标题: 数码管时钟和按键结合的问题,有点小问题,请教下大家 [打印本页]
作者: 小胖头 时间: 2016-12-4 10:43
标题: 数码管时钟和按键结合的问题,有点小问题,请教下大家
最近学了数码管的时钟显示和按键的控制,于是想到小时候戴过的几块钱的电子表,就想实现一个,可以通过按键来手动调时间!代码写好了,单片机也能跑起来,不按按键的时候,时钟可以自动实现,但是有问题,就是当我用按键实现对分钟和时钟的调整(这里是加1)后,这个时钟就会停止运行了!我的猜想是,按键实现后,程序没有进入到中断里面了,所以时钟停止!但不知道对不对!代码如下- #include <reg52.h>
- sbit S5=P3^7;//按键控制分钟的调整
- sbit S4=P3^6;//按键控制时钟的调整
- sbit D1=P1^0;
- sbit D2=P1^1;
- sbit WELA=P2^7;
- sbit DULA=P2^6;
- #define uint unsigned int
- uint num ,a,b,c,d,e,f,g,x,y,z;
- void delay(uint z);//延时
- void display(uint a,uint b,uint c,uint d, uint e,uint f);//数码管显示函数
- unsigned char code table1[]=
- {
- 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F
- };
- unsigned char code table2[]=
- {
- 0XDF,0XEF,0XF7,0XFB,0XFD,0XFE
- };
- void main()
- {
- TMOD=0X00;
- TH0=(8192-8000)/32;
- TL0=(8192-8000)%32;
- EA=1;
- ET0=1;
- TR0=1;
- while(1)
- {
- if(num==1)
- {
- num=0;
- a++;
- }
- if(S5==0)
- {
- delay(10);
- if(S5==0)
- {
- D1=0;
- c++;
- if(c==10)
- {
- d++;
- c=0;
- if(d==6)
- {
- e++;
- d=0;
- if(e==24)
- {
- e=0;
- }
- }
- }
- while(!S5);
- delay(10);
- while(!S5);
- }
- }
- if(S4==0)
- {
- delay(10);
- if(S4==0)
- {
- D2=0;
- e++;
- if(e==24)
- {
- e=0;
- }
- while(!S4);
- delay(10);
- while(!S4);
- }
- }
- else
- {
- D1=1;
- D2=1;
- }
- if(a==10)
- {
- b++;
- a=0;
- if(b==6)
- {
- c++;
- b=0;
- if(c==10)
- {
- d++;
- c=0;
- if(d==6)
- {
- e++;
- d=0;
- if(e==24)
- {
- e=0;
- }
- }
- }
- }
- }
- g=e%10;
- f=(e-g)/10;
- display(a,b,c,d,g,f);
- }
- }
- void display(uint a,uint b,uint c,uint d,uint g,uint f)
- {
- WELA=1;
- P0=table2[0];
- WELA=0;
- DULA=1;
- P0=table1[a];
- DULA=0;
- delay(2);
- WELA=1;
- P0=table2[1];
- WELA=0;
- DULA=1;
- P0=table1[b];
- DULA=0;
- delay(2);
- WELA=1;
- P0=table2[2];
- WELA=0;
- DULA=1;
- P0=table1[c];
- DULA=0;
- delay(2);
- WELA=1;
- P0=table2[3];
- WELA=0;
- DULA=1;
- P0=table1[d];
- DULA=0;
- delay(2);
- WELA=1;
- P0=table2[4];
- WELA=0;
- DULA=1;
- P0=table1[g];
- DULA=0;
- delay(2);
- WELA=1;
- P0=table2[5];
- WELA=0;
- DULA=1;
- P0=table1[f];
- DULA=0;
- delay(2);
- }
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- {
- for(y=20;y>0;y--);
- }
- }
- void timero() interrupt 1
- {
- TH0=(8192-8000)/32;
- TL0=(8192-8000)%32;
- num++;
-
- }
复制代码 代码有点长,但逻辑上很简单,就是一个时钟(时分秒的显示),然后加上按键,出现的问题描述如上!请大家帮我看看,感激不尽
作者: zl2168 时间: 2016-12-4 18:23
本帖最后由 zl2168 于 2016-12-4 18:26 编辑
校正全期间时钟不停运行的2个案例。
实例91 具有校正功能的时钟1302(LCD1602显示)
先Proteus仿真,确认有效
实例91 带校正时钟1302(LCD1602显示).rar
(52.74 KB, 下载次数: 5)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,书中电路和程序设计有详细说明,程序语句条条有注解。
作者: zl2168 时间: 2016-12-4 18:27
本帖最后由 zl2168 于 2016-12-4 18:28 编辑
实例93 具有校正功能的时钟1302(LED数码管显示)
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |