找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2681|回复: 1
收起左侧

51单片机农历时钟Proteus仿真图与程序 LCD12864显示

[复制链接]
ID:437064 发表于 2021-7-30 16:29 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
2021-07-30_16-20-15.jpg 2021-07-30_16-22-13.jpg 2021-07-30_16-23-34.jpg

单片机源程序如下:
  1. #include <REGX52.H>
  2. #define        uint unsigned int
  3. #define        uchar unsigned char
  4. #include <zm.h>
  5. #include <_12864.H>
  6. #include <nongLi.h>
  7. init_time0(){
  8.         TMOD=0x01;
  9.         EA=ET0=TR0=1;
  10. }
  11. char c=0,sec=0,min=0,hour=12,day=12,mon=6,year=109;
  12. char week;
  13. bit flag,newShow=1;

  14. time0()interrupt 1        //定时器0中断
  15. {
  16.         TL0=(65536-5*110592/12)%256;
  17.         TH0=(65536-5*110592/12)/256;
  18.         c++;
  19.         if(c>=20)c=0,flag=1;   //1秒时间到
  20. }
  21. //
  22. DateAdd(){
  23.         if(flag){                  //如果到1秒则执行时间更新
  24.                 flag=0;        sec++;           //秒
  25.                 if(sec==60){
  26.                         sec=0; min++;  //分
  27.                         newShow=1;                 //每秒刷新一次显示
  28.                         if(min==60){
  29.                                 min=0;hour++;  //时
  30.                                 if(hour==24){
  31.                                         hour=0;day++;         //日
  32.                                         if(day>MonArr[LeapYear(year)][mon]){
  33.                                                 day=1; mon++;        //月
  34.                                                 if(mon==13){
  35.                                                         mon=1;year++;        //年
  36.                                                 }
  37.                                         }
  38.                                 }
  39.                         }
  40.                 }
  41.         }
  42. }
  43. #include <key.h>

  44. void main(){
  45.         init_time0();
  46.         Init12864();
  47.         while(1){
  48.                 keyCom();  //按键处理
  49.                 DateAdd();         //每秒更新新时钟
  50.                 if(newShow){
  51.                         newShow=0;
  52.                         /** 农历显示 **/
  53.                         getNongLi(year,mon,day);        //获取农历日期
  54.                         //显示天干地支,生肖
  55.                         showXY(0,66,15,2,TianGan_Table[(NL.year)%10]);
  56.                         showXY(0,82,15,2,DiZhi_Table[(NL.year)%12]);
  57.                         showXY(0,110,15,2,ShengXiao_Table[(NL.year)%12]);
  58.                         //农历月份
  59.                         if(NL.mon==1)showStr(2,64,"正");
  60.                         else showXY(2,64,15,2,nlMonCode[NL.mon-1]);
  61.                         showStr(2,80,"月");
  62.                         //农历日
  63.                         if(NL.day<11)showStr(2,96,"初");          //十位
  64.                         else if(NL.day<20)showStr(2,96,"十");
  65.                         else if(NL.day<30)showStr(2,96,"廿");
  66.                         else showStr(2,96,"三");
  67.                
  68.                         if(NL.day%10==0)showStr(2,112,"十");  //个位
  69.                         else  showXY(2,112,15,2,nlMonCode[NL.day%10-1]);
  70.                         
  71.                         /** 公历显示 **/
  72.                         showXY(0,0,20,5,zm20x40_Table[day/10]);        //大字
  73.                         showXY(0,20,20,5,zm20x40_Table[day%10]);
  74.                         showStr(2,40,"日");
  75.                         showNum8x16(6,0,(1901+year)/100);        //年
  76.                         showNum8x16(6,16,(1901+year)%100);
  77.                         showStr(6,32,"年");
  78.                         showNum8x16(6,48,mon);showStr(6,64,"月"); //月

  79.                         showStr(5,80,"星期");                           //星期
  80.                         week=getWeek(year,mon,day);
  81.                         if(week==6)showStr(5,112,"日");
  82.                         else showXY(5,112,15,2,nlMonCode[week]);

  83.                         showXY(7,92,5,1,zm5x8_Table[10]);        //冒号
  84.                         showXY(7,110,5,1,zm5x8_Table[10]);
  85.                           switch(keyCount){                                   //设置时,反白处理
  86.                                 case 1:notShow(6,2,0,32);break;        //年反白
  87.                                 case 2:notShow(6,2,48,16);break;//月反白
  88.                                 case 3:notShow(0,5,0,40);break;        //日反白                        
  89.                         }
  90.                         rect(0,0,40,60); rect(34,60,35,127); //画线条
  91.                 }
  92.                 //时分秒
  93.                 if(c>15&&keyCount>3){           //设置时闪烁处理
  94.                         if(keyCount==4){
  95.                                 showXY(7,81,5,1,zm5x8_Table[11]);//时
  96.                                 showXY(7,87,5,1,zm5x8_Table[11]);
  97.                         }
  98.                         else if(keyCount==5){
  99.                                 showXY(7,99,5,1,zm5x8_Table[11]);//分
  100.                                 showXY(7,105,5,1,zm5x8_Table[11]);
  101.                         }
  102.                         else if(keyCount==6){
  103.                                 showXY(7,116,5,1,zm5x8_Table[11]);//秒
  104.                                 showXY(7,122,5,1,zm5x8_Table[11]);
  105.                         }
  106.                 }
  107.                 else {                                           //时分秒正常显示
  108.                         showNum5x8(7,81,hour);
  109.                         showNum5x8(7,99,min);
  110.                         showNum5x8(7,116,sec);
  111.                 }
  112.         }
  113. }
复制代码
51hei.png
Proteus7.5版本的工程文件和程序下载:
农历钟.zip (36.77 KB, 下载次数: 71)

评分

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

查看全部评分

回复

使用道具 举报

ID:102963 发表于 2021-8-1 12:21 | 显示全部楼层
农历部分程序有问题,2021年7月30日,农历是六月二十一!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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