《基于51单片机控制的1602液晶电子时钟显示程序.doc》由会员分享,可在线阅读,更多相关《基于51单片机控制的1602液晶电子时钟显示程序.doc(14页珍藏版)》请在三一文库上搜索。
1、基于51单片机控制的1602液晶电子时钟显示程序 2007-05-31 13:31:45 | By: kevin 刚写好的基于51单片机控制的1602液晶电子时钟显示程序,整理了一下,并尽量加上的注释,放出来大家共享及交流。有兴趣的可以参考一下,各管脚定义都比较明显,有一定基础的可稍作修改即可进行实验。/基于51单片机控制的1602液晶电子时钟显示程序i nclude <intrins.h>i nclude <at89x51.h>#define uchar unsigned char#define LCM_RS P2_2 /定义引脚#define LCM_R
2、W P2_1#define LCM_E P2_0#define LCM_Data P0#define Busy 0x80 /用于检测LCM状态字中的Busy标识uchar i, j, k, second, tcount, minute, hour;void WriteDataLCM(unsigned char WDLCM);void WriteCommandLCM(unsigned char WCLCM,BuysC);unsigned char ReadDataLCM(void);unsigned char R
3、eadStatusLCM(void);void LCMInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);void DisplayqListChar(unsigned char X, unsigned char Y, unsigned char code *DData);void Delay5Ms(void);vo
4、id Delay400Ms(void);unsigned char code table='0','1','2','3','4','5','6','7','8','9'/数码管数字编码unsigned char code MyNo = "NAME:Who_am_I?"/* 函数名称:delay()* 功能描述:延时子程序,大约延时 n MS* 输 入:* 输
5、 出:* 全局变量:* 调用模块:* 作者: kevin * 日期: 2007年5月31日*/delay(uchar n)uchar i,j,k; for(i=2;i>0;i-) for(j=n;j>0;j-) for(k=125;k>0;k-);推荐精选/* 函数名称:lcd()* 功能描述:液晶初始化,然后在液晶屏第二行显示提示信息* 输 入:* 输&
6、#160; 出:* 全局变量:* 调用模块:Delay400Ms(),LCMInit(),DisplayListChar()* 作者: kevin * 日期: 2007年5月31日*/void lcd(void) Delay400Ms(); /启动等待,等LCM讲入工作状态 LCMInit(); /LCM初始化 Delay5Ms(); /延时片刻(可不要) DisplayListChar(0, 1, MyNo);/* 函数名称:Writ
7、eDataLCM()* 功能描述:写数据* 输 入: WDLCM* 输 出:* 全局变量:* 调用模块:* 作者: kevin * 日期: 2007年5月31日*/void WriteDataLCM(unsigned char WDLCM) ReadStatusLCM(); /检测忙 LCM_Data = WDLCM; LCM_RS = 1; LCM_RW = 0;
8、 LCM_E = 0; /若晶振速度太高可以在这后加小的延时 LCM_E = 0; /延时 LCM_E = 1;推荐精选/* 函数名称:WriteCommandLCM()* 功能描述:写指令* 输 入:* 输 出:* 全局变量:* 调用模块:* 作者: kevin * 日期: 2007年5月31日*/void WriteCommandLCM(unsigned char WCL
9、CM,BuysC) /BuysC为0时忽略忙检测 if (BuysC) ReadStatusLCM(); /根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0; LCM_E = 0; LCM_E = 0; LCM_E = 1;/* 函数名称:ReadDataLCM()* 功能描述:读数据* 输 入:* 输 出:* 全局变量:* 调用模块:* 作者:
10、kevin * 日期: 2007年5月31日*/unsigned char ReadDataLCM(void) LCM_RS = 1; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; return(LCM_Data);推荐精选/* 函数名称:ReadStatusLCM()* 功能描述:读状态* 输 入:* 输 出:* 全局变量:* 调用模块
11、:* 作者: kevin * 日期: 2007年5月31日*/unsigned char ReadStatusLCM(void) LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; while (LCM_Data & Busy); /检测忙信号 return(LCM_Data);/* 函数名称:LCMIni
12、t()* 功能描述:LCM初始化* 输 入:* 输 出:* 全局变量:* 调用模块:* 作者: kevin * 日期: 2007年5月31日*/void LCMInit(void) LCM_Data = 0; WriteCommandLCM(0x38,0); /三次显示模式设置,不检测忙信号 Delay5Ms(); WriteCommandLCM(0x38,0); D
13、elay5Ms(); WriteCommandLCM(0x38,0); Delay5Ms();推荐精选 WriteCommandLCM(0x38,1); /显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x08,1); /关闭显示 WriteCommandLCM(0x01,1); /显示清屏 WriteCommandLCM(0x06,1); / 显示光标移动设置 WriteCommandLCM(0x0C,1); / 显示开及光标设置/* 函数名称:DisplayOneChar()*
14、0; 功能描述:按指定位置显示一个字符* 输 入:* 输 出:* 全局变量:* 调用模块:* 作者: kevin * 日期: 2007年5月31日*/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) Y &= 0x1; X &= 0xF; /限制X不能大于15,Y不能大于1 if (Y
15、) X |= 0x40; /当要显示第二行时地址码+0x40; X |= 0x80; / 算出指令码 WriteCommandLCM(X, 0); /这里不检测忙信号,发送地址码 WriteDataLCM(DData);推荐精选/* 函数名称:DisplayListChar()* 功能描述:按指定位置显示一串字符* 输 入:* 输 出:* 全局变量:* 调用模块:* 作者: kevin * 日期:&
16、#160; 2007年5月31日*/void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) unsigned char ListLength; ListLength = 0; Y &= 0x1; X &= 0xF; /限制X不能大于15,Y不能大于1 while (DDataListLength>0x20) /若到达字串尾则退出 if (X <= 0xF) /
17、X坐标应小于0xF DisplayOneChar(X, Y, DDataListLength); /显示单个字符 ListLength+; X+; /* 函数名称:Delay5Ms()* 功能描述:5ms延时* 输 入:* 输 出:* 全局变量:* 调用模块:*
18、; 作者: kevin * 日期: 2007年5月31日*/void Delay5Ms(void) unsigned int TempCyc = 5552; while(TempCyc-);推荐精选/* 函数名称:Delay400Ms()* 功能描述:400ms延时* 输 入:* 输 出:* 全局变量:* 调用模块:* 作者: kevin
19、 * 日期: 2007年5月31日*/void Delay400Ms(void) unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA-) TempCycB=7269; while(TempCycB-); /* 函数名称:timer0()* 功能描述:中断子程序,1秒重写一次液晶,以此实现60秒计数* 输 入:* 输 出:*
20、 全局变量:* 调用模块:* 作者: kevin * 日期: 2007年5月31日*/void timer0() interrupt 1 using 0int i; TH0=(65536-50000)/256*3; /中断设置初始化
21、; TL0=(65536-50000)%256*3; tcount+; if(tcount=60
22、) /满1秒 i=0; DisplayOneChar(i+, 0, 'T'); /在第1行第1个坐标显示 DisplayOneChar(i+, 0, 'I'); /在第1行第2个坐标显示 DisplayOneChar(i+, 0, 'M'); /在第1行第3个坐标显示 Dis
23、playOneChar(i+, 0, 'E'); /在第1行第4个坐标显示 DisplayOneChar(i+, 0, ':'); /在第1行第5个坐标显示 DisplayOneChar(i+, 0, tablehour/10); /在第1行第6个坐标显示 DisplayOneChar(i+, 0, tablehour%10); /在第1行第7个坐标显示 DisplayOneChar(i+, 0, ':'
24、); /在第1行第1个坐标显示 DisplayOneChar(i+, 0, tableminute/10); /在第1行第8个坐标显示 DisplayOneChar(i+, 0, tableminute%10); /在第1行第9个坐标显示 DisplayOneChar(i+, 0, ':'); /在第1行第10个坐标显示 DisplayOneChar(i+, 0, tablesecond/10); /在第1行第1
25、1个坐标显示 DisplayOneChar(i+, 0, tablesecond%10); /在第1行第12个坐标显示 tcount=0;second+; if(second=60) /满1分 second=0;minute+; /分数加1,秒数归零 if(minute=6
26、0) /满1小时 minute=0;hour+; /小时数加1,分数归零 if(hour=24) hour=0; 推荐精选/* 函数名称:main()* 功能描述:主程序,设置初始时间,中断设置初
27、始化,液晶显示,等待中断* 输 入:* 输 出:* 全局变量:* 调用模块:* 作者: kevin * 日期: 2007年5月31日*/void main()uchar i; second=0;minute=0;hour=0; /设置初始时间 TH0=(65536-50000)/256;
28、160; /中断设置初始化 TL0=(65536-50000)%256; EA=1;ET0=1;TMOD=0x21;TR0=1; lcd(); i=0; DisplayOneChar(i+, 0, 'T'); /在第1行第1个坐标显示&
29、#160; DisplayOneChar(i+, 0, 'I'); /在第1行第2个坐标显示 DisplayOneChar(i+, 0, 'M'); /在第1行第3个坐标显示 DisplayOneChar(i+, 0, 'E'); /在第1行第4个坐标显示 DisplayOneChar(i+, 0, ':'); /在第1行第5个坐标显示 DisplayOneChar(i+, 0, tabl
30、ehour/10); /在第1行第6个坐标显示 DisplayOneChar(i+, 0, tablehour%10); /在第1行第7个坐标显示 DisplayOneChar(i+, 0, ':'); /在第1行第1个坐标显示 DisplayOneChar(i+, 0, tableminute/10); /在第1行第8个坐标显示 DisplayOneChar(i+, 0, tableminute%10); /在
31、第1行第9个坐标显示 DisplayOneChar(i+, 0, ':'); /在第1行第10个坐标显示 DisplayOneChar(i+, 0, tablesecond/10); /在第1行第11个坐标显示 DisplayOneChar(i+, 0, tablesecond%10); /在第1行第12个坐标显示 while(1); /等待中断 (注:可编辑下载,若有不当之处,请指正,谢谢!) 推荐精选