最近学了数码管的时钟显示和按键的控制,于是想到小时候戴过的几块钱的电子表,就想实现一个,可以通过按键来手动调时间!代码写好了,单片机也能跑起来,不按按键的时候,时钟可以自动实现,但是有问题,就是当我用按键实现对分钟和时钟的调整(这里是加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++;
-
- }
复制代码 代码有点长,但逻辑上很简单,就是一个时钟(时分秒的显示),然后加上按键,出现的问题描述如上!请大家帮我看看,感激不尽
|