独立按键单次扫描与多次扫描问题
#include "reg52.h"typedef unsigned char u8;
typedef unsigned int u16;
sbit LED1=P2^0;
sbit KEY1=P3^1; // 按键
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0
//微秒延时
void delay_10us(u16 ten_us){
while(ten_us--);
}
//按键
u8 key_scan(u8 mode){
static u8 key=1;
if(mode==1){key=1;}
if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0)){
delay_10us(1000);
key=0;
if(KEY1==0){
return KEY1_PRESS;}
else if(KEY2==0){
return KEY2_PRESS;}
else if(KEY3==0){
return KEY3_PRESS;}
else if(KEY4==0){
return KEY4_PRESS;}
}
else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1){
key=1;
}
return KEY_UNPRESS;
}
//
void main(){
u8 keyvalue=0;
while(1){
keyvalue=key_scan(0);
if(keyvalue==KEY1_PRESS){
LED1=!LED1;
}
}
}
这个程序照着B站普中教程写的,但是下载到A2开发板使用,单次扫描时按键怎么按都没效果,连续扫描可以正常使用,哪里出了问题呢 改mode的值了吗,mode=1是连续扫描,0是单词扫描 本帖最后由 xyh. 于 2022-9-6 15:02 编辑
单次扫描和连续扫描的实验结果一样吗 dddty 发表于 2022-8-25 19:34
改mode的值了吗,mode=1是连续扫描,0是单词扫描
这不就是单次吗 xyh. 发表于 2022-9-6 15:04
这不就是单次吗
如果用连续扫描,这里只有一只LED闪烁,太快,你看不清,需在LED1=!LED1;后面加上几百毫秒的延时,如果按键按着不放,就会看到LED不停的闪烁 我认为代码问题是在
else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1){
key=1;
}
单次扫描无法将 key 设置为1,所以只能点亮LED,就无法熄灭它!
解决方法:
else if (KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0) {
key=1;
}
gbk18030 发表于 2022-10-14 12:52
我认为代码问题是在
else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1){
key=1;
那你这个意思就是按键1-4中任意一个键按下都会key=1,可是他要表达的意思是1-4中没有扫描到按键按下是才把key赋值为1。 xyh. 发表于 2022-9-6 11:12
单次扫描和连续扫描的实验结果一样吗
我仿真了一下:
1.如果是单次扫描的话只能是点亮,而且我设置8个按键分别控制8个灯时,按下一个键之后对应的灯亮了,而且我再按下一次它也不灭,与此同时,我再按其他的键也没有反应。
2.如果是连续扫描时,我加了延迟的,第一次按下灯点亮,再次按下时同一个键时灯就灭了,而且不影响其他键的使用。当长按时灯会闪烁,松开时会停留在点亮状态,只需再次按下该键灯就会熄灭。 xyh. 发表于 2022-9-6 11:12
单次扫描和连续扫描的实验结果一样吗
结果是不一样的,单次扫描就只扫描一次,长按时是没有变化的,按时连续扫描的话他会不断的扫描,长按的话它会闪烁。我刚刚试了单次扫描,在主函数的while循环里加一个if(keyvalue==KEY_UNPRESS){LED1= 1;delay_10us(50000);}
结果是我按一下它进行了一次亮灭。而且如果二次执行时需要按复位键
难道单次扫描是只可以进行一次扫描? 我用Keil uvision4+仿真器 debug 独立按键实验 的程序,debug后便马上跳出 Keil。
测试LED、数码管、蜂鸣器 的实验程序 没有以上问题。
页:
[1]
2