普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 2282|回复: 1

矩阵按键问题

 关闭 [复制链接]

1

主题

1

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2019-7-26 20:05:44 | 显示全部楼层 |阅读模式
本帖最后由 514430901 于 2019-7-26 20:11 编辑

复制代码
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
         
#define GPIO_DIG P0
#define GPIO_KEY P1

void delay(u16 i)
{
        while(i--);
}

void KeyDown(void)
{
        u8 a=0;
        GPIO_KEY=0xf0;
        if(GPIO_KEY!=0xf0)//读取按键是否按下
        {
                delay(1000);//延时10ms 进行消抖
                if(GPIO_KEY!=0xf0)//再次检测键盘是否按下
                {
                        //列
                        GPIO_KEY=0xf0;
                        switch(GPIO_KEY)
                        {
                                case(0Xe0): GPIO_DIG=~0x01;break;
                                case(0Xd0): GPIO_DIG=~0x02;break;
                                case(0Xb0): GPIO_DIG=~0x04;break;
                                case(0X70): GPIO_DIG=~0x08;break;
                        }
                }
        }
        while((a<50)&&(GPIO_KEY!=0xf0))
        {
                delay(100);
                a++;
        }//检测按键松手检测
}

void main()
{
        while(1)
        {
                KeyDown(); //按键判断函数
        }
}


为了检测矩阵键盘的数据,在提供的原代码上稍作了修改,目的是为了按第一列按键时D1等亮,按第二列按键时D2等亮,按第三列按键时D3等亮,按第四列按键时D4等亮。知道a在这里是强制退出循环,但是感觉a在这里没有什么作用,要是在此处不设置a,放开按键后一样可以退出循环,不放开按键一直循环也没有什么影响,所以把检测按键松手检测这段改了一下,直接将a去掉了:
  1.       while(GPIO_KEY!=0xf0);
复制代码
去掉后发现, 按键时好时坏,有时候按着枚反应,多按两下就好了,要是加上a后就不存在这个问题,这是为什么呢?请大佬求教
回复

使用道具 举报

0

主题

1

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2019-8-19 11:31:25 | 显示全部楼层
加不加这句话应该都存在“有时候按着没反应,多按几下就好了的”情况吧
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-5-5 20:53 , Processed in 0.104906 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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