51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)_第1页
51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)_第2页
51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)_第3页
51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)_第4页
51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 51单片机+带字库液晶12864+DS1302数字时钟C源程序无按键修改功能2021-10-19 16:47经过两天的搜索与调试,在别人程序的根底上,不断修改,终于调试成功了这个程序。目前还不能修改时间与日期,只是以预定时间以始。适用于开发板:51单片机AT89S52+带字库液晶12864(ST7920)+DS1302(实时时钟实现功能:简单,数字时钟+日期以后会不断完美。C语言源程序如下:#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int

2、/*DS1302 端口设置 */sbit SCK=P36;        /DS1302时钟sbit SDA=P34;      /DS1302 IOsbit RST = P35;   / DS1302复位bit ReadRTC_Flag;      /读DS1302全局变量/* 12864端口定义*/#define LCD_data P0     

3、0;       /带字库液晶12864数据口sbit LCD_RS = P24;            /存放器选择输入 sbit LCD_RW = P25;            /液晶读/写控制sbit LCD_EN = P26;     /液晶使能控制sbit  

4、;  PSB=P21;          /并口控制sbit    RES=P23;uchar code dis1 = " 电子设计天地"        /液晶显示的汉字uchar code dis2 = "有志者,事竟成!"uchar code dis4 = '0','1','2','3',&

5、#39;4','5','6','7','8','9'unsigned char temp;#define delayNOP(); _nop_();_nop_();_nop_();_nop_();void lcd_pos(uchar X,uchar Y); /确定显示位置unsigned char l_tmpdate7=0,7,16,19,10,1,9;/秒分时日月周年09-10-19 16:07:00code unsigned char write_rtc_address7=0x80,0x82,0x84,0

6、x86,0x88,0x8a,0x8c; /秒分时日月周年 最低位读写位code unsigned char read_rtc_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d; void Write_Ds1302_byte(unsigned char temp); void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);/read RTC void

7、Set_RTC(void); /set RTC void InitTIMER0(void);/inital timer0/*/*                                       &#

8、160;                         */* 延时函数                        

9、;                               */*                   &

10、#160;                                             */*/void    del

11、ay(unsigned int m)            /延时程序                                    

12、;     unsigned int i,j;                      for(i=0;i<m;i+)                  

13、0;      for(j=0;j<10;j+);                   /*/*                      &#

14、160;                                          */*检查LCD忙状态      &#

15、160;                                             */*lcd_busy为1时,忙,等待。lcd-busy为0时

16、,闲,可写指令与数据。      */*                                          

17、60;                      */*/bit lcd_busy()                          &

18、#160;   bit result;    LCD_RS = 0;    LCD_RW = 1;    LCD_EN = 1;    delayNOP();    result = (bit)(P0&0x80);    LCD_EN = 0;    return(result); /*/*      

19、;                                                  

