找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7875|回复: 8
收起左侧

51单片机运用定时器计时用lcd显示实时时钟年月日(带仿真及源程序)

  [复制链接]
ID:192650 发表于 2017-5-5 14:36 | 显示全部楼层 |阅读模式
能区分闰年,闰月。每按K1一次跳到要设置的位置。K2每按一次 相应位家1. QQ图片20170505142439.png lcd.zip (34.05 KB, 下载次数: 100)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:848242 发表于 2020-11-24 10:28 | 显示全部楼层
可以,实用,解决问题了
回复

使用道具 举报

ID:750850 发表于 2020-5-13 15:35 | 显示全部楼层
能加上温度吗?
回复

使用道具 举报

ID:464106 发表于 2019-1-7 20:37 | 显示全部楼层
给力哦
回复

使用道具 举报

ID:192650 发表于 2017-5-6 19:50 | 显示全部楼层
越快乐越堕落 发表于 2017-5-6 19:24
那数码管的作用是显示星期咯

不是,数码管我是自己加上去显示K1按了几下
回复

使用道具 举报

ID:99130 发表于 2017-5-6 19:24 | 显示全部楼层

那数码管的作用是显示星期咯
回复

使用道具 举报

ID:192650 发表于 2017-5-6 19:18 | 显示全部楼层

下面就是时间
回复

使用道具 举报

ID:99130 发表于 2017-5-6 11:27 | 显示全部楼层
不显示时间吗?
回复

使用道具 举报

ID:1 发表于 2017-5-5 15:57 | 显示全部楼层

