程序重寫了一遍,數(shù)碼管掃描也放到定時(shí)器里面,程序不用delay軟件延時(shí)- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define duan P1
- #define wei P3
- sbit key1 = P2^3; //設(shè)置
- sbit key2 = P2^4; //加
- sbit key3 = P2^5; //減
- sbit key4 = P2^6; //啟動(dòng)
- sbit key5 = P2^7; //手動(dòng)
- sbit out = P2^2; //輸出控制 ,低電平有效
- sbit di = P2^0; //蜂鳴器
- bit flag=0,flag1=0,shan=0;
- uchar knum,shan_cont,i;
- uchar shi=0,fen=0,miao=0;
- uint cont,cont1,cont2;
- uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰段碼表
- uchar code weima[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位碼 加反相器用
- uchar LedBuff[]={0,0,0,0,0,0,0,0}; //數(shù)碼管顯示緩沖區(qū)
- void init()
- {
- TMOD |= 0x01; //定時(shí)器0 工作方式1
- TH0 = (65536-1000)/256; //1ms初值 @12MHz
- TL0 = (65536-1000)%256;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void dis() //顯示函數(shù)
- {
- LedBuff[0] = duanma[miao%10];
- LedBuff[1] = duanma[miao/10];
- LedBuff[2] = 0x40;
- LedBuff[3] = duanma[fen%10];
- LedBuff[4] = duanma[fen/10];
- LedBuff[5] = 0x40;
- LedBuff[6] = duanma[shi%10];
- LedBuff[7] = duanma[shi/10];
- }
- void keysan()
- {
- static bit kf1=0, kf2=0,kf3=0; //自鎖標(biāo)志,這里一定要加static(或者用全局變量),否則按鍵不靈
- static uint i=0,j=0,k=0,l=0,m=0; //消抖延時(shí)變量
- if(knum==0)
- {
- if(key4 == 1)
- {
- m=0;
- kf2=0;
-
- }
- else if(kf2 == 0 ) //啟動(dòng) 暫停鍵
- {
- ++m; //消抖
- if( (m>20) && ((miao != 0) || (fen != 0) || (shi != 0)) )
- { //時(shí)分秒都為0時(shí),不能啟動(dòng)輸出,只要其中之一不為0,就能啟動(dòng)輸出
- m=0;
- kf2=1;
- flag = !flag; //啟動(dòng)、暫停計(jì)時(shí)標(biāo)志
- out = !out;
- }
- }
- }
-
- if(key5==1)
- {
- l=0;
- kf3=0;
- }
- else if(kf3==0 ) //手動(dòng)開關(guān),在沒有倒計(jì)時(shí)的狀態(tài)下才有用
- {
- ++l;
- if(l > 20)
- {
- l=0;
- kf3=1;
- if(shi==0 && fen==0 && miao==0)
- out = !out;
- }
- }
-
- if(out==1) //加這句,只有在輸出關(guān)閉的時(shí)候,才能設(shè)置計(jì)時(shí)時(shí)間,在倒計(jì)時(shí)的過程中是不能設(shè)置的
- {
- if(key1==1) //設(shè)置 //IO是高電平,說明按鍵沒有被按下,這時(shí)要及時(shí)清零一些標(biāo)志位
- {
- i=0; //按鍵消抖計(jì)時(shí)變量清零
- kf1=0; //按鍵自鎖標(biāo)志清零
- }
- else if(kf1 == 0) //有按鍵按下,且是第一次被按下
- {
- ++i;
- if(i>12)
- {
- i=0;
- kf1=1; //自鎖按鍵置位,避免一直觸發(fā)
- knum++;
- if(knum==4)
- knum = 0;
- }
- }
- }
- if(key2==0) //加
- {
- j++;
- if(j >= 3000) //長按,數(shù)碼管掃描放中斷里面,這里的值就要取得大才行
- { //因?yàn)闆]用delay延時(shí),CPU跑的很快
- if(knum==1)
- {
- miao++;
- if(miao==60)
- miao = 0;
- }
- if(knum==2)
- {
- fen++;
- if(fen==60)
- fen=0;
- }
- if(knum==3)
- {
- shi++;
- if(shi==24)
- shi=0;
- }
- j=1000; //這里j的值可以設(shè)置連加的快慢,j的值越大就越快
- } //因?yàn)槌踔翟酱,加?000的時(shí)間就越短
- }
- else
- {
- if(j>500 && j<3000) //短按
- {
-
- if(knum==1)
- {
- miao++;
- if(miao==60)
- miao = 0;
- }
- if(knum==2)
- {
- fen++;
- if(fen==60)
- fen=0;
- }
- if(knum==3)
- {
- shi++;
- if(shi==24)
- shi=0;
- }
- j=0;
- }
- }
-
- if(key3==0) //減
- {
- k++;
- if(k >= 3000) //長按
- {
- if(knum==1)
- {
- miao--;
- if(miao==255)
- miao = 59;
- }
- if(knum==2)
- {
- fen--;
- if(fen==255)
- fen=59;
- }
- if(knum==3)
- {
- shi--;
- if(shi==255)
- shi=23;
- }
- k=1000;
- }
- }
- else
- {
- if(k>500 && k<3000) //短按
- {
-
- if(knum==1)
- {
- miao--;
- if(miao==255)
- miao = 59;
- }
- if(knum==2)
- {
- fen--;
- if(fen==255)
- fen=59;
- }
- if(knum==3)
- {
- shi--;
- if(shi==255)
- shi=23;
- }
- }
- k=0; //消抖變量清零,為下次按鍵做準(zhǔn)備
- }
- }
- void main()
- {
- init();
- out = 1;
- while(1)
- {
- keysan();
- dis();
- if(shi==0 && fen==0 && miao==0 && flag == 1 ) //倒計(jì)時(shí)時(shí)間到
- {
- flag=0; //停止計(jì)時(shí)
- flag1=1; //啟動(dòng)蜂鳴器標(biāo)志置1
- out=1; //關(guān)閉輸出
- }
- }
- }
- void timer() interrupt 1
- {
- TH0 = (65536-1000)/256; //50毫秒初值
- TL0 = (65536-1000)%256;
-
- if(flag)
- {
- cont++;
- if(cont == 1000)
- {
- cont = 0;
- miao--;
- if(miao==255)
- {
- miao=59;
- fen--;
- if(fen==255)
- {
- fen=59;
- shi--;
- if(shi==255)
- {
- shi=0;
- }
- if(shi==0)
- fen=59;
- if(fen==0 && shi==0)
- fen=0;
- }
- }
- }
- }
- if(flag1) //倒計(jì)時(shí)時(shí)間到,啟動(dòng)蜂鳴器
- {
- cont1++;
- if(cont1==500) //500ms蜂鳴器響一次
- {
- cont1=0;
- di=!di;
- cont2++;
- if(cont2==20)//500*20=10000ms=10s,蜂鳴器響10s后停止
- {
- cont2=0;
- flag1=0;
- }
- }
- }
- if(knum != 0)
- {
- shan_cont++;
- if(shan_cont==100) //設(shè)置時(shí),100ms閃爍時(shí)間 可根據(jù)實(shí)際效果調(diào)整
- {
- shan_cont=0;
- shan = !shan;
- }
- }
- /**********數(shù)碼管掃描函數(shù)************/
- i++;
- if(i>=8)
- {
- i=0;
- }
- duan = 0x00;
- switch(i)
- {
- case 0:
- if(knum==1) //如果設(shè)置鍵第一次按下
- {if(shan==1){wei = 0x00; duan = LedBuff[0];} //設(shè)置秒位閃爍
- else{wei = weima[0]; duan = LedBuff[0];}
- }
- else{wei = weima[0]; duan = LedBuff[0];} break; //否則正常顯示
-
- case 1:
-
- if(knum==1)
- {if(shan==1){wei = 0x00; duan = LedBuff[1];}
- else{wei = weima[1]; duan = LedBuff[1];}
- }
- else{wei = weima[1]; duan = LedBuff[1];} break;
-
- case 2: wei = weima[2]; duan = LedBuff[2]; break;
-
- case 3:
- if(knum==2)
- {if(shan==1){wei = 0x00; duan = LedBuff[3];}
- else{wei = weima[3]; duan = LedBuff[3];}
- }
- else{wei = weima[3]; duan = LedBuff[3];} break;
-
- case 4:
- if(knum==2)
- {if(shan==1){wei = 0x00; duan = LedBuff[4];}
- else{wei = weima[4]; duan = LedBuff[4];}
- }
- else{wei = weima[4]; duan = LedBuff[4];} break;
-
- case 5: wei = weima[5]; duan = LedBuff[5]; break;
-
- case 6:
- if(knum==3)
- {if(shan==1){wei = 0x00; duan = LedBuff[6];}
- else{wei = weima[6]; duan = LedBuff[6];}
- }
- else{wei = weima[6]; duan = LedBuff[6];} break;
- case 7:
- if(knum==3)
- {if(shan==1){wei = 0x00; duan = LedBuff[7];}
- else{wei = weima[7]; duan = LedBuff[7];}
- }
- else{wei = weima[7]; duan = LedBuff[7];} break;
-
- default: break;
- }
- }
復(fù)制代碼 |