概要:
从网上找相关代码时,一些代码直接复制粘贴过来之后,可能没法使用,自己为了求效率只好继续从网上找。前一段时间终于避不开矩阵键盘了,于是自己就耐着性子写了一个适配STM32F103C8T6的4*4矩阵键盘函数库。
我自己在编写这个4*4键盘库时力求简短,可能在细节方面上存在瑕疵,不过整体还能使用。
也许代码被压缩的体积转化为了STM32的算力消耗,但影响应该不算大?如果有大佬能指出改进的方案,这里不胜感激。
4*4矩阵键盘函数库:
1. 头文件:KeyBoard_4_4.h
#ifndef __KEYBOARD_4_4_H
#define __KEYBOARD_4_4_H
#include "stm32f10x.h" // Device header
//这个4*4矩阵键盘实现库具有以下特点:
//1、使用行扫描法对键盘进行扫描;
//2、部分按键同时按下不会相互冲突,具体无冲按键作者暂未分析,用户想利用此功能可以枚举尝试(推荐不使用);
//3、代码极简化。
void KeyBoard_4_4_Init(void);
u8 KeyBoard_4_4_Scan(void);
#endif
2. 源文件:KeyBoard_4_4.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
//逐行扫描法。
//引脚定义:
//Row1~4:A0~A3
//Column1~4:A4~A7
uint16_t returnValue = 0x0000;
void KeyBoard_4_4_Init(void)
{
//Row
//A0~A3引脚对应矩阵键盘第1~4行。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//Column
//A4~7引脚对应矩阵键盘第1~4列。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
u8 KeyBoard_4_4_Scan(void)
{
static uint16_t temp;//中间量
static uint8_t row,column;
temp = 0x00F0;
/*************Scan Rows************************/
for(row=0;row<4;row++)
{
GPIO_Write(GPIOA,(0x00FF & (~(0x0001<<row))));
temp = GPIO_ReadInputData(GPIOA) & 0X00F0;
if( temp != 0x00F0)
{
Delay_ms(8);//消抖
if(temp != 0xF0)//再次确认:的确有按键被按下
{
/*************Scan Columns************************/
for(column=0;column<4;column++)
{
if((temp & (0x0010 << column)) == 0x0000)
{
returnValue = 0x0000 | (0x0001 << (4 * row + column));//推荐 = 而不是 |= ,这里作者想实现多个按键同时按下的检测,但效果并不好。
return (4 * row + column + 1);//如果想尝试个别键无冲的效果:两个操作:1、函数无返回值;2、操作上一句的注释中的不推荐的操作。
}
}
break;
}
}
returnValue = 0x0000;
}
return 0;
}
3. 说明:
上面展示了函数库的内容,可以复制粘贴到自己工程。用户可以如此使用:
#include "stm32f10x.h" // Device header
#include "KeyBoard_4_4.h"
int main(void)
{
KeyBoard_4_4_Init();
while(1)
{
switch(KeyBoard_4_4_Scan())
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
break;
case 12:
break;
case 13:
break;
case 14:
break;
case 15:
break;
case 16:
break;
}
}
}
文件提供:
已上传上述三个文件。如果该文章有帮到您,麻烦点个赞,这对我的创作热情很重要!