20、;         */*写指令数据到LCD                                       

21、0;          */*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */*       

22、                                                  

23、        */*/void lcd_wcmd(uchar cmd)                             while(lcd_busy();    LCD_RS = 0;   

24、 LCD_RW = 0;    LCD_EN = 0;    _nop_();    _nop_();     P0 = cmd;    delay(1);    LCD_EN = 1;    delay(1);    LCD_EN = 0; /*/*         

25、                                                  

26、      */*写显示数据到LCD                                           

27、;       */*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */*        &#

28、160;                                                 &#

29、160;      */*/void lcd_wdat(uchar dat)                             while(lcd_busy();    LCD_RS = 1;    LCD_RW

30、= 0;    LCD_EN = 0;    P0 = dat;    delayNOP();    LCD_EN = 1;    delay(1);    LCD_EN = 0; /*/*                   &

31、#160;                                             */* LCD初始化设定   

32、                                               */*   &#

33、160;                                                 &#

34、160;           */*/void lcd_init() P0=0xFF;P2=0xFF;delay(40);PSB=1;             /并口方式。delay(1);RES=0;delay(1);RES=1;delay(10);lcd_wcmd(0x30);delay(100);lcd_wcmd(0x30);delay(37);lcd_wcmd(0x08

35、);delay(100);lcd_wcmd(0x10);delay(100);lcd_wcmd(0x0C);      /显示开,关光标    delay(100);    lcd_wcmd(0x01);      /去除LCD的显示内容    delay(100);lcd_wcmd(0x06);delay(100);void main()uchar i;InitTIMER0();  

36、Set_RTC();   lcd_init();                  /初始化LCD             while(1)if(ReadRTC_Flag)   ReadRTC_Flag=0;Read_RTC();lcd_pos(0,0);  

37、           /设置显示位置为第一行的第1个字符     i = 0;    while(dis1i != '0')                         

38、     /显示字符       lcd_wdat(dis1i);       i+;         lcd_pos(1,0);             /设置显示位置为第二行的第1个字符     i = 0

39、;    while(dis2i != '0')            lcd_wdat(dis2i);      /显示字符       i+;     lcd_pos(2,0); lcd_wdat(dis4l_tmpdate6/16);     &#

40、160;    /DS1302是BCD码,进行处理得到十位与个位数。lcd_pos(2,1);                  lcd_wdat(dis4l_tmpdate6%16);lcd_pos(2,2);                  l

41、cd_wdat('-');lcd_pos(2,3);                  lcd_wdat(dis4l_tmpdate4/16);lcd_pos(2,4);                  lcd_wdat(dis4l_tmpdate4%16);l

42、cd_pos(2,5);                  lcd_wdat('-');lcd_pos(2,6);                  lcd_wdat(dis4l_tmpdate3/16);lcd_pos(2,7);  

43、0;               lcd_wdat(dis4l_tmpdate3%16);           /设置显示位置为第三行的第1个字符    lcd_pos(3,0);             /设置显示位置

44、为第四行的第1个字符     lcd_wdat(dis4l_tmpdate2/16);lcd_pos(3,1);                  lcd_wdat(dis4l_tmpdate2%16);lcd_pos(3,2);               

45、   lcd_wdat(':');lcd_pos(3,3);                  lcd_wdat(dis4l_tmpdate1/16);lcd_pos(3,4);                  lcd_wdat(dis4l_

46、tmpdate1%16);lcd_pos(3,5);                  lcd_wdat(':');lcd_pos(3,6);                  lcd_wdat(dis4l_tmpdate0/16);lcd_pos(3,7);&#

47、160;                 lcd_wdat(dis4l_tmpdate0%16);  /*/*                          

48、0;                            */* 设定显示位置                     

49、;                     */*                             &

50、#160;                         */*/void lcd_pos(uchar X,uchar Y)                   

51、60;         uchar pos;   if (X=0)     X=0x80;   else if (X=1)     X=0x90;   else if (X=2)     X=0x88;   else if (X=3)     X=0x98;   pos

52、 = X+Y ;    lcd_wcmd(pos);     /显示地址void InitTIMER0(void)TMOD|=0x01;/定时器设置 16位TH0=0xef;/初始化值TL0=0xf0;ET0=1;TR0=1;EA=1;void Write_Ds1302_Byte(unsigned char temp) unsigned char i;for (i=0;i<8;i+)     /循环8次 写入数据    SCK=0;   &

53、#160; SDA=temp&0x01;     /每次传输低字节      temp>>=1;    /右移一位     SCK=1;     /*/void Write_Ds1302( unsigned char address,unsigned char dat )        RST=0;_nop_();  

54、 SCK=0;_nop_();   RST=1;    _nop_();   /启动   Write_Ds1302_Byte(address); /发送地址   Write_Ds1302_Byte(dat);   /发送数据   RST=0;    /恢复/*/unsigned char Read_Ds1302 ( unsigned char address )   unsigned char i,temp=0x00;   RST=0;_nop_();   SCK=0;_nop_();   RST=1;_nop_();   Write_Ds1302_Byte(address

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论