十六届蓝桥杯嵌入式 模拟题

 题干大概内容:

1.输入密码界面(Lock)

2.修改密码界面(Set)

初始密码为012,当输入密码错误时,会返回输入界面重新输入;

当输入正确密码时,进入修改密码界面,若修改密码界面超过三秒无响应,则返回输入密码界面;

密码机制:通过采集R37的ADC电压值来进行判断,当电压小于1.5时,该密码值为0;当电压值大于等于1.5并且小于等于2.5时,密码值为1;当电压值大于2.5时,密码值为2;

按键B1产生一次下降沿的时候,为确定一位密码;

在输入界面时,LED1亮;在修改界面时,LED2亮;

当完成密码修改后,修改后的密码通过I2C存入AT24C02,实现掉电不丢失的功能。

ps:本人新手小白,代码全部是自己打的,若有不正确或者可以优化的地方,请大佬指正

使用到的模块: 

  1. LED模块
  2. 按键模块
  3. LCD模块
  4. ADC模块
  5. AT24C02模块

一、CUBE配置

  1. LED的引脚配置为OutPut模式(PC8~PC15),且初始电压为高电压
  2. PD2配置为OutPut模式(锁存器),且初始电压为低
  3. KEY按键引脚设置为InPut模式(PB0~PB2,PA0)
  4. LCD引脚设置为OutPut模式(PA8,PB589,PC0~15)
  5. ADC引脚设置为ADC2通道15(PB15),并打开ADC2的通道15
  6. 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>&copy; 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

物联沃分享整理
物联沃-IOTWORD物联网 » 十六届蓝桥杯嵌入式 模拟题

发表回复