找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2165|回复: 3
打印 上一主题 下一主题
收起左侧

液晶显示DS1302实时时钟

[复制链接]
跳转到指定楼层
楼主

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <string.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char

  6. sbit IO = P1^0;
  7. sbit SCLK = P1^1;
  8. sbit RST = P1^2;
  9. sbit RS = P2^0;
  10. sbit RW = P2^1;
  11. sbit EN = P2^2;

  12. uchar *WEEK[]=
  13. {
  14.         "SUN","***","MON","TUS","WEN","THU","FRI","SAT"
  15. };
  16. uchar LCD_DSY_BUFFER1[]={"DATE 00-00-00    "};
  17. uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00    "};
  18. uchar DateTime[7];

  19. void DelayMS(uint ms)
  20. {
  21.         uchar i;
  22.         while(ms--)
  23.         {
  24.                  for(i=0;i<120;i++);
  25.         }
  26. }

  27. void Write_A_Byte_TO_DS1302(uchar x)
  28. {
  29.         uchar i;
  30.         for(i=0;i<8;i++)
  31.         {
  32.                  IO=x&0x01;SCLK=1;SCLK=0;x>>=1;
  33.         }
  34. }

  35. uchar Get_A_Byte_FROM_DS1302()
  36. {
  37.         uchar i,b=0x00;
  38.         for(i=0;i<8;i++)
  39.         {
  40.                  b |= _crol_((uchar)IO,i);
  41.                 SCLK=1;SCLK=0;
  42.         }
  43.         return b/16*10+b%16;
  44. }

  45. uchar Read_Data(uchar addr)
  46. {
  47.         uchar dat;
  48.         RST = 0;SCLK=0;RST=1;
  49.            Write_A_Byte_TO_DS1302(addr);
  50.         dat = Get_A_Byte_FROM_DS1302();
  51.            SCLK=1;RST=0;
  52.         return dat;
  53. }

  54. void GetTime()
  55. {
  56.         uchar i,addr = 0x81;
  57.         for(i=0;i<7;i++)
  58.         {
  59.                  DateTime[i]=Read_Data(addr);addr+=2;
  60.         }
  61. }

  62. uchar Read_LCD_State()
  63. {
  64.         uchar state;
  65.         RS=0;RW=1;EN=1;DelayMS(1);
  66.         state=P0;
  67.         EN = 0;DelayMS(1);
  68.         return state;
  69. }


  70. void LCD_Busy_Wait()
  71. {
  72.         while((Read_LCD_State()&0x80)==0x80);
  73.         DelayMS(5);
  74. }

  75. void Write_LCD_Data(uchar dat)
  76. {
  77.         LCD_Busy_Wait();
  78.         RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;       
  79. }

  80. void Write_LCD_Command(uchar cmd)
  81. {
  82.         LCD_Busy_Wait();
  83.         RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0;       
  84. }

  85. void Init_LCD()
  86. {
  87.         Write_LCD_Command(0x38);
  88.         DelayMS(1);       
  89.         Write_LCD_Command(0x01);
  90.         DelayMS(1);       
  91.         Write_LCD_Command(0x06);
  92.         DelayMS(1);       
  93.         Write_LCD_Command(0x0c);
  94.         DelayMS(1);       
  95. }

  96. void Set_LCD_POS(uchar p)
  97. {
  98.         Write_LCD_Command(p|0x80);       
  99. }

  100. void Display_LCD_String(uchar p,uchar *s)
  101. {
  102.         uchar i;
  103.         Set_LCD_POS(p);
  104.         for(i=0;i<16;i++)
  105.         {
  106.                 Write_LCD_Data(s[i]);
  107.                 DelayMS(1);        
  108.         }
  109. }

  110. void Format_DateTime(uchar d,uchar *a)
  111. {
  112.         a[0]=d/10+'0';
  113.         a[1]=d%10+'0';
  114. }

  115. void main()
  116. {
  117.         Init_LCD();
  118.         while(1)
  119.         {
  120.                  GetTime();
  121.                 Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);
  122.                 Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);
  123.                 Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);

  124.                 strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]]);

  125.                 Format_DateTime(DateTime[2],LCD_DSY_BUFFER1+5);
  126.                 Format_DateTime(DateTime[1],LCD_DSY_BUFFER1+8);
  127.                 Format_DateTime(DateTime[0],LCD_DSY_BUFFER1+11);

  128.                 Display_LCD_String(0x00,LCD_DSY_BUFFER1);
  129.                 Display_LCD_String(0x40,LCD_DSY_BUFFER2);
  130.         }
  131. }
复制代码




时钟.zip (38.29 KB, 下载次数: 32)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:566128 发表于 2019-8-15 21:12 | 只看该作者
大佬这段语句起到什么作用 Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);                 Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);                 Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);                 strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]]);                 Format_DateTime(DateTime[2],LCD_DSY_BUFFER1+5);                 Format_DateTime(DateTime[1],LCD_DSY_BUFFER1+8);                 Format_DateTime(DateTime[0],LCD_DSY_BUFFER1+11);
回复

使用道具 举报

板凳
ID:577423 发表于 2019-8-19 19:17 | 只看该作者
这个程序经过本人测试可用,谢谢大神们
回复

使用道具 举报

地板
ID:626907 发表于 2019-10-20 14:47 来自手机 | 只看该作者
看不懂
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表