不要轻易使用外部中断做按键输入这种简单任务,既不易消抖,也占用有限资源。数码管亮度不一排除硬件因素后多为消隐不良和动态扫描周期不均衡。给你改了,你试试。
- #include <REGX52.H>//头文件
- //#include "Delay.h"
- //unsigned char sec_s=0,min_s=0;//秒、分设置变量
- //void Cnt10ms=0; //中断计时变量
- unsigned char code duan[]={
- 0xC0, //"0"
- 0xF9, //"1"
- 0xA4, //"2"
- 0xB0, //"3"
- 0x99, //"4"
- 0x92, //"5"
- 0x82, //"6"
- 0xF8, //"7"
- 0x80, //"8"
- 0x90, }; //段选
- unsigned char code wei[]={0x01,0x02,0x04,0x08};
- unsigned char cache[4];
- unsigned int number=1000;//初始值
- //unsigned char qian,bai,shi,ge;
- unsigned char count=0;
- bit sign=0;
- unsigned char num=0;
- void Delay(unsigned int t)
- {
- unsigned int i,j;
- for(i=t;i>0;i--)
- for(j=120;j>0;j--);
- }
- /*
- void INT0_inti()//外部中断初始化
- {
- EA=1;
- IT0=1;
- EX0=1;
- }
- void INT2_inti()//外部中断初始化
- {
- EA=1;
- IT1=1;
- EX1=1;
- }*/
- void jisuan()//计算子程序
- {//分解数据,保存入缓存
- cache[0]=duan[number/1000%10];
- cache[1]=duan[number/100%10];
- cache[2]=duan[number/10%10];
- cache[3]=duan[number%10];
-
- P2=0x00;//消隐
- P0=cache[num];//送段码
- P2=wei[num];//送位码
- Delay(1);//延时
- num=++num%4;//循环计数
- }
- void main()
- {
- // INT0_inti();//中断初始化
- // INT2_inti();//中断初始化
- P3_4=0;//键盘是矩阵的,所以给了3-4低电位,用的是P3-2,P3-3
- while(1)
- {
- if(!P3_2||!P3_3)
- {
- if(++count>=10 && sign==0)//消抖
- {
- sign=1;
- if(!P3_2)
- {
- if(number<9999)number++;
- }
- if(!P3_3)
- {
- if(number>0)number--;
- }
- }
- }
- else
- {
- count=0;
- sign=0;
- }
- jisuan();//数码管
- }
- }
- /*
- void IWT0_ISR() interrupt 0//进入中断
- {
- number=number+1;
- if(number==10000)
- number=0;
- if(number==-1)
- number=9999;
- }
- void IWT2_ISR() interrupt 2//进入中断
- {
- number=number-1;
- if(number==10000)
- number=0;
- if(number==-1)
- number=9999;
- }*/
复制代码 |