找回密码
 立即注册

QQ登录

只需一步,快速开始

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

数码管时钟和按键结合的问题,有点小问题,请教下大家

[复制链接]
跳转到指定楼层
楼主
最近学了数码管的时钟显示和按键的控制,于是想到小时候戴过的几块钱的电子表,就想实现一个,可以通过按键来手动调时间!代码写好了,单片机也能跑起来,不按按键的时候,时钟可以自动实现,但是有问题,就是当我用按键实现对分钟和时钟的调整(这里是加1)后,这个时钟就会停止运行了!我的猜想是,按键实现后,程序没有进入到中断里面了,所以时钟停止!但不知道对不对!代码如下
  1. #include <reg52.h>
  2. sbit S5=P3^7;//按键控制分钟的调整
  3. sbit S4=P3^6;//按键控制时钟的调整
  4. sbit D1=P1^0;
  5. sbit D2=P1^1;
  6. sbit WELA=P2^7;
  7. sbit DULA=P2^6;
  8. #define uint unsigned int
  9. uint num ,a,b,c,d,e,f,g,x,y,z;
  10. void delay(uint z);//延时
  11. void display(uint a,uint b,uint c,uint d, uint e,uint f);//数码管显示函数
  12. unsigned char code table1[]=
  13. {
  14.         0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F

  15. };
  16. unsigned char code table2[]=
  17. {
  18. 0XDF,0XEF,0XF7,0XFB,0XFD,0XFE

  19. };
  20. void main()
  21.         {
  22.         TMOD=0X00;
  23.         TH0=(8192-8000)/32;
  24.         TL0=(8192-8000)%32;
  25.         EA=1;
  26.         ET0=1;
  27.         TR0=1;

  28.         while(1)
  29.         {       
  30.                 if(num==1)
  31.                 {
  32.                         num=0;
  33.                         a++;
  34.                 }
  35.                 if(S5==0)
  36.                 {
  37.                                 delay(10);
  38.                                 if(S5==0)
  39.                         {
  40.                                         D1=0;
  41.                                         c++;
  42.                                         if(c==10)
  43.                                         {
  44.                                                 d++;
  45.                                                 c=0;
  46.                                                 if(d==6)
  47.                                                 {
  48.                                                         e++;
  49.                                                          d=0;
  50.                                                         if(e==24)
  51.                                                         {
  52.                                                                 e=0;
  53.                                                         }
  54.                                                 }
  55.                                         }
  56.                                 while(!S5);
  57.                                 delay(10);
  58.                                 while(!S5);
  59.                         }
  60.                 }
  61.                 if(S4==0)
  62.                 {
  63.                         delay(10);
  64.                         if(S4==0)
  65.                         {
  66.                                 D2=0;
  67.                                 e++;
  68.                                 if(e==24)
  69.                                 {
  70.                                         e=0;
  71.                                 }
  72.                                 while(!S4);
  73.                                 delay(10);
  74.                                 while(!S4);
  75.                         }
  76.                 }
  77.                         else
  78.                         {
  79.                                 D1=1;
  80.                                 D2=1;
  81.                         }
  82.                 if(a==10)
  83.                 {
  84.                         b++;
  85.                         a=0;
  86.                         if(b==6)
  87.                         {
  88.                                 c++;
  89.                                 b=0;
  90.                                 if(c==10)
  91.                                 {
  92.                                         d++;
  93.                                         c=0;
  94.                                         if(d==6)
  95.                                         {
  96.                                                 e++;
  97.                                                  d=0;
  98.                                                 if(e==24)
  99.                                                 {
  100.                                                         e=0;
  101.                                                 }
  102.                                         }
  103.                                 }
  104.                         }
  105.                 }
  106.                 g=e%10;
  107.                 f=(e-g)/10;       
  108.                 display(a,b,c,d,g,f);
  109.           }
  110. }
  111. void display(uint a,uint b,uint c,uint d,uint g,uint f)
  112.         {
  113.         WELA=1;
  114.         P0=table2[0];
  115.         WELA=0;
  116.         DULA=1;
  117.         P0=table1[a];
  118.         DULA=0;
  119.         delay(2);
  120.         WELA=1;
  121.         P0=table2[1];
  122.         WELA=0;
  123.         DULA=1;
  124.         P0=table1[b];
  125.         DULA=0;
  126.         delay(2);
  127.         WELA=1;
  128.         P0=table2[2];
  129.         WELA=0;
  130.         DULA=1;
  131.         P0=table1[c];
  132.         DULA=0;
  133.         delay(2);
  134.         WELA=1;
  135.         P0=table2[3];
  136.         WELA=0;
  137.         DULA=1;
  138.         P0=table1[d];
  139.         DULA=0;
  140.         delay(2);
  141.         WELA=1;
  142.         P0=table2[4];
  143.         WELA=0;
  144.         DULA=1;
  145.         P0=table1[g];
  146.         DULA=0;
  147.     delay(2);
  148.         WELA=1;
  149.         P0=table2[5];
  150.         WELA=0;
  151.         DULA=1;
  152.         P0=table1[f];
  153.         DULA=0;
  154.         delay(2);
  155.         }
  156. void delay(uint z)
  157.         {
  158.         uint x,y;
  159.         for(x=z;x>0;x--)
  160.         {
  161.         for(y=20;y>0;y--);
  162.         }
  163.         }
  164. void timero() interrupt 1
  165.         {

  166.         TH0=(8192-8000)/32;
  167.         TL0=(8192-8000)%32;
  168.         num++;
  169.                
  170.         }
复制代码
代码有点长,但逻辑上很简单,就是一个时钟(时分秒的显示),然后加上按键,出现的问题描述如上!请大家帮我看看,感激不尽
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:111634 发表于 2016-12-4 18:23 | 只看该作者
本帖最后由 zl2168 于 2016-12-4 18:26 编辑

校正全期间时钟不停运行的2个案例。
实例91 具有校正功能的时钟1302LCD1602显示)
先Proteus仿真,确认有效
实例91 带校正时钟1302(LCD1602显示).rar (52.74 KB, 下载次数: 5)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

板凳
ID:111634 发表于 2016-12-4 18:27 | 只看该作者
本帖最后由 zl2168 于 2016-12-4 18:28 编辑

实例93  具有校正功能的时钟1302(LED数码管显示)


Proteus仿真一下,确认有效。
实例93 带校正时分秒的时钟1302(6位LED数码管显示).rar (732.75 KB, 下载次数: 10)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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