STM32智能门禁系统(语音版)

目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

PCB图

五、程序设计

[六、实验效果 ​编辑](#六、实验效果 编辑)

七、包含内容

项目分享

一、前言

项目成品图片:

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV1aTuw6UErf/?spm_id_from=333.1387.homepage.video_card.click&vd_source=199aed5297a00e80e1faf7e270afe8d7

(资料分享见文末)

二、项目简介

1.功能详解

基于STM32的智能门禁系统(语音版)

功能如下:

  1. STM32F103C8T6单片机作为主控芯片
  2. 检测功能:检测输入的密码、卡片、指纹是否匹配
  3. 显示功能:OLED显示时间,密码输入界面
  4. 手动控制:手动模式下可通过按键控制门锁、LED的开关
  5. 自动模式:自动模式下输入的密码\卡片\指纹验证通过后,可自动进入设置模式,语音播报
  6. 设置模式:按键可设置时间、密码、录入\删除卡片或指纹等功能
  7. 蓝牙APP:通过蓝牙连接手机APP,APP可以远程开锁,修改密码

2.主要器件

  • STM32F103C8T6单片机
  • OLED 屏幕
  • AS608指纹模块
  • RC522射频模块
  • 4*4矩阵键盘
  • JR6001语音模块
  • BT04-A蓝牙模块
  • 有源蜂鸣器
  • LED灯
  • 舵机

三、原理图设计

四、PCB硬件设计

PCB图

五、程序设计

cpp 复制代码
#include "stm32f10x.h"
#include "led.h"
#include "beep.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "button4_4.h"
#include "Modules.h"
#include "adcx.h"
#include "flash.h"
#include "TIM2.h" 
#include "timer.h"
#include "usart2.h"
#include "servo.h"
#include "MFRC522.h"
#include "password.h"
#include "MyRTC.h"
#include "finger.h"
#include "usart3.h"
#include <string.h>
#include <stdio.h>


/****************异方辰电子工作室******************
					   STM32
											
 * 项目		:	    STM32智能门禁系统(语音版)                 
 * 版本		:       V2.0
 * 日期		:       2026.3.11
 * MCU		:	    STM32F103C8T6
 * 接口		:	    见代码		
 * IP账号	:	    异方辰电子/辰哥单片机设计(同BILIBILI|抖音|快手|小红书|CSDN|公众号|视频号等)
 * 作者		:	    辰哥 
 * 工作室	:       异方辰电子工作室
 * 授权IP	:	    辰哥单片机设计、异方辰电子、YFC电子、异方辰系列 
 * 官方网站	:	    www.yfcdz.cn	

**********************BEGIN***********************/




#define KEY_S1     1
#define KEY_S2     2
#define KEY_S3     3
#define KEY_S4     4
#define KEY_S5     5
#define KEY_S6     6
#define KEY_S7     7
#define KEY_S8     8
#define KEY_S9     9
#define KEY_S10    10
#define KEY_S11    11
#define KEY_S12    12
#define KEY_S13    13
#define KEY_S14    14
#define KEY_S15    15
#define KEY_S16    16

#define AUTO_MODE     1   // 自动模式
#define MANUAL_MODE   2   // 手动模式
#define SETTINGS_MODE 3   // 设置模式
	
// 外部变量声明
  SensorModules sensorData;								
  SensorThresholdValue Sensorthreshold;		
  DriveModules driveData;									

// 全局变量定义
uint8_t mode = 1;	//系统模式  1自动  2手动  3设置
// 系统静态变量
uint8_t count_m = 1;  // 手动模式按键计数
uint8_t count_s = 1;	 // 设置模式按键计数
uint8_t auto_page = 1;   
uint8_t set_pass = 0;
uint8_t password_confirm = 0;
extern uint8_t Password_ConfirmStep;
extern uint8_t Password_SetStep;
extern uint8_t Password_success;
uint8_t TimeMenuFlag = 0;
static uint8_t count_t = 1; 
uint8_t Time_SetBuf[6];
uint8_t Time_InputCount = 0;
uint8_t Time_EditFlag = 0;
uint8_t Time_SaveFlag = 0;
uint8_t manual = 0;
uint8_t write_card = 0;
uint8_t del_card = 0;
static uint8_t DeleteCard_No = 0;
static uint8_t DeleteCard_InputFlag = 0;
unsigned char CardID[5];
static uint8_t WriteCardHandled = 0;
unsigned char SavedCardID[4]={0};
uint8_t UID_SavedFlag=0;
char OLED_BUF[30];
    uint8_t result;
    uint16_t finger_id;
    uint16_t score;
    uint16_t enroll_id;
static uint8_t Finger_Lock = 0;
uint8_t new_fingerprint = 0;
uint8_t del_fingerprint = 0;
uint8_t del_all = 0;
static uint8_t DeleteFinger_ID = 0;
static uint8_t DeleteFinger_InputFlag = 0;
uint8_t Finger_Fail_Count = 0;
uint8_t Card_Fail_Count = 0;
uint8_t Password_Fail_Count = 0;
uint8_t Finger_Enable = 1;
uint8_t Card_Enable = 1;
volatile uint8_t System_Lock = 0;
volatile uint32_t Lock_Time = 0;
volatile uint32_t System_ms = 0;
#define CARD_REMOVE_CONFIRM_MS 800
#define SYSTEM_LOCK_TIME_MS 30000UL
static uint8_t Lock_Page_Shown = 0;
static uint8_t Lock_LastSecond = 0xFF;
static uint32_t Auto_DisplayTick = 0;
static uint32_t RC522_ScanTick = 0;
#define AUTO_DISPLAY_PERIOD_MS 100
#define RC522_SCAN_PERIOD_MS   30



/**
  * @brief  主函数
  */
int main(void)
{ 
    // 系统初始化
    SystemInit();
    delay_init(72);  
    ADCx_Init();
    LED_Init();
    BEEP_Init();
    BEEP_Off();
    USART1_Config();
	  USART2_Init();
    Button4_4_Init();
	  MFRC522_Init();
    OLED_Init(); 
    OLED_Clear();
    Servo_Init();
    delay_ms(100); 
	  Password_Init();
    TIM2_Init(72-1,1000-1);  
    MyRTC_Init();
	  delay_ms(200);
    AS608_Init();
	  USART2_SendString("AF:30");     // 设置音量30
    delay_ms(1000);
    USART2_SendString("A7:00001");  // 播放"欢迎"或其他提示音
    delay_ms(1000);
    // 主循环
    while(1)
{
	
	  USART2_ProcessCmd();
    switch(mode)
    {
        case AUTO_MODE:
    {
		uint8_t password_key;
		uint8_t card_no;
		uint8_t finger_present;

    /*
     * 系统锁定30秒
     */
			if(System_IsLocked())
			{
					/*
					 * 锁定期间不处理键盘输入。
					 */
					KeyNum = 0;

					/*
					 * 显示剩余锁定时间。
					 */
					OLED_ShowLockCountdown();

					break;
			}

		if(KeyNum != 0)
		{
				password_key = KeyNum;
				KeyNum = 0;
				Password_AutoProcess(password_key);
				/*
				 * Password_AutoProcess已经立即刷新密码输入区域,
				 * 更新显示计时,避免本轮再次整屏刷新。
				 */
				Auto_DisplayTick = System_ms;
				/*
				 * 密码验证成功。
				 */
				if(Password_OK == 1)
				{					
						Verify_Reset();
						EnterSettingsMode();
						break;
				}

				/*
				 * 密码验证失败。
				 */
				if(Password_Error == 1)
				{
						Password_Error = 0;
						Password_Fail_Count++;				
				if(Password_Fail_Count >= 3)
				{
						System_Lock = 1;
						Lock_Time = 0;
						Password_OK = 0;
						Password_Error = 0;
						Password_ClearInput();
						Lock_Page_Shown = 0;
						Lock_LastSecond = 0xFF;
						USART2_SendString("A7:00003");
						OLED_ShowLockCountdown();

						break;
				}
										else
						{
							  USART2_SendString("A7:00005"); 
								OLED_Clear();//密码错误
							  OLED_ShowChinese(32,24,34,16,1);
							  OLED_ShowChinese(48,24,35,16,1);
							  OLED_ShowChinese(64,24,50,16,1);
							  OLED_ShowChinese(80,24,51,16,1);
								OLED_Refresh();
								delay_ms(500);
								OLED_Clear();
								break;
						}
				}
		}

/*
 * 自动页面每100ms刷新一次。
 *
 * 不再每次主循环都刷新OLED。
 */
		if((uint32_t)(System_ms - Auto_DisplayTick) >= AUTO_DISPLAY_PERIOD_MS)
		{
				Auto_DisplayTick = System_ms;
				MyRTC_ReadTime();
				SensorDataDisplay1();
				OLED_autoPage1();
		}

		Control_Manager();


/*
 * RC522卡片检测。
 *
 * 每30ms读取一次卡片。
 * 不记录上一次UID,不检测卡片是否移开。
 * 读取完成后调用MFRC522_Halt()使当前卡片进入休眠。
 */
if(Card_Enable && (uint32_t)(System_ms - RC522_ScanTick) >= RC522_SCAN_PERIOD_MS)
{
    RC522_ScanTick = System_ms;

    if(RC522_ReadUID(CardID))
    {
        /*
         * 当前卡片进入Halt状态。
         * 不需要再用软件判断卡片有没有移开。
         */
        MFRC522_Halt();
        /*
         * 查询该UID对应的卡片编号。
         * 返回0表示卡片不存在。
         */
        card_no = RC522_UIDCompare(CardID);

        if(card_no != 0)
        {           
            OLED_Clear();//成功编号
            OLED_ShowChinese(24,20,86,16,1);
            OLED_ShowChinese(40,20,87,16,1);
            OLED_ShowChinese(56,20,55,16,1);
            OLED_ShowChinese(72,20,56,16,1);
					  //卡片编号
					  OLED_ShowChinese(24,36,23,16,1);
            OLED_ShowChinese(40,36,24,16,1);
            OLED_ShowChinese(56,36,57,16,1);
            OLED_ShowChinese(72,36,58,16,1);
					  OLED_ShowChar(88,36,':',16,1);
            OLED_ShowNum(96,36,card_no,1,16,1);
            OLED_Refresh();

           delay_ms(500);
					 delay_ms(500);


            /*
             * 验证成功,清除所有失败次数。
             */
            Verify_Reset();

            /*
             * 开锁并进入设置模式。
             */
            EnterSettingsMode();

            break;
        }
        else
        {
            Card_Fail_Count++;

            USART2_SendString("A7:00006"); 
					  OLED_Clear();//不匹配
					  OLED_ShowChinese(32,24,52,16,1);
            OLED_ShowChinese(48,24,53,16,1);
            OLED_ShowChinese(64,24,54,16,1);
//            OLED_ShowString(0,0,"Card Error",16,1);
//            OLED_ShowString(0,16,"Count:",16,1);
//            OLED_ShowNum(56,16,Card_Fail_Count,1,16,1);
					 
            OLED_Refresh();

            /*
             * 卡片连续验证失败3次后,
             * 禁用卡片和指纹,只允许密码验证。
             */
            if(Card_Fail_Count >= 3)
            {
                Verify_DisableCardAndFinger();

                OLED_Clear();//已禁用
								OLED_ShowChinese(32,24,69,16,1);
                OLED_ShowChinese(48,24,81,16,1);
                OLED_ShowChinese(64,24,82,16,1);
							
								OLED_ShowChinese(16,40,83,16,1);
                OLED_ShowChinese(32,40,46,16,1);
                OLED_ShowChinese(48,40,47,16,1);
							  OLED_ShowChinese(64,40,34,16,1);
                OLED_ShowChinese(80,40,35,16,1);
//                OLED_ShowString(0,0,"Verify Disable",16,1);
//                OLED_ShowString(0,16,"Use Password",16,1);
                OLED_Refresh();
                delay_ms(1000);
                delay_ms(1000);
            }
            else
            {
                delay_ms(500);
            }

            OLED_Clear();
        }
    }
}



    /*
     * 指纹检测
     *
     * 只读取一次PA8,不能在if和else if中重复读取。
     */
    finger_present = AS608_FingerDetected();

    if(finger_present == 0)
    {
        /*
         * 手指拿开,允许下次重新验证
         */
        Finger_Lock = 0;
    }
    else if(Finger_Enable && Finger_Lock == 0)
    {
        /*
         * 同一次放置手指只验证一次
         */
        Finger_Lock = 1;

        OLED_Clear();
                              //验证中
        OLED_ShowChinese(32,24,86,16,1);
        OLED_ShowChinese(48,24,87,16,1);
        OLED_ShowChinese(64,24,88,16,1);
			  OLED_ShowString(80,24,"...",16,1);		

        OLED_Refresh();

        result = AS608_Verify(&finger_id,&score);

        /*
         * 指纹验证成功
         */
        if(result == AS608_OK)
        {
            OLED_ShowVerifyOK(finger_id,score);          
            Verify_Reset();
            EnterSettingsMode();
            break;
        }

        /*
         * 找不到指纹或指纹不匹配,
         * 才算身份验证失败。
         */
        if(result == AS608_ACK_NOT_FOUND || result == AS608_ACK_NOT_MATCH)
        {
            Finger_Fail_Count++;

            if(Finger_Fail_Count >= 3)
            {
                Verify_DisableCardAndFinger();

                OLED_Clear();//已禁用
								OLED_ShowChinese(32,24,69,16,1);
                OLED_ShowChinese(48,24,81,16,1);
                OLED_ShowChinese(64,24,82,16,1);
							
								OLED_ShowChinese(16,40,83,16,1);
                OLED_ShowChinese(32,40,46,16,1);
                OLED_ShowChinese(48,40,47,16,1);
							  OLED_ShowChinese(64,40,34,16,1);
                OLED_ShowChinese(80,40,35,16,1);
                OLED_Refresh();

                delay_ms(1000);
            }
            else
            {
							  USART2_SendString("A7:00006"); 
							  OLED_Clear();//不匹配
                OLED_ShowChinese(32,24,52,16,1);
                OLED_ShowChinese(48,24,53,16,1);
                OLED_ShowChinese(64,24,54,16,1);
							  OLED_Refresh();
                delay_ms(500);
							  OLED_Clear();
            }

            OLED_Clear();
            break;
        }

        /*
         * 通信失败、采集失败等属于模块错误,
         * 不增加身份验证失败次数。
         */
				OLED_Clear();
        OLED_ShowChinese(32,24,95,16,1);
        OLED_ShowChinese(48,24,96,16,1);
        OLED_ShowChinese(64,24,65,16,1);
				OLED_ShowChinese(80,24,66,16,1);
				OLED_Refresh();
        //OLED_ShowError(result);
        delay_ms(800);
        OLED_Clear();

        break;
    }

    break;
}

				
					 
       case SETTINGS_MODE:
        {
          uint8_t sel;
          Control_Manager();	
             
					//case 1
					if(manual)
						 {
                    OLED_manualPage1();
										OLED_manualOption(SetManual());
								    ManualSettingsDisplay1();
								    ManualControl(count_m);
							     	Control_Manager();
							 if(KeyNum == S13)
				         {
				          KeyNum=0;
				          manual=0;
				          OLED_Clear();
				         }
				       break;
						 }
			

					//case 2		 
				if(TimeMenuFlag)
				{
						OLED_settingsPage3();
						SettingsThresholdDisplay3();                  
						OLED_timeOption(TimeSelection());                  
						TimeSettings();
						if(KeyNum == S13)
						{
								KeyNum=0;

								/*
								 * 退出时间设置页面前,
								 * 同时写入RTC和Flash。
								 */
								Time_SaveToRTC();

								MyRTC_ReadTime();

								TimeMenuFlag=0;
								Time_SaveFlag=0;
								Time_InputCount=0;
								Time_EditFlag=0;

								OLED_Clear();
						}		
				break;
				}
					
	
				
    /*
        当前处于密码设置页面
    */
			//case 3		
			if(set_pass)
			{
					Password_ShowSetPage();
					if(Password_success)
					{
							KeyNum = 0;
							set_pass = 0;
							Password_ConfirmStep = 0;
							Password_ClearInput();
							OLED_Clear();
					}
					else if(KeyNum != 0)
					{
							Password_SetProcess(KeyNum);
							KeyNum = 0;
					}

					break;
			}
			
			/*
			 * 录入卡片页面
			 */
			//case 4
			if(write_card)
			{
					/*
					 * 每次进入录卡页面只处理一张卡
					 */
					if(WriteCardHandled == 0)
					{
							OLED_ShowChinese(24,0,67,16,1);
			        OLED_ShowChinese(40,0,68,16,1);
						  OLED_ShowChinese(56,0,23,16,1);
				      OLED_ShowChinese(72,0,24,16,1);
						
							//OLED_ShowString(0,0,"PUT CARD TO SAVE",16,1);
						  OLED_ShowString(0, 48, "S13:", 16, 1);
	            OLED_ShowChinese(32,48,48,16,1);
	            OLED_ShowChinese(48,48,49,16,1);
							OLED_Refresh();

							if(RC522_ReadUID(CardID))
							{
									RC522_RememberUID(CardID);
									WriteCardHandled = 1;
							}
					}

					/*
					 * S13返回设置菜单
					 */
				
					if(KeyNum == S13 ||WriteCardHandled)
					{
						  delay_ms(1000);
							KeyNum = 0;
							write_card = 0;
							WriteCardHandled = 0;
							OLED_Clear();
					}

					break;
			}
			

/*
 * case 5:根据编号删除卡片
 */
			if(del_card)
			{
					uint8_t delete_result;

					/*
					 * S1~S5输入卡片编号
					 */
					if(KeyNum >= KEY_S1 && KeyNum <= KEY_S5)
					{
							DeleteCard_No = KeyNum;
							DeleteCard_InputFlag = 1;
							KeyNum = 0;
							OLED_ShowDeleteCardPage();
					}

					/*
					 * S11清除当前输入
					 */
					else if(KeyNum == KEY_S11)
					{
							KeyNum = 0;
							DeleteCard_No = 0;
							DeleteCard_InputFlag = 0;
							OLED_ShowDeleteCardPage();
					}

					/*
					 * S12确认删除
					 */
					else if(KeyNum == KEY_S12)
					{
							KeyNum = 0;
							if(DeleteCard_InputFlag == 0)
							{
									OLED_Clear();
									OLED_Refresh();
									delay_ms(1000);
									OLED_ShowDeleteCardPage();
							}
							else
							{
									

									delete_result = FlashData_UIDDeleteByNumber(DeleteCard_No);
									if(delete_result == 1)
									{
										OLED_Clear();								
										OLED_ShowDeleteCardOK(DeleteCard_No);
									}
									 else if(delete_result == 2)
            {
//                printf("Card NO=%d Is Empty\r\n",DeleteCard_No);

                OLED_Clear();
							  OLED_ShowChinese(40,24,50,16,1);
							  OLED_ShowChinese(56,24,51,16,1);
//                OLED_ShowString(0,0,"Card Is Empty",16,1);
//                OLED_ShowString(0,16,"Card NO:",16,1);
//                OLED_ShowNum(72,16,DeleteCard_No,1,16,1);
                OLED_Refresh();
            }
            else if(delete_result == 3)
            {

                OLED_Clear();
								OLED_ShowChinese(40,20,83,16,1);
							  OLED_ShowChinese(56,20,46,16,1);
							  OLED_ShowChinese(80,20,47,16,1);               
                OLED_ShowString(40,36,"1-5",16,1);
                OLED_Refresh();
            }
            else
            {
               // printf("Delete Card Flash Error\r\n");

                OLED_Clear();
							  OLED_ShowChinese(40,24,50,16,1);
							  OLED_ShowChinese(56,24,51,16,1);
//                OLED_ShowString(0,0,"Delete Failed",16,1);
//                OLED_ShowString(0,16,"Flash Error",16,1);
                OLED_Refresh();
            }

									delay_ms(1500);
									DeleteCard_No = 0;
									DeleteCard_InputFlag = 0;
									del_card = 0;
									OLED_Clear();
							}
					}

					/*
					 * S13取消并返回设置菜单
					 */
					else if(KeyNum == KEY_S13)
					{
							KeyNum = 0;
							DeleteCard_No = 0;
							DeleteCard_InputFlag = 0;
							del_card = 0;
							OLED_Clear();
					}

					/*
					 * S6~S10不是有效卡片编号
					 */
					else if(KeyNum >= KEY_S6 && KeyNum <= KEY_S10)
					{
							KeyNum = 0;

							  OLED_Clear();
								OLED_ShowChinese(40,20,83,16,1);
							  OLED_ShowChinese(56,20,46,16,1);
							  OLED_ShowChinese(72,20,47,16,1);               
                OLED_ShowString(40,36,"1-5",16,1);
							  OLED_Refresh();

							delay_ms(800);

							OLED_ShowDeleteCardPage();
					}

					/*
					 * 防止普通设置页面覆盖删除卡片页面
					 */
					break;
			}
			

			
			
			//case 6
        if(new_fingerprint)
        {
            KeyNum = 0;

            result = AS608_FindFreeID(&enroll_id);

            if(result == AS608_OK)
            {
               

                OLED_ShowEnrollWait(enroll_id);

                result = AS608_Enroll(enroll_id);

                if(result == AS608_OK)
                {
                    OLED_ShowEnrollOK(enroll_id);
                }
                else
                {

                    OLED_ShowError(result);
                }
            }
            else if(result == AS608_ERR_LIBRARY_FULL)
            {
             
                OLED_Clear();//已存满
								OLED_ShowChinese(32,24,69,16,1);
							  OLED_ShowChinese(48,24,70,16,1);
							  OLED_ShowChinese(64,24,90,16,1);

                OLED_Refresh();
            }
            else
            {
                OLED_ShowError(result);
            }

            /*
                录入结束后,第二次按下的手指可能还没有拿开。
                将锁置1,防止马上又进行一次验证。
            */
            Finger_Lock = AS608_FingerDetected();

            delay_ms(1500);
						OLED_Clear();
						new_fingerprint = 0;
						
            //OLED_ShowHome();
        }
				
				
			        /*
            S14:删除当前选择编号。
        */
				//case 7
				if(del_fingerprint)
{
    /*
     * S1~S5:输入需要删除的指纹编号
     */
    if(KeyNum >= KEY_S1 && KeyNum <= KEY_S5)
    {
        DeleteFinger_ID = KeyNum;
        DeleteFinger_InputFlag = 1;
        KeyNum = 0;
        OLED_ShowDeleteFingerPage();
    }

    /*
     * S11:删除当前输入
     */
    else if(KeyNum == KEY_S11)
    {
        KeyNum = 0;

        DeleteFinger_ID = 0;
        DeleteFinger_InputFlag = 0;

        OLED_ShowDeleteFingerPage();
    }

    /*
     * S12:确认删除
     */
    else if(KeyNum == KEY_S12)
    {
        KeyNum = 0;

        /*
         * 没有输入编号
         */
        if(DeleteFinger_InputFlag == 0)
        {
            OLED_Clear();
						OLED_ShowChinese(32,24,83,16,1);
						OLED_ShowChinese(48,24,46,16,1);
						OLED_ShowChinese(64,24,47,16,1);               
            OLED_ShowString(32,40,"1-5",16,1);
            OLED_Refresh();
            delay_ms(1000);
            OLED_ShowDeleteFingerPage();
        }
        else
        {
            result = AS608_Delete(DeleteFinger_ID);

            if(result == AS608_OK)
            {
                OLED_ShowDeleteOK(DeleteFinger_ID);
            }
            else if(result == AS608_ERR_ID_EMPTY)
            {               

                OLED_Clear();
								OLED_ShowChinese(32,24,50,16,1);
							  OLED_ShowChinese(48,24,51,16,1);

                OLED_Refresh();
            }
            else if(result == AS608_ERR_PARAMETER)
            {
               // printf("Finger ID Error=%d\r\n", DeleteFinger_ID);

                OLED_Clear();
								OLED_ShowChinese(32,24,50,16,1);
							  OLED_ShowChinese(48,24,51,16,1);
                OLED_Refresh();
            }
            else
            {

                OLED_ShowError(result);
            }

            delay_ms(1500);

            DeleteFinger_ID = 0;
            DeleteFinger_InputFlag = 0;
            del_fingerprint = 0;

            OLED_Clear();
        }
    }

    /*
     * S13:取消删除并返回设置菜单
     */
    else if(KeyNum == KEY_S13)
    {
        KeyNum = 0;
        DeleteFinger_ID = 0;
        DeleteFinger_InputFlag = 0;
        del_fingerprint = 0;
        OLED_Clear();
    }

    /*
     * S6~S10属于无效编号
     */
    else if(KeyNum >= KEY_S6 && KeyNum <= KEY_S10)
    {
        KeyNum = 0;

        OLED_Clear();
				OLED_ShowChinese(32,24,83,16,1);
				OLED_ShowChinese(48,24,46,16,1);
				OLED_ShowChinese(64,24,47,16,1);
                
        OLED_ShowString(32,40,"1-5",16,1);
        OLED_Refresh();
        delay_ms(800);
        OLED_ShowDeleteFingerPage();
    }

    /*
     * 删除指纹页面必须退出本次SETTINGS_MODE处理,
     * 防止继续刷新下面的设置菜单。
     */
    break;
}

/*
 * case 8:删除全部数据
 *
 * 1. 删除全部卡片UID
 * 2. 删除全部指纹
 * 3. 密码恢复为123456
 */
if(del_all)
{
    uint8_t flash_result;
    uint8_t finger_result;

    KeyNum = 0;

	  OLED_Clear();//恢复默认
		OLED_ShowChinese(16,24,72,16,1);
		OLED_ShowChinese(32,24,73,16,1);
		OLED_ShowChinese(48,24,74,16,1);
		OLED_ShowChinese(64,24,75,16,1);
		OLED_ShowChinese(80,24,88,16,1);
   // OLED_ShowString(0,0,"Reset All Data",16,1);
    OLED_ShowString(96,24,"...",16,1);
    OLED_Refresh();

    //printf("Start Reset All Data\r\n");

    /*
     * 清空全部指纹
     */
    finger_result = AS608_Empty();

    /*
     * 清空全部卡片,并把密码恢复为123456
     */
    flash_result = FlashData_ResetAll();

    /*
     * Flash恢复成功后,重新加载当前运行密码
     */
    if(flash_result == 1)
    {
        FlashData_LoadPassword(Password_SaveBuf);
    }

    /*
     * 清除密码输入及设置状态
     */
    Password_OK = 0;
    Password_Error = 0;
    Password_SetSuccess = 0;
    Password_success = 0;
    Password_SetStep = 0;
    Password_ConfirmStep = 0;
    Password_ClearInput();

    /*
     * 清除卡片页面状态
     */
    memset(CardID,0,sizeof(CardID));
    memset(SavedCardID,0,sizeof(SavedCardID));
    //Card_DetectReset();
    UID_SavedFlag = 0;
    WriteCardHandled = 0;
    //DeleteCardHandled = 0;

    DeleteCard_No = 0;
    DeleteCard_InputFlag = 0;
    del_card = 0;

    /*
     * 清除指纹页面状态
     */
    DeleteFinger_ID = 0;
    DeleteFinger_InputFlag = 0;
    Finger_Lock = 0;
    del_fingerprint = 0;
    new_fingerprint = 0;

    if(flash_result == 1 && finger_result == AS608_OK)
    {
        OLED_ShowResetAllOK();
    }
    else if(flash_result == 0 && finger_result != AS608_OK)
    {
          OLED_Clear();
		      OLED_ShowChinese(16,24,72,16,1);
		      OLED_ShowChinese(32,24,73,16,1);
		      OLED_ShowChinese(48,24,65,16,1);
		      OLED_ShowChinese(64,24,66,16,1);
        OLED_Refresh();
    }
    else if(flash_result == 0)
    {
        //printf("Reset Flash Fail\r\n");

        OLED_Clear();
		    OLED_ShowChinese(16,24,72,16,1);
		    OLED_ShowChinese(32,24,73,16,1);
		    OLED_ShowChinese(48,24,65,16,1);
		    OLED_ShowChinese(64,24,66,16,1);

        OLED_Refresh();
    }
    else
    {
       
			  OLED_Clear();//恢复失败
		    OLED_ShowChinese(16,24,72,16,1);
		    OLED_ShowChinese(32,24,73,16,1);
		    OLED_ShowChinese(48,24,65,16,1);
		    OLED_ShowChinese(64,24,66,16,1);
        OLED_Refresh();
    }

    delay_ms(1800);

    del_all = 0;

    OLED_Clear();

    /*
     * 防止继续刷新设置菜单覆盖结果页面
     */
    break;
}
				
    /*
        正常设置菜单
    */

				sel = SetSelection();
				if(sel <= 4)
				{
						OLED_settingsPage1();
					
				}
				else
				{
						OLED_settingsPage2();
					
				}

         OLED_settingsOption(sel);
         ThresholdSettings(sel);
		
					if(KeyNum == S13)
            {
							  USART2_SendString("A7:00004"); 
                KeyNum = 0;
							  count_s = 1;
                mode = AUTO_MODE;
                Password_OK = 0;
                Password_ClearInput();
							  driveData.servo_Flag = 0;
                driveData.LED_Flag = 0;
               // Password_ShowAutoPage();
							  OLED_Clear();
                break;
            }
					

    break;

}
        default:
        {
            mode = AUTO_MODE;
            Password_ClearInput();
            OLED_autoPage1();

            break;
        }
    }
		
		delay_ms(50);
		
		
  }

}

六、实验效果

七、包含内容

项目分享

相关推荐
映翰通朱工3 小时前
Windows 上位机 + EC3320:USB 转 CAN 通信实测(从接线到 SSH 收包)
windows·stm32·ssh
Industio_触觉智能3 小时前
瑞芯微ISP内核驱动深度解析|RKISP39从架构到Probe初始化全流程(上篇)
linux·嵌入式硬件·硬件架构·摄像头·isp·瑞芯微·rk3576
Funing74 小时前
系列一:STM32 外设初始化
stm32·单片机·嵌入式硬件
XiangrongZ4 小时前
debian中配置stm32的交叉编译环境
运维·stm32·debian
✎ ﹏梦醒͜ღ҉繁华落℘5 小时前
单片机基础知识--LVGL学习-lv_obj_add_flag()
c语言·单片机·学习
zcmodeltech5 小时前
钢铁冶金沙盘模型多工序协同控制系统设计:基于STM32与Modbus RTU的高炉-连铸-热轧全流程联动方案
stm32·单片机·嵌入式硬件·数据库架构·嵌入式实时数据库·多分类
西城微科方案开发6 小时前
充气泵PCBA方案:数字传感器VS模拟传感器
单片机
zcmodeltech6 小时前
供热系统模型多工况控制系统设计:基于STM32与Modbus RTU的热源-管网-末端联动方案
大数据·stm32·单片机·嵌入式硬件·制造·数据库系统
时空自由民.6 小时前
STM32的缓存Cache
stm32·嵌入式硬件·缓存