找回密码
 立即注册

QQ登录

只需一步,快速开始

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

1602液晶屏仿真 电子时钟日历设计

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

1602lcd液晶屏仿真 51单片机的电子时钟日历设计原理图如下:





仿真文件及完整的程序代码下载:http://www.51hei.com/bbs/dpj-50777-1.html


  1. #include <reg51.h>
  2. #ifndef uchar
  3. #define uchar unsigned char
  4. #endif

  5. #ifndef uint
  6. #define uint unsigned int
  7. #endif
  8. /*定义年月日参数变量*/
  9. unsigned char YEAR1 = 2;
  10. unsigned char YEAR2 = 0;
  11. unsigned char YEAR3 = 1;
  12. unsigned char YEAR4 = 6;
  13. unsigned char MONTH1 = 0;
  14. unsigned char MONTH2 = 1;
  15. unsigned char DAY1 = 2;
  16. unsigned char DAY2 = 6;
  17. unsigned char HOUR1 = 0;
  18. unsigned char HOUR2 = 0;
  19. unsigned char MINUTE1 = 0;
  20. unsigned char MINUTE2 = 0;
  21. unsigned char SECOND1 = 0;
  22. unsigned char SECOND2 = 0;
  23. unsigned char time[10];         
  24. unsigned char Y_M[10];
  25. unsigned char count = 0;
  26. /*LCD1602写入8位数据子函数*/
  27. void LcdWriteCom(unsigned char com);
  28. void LcdWriteData(uchar dat);
  29. /*LCD1602初始化子程序*/
  30. void LcdInit();
  31. void add1day(unsigned char month_day);            //按按键后天数本月减一
  32. void sub1month(void);                                                //按按键后月数减一
  33. unsigned char returnDays(unsigned char months);   //获取本月有多少天

  34. void Lcd1602_Delay1ms(unsigned char c)                          //延时1ms函数
  35. {
  36.     unsigned char a,b;
  37.         for (; c>0; c--)
  38.                  for (b=199;b>0;b--)
  39.                           for(a=1;a>0;a--)
  40.                         ;
  41.                      
  42. }
  43. void add1Sec(void)                                                                //调用此函数LCD1602显示屏上秒数加1
  44. {
  45.   SECOND2++;
  46.   if (SECOND2 > 9)     //>'9'
  47.   {
  48.     SECOND2 = 0;
  49.     SECOND1++;
  50.   }
  51. }
  52. void time1() interrupt 1                                                //定时器中断
  53. {
  54.   unsigned char i, j;
  55.   TH0=(65536-50000)/256;                                                //16位定时器0x60B0  高八位TH0 60低八位 B0 定时50000微秒触发定时器
  56.   TL0=(65536-50000)%256;
  57.   count++;
  58.   if (count % 16 == 0)
  59.   {
  60.     add1Sec();
  61.         LcdWriteCom(0x01);  //清屏
  62.     LcdWriteCom(0x80+0x40);
  63.     for (j = 0; j < 8; j++)
  64.           LcdWriteData(time[j]);         
  65.         LcdWriteCom(0x80);
  66.         for (i = 0; i < 10; i++)
  67.           LcdWriteData(Y_M[i]);
  68.             if(count == 240)
  69.                 count = 0;
  70.   }
  71.   
  72.   if (SECOND1 >= 6)    //=='6'
  73.   {
  74.     SECOND1 = 0;
  75.     MINUTE2++;
  76.   }
  77.   if (MINUTE2 > 9)
  78.   {
  79.     MINUTE2 = 0;
  80.     MINUTE1++;

  81.     if (MINUTE1 >= 6)  //'6'
  82.     {
  83.       MINUTE1 = 0;
  84.       HOUR2++;
  85.           for(i = 0; i < 19; i++)
  86.               add1Sec();
  87.     }
  88.   }
  89.   if (HOUR2 > 9)
  90.   {
  91.     HOUR2 = 0;
  92.     HOUR1++;
  93.   }
  94.   if (HOUR1 >= 2)    //'2' ,'4'  
  95.   {
  96.     if(HOUR2 >= 4)
  97.         {
  98.     HOUR1 = 0;
  99.     HOUR2 = 0;
  100.     MINUTE1 = 0;
  101.     MINUTE2 = 0;
  102.     SECOND1 = 0;
  103.     SECOND2 = 0;
  104.         add1day(returnDays(MONTH1*10+MONTH2));
  105.         }

  106.   }
  107.    Y_M[0] = (char)(YEAR1+48);
  108.    Y_M[1] = (char)(YEAR2+48);
  109.    Y_M[2] = (char)(YEAR3+48);
  110.    Y_M[3] = (char)(YEAR4+48);
  111.    Y_M[4] = '-';
  112.    Y_M[5] = (char)(MONTH1+48);
  113.    Y_M[6] = (char)(MONTH2+48);
  114.    Y_M[7] = '-';
  115.    Y_M[8] = (char)(DAY1+48);
  116.    Y_M[9] = (char)(DAY2+48);
  117.    time[0] = (char)(HOUR1+48);
  118.    time[1] = (char)(HOUR2+48);
  119.    time[2] = ':';
  120.    time[3] = (char)(MINUTE1+48);
  121.    time[4] = (char)(MINUTE2+48);
  122.    time[5] = ':';
  123.    time[6] = (char)(SECOND1+48);
  124.    time[7] = (char)(SECOND2+48);
  125. }

  126.   unsigned char returnDays(unsigned char months)
  127.   {
  128.     if (MONTH2 < 10 && MONTH1 == 0)
  129.           switch(MONTH2)
  130.           {
  131.             case 1:  return 31; break;
  132.                 case 2:         
  133.                 if (((YEAR3*10+YEAR4)%4 == 0 && (YEAR3*10+YEAR4) != 0 )
  134.         ||((YEAR3 * 10 + YEAR4) == 0 && (YEAR1+YEAR2)%4 == 0))       
  135.               return 29;
  136.                 else
  137.                   return 28;
  138.                 break;
  139.                 case 3:  return 31;        break;
  140.                 case 4:         return 30;        break;
  141.                 case 5:  return 31;        break;
  142.                 case 6:         return 30;        break;
  143.                 case 7:  return 31;        break;
  144.                 case 8:         return 31;        break;
  145.                 case 9:  return 30;        break;
  146.                   
  147.           }
  148.           else if(MONTH1 == 1 && MONTH2 <= 2)
  149.           {
  150.             if (MONTH1 == 1 && MONTH2 == 0)
  151.               return 31;
  152.             if (MONTH1 == 1 && MONTH2 == 1)
  153.               return 30;
  154.             if (MONTH1 == 1 && MONTH2 == 2)
  155.                   return 31;
  156.           }
  157.   }
  158.   

  159.   void sub1day(void)
  160.   {
  161.     if(DAY1 == 0)
  162.         {
  163.           if(DAY2 != 1)
  164.             DAY2--;
  165.           else
  166.           {
  167.             sub1month();
  168.                 DAY1 = (unsigned char) returnDays(MONTH1*10+MONTH2)/10;
  169.                 DAY2 =         returnDays(MONTH1*10+MONTH2)%10+1;                         //...
  170.           }
  171.         }
  172.         if(DAY1 != 0)
  173.         {
  174.           if(DAY2 != 0)
  175.             DAY2--;
  176.           else
  177.           {
  178.             DAY1--;
  179.                 DAY2 = 9;
  180.           }
  181.         }
  182.   }
  183.   void add1month(void)
  184.   {
  185.     if (MONTH2 == 9)
  186.         {
  187.       MONTH1 = 1;
  188.           MONTH2 = 0;
  189.     }
  190.         else if (MONTH1 == 0 ||(MONTH1 == 1 && MONTH2 < 2))
  191.       MONTH2++;
  192.     else if (MONTH1*10+MONTH2  == 12)
  193.           {
  194.                 MONTH1 = 0;
  195.                 MONTH2 = 1;
  196.                 YEAR4++;
  197.           }
  198. }

  199.        

  200.   void add1day(unsigned char month_day)           //获取本月有多少天后,天数减1
  201.   {
  202.     if (DAY1*10+DAY2 == month_day)            
  203.         {
  204.           DAY2 = 1;
  205.           DAY1 = 0;
  206.           add1month();
  207.         }
  208.     else
  209.     {
  210.           if(DAY2 != 9)
  211.             DAY2++;
  212.           else
  213.           {
  214.             DAY2 = 0;
  215.                 DAY1++;
  216.           }
  217.         }
  218.          
  219. }
  220. void sub1month(void)       //减一个月
  221. {
  222.   if(MONTH1 == 0)
  223.   {
  224.     if(MONTH2 != 1)
  225.           MONTH2--;
  226.         else
  227.         {
  228.           MONTH1 = 1;
  229.           MONTH2 = 2;
  230.           if(YEAR4 != 0)
  231.             YEAR4--;
  232.           else
  233.           {
  234.             if(YEAR3 != 0)
  235.                 {
  236.                   YEAR3--;
  237.                   YEAR4 = 9;
  238.                 }
  239.                 else
  240.                 {
  241.                   if(YEAR2 != 0)
  242.                   {
  243.                    YEAR2--;
  244.                    YEAR3 = 9;
  245.                    YEAR4 = 9;
  246.                   }
  247.                   else
  248.                   {
  249.                     if(YEAR1 != 0)
  250.                         {
  251.                           YEAR1--;
  252.                           YEAR2 = 9;
  253.                       YEAR3 = 9;
  254.                       YEAR4 = 9;
  255.                         }
  256.                         else
  257.                         ;
  258.                   }
  259.                 }
  260.           }
  261.         }
  262.   }
  263.   else
  264.   {
  265.     if(MONTH2 == 0)
  266.         {
  267.           MONTH1 = 0;
  268.           MONTH2 = 9;
  269.         }
  270.         else
  271.           MONTH2--;
  272.   }
  273. }
  274.   

  275. void main(void)
  276. {
  277.      
  278.        
  279.         TMOD=0x01;//设置定时器0为工作方式1
  280.     TH0=(65536-50000)/256;
  281.     TL0=(65536-50000)%256;
  282.     EA=1;//打开中断总开关
  283.     ET0=1;//开定时器0中断
  284.     TR0=1;//启动定时器0       
  285.        
  286.         P3 = 0XFF;
  287.         LcdInit();
  288.         while(1)
  289.         {
  290.           if (P3 != 0XFF)
  291.         switch(P3)
  292.         {
  293.         case 0xFE:                                    //按 按键后加一小时
  294.                 Lcd1602_Delay1ms(20);
  295.                 while(P3 == 0xFE);
  296.                 Lcd1602_Delay1ms(5);
  297.                 HOUR2++;
  298.                 break;
  299.         case 0xFD:                             //按 按键后减一小时
  300.                 Lcd1602_Delay1ms(20);
  301.                 while(P3 == 0xFD);
  302.                 Lcd1602_Delay1ms(5);
  303.                 if (HOUR1 != 0 && HOUR2 == 0)
  304.                 {
  305.                   HOUR1--;
  306.                   HOUR2 = 9;
  307.                   break;
  308.                 }
  309.                 else if(HOUR1 == 0 && HOUR2 == 0)
  310.                 {
  311.                   HOUR1 = 2;
  312.                   HOUR2 = 3;
  313.                   MINUTE1 = 0;
  314.                   MINUTE2 = 0;
  315.                   sub1day();  
  316.                 }
  317.                 else if (HOUR2 != 0)
  318.                 HOUR2--;
  319.                 break;
  320.         case 0xFB:              //按 按键后加一分钟
  321.                 Lcd1602_Delay1ms(20);
  322.                 while(P3 == 0xFB);
  323.             Lcd1602_Delay1ms(5);
  324.                 MINUTE2++;
  325.                 break;
  326.         case 0XF7:
  327.                 Lcd1602_Delay1ms(20);
  328.                 while(P3 == 0xF7);
  329.             Lcd1602_Delay1ms(5);
  330.                 if (MINUTE2 == 0)           //分钟减到0时处理
  331.                 {
  332.                   if(MINUTE1 == 0)
  333.                   {
  334.                     MINUTE1 = 5;
  335.                     MINUTE2 = 9;
  336.                     if (HOUR2 != 0)
  337.                       HOUR2--;
  338.                     else
  339.                     {
  340.                       if(HOUR1 != 0)
  341.                           {
  342.                         HOUR1--;
  343.                             HOUR2 = 9;
  344.                           }
  345.                           else
  346.                           {
  347.                             HOUR1 = 2;
  348.                             HOUR2 = 3;
  349.                             MINUTE1 = 5;
  350.                             MINUTE2 = 9;
  351.                             sub1day();  
  352.                           }
  353.                     }
  354.                   }
  355.                   else
  356.                   {
  357.                     MINUTE2 = 9;
  358.                         MINUTE1--;
  359.                   }
  360.                   break;
  361.                  }
  362.                  else
  363.                     MINUTE2--;
  364.                     break;          
  365.         case 0XDF:
  366.             Lcd1602_Delay1ms(20);
  367.                 while(P3 == 0xDF);
  368.             Lcd1602_Delay1ms(5);
  369.               sub1month();
  370.                 break;        
  371.         case 0XEF:
  372.             Lcd1602_Delay1ms(20);
  373.                 while(P3 == 0xEF);
  374.             Lcd1602_Delay1ms(5);
  375.                 add1month();
  376.                 break;          
  377.          case 0XBF:
  378.             Lcd1602_Delay1ms(20);
  379.                 while(P3 == 0xBF);
  380.             Lcd1602_Delay1ms(5);
  381.                 add1day(returnDays(MONTH1*10+MONTH2));
  382.                 break;          
  383.           case 0X7F:
  384.             Lcd1602_Delay1ms(20);
  385.                 while(P3 == 0x7F);
  386.             Lcd1602_Delay1ms(5);
  387.                 sub1day();
  388.                 break;          
  389.                
  390.                 default:
  391.             break;
  392.                  
  393.     }
  394.         }               
  395.             

  396. }
复制代码



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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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