找回密码
 立即注册

QQ登录

只需一步,快速开始

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

12864液晶万年历制作

[复制链接]
ID:108531 发表于 2016-3-12 21:22 | 显示全部楼层 |阅读模式


  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit LCD_RS=P2^6;
  5. sbit LCD_RW=P2^5;
  6. sbit LCD_EN=P2^7;
  7. sbit LCD_PSB=P3^2;
  8. sbit s1=P1^4;        //独立按键
  9. sbit s2=P1^5;
  10. sbit s3=P1^6;
  11. sbit rd=P1^7;
  12. sbit beep=P2^3;                                        //定义蜂鸣器端口
  13. uchar  miao,shi,fen,mon,day,week,year1,year2,i, s1num,count;
  14. uint a,b,year;
  15. uchar code dis2[]={"星期 "};  
  16. uchar code dis3[]={ "风雨恋情"};
  17. void delay_1ms(uint z)
  18. {
  19. uint x,y;
  20. for(x=z;x>0;x--)
  21.    for(y=110;y>0;y--);
  22. }
  23. void di()                        //蜂鸣器
  24. {
  25. beep=0;
  26. delay_1ms(100);
  27. beep=1;
  28. }
  29. void write_cmd(uchar cmd)        //写命令
  30. {
  31. LCD_RS=0;
  32. LCD_RW=0;
  33. LCD_EN=0;
  34. P0=cmd;
  35. delay_1ms(5);
  36. LCD_EN=1;
  37. delay_1ms(5);
  38. LCD_EN=0;
  39. }
  40. void write_dat(uchar dat)                                  //写数据
  41. {
  42. LCD_RS=1;
  43. LCD_RW=0;
  44. LCD_EN=0;
  45. P0=dat;
  46. delay_1ms(5);
  47. LCD_EN=1;
  48. delay_1ms(5);
  49. LCD_EN=0;
  50. }

  51. void write_sfm(uchar add,char dat)         //写时分秒
  52. {
  53. uchar shi1,ge1;

  54. shi1=dat/10;
  55. ge1=dat%10;
  56. write_cmd(0x90+add);                          //写显示地址的指令
  57. write_dat(0x30+shi1);
  58. write_dat(0x30+ge1);
  59. //ge2=dat%10;
  60. //write_cmd(0x88+add);
  61. // write_dat(0x30+ge2);

  62. }
  63. void write_nyr(uchar add,char dat)                         //写年月
  64. {
  65. char shi,ge;
  66. shi=dat/10;
  67. ge=dat%10;
  68. write_cmd(0x80+add);
  69. write_dat(0x30+shi);
  70. write_dat(0x30+ge);
  71. }
  72. void write_week(uchar add,char dat)                                //写星期
  73. {
  74. char ge2;
  75. ge2=dat%10;
  76. write_cmd(0x88+add);
  77. write_dat(0x30+ge2);
  78. }
  79. void init()
  80. {                                                                                         //初始化   2014年11月6日星期1  23:59:59

  81. LCD_PSB=1;
  82. rd=0;
  83. LCD_EN=0;

  84. fen=59;
  85. miao=59;
  86. shi=23;
  87. week=1;
  88. year1=20;
  89. year2=14;
  90. mon=11;
  91. day=6;
  92. count=0;
  93. s1num=0;
  94. TMOD=0x01;                                                         //中断0,方式1
  95. TH0=(65536-50000)/256;
  96. TL0=(65536-50000)%256;
  97. EA=1;
  98. ET0=1;
  99. TR0=1;
  100. write_cmd(0x30);
  101. delay_1ms(5);
  102. write_cmd(0x0c);
  103. delay_1ms(5);
  104. write_cmd(0x01);
  105. delay_1ms(5);
  106. write_cmd(0x91);
  107. write_dat(':');
  108. delay_1ms(5);
  109. write_cmd(0x93);
  110. write_dat(':');
  111. delay_1ms(5);
  112. write_sfm(4,miao);
  113. write_sfm(2,fen);
  114. write_sfm(0,shi) ;
  115. write_cmd(0x82);
  116. write_dat('-');
  117. delay_1ms(5);
  118. write_cmd(0x84);
  119. write_dat('-');
  120. delay_1ms(5);
  121. write_nyr(5,day);
  122. write_nyr(3,mon);
  123. write_nyr(0,year1);
  124. write_nyr(1,year2);
  125. write_week(2,week);
  126. }
  127. void keyscan()                                  //独立键盘检测
  128. {
  129. if(s1==0)
  130. {
  131.   delay_1ms(5);
  132.   if(s1==0)
  133.   {
  134.    s1num++;
  135.    while(!s1);
  136.    di();
  137.    if(s1num==1)
  138.    {
  139.     TR0=0;
  140.         write_cmd(0x80);   //光标定位到年的位置
  141.         write_cmd(0x0f);   //光标开始闪数
  142.         }
  143.         if(s1num==2)
  144.         {
  145.         write_cmd(0x81);                //光标定位到年的位置
  146.         }
  147.         if(s1num==3)
  148.         {
  149.          write_cmd(0x83);                  //光标定位到月的位置
  150.          }
  151.          if(s1num==4)
  152.          {
  153.           write_cmd(0x85);                         //光标定位到天的位置
  154.           }
  155.           if(s1num==5)
  156.           {
  157.            write_cmd(0x90);                //光标定位到时的位置
  158.                 }
  159.                 if(s1num==6)
  160.                 {
  161.                 write_cmd(0x92);                //光标定位到分的位置
  162.                 }
  163.                 if(s1num==7)
  164.                 {
  165.                  write_cmd(0x94); //光标定位到秒的位置
  166.                  }
  167.                   if(s1num==8)
  168.                   {
  169.                    write_cmd(0x8a);                //光标定位到星期的位置
  170.                   }
  171.                    if(s1num==9)
  172.                   {
  173.                   s1num=0;
  174.                   write_cmd(0x0c);                        //取消光标闪数
  175.                   TR0=1;                                        //启动定时器
  176.                   }
  177.                 }
  178.         }
  179. if(s1num!=0)                                         //只有功能键被按下后,增大和减小键才有效
  180. {
  181. if(s2==0)
  182. {
  183.   delay_1ms(5);
  184.   if(s2==0)
  185.   {
  186.    while(!s2);
  187.    di();
  188.    if(s1num==1)
  189.    {
  190.     year1++;
  191.         if(year1==99)
  192.          year1=0;
  193. write_nyr(0,year1);
  194.         write_cmd(0x80);
  195.         }
  196.         if(s1num==2)
  197.         {
  198.          year2++;
  199.         if(year2==99)
  200.          year2=0;
  201.         write_nyr(1,year2);
  202.         write_cmd(0x81);
  203.         }
  204.         if(s1num==3)
  205.         {
  206.         mon++;
  207.         if(mon==13)
  208.         mon=1;
  209.         write_nyr(3,mon);
  210.         write_cmd(0x83);
  211.         }
  212.         if(s1num==4)
  213.         {
  214.         day++;
  215.         if(day==a+1)
  216.          day=1;
  217.         write_nyr(5,day);
  218.         write_cmd(0x85);
  219.         }
  220.         if(s1num==5)
  221.         {
  222.         shi++;
  223.         if(shi==23)
  224.         shi=0;
  225.     write_sfm(0,shi);
  226.         write_cmd(0x90);
  227.         }
  228.         if(s1num==6)
  229.         {
  230.         fen++;
  231.         if(fen==59)
  232.         fen=0;
  233.         write_sfm(2 ,fen);
  234.         write_cmd(0x92);
  235.         }
  236.         if(s1num==7)
  237.         {
  238.         miao++;
  239.          if(miao==59)
  240.         miao=0;
  241.         write_sfm(4,miao);
  242.         write_cmd(0x94);
  243.         }
  244.         if(s1num==8)
  245.         {
  246.         week++;
  247.         if(week==8)
  248.         week=0;
  249.         write_week(2,week);
  250.         write_cmd(0x8a);
  251.         }
  252.   }
  253. }
  254. if(s3==0)
  255. {
  256.   delay_1ms(5);
  257.   if(s3==0)
  258.   {
  259.    while(!s3);
  260.    di();
  261.    if(s1num==1)
  262.    {
  263.     year1--;
  264.         if(year1==-1)
  265.          year1=99;
  266. write_nyr(0,year1);
  267.         write_cmd(0x80);
  268.         }
  269.         if(s1num==2)
  270.         {
  271.          year2--;
  272.         if(year2==-1)
  273.          year2=99;
  274.         write_nyr(1,year2);
  275.         write_cmd(0x81);
  276.         }
  277.         if(s1num==3)
  278.         {
  279.         mon--;
  280.         if(mon==0)
  281.         mon=12;
  282.         write_nyr(3,mon);
  283.         write_cmd(0x83);
  284.         }
  285.         if(s1num==4)
  286.         {
  287.         day--;
  288.         if(day==0)
  289.          day=a;
  290.         write_nyr(5,day);
  291.         write_cmd(0x85);
  292.         }
  293.         if(s1num==5)
  294.         {
  295.         shi--;
  296.         if(shi==-1)
  297.         shi=23;
  298. write_sfm(0,shi);
  299.         write_cmd(0x90);
  300.         }
  301.         if(s1num==6)
  302.         {
  303.        
  304.         fen--;
  305.         if(fen==-1)
  306.         fen=59;
  307.         write_sfm(2 ,fen);
  308.         write_cmd(0x92);

  309.         }
  310.         if(s1num==7)
  311.         {
  312.         miao--;
  313.          if(miao==-1)
  314.         miao=59;
  315.         write_sfm(4,miao);
  316.         write_cmd(0x94);
  317.         }

  318.         if(s1num==8)
  319.         {
  320.         week--;
  321.         if(week==0)
  322.         week=7;
  323.         write_week(2,week);
  324.         write_cmd(0x8a);
  325.         }
  326.   }
  327. }
  328. }
  329. }
  330. void display()//判断月份年份天数
  331. {                                           
  332. year=year2+year1*100;
  333. if(mon==1||3||5||7||8||10||12)
  334. a=31;
  335. if(mon==4||6||9||11)
  336. a=30;
  337. if(mon==2)
  338. {
  339.   if(year%4!=0)
  340.   a=28;
  341.   else
  342.   a=29;
  343. }
  344. }

  345. void main()
  346. {
  347. init();
  348.   write_cmd(0x98);          //地址
  349. for(i=0;i<8;i++)
  350. {
  351. write_dat(dis3[i]);
  352. delay_1ms(5);
  353. }
  354. write_cmd(0x88);                  //地址
  355. for(i=0;i<4;i++)
  356. {
  357. write_dat(dis2[i]);
  358. delay_1ms(5);
  359. }
  360.    while(1)
  361.    {
  362.   keyscan();
  363.   display();
  364.   }
  365. }
  366. void timer0()interrupt 1
  367. {
  368. TH0=(65536-50000)/256;
  369. TL0=(65536-50000)%256;
  370. count++;
  371. if(count==20)
  372. {
  373.   count=0;
  374.   miao++;
  375.   if(miao==60)
  376.   {
  377.    miao=0;
  378.    fen++;
  379.    if(fen==60)
  380.    {
  381.     fen=0;
  382.         shi++;
  383.         if(shi==24)
  384.         {
  385.         shi=0;
  386.         day++;
  387.         week++;
  388.         if(week==7)
  389.         {
  390.          week=0;
  391.         }                 
  392.         if(day==a)
  393.         {
  394.          day=0;
  395.          mon++;
  396.          if(mon==12)
  397.          {
  398.           mon=0;
  399.           year2++;
  400.           if(year2==99)
  401.           {
  402.            year2=-1;
  403.                 year1++;
  404.          }
  405.           write_nyr(0,year1);
  406.           write_nyr(1,year2);
  407.          }
  408.          write_nyr(3,mon);
  409.          }
  410.          write_nyr(5,day);
  411.         }
  412.         write_week(2,week);
  413.         write_sfm(0,shi);
  414.     }
  415.         write_sfm(2,fen);
  416.    }
  417.    write_sfm(4,miao);
  418.   }  
  419. }
复制代码




回复

使用道具 举报

ID:1094355 发表于 2024-1-21 22:40 | 显示全部楼层
感谢分享,跟着这么好的例子容易上手
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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