stm32f103zet64*4矩阵按键按下两个值最后在LCD12864液晶屏得到的结果是从左往右的值例子
时间: 2024-04-12 13:31:35 浏览: 12
好的,下面是一个示例代码,展示如何在STM32F103ZET6开发板上实现按下4x4矩阵按键获取两个值,并将结果从左到右显示在LCD12864液晶屏上:
```c
#include "stm32f10x.h"
#include "lcd12864.h"
#define ROW_NUM 4
#define COL_NUM 4
// 定义矩阵按键的行和列引脚
GPIO_TypeDef* rowPorts[ROW_NUM] = {GPIOA, GPIOA, GPIOA, GPIOA};
uint16_t rowPins[ROW_NUM] = {GPIO_Pin_0, GPIO_Pin_1, GPIO_Pin_2, GPIO_Pin_3};
GPIO_TypeDef* colPorts[COL_NUM] = {GPIOB, GPIOB, GPIOB, GPIOB};
uint16_t colPins[COL_NUM] = {GPIO_Pin_0, GPIO_Pin_1, GPIO_Pin_2, GPIO_Pin_3};
// 定义按键状态数组
uint8_t keyState[ROW_NUM][COL_NUM] = {0};
// 初始化矩阵按键的GPIO引脚
void initMatrixKey() {
GPIO_InitTypeDef GPIO_InitStruct;
// 初始化行引脚为输入模式,上拉输入
for (int i = 0; i < ROW_NUM; i++) {
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin = rowPins[i];
GPIO_Init(rowPorts[i], &GPIO_InitStruct);
}
// 初始化列引脚为输出模式,设置为高电平
for (int i = 0; i < COL_NUM; i++) {
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = colPins[i];
GPIO_Init(colPorts[i], &GPIO_InitStruct);
GPIO_SetBits(colPorts[i], colPins[i]);
}
}
// 读取矩阵按键的状态
void readMatrixKey() {
for (int row = 0; row < ROW_NUM; row++) {
// 设置当前行为低电平,其他行为高电平
GPIO_ResetBits(rowPorts[row], rowPins[row]);
for (int col = 0; col < COL_NUM; col++) {
// 读取当前列的状态
keyState[row][col] = GPIO_ReadInputDataBit(colPorts[col], colPins[col]);
}
// 恢复当前行为高电平
GPIO_SetBits(rowPorts[row], rowPins[row]);
}
}
// 获取按下的两个值并拼接
int getPressedValues() {
int value1 = -1;
int value2 = -1;
int result;
for (int row = 0; row < ROW_NUM; row++) {
for (int col = 0; col < COL_NUM; col++) {
if (keyState[row][col] == 0) {
if (value1 == -1) {
value1 = row * COL_NUM + col;
} else if (value2 == -1) {
value2 = row * COL_NUM + col;
}
}
}
}
// 拼接两个值
result = value1 * 10 + value2;
return result;
}
// 将结果从左到右显示在LCD上
void displayResultOnLCD(int result) {
char str[8];
sprintf(str, "%-7d", result); // 将结果格式化为7位字符串
LCD12864_Clear(); // 清屏
for (int i = 0; i < 7; i++) {
LCD12864_ShowChar(2 + i * 6, 2, str[i]); // 从左到右逐个显示字符
}
}
int main(void) {
int result;
// 初始化矩阵按键和LCD显示屏
initMatrixKey();
LCD12864_Init();
while (1) {
readMatrixKey(); // 读取矩阵按键状态
result = getPressedValues(); // 获取按下的两个值并拼接
displayResultOnLCD(result); // 将结果显示在LCD上
}
}
```
在上述示例代码中,我们假设矩阵按键的行引脚连接到GPIOA的Pin 0-3,列引脚连接到GPIOB的Pin 0-3。您需要根据实际情况进行引脚分配。
请注意,以上示例仅供参考,您需要根据实际情况进行适当的调整和修改。希望这些信息能对您有所帮助!如果您还有其他问题,请随时提问。