十六届蓝桥杯嵌入式 模拟题
题干大概内容:
1.输入密码界面(Lock)
2.修改密码界面(Set)
初始密码为012,当输入密码错误时,会返回输入界面重新输入;
当输入正确密码时,进入修改密码界面,若修改密码界面超过三秒无响应,则返回输入密码界面;
密码机制:通过采集R37的ADC电压值来进行判断,当电压小于1.5时,该密码值为0;当电压值大于等于1.5并且小于等于2.5时,密码值为1;当电压值大于2.5时,密码值为2;
按键B1产生一次下降沿的时候,为确定一位密码;
在输入界面时,LED1亮;在修改界面时,LED2亮;
当完成密码修改后,修改后的密码通过I2C存入AT24C02,实现掉电不丢失的功能。
ps:本人新手小白,代码全部是自己打的,若有不正确或者可以优化的地方,请大佬指正
使用到的模块:
- LED模块
- 按键模块
- LCD模块
- ADC模块
- AT24C02模块
一、CUBE配置
- LED的引脚配置为OutPut模式(PC8~PC15),且初始电压为高电压
- PD2配置为OutPut模式(锁存器),且初始电压为低
- KEY按键引脚设置为InPut模式(PB0~PB2,PA0)
- LCD引脚设置为OutPut模式(PA8,PB589,PC0~15)
- ADC引脚设置为ADC2通道15(PB15),并打开ADC2的通道15
- AT24C02的引脚设置为OutPut模式(PB6 PB7)
二、将I2C和LCD驱动程序复制到工程文件下
三、代码模块
1.LED和按键的代码,可以写入gpio.c的代码区(记得函数名要在.h文件下声明一下不然会报错)
void Led_Display(uint8_t uled)
{
//将LED的灯全部熄灭
HAL_GPIO_WritePin(GPIOC,0xff<<8,GPIO_PIN_SET);
//拉高PD2引脚,打开锁存器,将LED的数据传入
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
//拉低PD2引脚,闭关锁存器
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
//将uled的值左移八位,打开LED灯
HAL_GPIO_WritePin(GPIOC,uled<<8,GPIO_PIN_RESET);
//拉高PD2引脚,打开锁存器,将LED的数据传入
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
//拉低PD2引脚,闭关锁存器
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
uint8_t Key_Scanf()
{
uint8_t key_val=0;
//如果PB0引脚产生低电平
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET){
key_val=1;
}
//如果PB1引脚产生低电平
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET){
key_val=2;
}
//如果PB2引脚产生低电平
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET){
key_val=3;
}
//如果PA0引脚产生低电平
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET){
key_val=4;
}
//返回按键值
return key_val;
}
2.采样ADC的值,可以写入adc.c文件下(记得声明函数名)
uint16_t Get_ADC()
{
//定义一个16位的值用来保存采样到的ADC
uint16_t ADC_val;
//开启ADC通道2的采样
HAL_ADC_Start(&hadc2);
//获取采样到的ADC值
ADC_val=HAL_ADC_GetValue(&hadc2);
//返回采样值
return ADC_val;
}
3.在i2c文件下写一个读函数和写函数对AT24C02进行操作
void AT24C02_Write(unsigned char addr,unsigned char dat)
{
I2CStart();
I2CSendByte(0Xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
I2CStop();
}
uint8_t AT24C02_Read(uint8_t addr)
{
unsigned char dat;
I2CStart();
I2CSendByte(0Xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0Xa1);
I2CWaitAck();
dat=I2CReceiveByte();
I2CSendNotAck();
I2CStop();
return dat;
}
4.将用到的模块文件引入主函数内
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "i2c - hal.h"
#include "adc.h"
#include "stdio.h"
#include "string.h"
/* USER CODE END Includes */
5.进行子函数和主函数的编写
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2024 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "i2c - hal.h"
#include "adc.h"
#include "stdio.h"
#include "string.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
//LED define
uint8_t uled;
//LCD define
char lcd_buff[128]; //lcd显示字符串缓冲区
uint8_t lcd_shift=0; //输入密码的四个屏幕
uint8_t lcd_pass=0; //修改密码的三个屏幕
//ADC define
double R37pb15_Number; //ADC采集的值
//KEY define
uint8_t key_up,key_down,key_val,key_old;
uint8_t key_mi=0; //输入密码的键值
uint8_t key_ma=0; //修改密码的键值
//三个输入密码
uint8_t a=0;
uint8_t b=0;
uint8_t c=0;
//三个存储密码
uint8_t d=0;
uint8_t e=1;
uint8_t f=2;
//输入三个密码成功的标志位
uint8_t key_flag=0;
//修改三个密码成功标志位
uint8_t set_mima_flag=0;
//输入密码正确进入修改密码界面的标志位
uint8_t mima_flag=0;
//时间定义
uint32_t time=0;
int time2=0;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void LED_Port();
void Key_Port();
void Lcd_Port();
void ADC_Port();
void Mi_Set();
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC2_Init();
LCD_Init();
I2CInit();
/* USER CODE BEGIN 2 */
LCD_Clear(White);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
AT24C02_Write(0x00,0);
HAL_Delay(10);
AT24C02_Write(0x01,1);
HAL_Delay(10);
AT24C02_Write(0x02,2);
HAL_Delay(10);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
LED_Port();
Key_Port();
Lcd_Port();
ADC_Port();
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
/** Configure the main internal regulator output voltage
*/
HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;
RCC_OscInitStruct.PLL.PLLN = 20;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
/** Initializes the peripherals clocks
*/
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
}
/* USER CODE BEGIN 4 */
void LED_Port()
{
Led_Display(uled);
}
void Key_Port()
{
key_val=Key_Scanf();
key_down=key_val&(key_val^key_old);
key_up=~key_val&(key_val^key_old);
key_old=key_val;
//当按键1按下后
if(key_down==1)
{
//按键操作的值 从0开始 1为第一个密码 2为第二个密码 3为第三个密码
if(++key_mi>3)
key_mi=0;
//0是第一个界面,一共5个界面切换
if(++lcd_shift>7)
lcd_shift=0;
//当输入的密码正确的时候
if(mima_flag==1)
{
//修改密码界面加一
if(++lcd_pass>3)
lcd_pass=0;
//修改密码值加一
if(++key_ma>3)
key_ma=0;
}
//lcd屏幕刷新
LCD_Clear(White);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
//时间清零
time2=0;
}
}
void Lcd_Port()
{
//lcd_shift的第0个界面 密码为3个※
if(lcd_shift==0)
{
LCD_DisplayStringLine(Line2,(uint8_t*)" Lock ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Pass Word ");
LCD_DisplayStringLine(Line5,(uint8_t*)" * * * ");
uled=0x01;
}
//产生下降沿后 lcd_shift的第1个界面且密码值变成1
if(lcd_shift==1&&key_mi==1)
{
//做判断 当ADC采样的值小于1.5时,给a赋值并显示在LCD屏上
if(R37pb15_Number<1.5)
{
a=0;
LCD_DisplayStringLine(Line2,(uint8_t*)" Lock ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Pass Word ");
sprintf(lcd_buff," %d * * ",a);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
}
//做判断 当ADC采样的值大于1.5并且小于等于2.5时,给a赋值并显示在LCD屏上
else if(R37pb15_Number>=1.5&&R37pb15_Number<=2.5)
{
a=1;
LCD_DisplayStringLine(Line2,(uint8_t*)" Lock ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Pass Word ");
sprintf(lcd_buff," %d * * ",a);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
}
//做判断 当ADC采样的值大于2.5时,给a赋值并显示在LCD屏上
if(R37pb15_Number>2.5)
{
a=2;
LCD_DisplayStringLine(Line2,(uint8_t*)" Lock ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Pass Word ");
sprintf(lcd_buff," %d * * ",a);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
}
uled=0x01;
}
//产生下降沿后 lcd_shift的第2个界面且密码的键值变成2
if(lcd_shift==2&&key_mi==2)
{
if(R37pb15_Number<1.5)
{
b=0;
LCD_DisplayStringLine(Line2,(uint8_t*)" Lock ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Pass Word ");
sprintf(lcd_buff," %d %d * ",a,b);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
}
else if(R37pb15_Number>=1.5&&R37pb15_Number<=2.5)
{
b=1;
LCD_DisplayStringLine(Line2,(uint8_t*)" Lock ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Pass Word ");
sprintf(lcd_buff," %d %d * ",a,b);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
}
else if(R37pb15_Number>2.5)
{
b=2;
LCD_DisplayStringLine(Line2,(uint8_t*)" Lock ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Pass Word ");
sprintf(lcd_buff," %d %d * ",a,b);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
}
uled=0x01;
}
//产生下降沿后 lcd_shift的第3个界面且密码的键值变成3
if(lcd_shift==3&&key_mi==3)
{
if(R37pb15_Number<1.5)
{
c=0;
LCD_DisplayStringLine(Line2,(uint8_t*)" Lock ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Pass Word ");
sprintf(lcd_buff," %d %d %d ",a,b,c);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
key_flag=1;
//密码检测函数
Mi_Set();
}
else if(R37pb15_Number>=1.5&&R37pb15_Number<=2.5)
{
c=1;
LCD_DisplayStringLine(Line2,(uint8_t*)" Lock ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Pass Word ");
sprintf(lcd_buff," %d %d %d ",a,b,c);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
key_flag=1;
//密码检测函数
Mi_Set();
}
else if(R37pb15_Number>2.5)
{
c=2;
LCD_DisplayStringLine(Line2,(uint8_t*)" Lock ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Pass Word ");
sprintf(lcd_buff," %d %d %d ",a,b,c);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
key_flag=1;
//密码检测函数
Mi_Set();
}
uled=0x01;
}
//当密码正确时 进入修改密码界面
if(lcd_shift==4)
{
LCD_DisplayStringLine(Line2,(uint8_t*)" Set ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Change ");
LCD_DisplayStringLine(Line5,(uint8_t*)" * * * ");
uled=0x02;
//当三秒没有进行修改密码时
if(time2==3)
{
//输入密码的屏幕清零
lcd_shift=0;
//修改密码的屏幕清零
lcd_pass=0;
//输入密码和修改密码的键值清零
key_ma=0;
key_mi=0;
//密码正确标志位清零
mima_flag=0;
//LCD刷新
LCD_Clear(White);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
}
}
//开始修改第一个密码 lcd_pass的第一个界面
if(lcd_pass==1&&key_ma==1)
{
if(R37pb15_Number<1.5)
{
d=0;
LCD_DisplayStringLine(Line2,(uint8_t*)" Set ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Change ");
sprintf(lcd_buff," %d * * ",d);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
//将密码d存到AT24里
AT24C02_Write(0x00,d);
HAL_Delay(20);
}
else if(R37pb15_Number>=1.5&&R37pb15_Number<=2.5)
{
d=1;
LCD_DisplayStringLine(Line2,(uint8_t*)" Set ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Change ");
sprintf(lcd_buff," %d * * ",d);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
//将密码d存到AT24里
AT24C02_Write(0x00,d);
HAL_Delay(20);
}
else if(R37pb15_Number>2.5)
{
d=2;
LCD_DisplayStringLine(Line2,(uint8_t*)" Set ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Change ");
sprintf(lcd_buff," %d * * ",d);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
//将密码d存到AT24里
AT24C02_Write(0x00,d);
HAL_Delay(20);
}
uled=0x02;
if(time2==3)
{
lcd_shift=0;
lcd_pass=0;
key_ma=0;
key_mi=0;
//key_flag=0;
mima_flag=0;
LCD_Clear(White);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
}
}
//修改密码的界面 并且是第二个密码
if(lcd_pass==2&&key_ma==2)
{
if(R37pb15_Number<1.5)
{
e=0;
LCD_DisplayStringLine(Line2,(uint8_t*)" Set ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Change ");
sprintf(lcd_buff," %d %d * ",d,e);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
//将密码e存到AT24里
AT24C02_Write(0x01,e);
HAL_Delay(20);
}
else if(R37pb15_Number>=1.5&&R37pb15_Number<=2.5)
{
e=1;
LCD_DisplayStringLine(Line2,(uint8_t*)" Set ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Change ");
sprintf(lcd_buff," %d %d * ",d,e);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
//将密码e存到AT24里
AT24C02_Write(0x01,e);
HAL_Delay(20);
}
else if(R37pb15_Number>2.5)
{
e=2;
LCD_DisplayStringLine(Line2,(uint8_t*)" Set ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Change ");
sprintf(lcd_buff," %d %d * ",d,e);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
//将密码e存到AT24里
AT24C02_Write(0x01,e);
HAL_Delay(20);
}
uled=0x02;
if(time2==3)
{
lcd_shift=0;
lcd_pass=0;
key_ma=0;
key_mi=0;
//key_flag=0;
mima_flag=0;
LCD_Clear(White);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
}
}
//修改密码的界面 并且是第三个密码
if(lcd_pass==3&&key_ma==3)
{
if(R37pb15_Number<1.5)
{
f=0;
LCD_DisplayStringLine(Line2,(uint8_t*)" Set ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Change ");
sprintf(lcd_buff," %d %d %d ",d,e,f);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
//将密码f存到AT24里
AT24C02_Write(0x02,f);
HAL_Delay(20);
set_mima_flag=1;
}
else if(R37pb15_Number>=1.5&&R37pb15_Number<=2.5)
{
f=1;
LCD_DisplayStringLine(Line2,(uint8_t*)" Set ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Change ");
sprintf(lcd_buff," %d %d %d ",d,e,f);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
//将密码f存到AT24里
AT24C02_Write(0x02,f);
HAL_Delay(20);
set_mima_flag=1;
}
else if(R37pb15_Number>2.5)
{
f=2;
LCD_DisplayStringLine(Line2,(uint8_t*)" Set ");
LCD_DisplayStringLine(Line4,(uint8_t*)" Change ");
sprintf(lcd_buff," %d %d %d ",d,e,f);
LCD_DisplayStringLine(Line5,(uint8_t*)lcd_buff);
//将密码f存到AT24里
AT24C02_Write(0x02,f);
HAL_Delay(20);
set_mima_flag=1;
}
uled=0x02;
if(time2==3)
{
lcd_shift=0;
key_mi=0;
lcd_pass=0;
key_ma=0;
//key_flag=0;
mima_flag=0;
set_mima_flag=0;
LCD_Clear(White);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
}
}
if(set_mima_flag==1)
{
set_mima_flag=0;
lcd_shift=0;
key_mi=0;
lcd_pass=0;
key_ma=0;
key_flag=0;
mima_flag=0;
LCD_Clear(White);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
}
}
void ADC_Port()
{
R37pb15_Number=Get_ADC()*3.3/4096;
}
void Mi_Set()
{
//当三个密码输入完毕进行核对
if(key_flag==1)
{
if(a==d&&b==e)
{
//if(b==e)
//{
if(c==f)
{
//如果密码正确 进入修改密码的界面
lcd_shift=4;
//密码输入完毕标志位清零
key_flag=0;
//密码正确标志位置一
mima_flag=1;
//清空输入密码的键值
key_mi=0;
//刷新界面
LCD_Clear(White);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
}
//}
}
else
{
lcd_shift=0;
key_mi=0;
key_flag=0;
}
}
}
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
ps:最后有个小bug,修改第三个密码的时候,当检测到R37的值就立马修改完成,也就是第二个密码的值的第三个密码的值是一样的,有大佬可以帮我修改一下这屎山代码吗
作者:Y0071