514430901 发表于 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去掉了:      while(GPIO_KEY!=0xf0);去掉后发现, 按键时好时坏,有时候按着枚反应,多按两下就好了,要是加上a后就不存在这个问题,这是为什么呢?请大佬求教

shang1205 发表于 2019-8-19 11:31:25

加不加这句话应该都存在“有时候按着没反应,多按几下就好了的”情况吧
页: [1]
查看完整版本: 矩阵按键问题