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)
{
    // 实现警报声函数,略
}

代码解释

  1. 头文件包含: 包含 STM32F4xx 的头文件,以及 GPIO、RCC、EXTI、SYSCFG 等外设相关的头文件。
  2. 定义: 定义矩阵键盘的行数、列数,密码长度,以及密码数组。
  3. 按键GPIO定义: 定义矩阵键盘行、列的 GPIO 端口和引脚。
  4. OLED显示和警报声函数: 定义 OLED 显示函数 OLED_ShowString() 和警报声函数 buzzer_alarm(),这两个函数需要根据具体的硬件实现进行编写。
  5. keypad_init() 函数: 初始化矩阵键盘的 GPIO 口,将行设置为输入,列设置为输出。
  6. keypad_get_key() 函数: 读取矩阵键盘的按键值,返回按键对应的数字,若无按键按下则返回 0xff。
  7. main() 函数: 主函数,包含以下步骤:
    • 初始化矩阵键盘 GPIO
    • 进入循环,不断读取按键值
    • 如果有按键按下,则将按键值存储在 input 数组中,并进行计数
    • 当输入的按键数量达到 8 位后,开始验证密码
    • 验证密码正确则显示 'Pass!' 并发出两声 '嘀嘀' 声;密码错误则显示 'Warning!' 并发出刺耳的警报声
    • 清空输入数组并重置计数器,准备下一次输入

注意

  • 代码中的 OLED_ShowString()buzzer_alarm() 函数需要根据具体的硬件实现进行编写。
  • 密码数组 password 中的密码可以根据实际需求进行修改。
  • 该代码仅供参考,实际应用中可能需要根据具体情况进行调整。

总结

本文介绍了如何在 STM32 上利用矩阵键盘设置一个 8 位数的密码,并使用 OLED 显示密码验证结果,以及通过声音提示用户密码是否正确。代码包含完整的注释,方便理解和学习。希望本文能帮助您更好地理解 STM32 的开发。

STM32 矩阵键盘密码验证:8位密码输入,OLED显示结果并发出声音提示

原文地址: https://www.cveoy.top/t/topic/o89Y 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录