給你寫一個示例程序,你按實際需要修改。
無標題.jpg (110.32 KB, 下載次數: 40)
下載附件
2020-7-28 09:27 上傳
- #include <reg51.H>
- #define PD 0x80|(P1<<3&0x60)|(P2>>1&0x18)|(P3&0x07)//P1.2~3/P2.4~5/P3.0~2組合7個按鍵為1個字節數據
- unsigned char code table[]={//共陽數碼管段碼"0~f-."
- 0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
- unsigned char KeySec=0;//鍵值變量
- //延時程序
- void delayms(unsigned int k)
- {
- unsigned int i,j;
- for(i=k;i>0;i--)
- for(j=110;j>0;j--);
- }
- //按鍵掃描
- void keyscan()
- {
- static unsigned int count=0;//計數變量
- static bit key_sign=0; //按鍵狀態標志
- unsigned char time; //臨時變量
- if((PD&0xff)!= 0xff)//有按鍵按下
- {
- count++; //計數變量自加1
- if(count>500)
- count=501;//防止溢出
- if(count>10 && key_sign==0)//10ms消抖與按鍵狀態識別
- {//使用組合鍵要適當延長消抖時間
- key_sign=1;//確認按鍵按下
- time=PD&0xff;//保存鍵態值
- }
- if(count==500)//判斷按下0.5s長按有效
- {
- switch(time)
- {
- //單鍵
- case 0xfe: KeySec=8; break;
- case 0xfd: KeySec=9; break;
- case 0xfb: KeySec=10; break;
- case 0xf7: KeySec=11; break;
- case 0xef: KeySec=12; break;
- case 0xdf: KeySec=13; break;
- case 0xbf: KeySec=14; break;
- // 組合鍵
- // case 0xee: KeySec=?; break;
- }
- }
- }
- else //沒有按或按下后松手
- {
- if(key_sign==1)//判斷是按鍵按下后松手
- {
- key_sign=0; //按鍵狀態標志清0
- if(count>10 && count<500)//小于0.5s判斷為短按
- {
- switch(time)
- {
- //單鍵
- case 0xfe: KeySec=1; break;
- case 0xfd: KeySec=2; break;
- case 0xfb: KeySec=3; break;
- case 0xf7: KeySec=4; break;
- case 0xef: KeySec=5; break;
- case 0xdf: KeySec=6; break;
- case 0xbf: KeySec=7; break;
- // 組合鍵
- // case 0xee: KeySec=?; break;
- }
- }
- }
- count=0;//計數變量清0
- }
- }
- //主函數
- void main()
- {
- P0=table[KeySec];//初始顯示狀態0
- while(1)
- {
- keyscan(); //按鍵掃描
- if(KeySec!=0)//刷新顯示
- {
- P0=table[KeySec];//顯示鍵值
- KeySec=0;//鍵值清0
- }
- delayms(1);//控制主循環周期1ms
- }
- }
復制代碼
|