找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自己写的lcd1602时钟仿真,有闹钟功能,哪位高手能增加个长按暂停键唤出闹钟界面功能

[复制链接]
跳转到指定楼层
楼主
如果能把长按暂停键唤出闹钟界面就好了,但是不成功,各位大神看看怎么改

无标题.png (278.45 KB, 下载次数: 117)

效果图

效果图

无标题1.png (278.11 KB, 下载次数: 113)

效果图

效果图

1602时钟.rar

1.33 MB, 下载次数: 96

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:84598 发表于 2015-7-21 12:41 | 只看该作者
仿真及程序都在压缩包里
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit RS=P1^3;
  5. sbit R_W=P1^4;
  6. sbit E=P1^5;
  7. sbit wx=P2^6;
  8. sbit dx=P2^7;
  9. sbit O=P3^4;
  10. sbit L=P3^5;
  11. sbit R=P3^6;
  12. sbit S=P3^7;
  13. sbit beep=P2^2;
  14. uint n=2015;
  15. uchar num,w,s=6,f=0,m=0,q,p,y=5,d=5,cs,cf,t=0x58;
  16. char r=0;
  17. bit a;
  18. uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
  19. uchar code table1[]={"Mon"};
  20. uchar code table2[]={"Tue"};
  21. uchar code table3[]={"Wed"};
  22. uchar code table4[]={"Thu"};
  23. uchar code table5[]={"Fri"};
  24. uchar code table6[]={"Sat"};
  25. uchar code table7[]={"Sun"};
  26. void lcdshow();
  27. void delay(uchar s)
  28. {
  29.         uchar j,k;
  30.         for(j=s;j>0;j--)
  31.                 for(k=114;k>0;k--);
  32. }
  33. void R_busy()
  34. {
  35.         P0=0x00;
  36.         RS=0;
  37.         R_W=1;
  38.         E=1;
  39.         while(P0&0x80);
  40.         E=0;
  41. }
  42. void W_cmd(uchar com)
  43. {
  44.         R_busy();
  45.         RS=0;
  46.         R_W=0;
  47.         P0=com;
  48.         delay(2);
  49.         E=1;
  50.         delay(2);
  51.         E=0;
  52. }
  53. void W_data(uchar date)
  54. {
  55.         R_busy();
  56.         RS=1;
  57.         R_W=0;
  58.         P0=date;
  59.         delay(2);
  60.         E=1;
  61.         delay(2);
  62.         E=0;
  63. }
  64. void init()
  65. {
  66.         wx=0;
  67.         dx=0;
  68.         E=0;
  69.         EA=1;
  70.         ET0=1;
  71.         TR0=1;
  72.         TMOD=0x01;
  73.         TH0=(65536-46080)/256;
  74.         TL0=(65536-46080)%256;
  75.         W_cmd(0x38);
  76.         W_cmd(0x0c);
  77.         W_cmd(0x06);
  78.         W_cmd(0x01);
  79. }
  80. void week()
  81. {
  82.         uchar m;
  83.         w=((n/100)/4)-2*(n/100)+(n%100)+((n%100)/4)+((13*(y+1))/5)+d-1;
  84.         W_cmd(0x80+0x0c);
  85.         switch(w%7)
  86.         {
  87.                 case 0:
  88.                 for(m=0;m<3;m++)
  89.                 {
  90.                         W_data(table7[m]);
  91.                 }
  92.                 break;

  93.                 case 1:
  94.                 for(m=0;m<3;m++)
  95.                 {
  96.                         W_data(table1[m]);
  97.                 }
  98.                 break;

  99.                 case 2:
  100.                 for(m=0;m<3;m++)
  101.                 {
  102.                         W_data(table2[m]);
  103.                 }
  104.                 break;

  105.                 case 3:
  106.                 for(m=0;m<3;m++)
  107.                 {
  108.                         W_data(table3[m]);
  109.                 }
  110.                 break;

  111.                 case 4:
  112.                 for(m=0;m<3;m++)
  113.                 {
  114.                         W_data(table4[m]);
  115.                 }
  116.                 break;

  117.                 case 5:
  118.                 for(m=0;m<3;m++)
  119.                 {
  120.                         W_data(table5[m]);
  121.                 }
  122.                 break;

  123.                 case 6:
  124.                 for(m=0;m<3;m++)
  125.                 {
  126.                         W_data(table6[m]);
  127.                 }
  128.                 break;

  129.                 default:
  130.                 break;
  131.         }
  132. }
  133. void control_move()
  134. {
  135.         switch(r)
  136.         {
  137.                 case 0:
  138.                 W_cmd(0x80+0x01);
  139.                 break;

  140.                 case 1:
  141.                 W_cmd(0x80+0x02);
  142.                 break;

  143.                 case 2:
  144.                 W_cmd(0x80+0x03);
  145.                 break;

  146.                 case 3:
  147.                 W_cmd(0x80+0x04);
  148.                 break;

  149.                 case 4:
  150.                 W_cmd(0x80+0x06);
  151.                 break;

  152.                 case 5:
  153.                 W_cmd(0x80+0x07);
  154.                 break;

  155.                 case 6:
  156.                 W_cmd(0x80+0x09);
  157.                 break;

  158.                 case 7:
  159.                 W_cmd(0x80+0x0a);
  160.                 break;

  161.                 case 8:
  162.                 W_cmd(0x80+0x44);
  163.                 break;

  164.                 case 9:
  165.                 W_cmd(0x80+0x45);
  166.                 break;

  167.                 case 10:
  168.                 W_cmd(0x80+0x47);
  169.                 break;

  170.                 case 11:
  171.                 W_cmd(0x80+0x48);
  172.                 break;

  173.                 case 12:
  174.                 W_cmd(0x80+0x4a);
  175.                 break;

  176.                 case 13:
  177.                 W_cmd(0x80+0x4b);
  178.                 break;

  179.                 case 14:
  180.                 W_cmd(0x80+0x4e);
  181.                 break;

  182.                 case 16:
  183.                 W_cmd(0x80+0x11);
  184.                 W_data(table[cs/10]);
  185.                 W_cmd(0x80+0x11);
  186.                 break;

  187.                 case 17:
  188.                 W_cmd(0x80+0x12);
  189.                 W_data(table[cs%10]);
  190.                 W_cmd(0x80+0x12);
  191.                 break;

  192.                 case 18:
  193.                 W_cmd(0x80+0x14);
  194.                 W_data(table[cf/10]);
  195.                 W_cmd(0x80+0x14);
  196.                 break;

  197.                 case 19:
  198.                 W_cmd(0x80+0x15);
  199.                 W_data(table[cf%10]);
  200.                 W_cmd(0x80+0x15);
  201.                 break;

  202.                 case 20:
  203.                 W_cmd(0x80+0x17);
  204.                 break;

  205.                 case 21:
  206.                 W_cmd(0x80+0x19);
  207.                 break;

  208.                 default:
  209.                 if(r>20)
  210.                         W_cmd(0x80+0x11);
  211.                 if(r<16)
  212.                         W_cmd(0x80+0x01);
  213.                 break;
  214.         }
  215. }
  216. void leap()
  217. {
  218.         switch(y)
  219.         {
  220.                 case 2:
  221.                 if(n%4==0&&n%100!=0||n%400==0)
  222.                 {
  223.                         if(d>29)
  224.                         d=1;
  225.                         y++;
  226.                 }
  227.                 else
  228.                 {
  229.                         if(d>28)
  230.                         d=1;
  231.                         y++;
  232.                 }
  233.                 break;

  234.                 case 4:
  235.                 if(d>30)
  236.                 {
  237.                         d=1;
  238.                         y++;
  239.                 }
  240.                 break;

  241.                 case 6:
  242.                 if(d>30)
  243.                 {
  244.                         d=1;
  245.                         y++;
  246.                 }
  247.                 break;

  248.                 case 9:
  249.                 if(d>30)
  250.                 {
  251.                         d=1;
  252.                         y++;
  253.                 }
  254.                 break;

  255.                 case 11:
  256.                 if(d>30)
  257.                 {
  258.                         d=1;
  259.                         y++;
  260.                 }
  261.                 break;

  262.                 default:
  263.                 if(d>31)
  264.                 {
  265.                         d=1;
  266.                         y++;
  267.                 }
  268.                 break;
  269.         }
  270. }
  271. void lcdshow()
  272. {
  273.         W_cmd(0x80);
  274.         W_data(0x20);
  275.         W_data(table[n/1000]);
  276.         W_data(table[(n/100)%10]);
  277.         W_data(table[(n/10)%10]);
  278.         W_data(table[n%10]);
  279.         W_data(0x2f);
  280.         W_data(table[y/10]);
  281.         W_data(table[y%10]);
  282.         W_data(0x2f);
  283.         W_data(table[d/10]);
  284.         W_data(table[d%10]);
  285.         W_cmd(0x80+0x44);
  286.         W_data(table[s/10]);
  287.         W_data(table[s%10]);
  288.         W_data(0x3a);
  289.         W_data(table[f/10]);
  290.         W_data(table[f%10]);
  291.         W_data(0x3a);
  292.         W_data(table[m/10]);
  293.         W_data(table[m%10]);   
  294.         W_cmd(0x80+0x11);
  295.         W_data(table[cs/10]);
  296.         W_data(table[cs%10]);
  297.         W_data(0x3a);
  298.         W_data(table[cf/10]);
  299.         W_data(table[cf%10]);
  300.         W_cmd(0x80+0x17);
  301.         W_data(t);
  302.         W_cmd(0x80+0x19);
  303.         W_data(0x3c);
  304.         week();
  305.         beep=1;
  306. }

  307. void control_set()
  308. {
  309.         uchar c;       
  310.         switch(r)
  311.         {
  312.                 case 0:
  313.                 n=n+1000;
  314.                 if(n>9999)
  315.                         n=0;
  316.                 lcdshow();
  317.                 W_cmd(0x80+0x01);
  318.                 break;

  319.                 case 1:
  320.                 n=n+100;
  321.                 if(n>9999)
  322.                         n=0;
  323.                 lcdshow();
  324.                 W_cmd(0x80+0x02);
  325.                 break;

  326.                 case 2:
  327.                 n=n+10;
  328.                 if(n>9999)
  329.                         n=0;
  330.                 lcdshow();
  331.                 W_cmd(0x80+0x03);
  332.                 break;

  333.                 case 3:
  334.                 n=n+1;
  335.                 if(n>9999)
  336.                         n=0;
  337.                 lcdshow();
  338.                 W_cmd(0x80+0x04);
  339.                 break;

  340.                 case 4:
  341.                 y=y+10;
  342.                 if(y>12)
  343.                 {
  344.                         y=1;
  345.                 }
  346.                 lcdshow();
  347.                 W_cmd(0x80+0x06);
  348.                 break;

  349.                 case 5:
  350.                 y=y+1;
  351.                 if(y>12)
  352.                 {       
  353.                         y=1;
  354.                 }
  355.                 lcdshow();
  356.                 W_cmd(0x80+0x07);
  357.                 break;

  358.                 case 6:
  359.                 d=d+10;
  360.                 leap();
  361.                 lcdshow();
  362.                 W_cmd(0x80+0x09);
  363.                 break;

  364.                 case 7:
  365.                 d=d+1;
  366.                 leap();
  367.                 lcdshow();
  368.                 W_cmd(0x80+0x0a);
  369.                 break;

  370.                 case 8:
  371.                 s=s+10;
  372.                 if(s>23)       
  373.                         s=0;
  374.                 lcdshow();
  375.                 W_cmd(0x80+0x44);
  376.                 break;

  377.                 case 9:
  378.                 s=s+1;
  379.                 if(s>23)
  380.                         s=0;
  381.                 lcdshow();
  382.                 W_cmd(0x80+0x45);
  383.                 break;

  384.                 case 10:
  385.                 f=f+10;
  386.                 if(f>59)
  387.                         f=0;
  388.                 lcdshow();
  389.                 W_cmd(0x80+0x47);
  390.                 break;

  391.                 case 11:
  392.                 f=f+1;
  393.                 if(f>59)
  394.                         f=0;
  395.                 lcdshow();
  396.                 W_cmd(0x80+0x48);
  397.                 break;

  398.                 case 12:
  399.                 m=m+10;
  400.                 if(m>59)
  401.                         m=0;
  402.                 lcdshow();
  403.                 W_cmd(0x80+0x4a);
  404.                 break;

  405.                 case 13:
  406.                 m=m+1;
  407.                 if(m>59)
  408.                         m=0;
  409.                 lcdshow();
  410.                 W_cmd(0x80+0x4b);
  411.                 break;

  412.                 case 14:
  413.                 for(c=0;c<16;c++)
  414.                 {
  415.                         W_cmd(0x18);
  416.                         delay(150);
  417.                 }
  418.                 r=16;
  419.                 W_cmd(0x80+0x11);
  420.                 break;

  421.                 case 16:
  422.                 cs=cs+10;
  423.                 if(cs>23)
  424.                         cs=0;
  425.                 W_cmd(0x80+0x11);
  426.                 W_data(table[cs/10]);
  427.                 W_data(table[cs%10]);
  428.                 W_cmd(0x80+0x11);
  429.                 break;

  430.                 case 17:
  431.                 cs=cs+1;
  432.                 if(cs>23)
  433.                         cs=0;
  434.                 W_cmd(0x80+0x11);
  435.                 W_data(table[cs/10]);
  436.                 W_data(table[cs%10]);
  437.                 W_cmd(0x80+0x12);
  438.                 break;

  439.                 case 18:
  440.                 cf=cf+10;
  441.                 if(cf>59)
  442.                         cf=0;
  443.                 W_data(table[cf/10]);
  444.                 W_data(table[cf%10]);
  445.                 W_cmd(0x80+0x14);
  446.                 break;

  447.                 case 19:
  448.                 cf=cf+1;
  449.                 if(cf>59)
  450.                         cf=0;
  451.                 W_cmd(0x80+0x14);
  452.                 W_data(table[cf/10]);
  453.                 W_data(table[cf%10]);
  454.                 W_cmd(0x80+0x15);
  455.                 break;

  456.                 case 20:
  457.                 a=~a;
  458.                 if(a==1)
  459.                         t=0x4f;
  460.                 else
  461.                         t=0x58;
  462.                 W_cmd(0x80+0x17);
  463.                 W_data(t);
  464.                 W_cmd(0x80+0x17);
  465.                 break;

  466.                 case 21:
  467.                 for(c=0;c<16;c++)
  468.                 {
  469.                         W_cmd(0x1c);
  470.                         delay(150);
  471.                 }
  472.                 W_cmd(0x80+0x01);
  473.                 r=0;
  474.                 break;
  475.         }
  476. }
  477. void control()
  478. {
  479.         if(O==0)
  480.         {
  481.                 delay(10);
  482.                 if(O==0)
  483.                 {
  484.                         while(!O);
  485.                         TR0=0;
  486.                         W_cmd(0x0f);
  487.                         W_cmd(0x80+0x4e);
  488.                         W_data(0x43);
  489.                         W_cmd(0x80+0x01);
  490.                         while(1)
  491.                         {
  492.                                 if(O==0)
  493.                                 {
  494.                                         delay(10);
  495.                                         if(O==0)
  496.                                         {
  497.                                                 while(!O);
  498.                                                 TR0=1;
  499.                                                 r=0;
  500.                                                 init();
  501.                                                 break;
  502.                                         }
  503.                                 }
  504.                                 if(L==0)
  505.                                 {
  506.                                         delay(10);
  507.                                         if(L==0)
  508.                                         {
  509.                                                 while(!L);
  510.                                                 r--;
  511.                                                 if(r<0)
  512.                                                 {
  513.                                                         r=14;
  514.                                                         W_cmd(0x80+0x4b);
  515.                                                 }
  516.                                                 if(r>14&&r<16)
  517.                                                 {
  518.                                                         r=21;
  519.                                                         W_cmd(0x80+0x15);
  520.                                                 }
  521.                                                 control_move();
  522.                                         }
  523.                                 }
  524.                                 if(R==0)
  525.                                 {
  526.                                         delay(10);
  527.                                         if(R==0)
  528.                                         {
  529.                                                 while(!R);
  530.                                                 r++;
  531.                                                 if(r>14)
  532.                                                 {
  533.                                                         if(r<16)
  534.                                                         {
  535.                                                                 r=0;
  536.                                                                 W_cmd(0x80+0x01);
  537.                                                         }
  538.                                                         if(r>21)
  539.                                                         {
  540.                                                                 r=16;
  541.                                                                 W_cmd(0x80+0x11);
  542.                                                         }
  543.                                                 }
  544.                                                 control_move();
  545.                                         }
  546.                                 }
  547.                                 if(S==0)
  548.                                 {
  549.                                         delay(10);
  550.                                         if(S==0)
  551.                                         {
  552.                                                 while(!S);
  553.                                                 control_set();
  554.                                         }
  555.                                 }               
  556.                         }
  557.                         lcdshow();
  558.                 }
  559.         }
  560. }
  561. void count()
  562. {
  563.         if(num==20)
  564.         {
  565.                 m++;
  566.                 if(a==1)
  567.                 {
  568.                         if(cs==s)
  569.                         {
  570.                                 if(cf==f)
  571.                                 {
  572.                                         beep=~beep;
  573.                                 }
  574.                         }
  575.                 }
  576.                 num=0;
  577.                 if(m==60)
  578.                 {
  579.                         f++;
  580.                         m=0;
  581.                         if(f==60)
  582.                         {
  583.                                 beep=0;
  584.                                 s++;
  585.                                 f=0;
  586.                                 if(s==24)
  587.                                 {
  588.                                         s=0;
  589.                                         d++;
  590.                                         leap();
  591.                                         if(y>12)
  592.                                         {
  593.                                                 y=1;
  594.                                                 n++;
  595.                                                 if(n>9999)
  596.                                                         n=0;
  597.                                         }
  598.                                 }
  599.                         }
  600.                 }
  601.                 lcdshow();       
  602.         }
  603. }
  604. void main()
  605. {
  606.         init();
  607.         lcdshow();
  608.         while(1)
  609.         {
  610.                 count();
  611.                 control();
  612.         }
  613. }
  614. void Timer()interrupt 1
  615. {
  616.         TH0=(65536-46080)/256;
  617.         TL0=(65536-46080)%256;
  618.         num++;
  619. }
