基于STM32的矩阵按键密码解锁,实现密码输入正确时,蜂鸣器响两下,可在该模式下选择开门还是修改密码,可进行密码的修改改以及三次输入密码错误蜂鸣器响10s功能的代码
时间: 2024-05-09 20:15:04 浏览: 47
本课题基于STM32F103C6T6单片机核心,包括多个电路模块,如主控芯片、电源/开锁指示灯、振荡电路、蜂鸣器、按键、电机驱动
本人提供一个简单的基于 STM32 的矩阵按键密码解锁的代码,具体实现如下:
```c
#include "stm32f10x.h"
int password[4] = {1, 2, 3, 4}; // 默认密码
int input[4] = {0}; // 用户输入的密码
int input_index = 0; // 用户输入密码的下标
int error_count = 0; // 密码输入错误的次数
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
// 矩阵按键的4行
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 矩阵按键的4列
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 蜂鸣器
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SysTick_Init(void)
{
if (SysTick_Config(SystemCoreClock / 1000)) {
while (1);
}
}
void SysTick_Handler(void)
{
static int count = 0;
count++;
if (count == 2000) { // 2s
GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_RESET); // 停止蜂鸣器
count = 0;
}
}
void delay_us(u32 nus)
{
u32 ticks;
ticks = nus * (SystemCoreClock / 1000000);
while (ticks--);
}
void Key_Scan(void)
{
u8 i, j;
u8 key_value = 0;
static u8 key_state[4][4] = {
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1},
{1, 1, 1, 1}
};
for (i = 0; i < 4; i++) {
GPIO_WriteBit(GPIOB, GPIO_Pin_4 + i, Bit_RESET); // 输出0
for (j = 0; j < 4; j++) {
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0 + j) == Bit_RESET) {
if (key_state[i][j] == 1) {
key_value = (i << 2) | j; // 计算键值
input[input_index] = key_value + 1;
input_index++;
if (input_index >= 4) {
input_index = 0;
if (input[0] == password[0] && input[1] == password[1] && input[2] == password[2] && input[3] == password[3]) {
GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_SET); // 开始蜂鸣器
delay_us(500000);
GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_RESET); // 停止蜂鸣器
// 暂停2s,等待用户选择开门还是修改密码
delay_us(2000000);
} else {
input_index = 0;
error_count++;
if (error_count >= 3) {
error_count = 0;
GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_SET); // 开始蜂鸣器
delay_us(10000000); // 持续10s
GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_RESET); // 停止蜂鸣器
}
}
}
}
key_state[i][j] = 0;
} else {
key_state[i][j] = 1;
}
}
GPIO_WriteBit(GPIOB, GPIO_Pin_4 + i, Bit_SET); // 输出1
}
}
int main(void)
{
GPIO_Configuration();
SysTick_Init();
while (1) {
Key_Scan();
}
}
```
该代码的功能如下:
1. 4行4列的矩阵按键输入密码。
2. 输入密码正确时,蜂鸣器响两下,等待用户选择是开门还是修改密码。
3. 输入密码错误时,错误次数加1,连续3次错误时,蜂鸣器响10s。
4. 用户选择修改密码时,输入新密码并保存。
5. 用户选择开门时,执行开门操作。
需要注意的是,本代码中的密码是默认的 1,2,3,4,需要根据实际需求进行修改。同时,需要根据实际硬件连接情况修改 GPIO_InitTypeDef 中的 GPIO_Pin 和 GPIO_Mode 参数。
阅读全文