矩阵按键实现,欢迎来分享更好的矩阵按键实现方案!

2019-07-20 23:22发布


注意:IO口都要上拉。


一、IO口设置为开漏输出:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_OD;   
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
GPIO_Init(GPIOA, &GPIO_InitStructure);

二、扫描程序:
uint8_t KeyScan(void)
{
int tmp;
    static int KeyConter = 0;
 int keyval;
 keyval = 0xFF;
    if (KeyConter < 1)
    {//去抖
                KeyConter++;
    }
else 
{
keyval = 0xFF;
GPIO_Write(GPIOA, 0x0F);          //GPIOA低四位置1,既行选全置1
tmp = (GPIO_ReadInputData(GPIOA) | 0xF0);//读取此时的列选的值
keyval &= tmp;
GPIO_Write(GPIOA, 0xF0);//列选全置1
tmp = (GPIO_ReadInputData(GPIOA) | 0x0F);//读取此时的行选的值
keyval &= tmp; //两次的结果相与得到是一个唯一值,既一个按键按下只有一个keyval与之对应
switch (keyval)
                {                                                  
                case 0xee:    return 1; 
                case 0xde:    return 2;
                case 0xbe:    return 3;
                case 0x7e:    return 4;              
                case 0xed:    return 5;
                case 0xdd:    return 6;
                case 0xbd:    return 7;
                case 0x7d:    return 8;
                case 0xeb:    return 9;
                case 0xdb:    return 10; //*
                case 0xbb:    return 11;
                case 0x7b:    return 12;  //#
case 0x77:    return 13; //下一位
                default:      return 0;
                }               

KeyConter=0;
}  
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
下一个定义
1楼-- · 2019-07-22 15:14
 精彩回答 2  元偷偷看……
bruellyyang
2楼-- · 2019-07-22 16:47
下一个定义 发表于 2016-7-12 09:29
1、是可以用&的,但你后面“keyval&=tmp”就不能用&而用|。
2、因为已经用了GPIO_Write(GPIOA,0X0F)这 ...

这个地方已经明白了,上面的没问题。按键输入,为什么把IO口配置成开漏输出的
下一个定义
3楼-- · 2019-07-22 19:46
bruellyyang 发表于 2016-7-12 14:34
这个地方已经明白了,上面的没问题。按键输入,为什么把IO口配置成开漏输出的

这个我也不太懂,可能是因为用了GPIO_Write函数
orzking
4楼-- · 2019-07-22 23:52
该函数的调用间隔必须要大于按键抖动的时间。至少调用两次才能获取按键值
orzking
5楼-- · 2019-07-23 03:28
 精彩回答 2  元偷偷看……
superatom
6楼-- · 2019-07-23 08:21
MARK一下

一周热门 更多>