一,工具实现:
stm32cubeide-1.10.1编写和protues-8.0仿真;
芯片:STM32F103R6
灯:LED-RED,LED-GREEN
电阻:RES
三极管:PNP
蜂鸣器:BUZZER
红外模块:IRLINK
串口显示模块:VIRTUAL TERMINAL
电机驱动模块:L298
直流电机:MOTOR-DC
与非:NOR
指纹模拟:KEYPAD-PHONE(后文讲)
时钟激励源
我在下文就只介绍,主要难点:按键矩阵,红外,指纹模拟,电机驱动
二,完成图:
三,实现功能:
1,按键功能:
我这里借鉴了网上的图,但这个是我理解后自己连的图。这个按键矩阵原理是,芯片PC0~PC3输出(初始高电平)PC4~PC6输入(上拉(当有低电平时强行下拉成低电平))。实现按键功能是一行输入低电平,其他三行输入高电平,当按下按键,PC0~PC3依次接收是否有低电平现象,有则记录,这个就是按键矩阵的原理。连点enter可以进入修改密码的功能,若密码多次不对会进入锁死状态,任何操作都无用,初始密码6个0,当输入超过六个0,OLED屏显示“最多输入六个”,当密码正确蜂鸣器响两次,错误响一次。
我写了按键矩阵的读取文件key.c和保存的密码key_num.c代码如下:
key.c
/*
* key.c
*
* Created on: Jan 8, 2024
* Author: dbq
*/
#include <key.h>
#include <key_num.h>
#include "usart.h"
#include <string.h>
#include <stdio.h>
#include "OLED.h"
int ch[7]={};
int i=0;
int rr=0;
int tt=0;
char str[10];
int d=0;
char chin[]={4,5,8,9,10,11};//密码最多六个
char chinpp[]={16,17,18,19,20,4,5};//请输入按键密码
char chinpp1[]={19,20,4,5,21,22,23,24};//按键密码保存成功
char chinpp2[]={16,17,18,25,21,22,26,4,5};//请输入要保存的密码
void revise_num(void){
}
void prinf(void){
if(i>6){
i=6;
OLED_Clear();
OLED_ShowChinese(1, 1, (uint8_t *)chin,6);
}
for(int z=0;z<i;z++){
sprintf(str,"%d",(int)ch[z]);
HAL_UART_Transmit(&huart1, (uint8_t *)str, sizeof(str), 5);
}
HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", 2, 5);
HAL_Delay(1000);
}
void one_line(void){
GPIO_PinState read;
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
read=HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);
if(read==GPIO_PIN_RESET){
ch[i]=7;
i++;
prinf();
}
read=HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_5);
if(read==GPIO_PIN_RESET){
ch[i]=8;
i++;
prinf();
}
read=HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_6);
if(read==GPIO_PIN_RESET){
ch[i]=9;
i++;
prinf();
}
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
}
void tow_line(void){
GPIO_PinState read;
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET);
read=HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);
if(read==GPIO_PIN_RESET){
ch[i]=4;
i+