请选择 进入手机版 | 继续访问电脑版

普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 3484|回复: 11

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

[复制链接]

1

主题

1

帖子

14

积分

新手上路

Rank: 1

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

使用道具 举报

1

主题

7

帖子

34

积分

新手上路

Rank: 1

积分
34
发表于 2022-8-25 19:34:48 | 显示全部楼层
改mode的值了吗,mode=1是连续扫描,0是单词扫描
回复 支持 反对

使用道具 举报

2

主题

9

帖子

50

积分

注册会员

Rank: 2

积分
50
发表于 2022-9-6 11:12:10 | 显示全部楼层
本帖最后由 xyh. 于 2022-9-6 15:02 编辑

单次扫描和连续扫描的实验结果一样吗
回复 支持 反对

使用道具 举报

2

主题

9

帖子

50

积分

注册会员

Rank: 2

积分
50
发表于 2022-9-6 15:04:11 | 显示全部楼层
dddty 发表于 2022-8-25 19:34
改mode的值了吗,mode=1是连续扫描,0是单词扫描

这不就是单次吗
回复 支持 反对

使用道具 举报

0

主题

16

帖子

312

积分

中级会员

Rank: 3Rank: 3

积分
312
发表于 2022-9-22 16:08:22 | 显示全部楼层
xyh. 发表于 2022-9-6 15:04
这不就是单次吗

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

使用道具 举报

0

主题

1

帖子

30

积分

新手上路

Rank: 1

积分
30
发表于 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;
}
回复 支持 反对

使用道具 举报

0

主题

4

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 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。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 2022-11-23 17:15:28 | 显示全部楼层
xyh. 发表于 2022-9-6 11:12
单次扫描和连续扫描的实验结果一样吗

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

使用道具 举报

0

主题

4

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 2022-11-23 17:31:57 | 显示全部楼层
xyh. 发表于 2022-9-6 11:12
单次扫描和连续扫描的实验结果一样吗

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

使用道具 举报

0

主题

3

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2022-12-19 12:05:12 | 显示全部楼层
我用Keil uvision4+仿真器 debug 独立按键实验 的程序,debug后便马上跳出 Keil。
测试LED、数码管、蜂鸣器 的实验程序 没有以上问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-21 23:40 , Processed in 0.106355 second(s), 33 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表