标题:
单片机怎么防止一个按键单独按和两个按键同时按下发生冲突?
[打印本页]
作者:
zzccll
时间:
2022-7-9 10:46
标题:
单片机怎么防止一个按键单独按和两个按键同时按下发生冲突?
怎么防止一个按键单独按和两个按键同时按下发生冲突?
单片机源程序如下:
if((A6==0)&&(A7!=0))
{
delay_ms(10);
if((A6==0)&&(A7!=0))
{
while(!A6);TNUM=0;
OLED_ShowChar(x,y,table[8*y+x/8-16]);
if(x==0)x=120;
else if(x>0)x-=8;
}
}
if((A7==0)&&(A6!=0))
{
delay_ms(10);
if((A7==0)&&(A6!=0))
{
while(!A7);TNUM=0;
OLED_ShowChar(x,y,table[8*y+x/8-16]);
x+=8;if(x>120)x=0;
}
}
if((A6==0)&&(A7==0))
{
delay_ms(10);
if((A6==0)&&(A7==0))
{
while((!A6)&&(!A7));
flag2=0;
P1|=(1<<0);
P1|=(1<<1);
P1|=(1<<4);
P1|=(1<<5);
P1|=(1<<6);
P1|=(1<<7);
OLED_Clear();
OLED_ShowChinese(20,0,0);//接
OLED_ShowChinese(44,0,1);//收
OLED_ShowChinese(68,0,4);//消
OLED_ShowChinese(93,0,5);//息
memset(table,0,50);
flag=0;
REN=1;
}
复制代码
作者:
haiyang201
时间:
2022-7-9 13:29
参考这个,写的很清楚
作者:
haiyang201
时间:
2022-7-9 13:29
参考这个
http://www.51hei.com/bbs/dpj-212678-1.html
作者:
yelk'
时间:
2022-7-9 14:38
为了编程方便,尽量使用同一序列的口,如果不同序列的口,那端口号也要能错开,如用了P01,就不要用P11了。
这样的话,才能方便计算,提高扫描效率,如果非要用,只能通过移位处理
作者:
datouyuan
时间:
2022-7-9 15:07
A7 A6
1 1 键值3
1 0 键值2
0 1 键值1
0 0 键值0
用键值来表示按键状态更好。
unsigned char key_value_get()
{
unsigned char i=0;
if(A6) i|=1;
if(A7) i|=2;
return i;
}
{
unsigned char key_v=key_value_get();
if(key_v==2)//((A6==0)&&(A7!=0))
{
}
else if(key_v==1)
{
}
else if(key_v==0)
{
}
}
复制代码
作者:
Hephaestus
时间:
2022-7-9 20:55
看上去A6、A7不是单片机端口,那就是扫描键盘了,这种键盘要有硬件支持(二极管隔离)才能支持两个键同时按下。
作者:
lkc8210
时间:
2022-7-9 22:24
新加两个标志位记录有键按下,如A6_Flag和A7_Flag
然后放开按键时才检测这两个标志位
作者:
dwb123
时间:
2022-7-9 23:59
搞一个优先级
作者:
zzccll
时间:
2022-7-10 07:10
yelk' 发表于 2022-7-9 14:38
为了编程方便,尽量使用同一序列的口,如果不同序列的口,那端口号也要能错开,如用了P01,就不要用P11了。 ...
和我都主题有什么关系吗?我用的就是一个序列的接口。
作者:
zzccll
时间:
2022-7-10 07:32
感谢各位,解决了单独按下的防抖延时弄长一点就行了。
作者:
wulin
时间:
2022-7-10 08:32
严格讲,两个按键基本不可能做到同时按下,所以判断单键或组合键只能等松手后才能准确识别。给你一个简单,易懂、可靠的示例参考。
#include <reg52.h>
sbit key_A = P3^0;
sbit key_B = P3^1;
unsigned char key_value;
void Timer0Init() //1毫秒@12.000MHz
{
TMOD= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
void key_scan()
{
static unsigned char count_A=0,count_B=0;
static bit sign_A=0,sign_B=0;
if(!key_A||!key_B)
{
if(!key_A)
{
if(++count_A>=10 && sign_A==0)sign_A=1;
}
if(!key_B)
{
if(++count_B>=10 && sign_B==0)sign_B=1;
}
}
else//松手
{
if(sign_A && sign_B)key_value=3;
else if(!sign_A && sign_B)key_value=2;
else if(sign_A && !sign_B)key_value=1;
count_A=0;count_B=0;
sign_A=0;sign_B=0;
}
}
void main()
{
Timer0Init();
while(1)
{
switch(key_value)
{
case 1: P1=0x0f; key_value=0; break;
case 2: P1=0xf0; key_value=0; break;
case 3: P1=0x55; key_value=0; break;
}
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0xFC;
TL0 = 0x18;
key_scan();
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1