STM32 矩阵键盘密码验证:8位密码输入,OLED显示结果并发出声音提示
STM32 矩阵键盘密码验证:8位密码输入,OLED显示结果并发出声音提示
本代码实现使用 STM32 和矩阵键盘设置一个 8 位密码,并使用 OLED 显示密码验证结果。密码正确则显示 'Pass!' 并发出两声 '嘀嘀' 声;密码错误则显示 'Warning!' 并发出刺耳的警报声。
代码
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_exti.h"
#include "stm32f4xx_syscfg.h"
#define ROW_NUM 4 // 矩阵键盘的行数
#define COL_NUM 4 // 矩阵键盘的列数
// 定义密码
#define PASSWORD_LENGTH 8
uint8_t password[PASSWORD_LENGTH] = {1, 2, 3, 4, 5, 6, 7, 8};
// 定义按键GPIO端口和引脚
GPIO_TypeDef* ROW_PORT[ROW_NUM] = {GPIOA, GPIOA, GPIOA, GPIOA};
GPIO_TypeDef* COL_PORT[COL_NUM] = {GPIOB, GPIOB, GPIOB, GPIOB};
uint16_t ROW_PIN[ROW_NUM] = {GPIO_Pin_0, GPIO_Pin_1, GPIO_Pin_2, GPIO_Pin_3};
uint16_t COL_PIN[COL_NUM] = {GPIO_Pin_4, GPIO_Pin_5, GPIO_Pin_6, GPIO_Pin_7};
// 定义OLED显示函数
void OLED_ShowString(uint8_t x, uint8_t y, uint8_t* str);
// 定义警报声函数
void buzzer_alarm(void);
// 初始化矩阵键盘GPIO
void keypad_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = ROW_PIN[0] | ROW_PIN[1] | ROW_PIN[2] | ROW_PIN[3];
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = COL_PIN[0] | COL_PIN[1] | COL_PIN[2] | COL_PIN[3];
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
// 读取矩阵键盘的按键值
uint8_t keypad_get_key(void)
{
uint8_t row, col;
uint8_t row_val[ROW_NUM] = {0xff, 0xff, 0xff, 0xff};
// 设置列为高电平
for (col = 0; col < COL_NUM; col++) {
GPIO_SetBits(COL_PORT[col], COL_PIN[col]);
}
// 读取行的值
for (row = 0; row < ROW_NUM; row++) {
GPIO_ResetBits(COL_PORT[row], COL_PIN[row]);
row_val[row] = GPIO_ReadInputDataBit(ROW_PORT[row], ROW_PIN[row]);
GPIO_SetBits(COL_PORT[row], COL_PIN[row]);
}
// 判断按键值
for (row = 0; row < ROW_NUM; row++) {
if (row_val[row] == 0) {
return row * COL_NUM + col;
}
}
return 0xff; // 表示没有按键按下
}
int main(void)
{
uint8_t input[PASSWORD_LENGTH] = {0};
uint8_t i = 0;
keypad_init();
while (1) {
uint8_t key = keypad_get_key();
// 处理按键
if (key != 0xff) {
input[i] = key + 1; // 因为按键值从0开始,所以加1
i++;
if (i >= PASSWORD_LENGTH) {
// 验证密码
uint8_t correct = 1;
for (uint8_t j = 0; j < PASSWORD_LENGTH; j++) {
if (input[j] != password[j]) {
correct = 0;
break;
}
}
if (correct) {
OLED_ShowString(0, 0, 'Pass!');
buzzer_alarm();
} else {
OLED_ShowString(0, 0, 'Warning!');
buzzer_alarm();
}
// 清空输入
for (uint8_t j = 0; j < PASSWORD_LENGTH; j++) {
input[j] = 0;
}
i = 0;
}
}
}
}
void OLED_ShowString(uint8_t x, uint8_t y, uint8_t* str)
{
// 实现OLED显示函数,略
}
void buzzer_alarm(void)
{
// 实现警报声函数,略
}
代码解释
- 头文件包含: 包含 STM32F4xx 的头文件,以及 GPIO、RCC、EXTI、SYSCFG 等外设相关的头文件。
- 定义: 定义矩阵键盘的行数、列数,密码长度,以及密码数组。
- 按键GPIO定义: 定义矩阵键盘行、列的 GPIO 端口和引脚。
- OLED显示和警报声函数: 定义 OLED 显示函数
OLED_ShowString()和警报声函数buzzer_alarm(),这两个函数需要根据具体的硬件实现进行编写。 keypad_init()函数: 初始化矩阵键盘的 GPIO 口,将行设置为输入,列设置为输出。keypad_get_key()函数: 读取矩阵键盘的按键值,返回按键对应的数字,若无按键按下则返回 0xff。main()函数: 主函数,包含以下步骤:- 初始化矩阵键盘 GPIO
- 进入循环,不断读取按键值
- 如果有按键按下,则将按键值存储在
input数组中,并进行计数 - 当输入的按键数量达到 8 位后,开始验证密码
- 验证密码正确则显示 'Pass!' 并发出两声 '嘀嘀' 声;密码错误则显示 'Warning!' 并发出刺耳的警报声
- 清空输入数组并重置计数器,准备下一次输入
注意
- 代码中的
OLED_ShowString()和buzzer_alarm()函数需要根据具体的硬件实现进行编写。 - 密码数组
password中的密码可以根据实际需求进行修改。 - 该代码仅供参考,实际应用中可能需要根据具体情况进行调整。
总结
本文介绍了如何在 STM32 上利用矩阵键盘设置一个 8 位数的密码,并使用 OLED 显示密码验证结果,以及通过声音提示用户密码是否正确。代码包含完整的注释,方便理解和学习。希望本文能帮助您更好地理解 STM32 的开发。
原文地址: https://www.cveoy.top/t/topic/o89Y 著作权归作者所有。请勿转载和采集!