0.png

  1. #include<reg52.h>
  2. #include<absacc.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define DATA_ADDR XBYTE[0xF000]    //数据口地址
  6. #define COM_ADDR XBYTE[0xF100]    //命令口地址
  7. uchar xdata *C_ADDR,*D_ADDR;//指向命令口和数据口的地址指针
  8. uchar count=0;
  9. uchar second=0,fen=58,hour=23,mounth=2,day=25;
  10. uint year=2017;
  11. uchar k2;
  12. uchar zifuma[10]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19};
  13. uchar data COM;     //存放命令的变量
  14. uchar data DAT1;     //存放第一参数的变量
  15. uchar data DAT2;    //存放第二参数的变量
  16. void clear(void);
  17. void LCD_DISP(uchar y,uchar x,uchar zifu);
  18. void LCD_InIt();
  19. void DELAY();
  20. void WRITE_COM_DATA0();
  21. void WRITE_COM_DATA1();
  22. void WRITE_COM_DATA2();
  23. void WRITE_ZIFU();

  24. //上电延时子程序
  25. void DELAY()
  26. {   uint i,j;
  27.     for(i=0;i<2;i++)
  28.         {
  29.                 for(j=0;j<5;j++);
  30.         }
  31. }

  32. //向LCD写入要显示的字符的函数
  33. void WRITE_ZIFU()
  34. {
  35.      D_ADDR=&DATA_ADDR;//取数据口地址
  36.      *D_ADDR=DAT2;//将显示的字符写入LCD的数据单元
  37.      DELAY();
  38.      C_ADDR= &COM_ADDR;//取命令口地址
  39.      *C_ADDR=COM;//将命令写入LCD的命令单元
  40.      DELAY();
  41. }

  42. //向LCD写入无参数命令的函数
  43. void WRITE_COM_DATA0()
  44. {    C_ADDR=&COM_ADDR;//取命令口地址
  45.      *C_ADDR=COM;//将命令写入LCD的命令单元
  46.      DELAY();   
  47. }

  48. //向LCD写入只有一个参数命令的函数
  49. void WRITE_COM_DATA1()
  50. {    D_ADDR= &DATA_ADDR;//取数据口地址
  51.      *D_ADDR=DAT1;//将参数或者数据写入LCD的数据单元
  52.      DELAY();
  53.      C_ADDR= &COM_ADDR;//取命令口地址
  54.      *C_ADDR=COM;//将命令写入LCD的命令单元
  55.      DELAY();
  56. }

  57. //向LCD写入有2个参数命令的函数
  58. void WRITE_COM_DATA2()
  59. {    D_ADDR=&DATA_ADDR;//取数据口地址
  60.      *D_ADDR=DAT1;//将参数1或者数据1写入LCD的数据单元
  61.      DELAY();
  62.      *D_ADDR=DAT2;//将参数2或者数据2写入LCD的数据单元
  63.      DELAY();
  64.      C_ADDR=&COM_ADDR;//取命令口地址
  65.      *C_ADDR=COM;//将命令写入LCD的命令单元
  66.      DELAY();
  67. }


  68. //LCD初始化函数
  69. void LCD_InIt()
  70. {     
  71. //显示区域设置
  72.         DAT1=0x00;//设置文本显示区首地址,首地址为屏幕的左上角
  73.         DAT2=0x00;
  74.             COM=0x40;//设置文本显示区首地址的命令
  75.         WRITE_COM_DATA2();//双参数函数。将文本显示区首地址写入LCD

  76.             DAT1=16;//设置文本显示区域宽度,即一行显示所占字节数.每行16个字符
  77.             DAT2=0;                                          
  78.             COM=0x41;//设置文本显示区域宽度的命令
  79.         WRITE_COM_DATA2();//双参数函数。将文本显示区宽度写入LCD

  80.             DAT1=0x00;//设置显示区域首地址,或文本属性区域首地址
  81.             DAT2=0x00;
  82.             COM=0x42;//设置显示区域首地址或文本属性区域首地址的命令
  83.         WRITE_COM_DATA2();//双参数函数。显示区域首地址或文本属性区域首地址写入LCD

  84.             DAT1=0x10;/ /设置图形显示区域宽度或为文本属性区域宽度,即一行显示所占字节数
  85.         DAT2=0x00;
  86.             COM=0x43;//设置图形显示区域宽度或为文本属性区域宽度的命令
  87.         WRITE_COM_DATA2();//双参数函数。显示区域首地址或文本属性区域首地址写入LCD

  88. //显示光标设置
  89.             COM=0xA1;//光标形状设置命令
  90.         WRITE_COM_DATA0();//无参数函数。光标形状设置命令写入LCD

  91. //设置光标初始位置,是字符行和字符列,第0行第0列
  92.             DAT1=0x00;//设置光标列位置
  93.         DAT2=0x00;//设置光标行位置
  94.             COM=0x21;//设置光标行和列位置的命令
  95.         WRITE_COM_DATA2();//双参数函数。光标行和列位置写入LCD

  96. //显示方式设置,使用内部字符发生器
  97.             COM=0x80;//显示方式设置,逻辑"或"合成
  98.         WRITE_COM_DATA0();//无参数函数。显示方式设置命令写入LCD

  99. //显示开关方式
  100.             COM=0x97;//仅用文本显示
  101.         WRITE_COM_DATA0();//无参数函数。仅用文本显示方式命令写入LCD
  102. }


  103. //LCD在规定位置显示字符。行为Y,列为X,要显示的字符预先放在zifu变量中
  104. void LCD_DISP(uchar y,uchar x,uchar zifu)
  105. {
  106.         DAT1=y*16+x;//设置显示RAM首地址,水平方向字符数
  107.         DAT2=0;//固定送0
  108.         COM=0x24;//设置将要进行操作的显示缓冲区(RAM)的一个单元地址
  109.         WRITE_COM_DATA2();//双参数函数。设置将要显示的字符位置  

  110.         DAT2=zifu;//要显示的字符
  111.         COM=0xc4;//数据写,地址不变
  112.         WRITE_ZIFU();//单参数函数。将要显示的字符在规定的(x,y)位置写入LCD ,在LCD上显示该字符
  113. }

  114. //清显示缓冲区(16*8单元)
  115. void clear(void)
  116. {
  117.       uchar i,j;
  118.       for(i=0;i<8;i++)
  119.       {
  120.          for(j=0;j<16;j++)
  121.              LCD_DISP(i,j,0x00);
  122.       }
  123. }
  124. void main()
  125. {  
  126.             TMOD = 0x01;
  127.          TH0 = (65536-20000)/256;
  128.          TL0 = (65536-20000)%256;
  129.          ET0 = 1;  
  130.          TR0 = 1;

  131.          EX1 = 1; //中断int1
  132.          IT1 = 1;

  133.          EX0 = 1; //中断int0
  134.          IT0 = 1;

  135.           EA = 1;
  136.         SP=0x60;
  137.     DELAY();//上电延时
  138.     DELAY();
  139.     LCD_InIt();//LCD初始化设置
  140.     clear();//清显示缓冲区(16*8单元),屏幕全黑
  141.         while(1)
  142.         {
  143.            LCD_DISP(3,2,zifuma[year/1000]);
  144.        LCD_DISP(3,3,zifuma[year%1000/100]);
  145.            LCD_DISP(3,4,zifuma[year%1000%100/10]);
  146.        LCD_DISP(3,5,zifuma[year%1000%100%10]);
  147.        LCD_DISP(3,6,0x0D);
  148.        LCD_DISP(3,7,zifuma[mounth/10]);
  149.        LCD_DISP(3,8,zifuma[mounth%10]);
  150.        LCD_DISP(3,9,0x0D);
  151.        LCD_DISP(3,10,zifuma[day/10]);
  152.        LCD_DISP(3,11,zifuma[day%10]);

  153.        LCD_DISP(4,3,zifuma[hour/10]);
  154.        LCD_DISP(4,4,zifuma[hour%10]);
  155.        LCD_DISP(4,5,0x0D);
  156.        LCD_DISP(4,6,zifuma[fen/10]);
  157.        LCD_DISP(4,7,zifuma[fen%10]);
  158.        LCD_DISP(4,8,0x0D);
  159.        LCD_DISP(4,9,zifuma[second/10]);
  160.        LCD_DISP(4,10,zifuma[second%10]);
  161.          P1=k2;
  162.         }
  163. }
  164. int_1k2() interrupt 2
  165. {
  166.         if(k2==6)
  167.         k2=0;
  168.         else
  169.         k2++;
  170.                 if(k2==0)
  171.         {
  172.         DAT1=0x00;//设置光标列位置
  173.     DAT2=0x00;//设置光标行位置       
  174.         }
  175.         else if(k2==1)
  176.         {
  177.         DAT1=0x09;//设置光标列位置
  178.     DAT2=0x04;//设置光标行位置
  179.         }
  180.         else if(k2==2)
  181.         {
  182.         DAT1=0x06;//设置光标列位置
  183.     DAT2=0x04;//设置光标行位置
  184.         }
  185.         else if(k2==3)
  186.         {
  187.         DAT1=0x03;//设置光标列位置
  188.     DAT2=0x04;//设置光标行位置
  189.         }
  190.         else if(k2==4)
  191.         {
  192.         DAT1=0x0a;//设置光标列位置
  193.     DAT2=0x03;//设置光标行位置
  194.         }
  195.         else if(k2==5)
  196.         {
  197.         DAT1=0x07;//设置光标列位置
  198.     DAT2=0x03;//设置光标行位置
  199.         }
  200.         else if(k2==6)
  201.         {
  202.         DAT1=0x02;//设置光标列位置
  203.     DAT2=0x03;//设置光标行位置
  204.         }
  205.     COM=0x21;//设置光标行和列位置的命令
  206.     WRITE_COM_DATA2();//双参数函数。光标行和列位置写入LCD


  207. }
  208. int_0k1() interrupt 0
  209. {
  210.         if(k2==1)
  211.         {
  212.          if(second==59)
  213.          second=0;
  214.          else
  215.          second++;
  216.         }
  217.         else if(k2==2)
  218.         {
  219.          if(fen==59)
  220.          fen=0;
  221.          else
  222.          fen++;
  223.         }
  224.         else if(k2==3)
  225.          {
  226.          if(hour==23)
  227.           hour=0;
  228.           else
  229.           hour++;
  230.           }
  231.          else if(k2==4)
  232.         {
  233.          if(year%4==0)
  234.            {
  235.             if(mounth==2)
  236.                     {
  237.                   if(day==29)
  238.                   day=1;
  239.                   else
  240.                   day++;
  241.                  }
  242.                 else if(mounth==1|mounth==3|mounth==5|mounth==7|mounth==8|mounth==10|mounth==12)
  243.                     {
  244.                   if(day==31)
  245.                   day=1;
  246.                   else
  247.                   day++;
  248.                   }
  249.                 else if(mounth==4|mounth==6|mounth==9|mounth==11)
  250.                  {
  251.                   if(day==30)
  252.                   day=1;
  253.                   else
  254.                   day++;
  255.                  }
  256.            }
  257.            else        if(year%4!=0)
  258.            {
  259.             if(mounth==2)
  260.                     {
  261.                   if(day==28)
  262.                   day=1;
  263.                   else
  264.                   day++;
  265.                  }
  266.                 else if(mounth==1||mounth==3||mounth==5||mounth==7||mounth==8||mounth==10||mounth==12)
  267.                     {
  268.                   if(day==31)
  269.                   day=1;
  270.                   else
  271.                   day++;
  272.                   }
  273.                 else if(mounth==4||mounth==6||mounth==9||mounth==11)
  274.                  {
  275.                   if(day==30)
  276.                   day=1;
  277.                   else
  278.                   day++;
  279.                  }
  280.            }
  281.          }
  282.         else if(k2==5)
  283.          {
  284.          if(mounth==12)
  285.           mounth=1;
  286.           else
  287.           mounth++;
  288.           }
  289.            else if(k2==6)
  290.          year++;

  291. }
  292. timer0() interrupt 1
  293. {
  294.        
  295.         TH0 = (65536-20000)/256;
  296.         TL0 = (65536-20000)%256;
  297.    if(year%4==0)
  298.    {
  299.         if(mounth==2)
  300.         {
  301.          if(count==49)
  302.          {
  303.           count=0;
  304.           if(second==59)
  305.           {
  306.           second=0;
  307.             if(fen==59)
  308.                   {
  309.                    fen=0;
  310.                    if(hour==23)
  311.                    {
  312.                         hour=0;
  313.                          if(day==29)
  314.                             {
  315.                               day=1;
  316.                               if(mounth==12)
  317.                                {
  318.                                     mounth=1;
  319.                                      year++;
  320.                                    }
  321.                                     else
  322.                                     mounth++;
  323.                              }
  324.                         else
  325.                         day++;               
  326.                           }
  327.                else
  328.                    hour++;
  329.                   }
  330.             else
  331.             fen++;
  332.             }
  333.           else
  334.           second++;
  335.           }
  336.         else
  337.         count++;
  338.         }
  339.     else
  340.         ;
  341.   }
  342.   if(year%4!=0)
  343.    {
  344.           if(mounth==2)
  345.         {
  346.          if(count==49)
  347.          {
  348.           count=0;
  349.           if(second==59)
  350.           {
  351.           second=0;
  352.             if(fen==59)
  353.                   {
  354.                    fen=0;
  355.                    if(hour==23)
  356.                    {
  357.                         hour=0;
  358.                          if(day==28)
  359.                             {
  360.                               day=1;
  361.                               if(mounth==12)
  362.                                {
  363.                                     mounth=1;
  364.                                      year++;
  365.                                    }
  366.                                     else
  367.                                     mounth++;
  368.                              }
  369.                         else
  370.                         day++;               
  371.                           }
  372.                else
  373.                    hour++;
  374.                   }
  375.             else
  376.             fen++;
  377.             }
  378.           else
  379.           second++;
  380.           }
  381.         else
  382.         count++;
  383.         }
  384.         else
  385.         ;
  386.   }
  387.   if(mounth==1||mounth==3||mounth==5||mounth==7||mounth==8||mounth==10||mounth==12)
  388.     {
  389.          if(count==49)
  390.          {
  391.           count=0;                                    
  392.           if(second==59)
  393.           {
  394.           second=0;
  395.             if(fen==59)
  396.                   {
  397.                    fen=0;
  398.                    if(hour==23)
  399.                    {
  400.                         hour=0;
  401.                          if(day==31)
  402.                             {
  403.                               day=1;
  404.                               if(mounth==12)
  405.                                {
  406.                                     mounth=1;
  407.                                      year++;
  408.                                    }
  409.                                     else
  410.                                     mounth++;
  411.                              }
  412.                         else
  413.                         day++;               
  414.                           }
  415.                else
  416.                    hour++;
  417.                   }
  418.             else
  419.             fen++;
  420.             }
  421.           else
  422.           second++;
  423.           }
  424.         else
  425.         count++;
  426.         }
  427.     if(mounth==4||mounth==6||mounth==9||mounth==11)
  428.     {
  429.          if(count==49)
  430.          {
  431.           count=0;
  432.           if(second==59)
  433.           {
  434.           second=0;
  435.             if(fen==59)
  436.                   {
  437.                    fen=0;
  438.                    if(hour==23)
  439.                    {
  440.                         hour=0;
  441.                          if(day==30)
  442.                             {
  443.                               day=1;
  444.                               if(mounth==12)
  445.                                {
  446.                                     mounth=1;
  447.                                      year++;
  448.                                    }
  449.                                     else
  450.                                     mounth++;
  451.                              }
  452.                         else
  453.                         day++;               
  454.                           }
  455.                else
  456.                    hour++;
  457.                   }
  458.             else
  459.             fen++;
  460.             }
  461.           else
  462.           second++;
  463.           }




  464. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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