|
給你寫個(gè)示例,理解后可以發(fā)揮各種應(yīng)用場(chǎng)景。也可以用于旋轉(zhuǎn)編碼器。
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit key_A = P3^0;
- sbit key_B = P3^1;
- uchar code table[]={//共陰數(shù)碼管段碼"0~f"
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- uchar num;
- uchar sign;
- bit flag1,flag2;
- void key_scan()
- {
- static uchar count;
- if(!key_A||!key_B)//任意按鍵按下
- {
- if(++count>=100)//消抖
- {
- count=0;
- if(!key_A && key_B && !flag1)//判斷誰(shuí)先按下
- {
- flag1=1; //狀態(tài)標(biāo)志1
- sign=1;
-
- }
- if(!key_B && key_A && !flag1)//判斷誰(shuí)先按下
- {
- flag1=1; //狀態(tài)標(biāo)志1
- sign=2;
- }
- if(!key_B && !key_A && flag1 && !flag2)//兩個(gè)按鍵先后都按下
- {
- flag2=1; //狀態(tài)標(biāo)志2
- switch(sign)
- {
- case 1: if(num<9)num++; break;
- case 2: if(num>0)num--; break;
- }
- }
- }
- }
- else
- {
- if(flag1==1)//按下一個(gè)中途抬起或結(jié)束按鍵都抬起
- {
- sign=0;//復(fù)位
- flag1=0;//復(fù)位
- flag2=0;//復(fù)位
- }
- count=0;//復(fù)位
- }
- }
- void main()
- {
- while(1)
- {
- key_scan();
- P2=table[num];
- }
- }
復(fù)制代碼
|
|