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

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;
}  
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。