Zephyr 发表于 2022-8-22 10:30:53

独立按键单次扫描与多次扫描问题

#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开发板使用,单次扫描时按键怎么按都没效果,连续扫描可以正常使用,哪里出了问题呢

dddty 发表于 2022-8-25 19:34:48

改mode的值了吗,mode=1是连续扫描,0是单词扫描

xyh. 发表于 2022-9-6 11:12:10

本帖最后由 xyh. 于 2022-9-6 15:02 编辑

单次扫描和连续扫描的实验结果一样吗

xyh. 发表于 2022-9-6 15:04:11

dddty 发表于 2022-8-25 19:34
改mode的值了吗,mode=1是连续扫描,0是单词扫描

这不就是单次吗

人在天涯 发表于 2022-9-22 16:08:22

xyh. 发表于 2022-9-6 15:04
这不就是单次吗

如果用连续扫描,这里只有一只LED闪烁,太快,你看不清,需在LED1=!LED1;后面加上几百毫秒的延时,如果按键按着不放,就会看到LED不停的闪烁

gbk18030 发表于 2022-10-14 12:52:50

我认为代码问题是在
      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;
}

XIAO-CAICAI 发表于 2022-11-23 17:03:26

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。

XIAO-CAICAI 发表于 2022-11-23 17:15:28

xyh. 发表于 2022-9-6 11:12
单次扫描和连续扫描的实验结果一样吗

我仿真了一下:
1.如果是单次扫描的话只能是点亮,而且我设置8个按键分别控制8个灯时,按下一个键之后对应的灯亮了,而且我再按下一次它也不灭,与此同时,我再按其他的键也没有反应。
2.如果是连续扫描时,我加了延迟的,第一次按下灯点亮,再次按下时同一个键时灯就灭了,而且不影响其他键的使用。当长按时灯会闪烁,松开时会停留在点亮状态,只需再次按下该键灯就会熄灭。

XIAO-CAICAI 发表于 2022-11-23 17:31:57

xyh. 发表于 2022-9-6 11:12
单次扫描和连续扫描的实验结果一样吗

结果是不一样的,单次扫描就只扫描一次,长按时是没有变化的,按时连续扫描的话他会不断的扫描,长按的话它会闪烁。我刚刚试了单次扫描,在主函数的while循环里加一个if(keyvalue==KEY_UNPRESS){LED1= 1;delay_10us(50000);}
结果是我按一下它进行了一次亮灭。而且如果二次执行时需要按复位键
难道单次扫描是只可以进行一次扫描?

felixkhill 发表于 2022-12-19 12:05:12

我用Keil uvision4+仿真器 debug 独立按键实验 的程序,debug后便马上跳出 Keil。
测试LED、数码管、蜂鸣器 的实验程序 没有以上问题。
页: [1] 2
查看完整版本: 独立按键单次扫描与多次扫描问题