本帖最后由 51黑電子會員 于 2020-5-22 08:40 編輯
- //按鍵短按加或減,長按連加或連減,四位一體數碼管顯示0~9999。
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define key_short 10//宏定義短按20ms
- #define key_long 50//宏定義長按100ms
- #define key_middle 40//宏定義長按間隔80ms
- sbit led=P1^4;//啟停指示燈
- sbit addkey=P3^0;//位定義加鍵
- sbit deckey=P3^2;//位定義減鍵
- sbit qiting=P3^4;//位定義啟動按鍵端口
- sbit tingzhi=P3^6;//位定義停止按鍵端口
- //uchar i;//數碼管位數變量
- uchar flag;//顯示函數標志位變量
- uchar qitingnum;//聲明啟停次數變量
- uint num;//數值變量
- uint addcount,deccount;//計數變量
- uint qian,bai,shi,ge;//定義拆字變量
- //uchar code weima[]={0xfe,0xfd,0xfb,0xf7};//數碼管位碼表
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數碼管段碼數字0~9字碼表,高電平點亮數碼管段碼數字0~9。
- /**ms級延時子程序**/
- void delay(uint x)
- {
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<110;j++);
- }
- void display()
- {
- qian=num/1000;//取得千位數字
- bai=num%1000/100;//取得百位數字
- shi=num%100/10;//取得十位數字
- ge=num%10;//取得個位數字
- P2=0xfe;//數碼管千位顯示位
- P0=table[qian];//數碼管千位數值顯示
- delay(2);//延時
- P2=0xfd;//數碼管百位顯示位
- P0=table[bai];//數碼管百位數值顯示
- delay(2);//延時
- P2=0xfb;//數碼管十位顯示位
- P0=table[shi];//數碼管十位數值顯示
- delay(2);//延時
- P2=0xf7;//數碼管個位顯示位
- P0=table[ge];//數碼管個位數值顯示
- delay(2);//延時
- }
- void qidongkeyscan()//啟動函數
- {
- if(qiting==0)
- {
- delay(15);
- if(qiting==0)
- {
- qitingnum++;
- TR0=1;
- flag=0;
- while(qiting==1);
- }
- }
- }
- void tingzhikeyscan()//關掉函數
- {
- if(tingzhi==0)
- {
- delay(15);
- if(tingzhi==0)
- {
- led=1;
- flag=1;
- TR0=0;
- P2=0xff;
- P0=0x00;
- qitingnum=0;
- while(tingzhi==1);
- }
- }
- }
- void keyscan()//設置函數
- {
- if(qitingnum==1)
- {
- led=0;
- if(!addkey)
- {
- addcount++;
- // delay(10);
- if(addcount>=key_long)//增加長按
- {
- if(num<9999)
- num++;
- addcount=key_middle;//為什么存在addcount=key_middle,由于一直按著按鍵,addcount計數會溢出,設定addcount=key_middle能讓addcount在這個addcount=key_middle基礎上反復累積計數,從而不會出現計數溢出的情況。
- }
- }
- else
- {
- if(key_short<addcount&&addcount<key_long)//增加短按,為什么不可以是key_short<addcount<key_long,假若是key_short<addcount<key_long,就相當于按鍵還沒按下,條件已經滿足,按鍵再按下去就沒意義啦。
- {
- if(num<9999)
- num++;
- }
- addcount=0;
- }
- if(!deckey)
- {
- deccount++;
- // delay(10);
- if(deccount>=key_long)//減少長按
- {
- if(num>0)
- num--;
- deccount=key_middle;//為什么存在deccount=key_middle,由于一直按著按鍵,deccount計數會溢出,設定deccount=key_middle能讓addcount在這個deccount=key_middle基礎上反復累積計數,從而不會出現計數溢出的情況。
- }
- }
- else
- {
- if(key_short<deccount&&deccount<key_long)//減少短按,為什么if條件不可以是key_short<deccount<key_long,假若是key_short<deccount<key_long,就相當于按鍵還沒按下,條件已經滿足,按鍵再按下去就沒意義啦。
- {
- if(num>0)
- num--;
- }
- deccount=0;
- }
- }
- }
- // void display()//顯示程序
- //{
- //// static uchar i;
- // P0=0x00;
- // P2=weima[i];
- // switch(i)
- // {
- // case 0:
- // P0=table[num/1000];
- // break;
- // case 1:
- // P0=table[num%1000/100];
- // break;
- // case 2:
- // P0=table[num%100/10];
- // break;
- // case 3:
- // P0=table[num%10];
- // break;
- // }
- // i++;
- // i%=4;
- // }
- /**定時器0初始化子程序**/
- void Time0_init()
- {
- TMOD=0X01;//模式選定時器0、計數器1,工作方式選定時器0定時模式1、計數器1計數模式1。
- TH0=(65536-5000)/256;//定時器0高8位定時50毫秒
- TL0=(65536-5000)%256;//定時器0低8位定時50毫秒
- EA=1;//打開總中斷
- ET0=1;//打開定時器0的中斷
- TR0=0;//打開定時器0
- }
- void Timer0() interrupt 1//定時器0中斷子程序
- {
- TH0=(65536-5000)/256;//重裝定時器0高8位定時50毫秒
- TL0=(65536-5000)%256;//重裝定時器0低8位定時50毫秒
- keyscan();//設置函數
- if(flag==0)
- display();//顯示函數
- tingzhikeyscan();//關掉函數
- }
- void main()//主函數
- {
- Time0_init();//定時器0初始化子程序
- while(1)
- {
- qidongkeyscan();//啟動函數
- }
- }
復制代碼
圖片110.png (78.94 KB, 下載次數: 70)
下載附件
2020-5-17 13:49 上傳
|