stm32f103矩阵按键初始化程序
时间: 2023-08-23 15:08:14 浏览: 52
以下是一个简单的矩阵按键初始化程序,适用于stm32f103芯片:
```c
#include "stm32f10x.h"
#define KEYPAD_PORT GPIOA
#define KEYPAD_ROW1 GPIO_Pin_0
#define KEYPAD_ROW2 GPIO_Pin_1
#define KEYPAD_ROW3 GPIO_Pin_2
#define KEYPAD_ROW4 GPIO_Pin_3
#define KEYPAD_COL1 GPIO_Pin_4
#define KEYPAD_COL2 GPIO_Pin_5
#define KEYPAD_COL3 GPIO_Pin_6
#define KEYPAD_COL4 GPIO_Pin_7
void Keypad_Init(void) {
// 初始化列引脚为输出
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = KEYPAD_COL1 | KEYPAD_COL2 | KEYPAD_COL3 | KEYPAD_COL4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(KEYPAD_PORT, &GPIO_InitStruct);
// 初始化行引脚为输入
GPIO_InitStruct.GPIO_Pin = KEYPAD_ROW1 | KEYPAD_ROW2 | KEYPAD_ROW3 | KEYPAD_ROW4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(KEYPAD_PORT, &GPIO_InitStruct);
}
uint8_t Keypad_Scan(void) {
uint8_t key = 0;
// 检测第一列
GPIO_ResetBits(KEYPAD_PORT, KEYPAD_COL1);
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW1) == 0) key = 1;
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW2) == 0) key = 4;
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW3) == 0) key = 7;
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW4) == 0) key = 10;
GPIO_SetBits(KEYPAD_PORT, KEYPAD_COL1);
// 检测第二列
GPIO_ResetBits(KEYPAD_PORT, KEYPAD_COL2);
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW1) == 0) key = 2;
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW2) == 0) key = 5;
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW3) == 0) key = 8;
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW4) == 0) key = 0;
GPIO_SetBits(KEYPAD_PORT, KEYPAD_COL2);
// 检测第三列
GPIO_ResetBits(KEYPAD_PORT, KEYPAD_COL3);
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW1) == 0) key = 3;
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW2) == 0) key = 6;
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW3) == 0) key = 9;
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW4) == 0) key = 11;
GPIO_SetBits(KEYPAD_PORT, KEYPAD_COL3);
// 检测第四列
GPIO_ResetBits(KEYPAD_PORT, KEYPAD_COL4);
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW1) == 0) key = 12;
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW2) == 0) key = 13;
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW3) == 0) key = 14;
if (GPIO_ReadInputDataBit(KEYPAD_PORT, KEYPAD_ROW4) == 0) key = 15;
GPIO_SetBits(KEYPAD_PORT, KEYPAD_COL4);
return key;
}
```
在这个程序中,我们首先定义了矩阵按键的引脚号码,然后定义了一个`Keypad_Init()`函数来初始化这些引脚。在该函数中,我们将列引脚设置为输出,行引脚设置为输入。接着,我们定义了一个`Keypad_Scan()`函数来扫描矩阵按键。在该函数中,我们依次检测每一列,如果发现某一行被按下了,就返回相应的键码。最后,我们可以在主函数中调用`Keypad_Scan()`函数来获取按下的键。