给你写个示例,理解后可以发挥各种应用场景。也可以用于旋转编码器。
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit key_A = P3^0;
- sbit key_B = P3^1;
- uchar code table[]={//共阴数码管段码"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)//判断谁先按下
- {
- flag1=1; //状态标志1
- sign=1;
-
- }
- if(!key_B && key_A && !flag1)//判断谁先按下
- {
- flag1=1; //状态标志1
- sign=2;
- }
- if(!key_B && !key_A && flag1 && !flag2)//两个按键先后都按下
- {
- flag2=1; //状态标志2
- switch(sign)
- {
- case 1: if(num<9)num++; break;
- case 2: if(num>0)num--; break;
- }
- }
- }
- }
- else
- {
- if(flag1==1)//按下一个中途抬起或结束按键都抬起
- {
- sign=0;//复位
- flag1=0;//复位
- flag2=0;//复位
- }
- count=0;//复位
- }
- }
- void main()
- {
- while(1)
- {
- key_scan();
- P2=table[num];
- }
- }
复制代码
|