目录
[六、实验效果 编辑](#六、实验效果 编辑)
一、前言
项目成品图片:

哔哩哔哩视频链接:
(资料分享见文末)
二、项目简介
1.功能详解
基于STM32的智能门禁系统(语音版)
功能如下:
- STM32F103C8T6单片机作为主控芯片
- 检测功能:检测输入的密码、卡片、指纹是否匹配
- 显示功能:OLED显示时间,密码输入界面
- 手动控制:手动模式下可通过按键控制门锁、LED的开关
- 自动模式:自动模式下输入的密码\卡片\指纹验证通过后,可自动进入设置模式,语音播报
- 设置模式:按键可设置时间、密码、录入\删除卡片或指纹等功能
- 蓝牙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);
}
}
六、实验效果 
七、包含内容
