#include<reg52.H>
#include <stdio.h>
#include<string.h>
#define uchar unsigned char
sfr lcd_data=0x80;
sbit lcd_E=P0^0;
sbit lcd_RW=P0^1;
sbit lcd_RS=P0^2;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
unsigned char code show1[]="Welcome";
unsigned char code show2[]="Friend";
unsigned char code show3[]="Welcome gj";
unsigned char code show4[]="Friendship";
unsigned char code show5[]="Welcome ftl";
unsigned char code show6[]="Friendship";
unsigned char code show7[]="Welcome wf";
unsigned char code show8[]="Friendship";
unsigned char temp;
unsigned char key;
uchar i,j,k;
/****************************延时函数
**************************/
/*函数原型:void f_v_delay5ms(void)
/*函数功能:延时
/*输入参数:无
/*输出参数:无
///***********************************************
***********************/
void f_v_delay5ms(void)
{
unsigned char i;
unsigned char j;
for(i=0;i<100;i++)
{
for(j=0;j<250;j++)
;
}
}
void f_v_delay50us(void)
{
unsigned char i;
for(i=0;i<50;i++)
{;}
}
void f_v_delay2ms(void)
{
unsigned char i;
unsigned char j;
for(i=0;i<200;i++)
{
for(j=0;j<50;j++)
;
}
}
void f_v_delay10ms(void)
{
f_v_delay5ms();
f_v_delay5ms();
}
//*lcd显示*/
/****************************1602A读状态函数
**************************/
/*函数原型:unsigned char f_uc_lcdReadStatus(void)
/*函数功能:1602A读状态
/*输入参数:无
/*输出参数:1602A返回的状态
/*调用模块:
///***********************************************
***********************/
void f_uc_lcdReadStatus(void)
{
lcd_data=0xff;
lcd_RS = 0;
lcd_RW = 1;
lcd_E = 1;
f_v_delay50us();
while(P2&0x80);//检测忙信号
lcd_E = 0;
}
/****************************1602A写数据函数
**************************/
/*函数原型:void f_v_lcdWriteData(unsigned char
WDLCM)
/*函数功能:1602A写数据
/*输入参数:要写入的数?
/*输出参数:无
/*调用模块:
/*************************************************
*********************/
void f_v_lcdWriteData(unsigned char WDLCM)
{
f_uc_lcdReadStatus(); //检测忙
P2 = WDLCM;
lcd_RS = 1;
lcd_RW = 0;
lcd_E = 1;//若晶振速度太高可以在这后加小的延时
f_v_delay50us();//延时
lcd_E = 0;
}
/****************************1602A写指令函数
**************************/
/*函数原型:void f_v_lcdWriteCommand(unsigned char
WCLCM,BuysC)
/*函数功能:1602A写指令
/*输入参数:要写入的指令
/*输出参数:无
/*调用模块:
/*************************************************
*********************/
void f_v_lcdWriteCommand(unsigned char WCLCM,unsigned char BuysC)//BuysC为0时忽略忙检测
{
if (BuysC)
f_uc_lcdReadStatus();//根据需要检测忙
P2 = WCLCM;
lcd_RS = 0;
lcd_RW = 0;
lcd_E = 1;
f_v_delay50us();//延时
lcd_E = 0;
}
/****************************1602A读数据函数
**************************/
/*函数原型:unsigned char f_v_lcdReadData(void)
/*函数功能:1602A读数据
/*输入参数:无
/*输出参数:1602A返回的数据
/*调用模块:
/*************************************************
**********************/
/*unsigned char f_uc_lcdReadData(void)
{
lcd_RS = 1;
lcd_RW = 1;
lcd_E = 0;
lcd_E = 0;
lcd_E = 1;
return(lcd_data);
}*/
/******************1602A按指定位置显示一个字符函数
**********************/
/*函数原型:void f_v_displayOneChar(unsigne char X,
unsigned char Y, unsigned char DData)
/*函数功能:1602A按指定位置显示一个字符
/*输入参数:X坐标 Y坐标 要显示的字符
/*输出参数:无
/*调用模块:
/*************************************************
*********************/
void f_v_displayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF;//限制X不能大于15,Y不能大于1
if (Y)
X |= 0x40;//当要显示第二行时地址码+0x40;
X |= 0x80;// 算出指令码
f_v_lcdWriteCommand(X, 0);//这里不检测忙信号,发送地址码
f_v_lcdWriteData(DData);
}
/*******************1602A按指定位置显示一串字符函
数*********************/
/*函数原型:void f_v_displayListChar(unsigned char
X, unsigned char Y, unsigned char code *DData)
/*函数功能:1602A按指定位置显示一个字符
/*输入参数:X坐标 Y坐标 要显示字符串的首地址
/*输出参数:
/*************************************************
*********************/
void f_v_displayListChar(unsigned char X, unsigned char Y, unsigned char *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF;//限制X不能大于15,Y不能大于1
while (DData[ListLength]>=0x20)//若到达字串尾则退出
{
if (X <= 0xF)//X坐标应小于0xF
{
f_v_displayOneChar(X, Y, DData[ListLength]);//显示单个字符
ListLength++;
X++;
}
}
}
/****************************1602A初始化函数
**************************/
/*函数原型:void f_v_lcdInit(void)
/*函数功能:1602A初始化
/*输入参数:无
/*输出参数:无
/*调用模块:/
/*************************************************
*********************/
void f_v_lcdInit(void)
{
lcd_data = 0;
f_v_lcdWriteCommand(0x38,0);//三次显示模式设置,不检测忙信号
f_v_delay5ms();
f_v_lcdWriteCommand(0x38,0);
f_v_delay5ms();
f_v_lcdWriteCommand(0x38,0);
f_v_delay5ms();
f_v_lcdWriteCommand(0x38,1);//显示模式设置,开始要求每次检测忙信号
f_v_lcdWriteCommand(0x08,1);//关闭显示
f_v_lcdWriteCommand(0x01,1);//显示清屏
f_v_delay2ms();
f_v_lcdWriteCommand(0x06,1);// 显示光标移动设置
f_v_lcdWriteCommand(0x0C,1);// 显示开及光标设置
}
//////////////////////////////////////////////////
//////////////////////////
/*喂狗程序*/
/*void f_v_watchDog()
{
dog=1;
;
;
;
;
;
;
;
dog=0;
}*/
//////////////////////////////////////////////////
//////////////////////////
/*void f1()
{
f_v_delay10ms();
f_v_delay10ms();
f_v_lcdInit();
f_v_delay10ms();
f_v_delay10ms();
f_v_displayListChar(0,0,show1);
f_v_displayListChar(0,1,show2);
}
void f2()
{
f_v_delay10ms();
f_v_delay10ms();
f_v_lcdInit();
f_v_delay10ms();
f_v_delay10ms();
f_v_displayListChar(0,0,show3);
f_v_displayListChar(0,1,show4);
}
void f3()
{
f_v_delay10ms();
f_v_delay10ms();
f_v_lcdInit();
f_v_delay10ms();
f_v_delay10ms();
f_v_displayListChar(0,0,show5);
f_v_displayListChar(0,1,show6);
}*/
void main(void)
{
i="0";
j="0";
while(1)
{
/* for(i=0;i<10;i++)
{
;
f_v_lcdInit();
;
f_v_displayListChar(i,0,show1);
f_v_displayListChar(i,1,show2);
;
}
for(i=10;i<16;i++)
{
;
f_v_lcdInit();
;
for(j=0;j<7;j++)
{
f_v_displayOneChar((i+j)%16,0,show1[j]);
f_v_displayOneChar((i+j)%16,1,show2[j]);
;
}
}*/
for(i=0;i<16;i++)
{
;
f_v_lcdInit();
;
for(j=0;j<strlen(show1);j++)
{
f_v_displayOneChar((i+j)%16,0,show1[j]);
;
}
for(j=0;j<strlen(show2);j++)
{
f_v_displayOneChar((i+j)%16,1,show2[j]);
;
}
}
}
}
文章评论(0条评论)
登录后参与讨论