/************************************************************************/ /********按鍵記數(shù)0-99 長(zhǎng)按鍵連續(xù)加或者連續(xù)減實(shí)驗(yàn)******************/ /********按k1鍵加一,超過(guò)一定時(shí)間連續(xù)加一,加到99后k1在按無(wú)效*******/ /********按k2鍵減一,超過(guò)一定時(shí)間連續(xù)減一,減到00后k2在按無(wú)效*******/ /************************************************************************/ /****************宏定義*******************/ #include<reg51.h> #define uchar unsigned char #define uint unsigned int #define SEG P2 //段碼 #define DIG P0 //位碼 sbit k1=P3^0; //按鍵加1按鈕 sbit k2=P3^1; //按鍵減1按鈕 uchar code SegTabl[11] = {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff}; uchar DispData[8] = {10,10,10,10,10,10,0,0}; uchar count; //記數(shù) uchar IntCount; //中斷記數(shù) uchar keyk1; //k1按下后等待的時(shí)間 uchar keyk2; //k2按下后等待的時(shí)間 void delay(uint); //延時(shí)函數(shù) void key(void); //按鍵判斷函數(shù) void display(void); //掃描顯示函數(shù) /****************主程序********************/ void main(void) { //**************硬件初始化*********** //* 使用定時(shí)器T0,定時(shí)模式,工作方式1;晶振頻率f=22.1184MHz-即1S鐘有22118400個(gè)`````` //晶振脈沖,也就是22118400/12=1843200個(gè)機(jī)器周期-即1843200個(gè)機(jī)器周期就是````````` //1S;考慮到單片機(jī)本身設(shè)計(jì)成倍頻方式,所以實(shí)際上1S是3686400個(gè)機(jī)器周期。 */`*` DIG = 0xff; //關(guān)位碼 TMOD = 0x01; //選用T0定時(shí)器,T0為定時(shí)方式,工作方式為1```` TH0 = 0x10; //中斷初值 TL0 = 0x00; //中斷初值 EA = 1; //開(kāi)總中斷 ET0 = 1; //允許T0中斷 TR0 = 0; //關(guān)閉定時(shí)器T0 //**************超級(jí)循環(huán)************** while(1) { key(); //調(diào)用按鍵判斷函數(shù) display(); //調(diào)用掃描顯示函數(shù) } } /****************按鍵掃描*******************/ void key(void) { uchar q,w; //******k1按鍵掃描****** if(k1==0) //判斷k1是否按下 { delay(5); //去抖 if(k1==0) //在判斷k1是否真的按下 { TR0 = 1; //開(kāi)啟定時(shí)器0 keyk1=0; //k1按鍵按下時(shí)間清0 count++; //k1按下就加一 while(k1==0) //等待按鍵彈起 { display(); //調(diào)用掃描顯示,讓按鍵進(jìn)入等待時(shí)數(shù)碼管也顯示 if(keyk1 >= 2) //k1按鍵按下超過(guò)1.5秒連續(xù)加一 { if(count!=99) //要顯示的數(shù)超過(guò)99就不執(zhí)行下列語(yǔ)句 { for(w=0;w<8;w++) //為了使加一的過(guò)程變的緩慢一些,以便看的清 { //如果有需要就改變for語(yǔ)句循環(huán)的次數(shù) display( ); delay(2); display( ); delay(2); display( ); delay(2); display( ); delay(2); display( ); } count++; //上面for循環(huán)完畢后記數(shù)加一 } } } } } //*************k2按鍵掃描************ if(k2==0) { delay(5); if(k2==0) { TR0 = 1; keyk2 = 0; if(count) //記數(shù)值為0不執(zhí)行減一功能 count--; while(k2==0) //等待按鍵彈起 { display(); //調(diào)用掃描顯示,讓按鍵進(jìn)入等待時(shí)數(shù)碼管也顯示 if(keyk2 >= 2) { for(q=0;q<8;q++) { display( ); delay(2); display( ); delay(2); display( ); delay(2); display( ); delay(2); display( ); } if(count) //記數(shù)值為0是不執(zhí)行減一功能 count--; } } //EA = 0;//關(guān)總中斷 //ET0 = 0;//禁止T0中斷 TR0 = 0;//關(guān)閉定時(shí)器T0 } } } /**************定時(shí)器T0中斷程序****************/ void IntTimer0(void) interrupt 1 { TH0 = 0x10; TL0 = 0x00; IntCount++; //中斷記數(shù) if(IntCount == 45) //中斷60次為1秒 { IntCount=0; keyk1++; //K1加一 keyk2++; //k2加一 } } /****************掃描顯示******************/ void display(void) { uchar i; uchar scan = 0xfe; if(count >= 99) //超過(guò)99或者等于99的只顯示99 count = 99; DispData[6] = count/10; DispData[7] = count%10; for(i=0;i<8;i++) //掃描顯示8位 { SEG = SegTabl[DispData[i]]; //輸出顯示碼 DIG = scan; //掃描位 delay(2); //延時(shí) DIG = 0xff; //關(guān)顯示 scan = (scan<<1)|0x01; //掃描下一位 } } /**************延時(shí)****************/ void delay(uint time) { uint i; uint j; for(i=0;i<time;i++) { for(j=0;j<130;j++); } }