找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于stc89c51的万年历lcd1602不显示内容 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:884825 发表于 2021-2-19 10:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
该设计的时间和星期可以正常显示,但是年份没有具体的平年闰年月份算法,所以并没有真正实现万年历,仅供参考,也欢迎大家完善该代码。
  1. #include<reg51.h>
  2. #include<lcd1602.h>        
  3. #include<aj.h>
  4. //#include<ds18b20.h>
  5. #include<temp.h>
  6. //#include<sound.h>                                                            
  7. #include<stdlib.h>
  8. unsigned char datas[] = { 0, 0}; //定义数组
  9. uchar code digit[]={"0123456789"};
  10. uchar count;
  11. void LcdDisplay(int);
  12. void clock();        
  13. void main()
  14. {  
  15. P1=0xf0;
  16.    lcdinitiata();
  17.    TMOD=0X10;                                 //使用T1的方式1定时
  18.    TH1=(65536-50000)/256;         //
  19.    TL1=(65536-50000)%256;
  20.    EA=1;                                         //开总中断
  21.    ET1=1;                                         //允许定时器T1中断
  22.    TR1=1;                                         //启动定时器T1
  23.    count=0;
  24.    s=50;
  25.    m=10;
  26.    h=10;
  27.    d=24;
  28.    w=1;
  29.    n=6;
  30.    y=2019;
  31.    z=12;
  32.    x=12;
  33.    writeaddress(0x04) ;
  34.    writedata('-');
  35.    writeaddress(0x07) ;
  36.    writedata('-');
  37.    writeaddress(0x42) ;
  38.    writedata(':');
  39.    writeaddress(0x45) ;
  40.    writedata(':');
  41.    writeaddress(0x4c) ;
  42.    writedata(':');
  43.    beep=0;
  44.    writeinrtuction(0x80+0x0f);        //写地址 80表示初始地址
  45.    writedata(0xdf);
  46.    while(1)
  47.    {

  48.          displayyear();                  //年
  49.          delay_ms(5);
  50.          displaymonth();                  //月
  51.          delay_ms(5);
  52.          displaydata();                  //日
  53.          delay_ms(5);
  54.          displayweek();                  //周
  55.          delay_ms(5);
  56.      displayhour();                  //时
  57.          delay_ms(5);
  58.          displaymin();                  //分
  59.          delay_ms(5);
  60.          displaysec();                  //秒
  61.          delay_ms(5);
  62.          displayzhour();          //闹钟时
  63.          delay_ms(5);
  64.          displayzmin();                  //闹钟分
  65.          key_detect();
  66.          LcdDisplay(Ds18b20ReadTemp);
  67.          if(h==z&&m==x)
  68.          {
  69.                  clock();
  70.          }         
  71.    }

  72. }
  73. void displayyear()          //显示年
  74. {
  75.    uchar i,j,o,p;
  76.    i=y/1000;
  77.    j=y%1000/100;
  78.    o=y%100/10;
  79.    p=y%10;
  80.    writeaddress(0x00) ;
  81.    writedata(digit[i]);
  82.    writedata(digit[j]);
  83.    writedata(digit[o]);
  84.    writedata(digit[p]);
  85. }
  86. void displaymonth()          //显示月
  87. {
  88.    uchar i,j;
  89.    i=n/10;
  90.    j=n%10;
  91.    writeaddress(0x05) ;
  92.    writedata(digit[i]);
  93.    writedata(digit[j]);
  94. }
  95. void displayweek()          //显示周
  96. {
  97.    uchar i;
  98.    i=w/1;
  99.    writeaddress(0x0b) ;
  100.    writedata(digit[i]);
  101. }
  102. void displaydata()          //显示日
  103. {
  104.    uchar i,j;
  105.    i=d/10;
  106.    j=d%10;
  107.    writeaddress(0x08) ;
  108.    writedata(digit[i]);
  109.    writedata(digit[j]);
  110. }

  111. void displayhour()          //显示时
  112. {
  113.    uchar i,j;
  114.    i=h/10;
  115.    j=h%10;
  116.    writeaddress(0x40) ;
  117.    writedata(digit[i]);
  118.    writedata(digit[j]);
  119. }

  120. void displaymin()         //        显示分
  121. {
  122.    uchar i,j;
  123.    i=m/10;
  124.    j=m%10;
  125.    writeaddress(0x43) ;
  126.    writedata(digit[i]);
  127.    writedata(digit[j]);
  128. }

  129. void displaysec()        // 显示秒
  130. {
  131.    uchar i,j;
  132.    i=s/10;
  133.    j=s%10;
  134.    writeaddress(0x46) ;
  135.    writedata(digit[i]);
  136.    writedata(digit[j]);
  137. }

  138. void LcdDisplay(int temp)          //lcd显示
  139. {

  140.         float tp;  
  141.         /*        temp=temp-1;
  142.                 temp=~temp;        */
  143.                 tp=temp;   
  144.                 temp=tp*0.0625*100+0.5;               
  145.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  146.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  147.                 //算由?.5,还是在小数点后面。

  148.         datas[0] = temp % 10000 / 1000;
  149.         datas[1] = temp % 1000 / 100;
  150.         writeinrtuction(0x80+0x0d);                 //写地址 80表示初始地址
  151.         writedata('0'+datas[0]); //十位
  152.         writeinrtuction(0x80+0x0e);                //写地址 80表示初始地址
  153.         writedata('0'+datas[1]); //个位
  154. }           

  155. void displayzhour()          //显示闹钟时
  156. {
  157.    uchar i,j;
  158.    i=z/10;
  159.    j=z%10;
  160.    writeaddress(0x4a) ;
  161.    writedata(digit[i]);
  162.    writedata(digit[j]);
  163. }

  164. void displayzmin()         //        显示闹钟分
  165. {
  166.    uchar i,j;
  167.    i=x/10;
  168.    j=x%10;
  169.    writeaddress(0x4d) ;
  170.    writedata(digit[i]);
  171.    writedata(digit[j]);
  172. }
  173. void clock()
  174. {
  175.         if((h == z) || (m == x))
  176.         {
  177.         beep = ~beep;
  178.         }
  179.         else
  180.         {
  181.                 beep=1;        
  182.         }               
  183. }  

  184. void t1_int() interrupt 3         //T1中断方式
  185. {
  186.    count++;
  187.      if(count==20)
  188.          {
  189.             count=0;
  190.                 s++;
  191.          }
  192.          if(s==60)
  193.          {
  194.             s=0;
  195.                 m++;
  196.          }
  197.          if(m==60)
  198.          {
  199.             m=0;
  200.                 h++;
  201.          }
  202.          if(h==24)
  203.          {
  204.             h=0;
  205.                 w++;
  206.          }
  207.          if(w==8)
  208.          {
  209.             w=1;
  210.                 d++;  
  211.           }
  212.          if(d > 31)
  213.          {
  214.                 d = 1;
  215.                 n++;  
  216.          }
  217.          if(n > 13)
  218.          {
  219.                  n = 1;
  220.                 y++;
  221.          }
  222.          TH1=(65536-50000)/256;
  223.          TL1=(65536-50000)%256;
  224. }
复制代码


电子表.zip

95.71 KB, 下载次数: 17

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

使用道具 举报

沙发
ID:242298 发表于 2021-2-21 00:53 | 只看该作者
请问有原理图发一张可以吗
回复

使用道具 举报

板凳
ID:883031 发表于 2021-2-21 08:08 | 只看该作者
用内部定时器走的准吗?
回复

使用道具 举报

地板
ID:268402 发表于 2021-6-4 13:26 | 只看该作者
为什么不显示呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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