复制代码



评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:86056 发表于 2015-7-23 11:48 | 只看该作者
程序如上,识别按键被按下,做对应的输出

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:98756 发表于 2015-12-9 13:07 | 只看该作者
proteus7.8闹钟显示不对怎么办
回复

使用道具 举报

5#
ID:116303 发表于 2016-5-25 11:35 | 只看该作者
程序不错
回复

使用道具 举报

6#
ID:123210 发表于 2016-5-25 20:49 | 只看该作者
二楼写得不错
回复

使用道具 举报

7#
ID:123289 发表于 2016-5-26 12:12 | 只看该作者
方法:
设你的长按键叫CA,S就是你长按的时间门限值;
1,设定一个标记叫CAOK,=1时表示长按成功;
2,做一个按键计时器K,设定一个标记KY,约定KY=1时,由时间中断(如10ms)进行K+1;
实现:
1,每次检测时:有CA时KY=1.<起动计时器>
2,每次检测时:无CA时KY=1,K=0.KY=0<清计时器并清0>(必须多次检测,且间隔时间<<S);
3,当K=S时,置CAOK=1;
4,当CAOK被使用完成后,请记得清CAOK=0;
这样还不够,这里不说了.就是长按时间>S后的处理.留给你自己解决吧.

评分

参与人数 1黑币 +100 收起 理由
admin + 100 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:84598 发表于 2016-5-26 17:27 | 只看该作者
yzwzfyz 发表于 2016-5-26 12:12
方法:
设你的长按键叫CA,S就是你长按的时间门限值;
1,设定一个标记叫CAOK,=1时表示长按成功;

好久之前写的东西了,这些功能后来已经实现了,还有1302,屏幕也换成12864了,已经移植到STM32上了,不过还是多谢了
回复

使用道具 举报

9#
ID:649345 发表于 2019-11-25 22:04 | 只看该作者
程序写的不错,就是二月份不管是什么年份都直接跳过了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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