給你改寫了,只用兩個鍵,一個用于設置選項,一個多功能鍵。用外部中斷計數(shù)。仿真正常,你自己完善其它硬件。
無標題.jpg (139.64 KB, 下載次數(shù): 14)
下載附件
2022-12-8 21:56 上傳
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit K1=P2^4;
- sbit K2=P2^5;
- sbit OUT=P2^6;
- sbit buzzer=P2^7;
- uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽LED段碼表
- uchar displayData[4];//顯示數(shù)據(jù)緩存
- uchar qian,bai,shi,ge;
- uchar Cnt5ms;
- uchar KeySec=0;
- uint num;
- int count;
- bit flashing=0;//閃爍標志
- void Timer0Init(void) //5毫秒@12.000MHz
- {
- TMOD |= 0x01; //設置定時器模式
- TL0 = 0x78; //設置定時初始值
- TH0 = 0xEC; //設置定時初始值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- }
- //按鍵掃描
- void keyscan()
- {
- static unsigned int time=0;
- static bit sign=0;
- if(!K1||!K2)
- {
- if(++time>=15 && sign==0)//短按消抖
- {
- sign=1;
- if(!K1)
- {
- KeySec++;
- if(KeySec>=5)
- {
- KeySec=0;
- count=0;
- }
- }
- if(!K2 && KeySec==0)
- {
- if(count!=num)
- {
- EA = ~EA;//暫停/繼續(xù)
- OUT=EA;
- }
- else
- {
- count=0;
- EA = 1; //開始
- OUT= 1;
- buzzer=1;//蜂鳴器復位
- }
- }
- if(!K2 && KeySec!=0)
- {
- if(KeySec)
- {
- switch(KeySec)
- {
- case 1: qian= ++qian%10; break;
- case 2: bai = ++bai%10; break;
- case 3: shi = ++shi%10; break;
- case 4: ge = ++ge%10; break;
- }
- num=(qian*1000)+(bai*100)+(shi*10)+ge;
- // num寫入EEPROM保存,下次上電直接調(diào)用
- }
- }
- }
- }
- else
- {
- time=0;
- sign=0;
- }
- }
- void display()//顯示
- {
- static uchar i=0;
- if(KeySec==0)
- {//顯示計數(shù)值
- displayData[0] = tab[count/1000%10];
- displayData[1] = tab[count/100%10];
- displayData[2] = tab[count/10%10];
- displayData[3] = tab[count%10];
- }
- if(KeySec!=0)
- {//顯示設定值
- displayData[0] = tab[num/1000%10];
- displayData[1] = tab[num/100%10];
- displayData[2] = tab[num/10%10];
- displayData[3] = tab[num%10];
- }
- P2&=0xf0;//消隱
- if(KeySec==1 && i==0 && flashing==0)
- P0=0xff;//千位閃爍
- else if(KeySec==2 && i==1 && flashing==0)
- P0=0xff;//百位閃爍
- else if(KeySec==3 && i==2 && flashing==0)
- P0=0xff;//十位閃爍
- else if(KeySec==4 && i==3 && flashing==0)
- P0=0xff;//個位閃爍
- else
- P0=displayData[i];
- P2|=0x01<<i;
- i++;i%=4;
- }
- void main()//主函數(shù)
- {
- OUT=0;
- Timer0Init();//初始化定時器
- // num=讀取EEPROM
- IT0 = 1;// 外部下降沿中斷
- EX0 = 1;
- // EA = 1;
- while(1)
- {
- if(TF0)//查詢定時器中斷請求位
- {
- TF0=0;
- TL0 = 0x78; //設置定時初始值
- TH0 = 0xEC; //設置定時初始值
- Cnt5ms++;
- if(Cnt5ms==40)
- {
- Cnt5ms=0;
- flashing=~flashing;
- }
- keyscan(); //按鍵掃描
- display(); //數(shù)碼管顯示
- }
- }
- }
- void exint0() interrupt 0
- {
- count++;
- if(count>=num)
- {
- buzzer=0;
- EA = 0;
- OUT= 0;
- }
- }
復制代碼
|