基于STM32的指纹锁

STM32

指纹锁

前言

封校生活无聊至极,手上还有个AS608指纹模块没玩过,闲着无聊做了个指纹锁。

一、AS608模块

ATK-AS608 指纹识别模块是 ALIENTEK 推出的一款高性能的光学指纹识别模块。
ATK-AS608 模块采用了国内著名指纹识别芯片公司杭州晟元芯片技术有限公司(Synochip)的 AS608 指纹识别芯片。芯片内置 DSP 运算单元,集成了指纹识别算法,能高效快速采集图像并识别指纹特征。模块配备了串口、USB 通讯接口,用户无需研究复杂的图像处理及指纹识别算法,只需通过简单的串口、USB 按照通讯协议便可控制模块。本模块可应用于各种考勤机、保险箱柜、指纹门禁系统、指纹锁等场合。
在这里插入图片描述
切记不可以接5v

接线说明

在这里插入图片描述
在这里插入图片描述

二、使用步骤

代码

#include <string.h>
#include <stdio.h>
#include "delay.h"
#include "usart3.h"
#include "as608.h"
#include "oled_iic.h"
#include "key.h"

u32 AS608Addr = 0XFFFFFFFF; //ĬÈÏ
char str2[6] = {0};


//´®¿Ú·¢ËÍÒ»¸ö×Ö½Ú
static void MYUSART_SendData(u8 data)
{
  while((USART3->SR & 0X40) == 0);
  USART3->DR = data;
}
//·¢ËͰüÍ·
static void SendHead(void)
{
  MYUSART_SendData(0xEF);
  MYUSART_SendData(0x01);
}
//·¢Ë͵ØÖ·
static void SendAddr(void)
{
  MYUSART_SendData(AS608Addr >> 24);
  MYUSART_SendData(AS608Addr >> 16);
  MYUSART_SendData(AS608Addr >> 8);
  MYUSART_SendData(AS608Addr);
}
//·¢ËͰü±êʶ,
static void SendFlag(u8 flag)
{
  MYUSART_SendData(flag);
}
//·¢ËͰü³¤¶È
static void SendLength(int length)
{
  MYUSART_SendData(length >> 8);
  MYUSART_SendData(length);
}
//·¢ËÍÖ¸ÁîÂë
static void Sendcmd(u8 cmd)
{
  MYUSART_SendData(cmd);
}
//·¢ËÍУÑéºÍ
static void SendCheck(u16 check)
{
  MYUSART_SendData(check >> 8);
  MYUSART_SendData(check);
}
//ÅжÏÖжϽÓÊÕµÄÊý×éÓÐûÓÐÓ¦´ð°ü
//waittimeΪµÈ´ýÖжϽÓÊÕÊý¾ÝµÄʱ¼ä£¨µ¥Î»1ms£©
//·µ»ØÖµ£ºÊý¾Ý°üÊ×µØÖ·
static u8 *JudgeStr(u16 waittime)
{
  char *data;
  u8 str[8];
  str[0] = 0xef;
  str[1] = 0x01;
  str[2] = AS608Addr >> 24;
  str[3] = AS608Addr >> 16;
  str[4] = AS608Addr >> 8;
  str[5] = AS608Addr;
  str[6] = 0x07;
  str[7] = '\0';
  USART3_RX_STA = 0;
  while(--waittime)
  {
    delay_ms(1);
    if(USART3_RX_STA & 0X8000) //½ÓÊÕµ½Ò»´ÎÊý¾Ý
    {
      USART3_RX_STA = 0;
      data = strstr((const char*)USART3_RX_BUF, (const char*)str);
      if(data)
        return (u8*)data;
    }
  }
  return 0;
}
//¼ÈëͼÏñ PS_GetImage
//¹¦ÄÜ:̽²âÊÖÖ¸£¬Ì½²âµ½ºó¼ÈëÖ¸ÎÆÍ¼Ïñ´æÓÚImageBuffer¡£
//Ä£¿é·µ»ØÈ·ÈÏ×Ö
u8 PS_GetImage(void)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(0x03);
  Sendcmd(0x01);
  temp =  0x01 + 0x03 + 0x01;
  SendCheck(temp);
  data = JudgeStr(2000);
  if(data)
    ensure = data[9];
  else
    ensure = 0xff;
  return ensure;
}
//Éú³ÉÌØÕ÷ PS_GenChar
//¹¦ÄÜ:½«ImageBufferÖеÄԭʼͼÏñÉú³ÉÖ¸ÎÆÌØÕ÷Îļþ´æÓÚCharBuffer1»òCharBuffer2
//²ÎÊý:BufferID --> charBuffer1:0x01	charBuffer1:0x02
//Ä£¿é·µ»ØÈ·ÈÏ×Ö
u8 PS_GenChar(u8 BufferID)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(0x04);
  Sendcmd(0x02);
  MYUSART_SendData(BufferID);
  temp = 0x01 + 0x04 + 0x02 + BufferID;
  SendCheck(temp);
  data = JudgeStr(2000);
  if(data)
    ensure = data[9];
  else
    ensure = 0xff;
  return ensure;
}
//¾«È·±È¶ÔÁ½Ã¶Ö¸ÎÆÌØÕ÷ PS_Match
//¹¦ÄÜ:¾«È·±È¶ÔCharBuffer1 ÓëCharBuffer2 ÖеÄÌØÕ÷Îļþ
//Ä£¿é·µ»ØÈ·ÈÏ×Ö
u8 PS_Match(void)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(0x03);
  Sendcmd(0x03);
  temp = 0x01 + 0x03 + 0x03;
  SendCheck(temp);
  data = JudgeStr(2000);
  if(data)
    ensure = data[9];
  else
    ensure = 0xff;
  return ensure;
}
//ËÑË÷Ö¸ÎÆ PS_Search
//¹¦ÄÜ:ÒÔCharBuffer1»òCharBuffer2ÖеÄÌØÕ÷ÎļþËÑË÷Õû¸ö»ò²¿·ÖÖ¸ÎÆ¿â.ÈôËÑË÷µ½£¬Ôò·µ»ØÒ³Âë¡£
//²ÎÊý:  BufferID @ref CharBuffer1	CharBuffer2
//˵Ã÷:  Ä£¿é·µ»ØÈ·ÈÏ×Ö£¬Ò³Â루ÏàÅäÖ¸ÎÆÄ£°å£©
u8 PS_Search(u8 BufferID, u16 StartPage, u16 PageNum, SearchResult *p)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(0x08);
  Sendcmd(0x04);
  MYUSART_SendData(BufferID);
  MYUSART_SendData(StartPage >> 8);
  MYUSART_SendData(StartPage);
  MYUSART_SendData(PageNum >> 8);
  MYUSART_SendData(PageNum);
  temp = 0x01 + 0x08 + 0x04 + BufferID
         + (StartPage >> 8) + (u8)StartPage
         + (PageNum >> 8) + (u8)PageNum;
  SendCheck(temp);
  data = JudgeStr(2000);
  if(data)
  {
    ensure = data[9];
    p->pageID   = (data[10] << 8) + data[11];
    p->mathscore = (data[12] << 8) + data[13];
  }
  else
    ensure = 0xff;
  return ensure;
}
//ºÏ²¢ÌØÕ÷£¨Éú³ÉÄ£°å£©PS_RegModel
//¹¦ÄÜ:½«CharBuffer1ÓëCharBuffer2ÖеÄÌØÕ÷ÎļþºÏ²¢Éú³É Ä£°å,½á¹û´æÓÚCharBuffer1ÓëCharBuffer2
//˵Ã÷:  Ä£¿é·µ»ØÈ·ÈÏ×Ö
u8 PS_RegModel(void)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(0x03);
  Sendcmd(0x05);
  temp = 0x01 + 0x03 + 0x05;
  SendCheck(temp);
  data = JudgeStr(2000);
  if(data)
    ensure = data[9];
  else
    ensure = 0xff;
  return ensure;
}
//´¢´æÄ£°å PS_StoreChar
//¹¦ÄÜ:½« CharBuffer1 »ò CharBuffer2 ÖеÄÄ£°åÎļþ´æµ½ PageID ºÅflashÊý¾Ý¿âλÖá£
//²ÎÊý:  BufferID @ref charBuffer1:0x01	charBuffer1:0x02
//       PageID£¨Ö¸ÎÆ¿âλÖúţ©
//˵Ã÷:  Ä£¿é·µ»ØÈ·ÈÏ×Ö
u8 PS_StoreChar(u8 BufferID, u16 PageID)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(0x06);
  Sendcmd(0x06);
  MYUSART_SendData(BufferID);
  MYUSART_SendData(PageID >> 8);
  MYUSART_SendData(PageID);
  temp = 0x01 + 0x06 + 0x06 + BufferID
         + (PageID >> 8) + (u8)PageID;
  SendCheck(temp);
  data = JudgeStr(2000);
  if(data)
    ensure = data[9];
  else
    ensure = 0xff;
  return ensure;
}
//ɾ³ýÄ£°å PS_DeletChar
//¹¦ÄÜ:  ɾ³ýflashÊý¾Ý¿âÖÐÖ¸¶¨IDºÅ¿ªÊ¼µÄN¸öÖ¸ÎÆÄ£°å
//²ÎÊý:  PageID(Ö¸ÎÆ¿âÄ£°åºÅ)£¬Nɾ³ýµÄÄ£°å¸öÊý¡£
//˵Ã÷:  Ä£¿é·µ»ØÈ·ÈÏ×Ö
u8 PS_DeletChar(u16 PageID, u16 N)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(0x07);
  Sendcmd(0x0C);
  MYUSART_SendData(PageID >> 8);
  MYUSART_SendData(PageID);
  MYUSART_SendData(N >> 8);
  MYUSART_SendData(N);
  temp = 0x01 + 0x07 + 0x0C
         + (PageID >> 8) + (u8)PageID
         + (N >> 8) + (u8)N;
  SendCheck(temp);
  data = JudgeStr(2000);
  if(data)
    ensure = data[9];
  else
    ensure = 0xff;
  return ensure;
}
//Çå¿ÕÖ¸ÎÆ¿â PS_Empty
//¹¦ÄÜ:  ɾ³ýflashÊý¾Ý¿âÖÐËùÓÐÖ¸ÎÆÄ£°å
//²ÎÊý:  ÎÞ
//˵Ã÷:  Ä£¿é·µ»ØÈ·ÈÏ×Ö
u8 PS_Empty(void)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(0x03);
  Sendcmd(0x0D);
  temp = 0x01 + 0x03 + 0x0D;
  SendCheck(temp);
  data = JudgeStr(2000);
  if(data)
    ensure = data[9];
  else
    ensure = 0xff;
  return ensure;
}
//дϵͳ¼Ä´æÆ÷ PS_WriteReg
//¹¦ÄÜ:  дģ¿é¼Ä´æÆ÷
//²ÎÊý:  ¼Ä´æÆ÷ÐòºÅRegNum:4\5\6
//˵Ã÷:  Ä£¿é·µ»ØÈ·ÈÏ×Ö
u8 PS_WriteReg(u8 RegNum, u8 DATA)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(0x05);
  Sendcmd(0x0E);
  MYUSART_SendData(RegNum);
  MYUSART_SendData(DATA);
  temp = RegNum + DATA + 0x01 + 0x05 + 0x0E;
  SendCheck(temp);
  data = JudgeStr(2000);
  if(data)
    ensure = data[9];
  else
    ensure = 0xff;
  if(ensure == 0)
    printf("\r\nÉèÖòÎÊý³É¹¦£¡");
  else
    printf("\r\n%s", EnsureMessage(ensure));
  return ensure;
}
//¶Áϵͳ»ù±¾²ÎÊý PS_ReadSysPara
//¹¦ÄÜ:  ¶Áȡģ¿éµÄ»ù±¾²ÎÊý£¨²¨ÌØÂÊ£¬°ü´óСµÈ)
//²ÎÊý:  ÎÞ
//˵Ã÷:  Ä£¿é·µ»ØÈ·ÈÏ×Ö + »ù±¾²ÎÊý£¨16bytes£©
u8 PS_ReadSysPara(SysPara *p)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(0x03);
  Sendcmd(0x0F);
  temp = 0x01 + 0x03 + 0x0F;
  SendCheck(temp);
  data = JudgeStr(1000);
  if(data)
  {
    ensure = data[9];
    p->PS_max = (data[14] << 8) + data[15];
    p->PS_level = data[17];
    p->PS_addr = (data[18] << 24) + (data[19] << 16) + (data[20] << 8) + data[21];
    p->PS_size = data[23];
    p->PS_N = data[25];
  }
  else
    ensure = 0xff;
  if(ensure == 0x00)
  {
    printf("\r\nÄ£¿é×î´óÖ¸ÎÆÈÝÁ¿=%d", p->PS_max);
    printf("\r\n¶Ô±ÈµÈ¼¶=%d", p->PS_level);
    printf("\r\nµØÖ·=%x", p->PS_addr);
    printf("\r\n²¨ÌØÂÊ=%d", p->PS_N * 9600);
  }
  else
    printf("\r\n%s", EnsureMessage(ensure));
  return ensure;
}
//ÉèÖÃÄ£¿éµØÖ· PS_SetAddr
//¹¦ÄÜ:  ÉèÖÃÄ£¿éµØÖ·
//²ÎÊý:  PS_addr
//˵Ã÷:  Ä£¿é·µ»ØÈ·ÈÏ×Ö
u8 PS_SetAddr(u32 PS_addr)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(0x07);
  Sendcmd(0x15);
  MYUSART_SendData(PS_addr >> 24);
  MYUSART_SendData(PS_addr >> 16);
  MYUSART_SendData(PS_addr >> 8);
  MYUSART_SendData(PS_addr);
  temp = 0x01 + 0x07 + 0x15
         + (u8)(PS_addr >> 24) + (u8)(PS_addr >> 16)
         + (u8)(PS_addr >> 8) + (u8)PS_addr;
  SendCheck(temp);
  AS608Addr = PS_addr; //·¢ËÍÍêÖ¸Á¸ü»»µØÖ·
  data = JudgeStr(2000);
  if(data)
    ensure = data[9];
  else
    ensure = 0xff;
  AS608Addr = PS_addr;
  if(ensure == 0x00)
    printf("\r\nÉèÖõØÖ·³É¹¦£¡");
  else
    printf("\r\n%s", EnsureMessage(ensure));
  return ensure;
}
//¹¦ÄÜ£º Ä£¿éÄÚ²¿ÎªÓû§¿ª±ÙÁË256bytesµÄFLASH¿Õ¼äÓÃÓÚ´æÓû§¼Çʱ¾,
//	¸Ã¼Çʱ¾Âß¼­Éϱ»·Ö³É 16 ¸öÒ³¡£
//²ÎÊý:  NotePageNum(0~15),Byte32(ҪдÈëÄÚÈÝ£¬32¸ö×Ö½Ú)
//˵Ã÷:  Ä£¿é·µ»ØÈ·ÈÏ×Ö
u8 PS_WriteNotepad(u8 NotePageNum, u8 *Byte32)
{
  u16 temp;
  u8  ensure, i;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(36);
  Sendcmd(0x18);
  MYUSART_SendData(NotePageNum);
  for(i = 0; i < 32; i++)
  {
    MYUSART_SendData(Byte32[i]);
    temp += Byte32[i];
  }
  temp = 0x01 + 36 + 0x18 + NotePageNum + temp;
  SendCheck(temp);
  data = JudgeStr(2000);
  if(data)
    ensure = data[9];
  else
    ensure = 0xff;
  return ensure;
}
//¶Á¼ÇÊÂPS_ReadNotepad
//¹¦ÄÜ£º  ¶ÁÈ¡FLASHÓû§ÇøµÄ128bytesÊý¾Ý
//²ÎÊý:  NotePageNum(0~15)
//˵Ã÷:  Ä£¿é·µ»ØÈ·ÈÏ×Ö+Óû§ÐÅÏ¢
u8 PS_ReadNotepad(u8 NotePageNum, u8 *Byte32)
{
  u16 temp;
  u8  ensure, i;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(0x04);
  Sendcmd(0x19);
  MYUSART_SendData(NotePageNum);
  temp = 0x01 + 0x04 + 0x19 + NotePageNum;
  SendCheck(temp);
  data = JudgeStr(2000);
  if(data)
  {
    ensure = data[9];
    for(i = 0; i < 32; i++)
    {
      Byte32[i] = data[10 + i];
    }
  }
  else
    ensure = 0xff;
  return ensure;
}
//¸ßËÙËÑË÷PS_HighSpeedSearch
//¹¦ÄÜ£ºÒÔ CharBuffer1»òCharBuffer2ÖеÄÌØÕ÷Îļþ¸ßËÙËÑË÷Õû¸ö»ò²¿·ÖÖ¸ÎÆ¿â¡£
//		  ÈôËÑË÷µ½£¬Ôò·µ»ØÒ³Âë,¸ÃÖ¸Áî¶ÔÓÚµÄÈ·´æÔÚÓÚÖ¸ÎÆ¿âÖÐ £¬ÇҵǼʱÖÊÁ¿
//		  ºÜºÃµÄÖ¸ÎÆ£¬»áºÜ¿ì¸ø³öËÑË÷½á¹û¡£
//²ÎÊý:  BufferID£¬ StartPage(Æðʼҳ)£¬PageNum£¨Ò³Êý£©
//˵Ã÷:  Ä£¿é·µ»ØÈ·ÈÏ×Ö+Ò³Â루ÏàÅäÖ¸ÎÆÄ£°å£©
u8 PS_HighSpeedSearch(u8 BufferID, u16 StartPage, u16 PageNum, SearchResult *p)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(0x08);
  Sendcmd(0x1b);
  MYUSART_SendData(BufferID);
  MYUSART_SendData(StartPage >> 8);
  MYUSART_SendData(StartPage);
  MYUSART_SendData(PageNum >> 8);
  MYUSART_SendData(PageNum);
  temp = 0x01 + 0x08 + 0x1b + BufferID
         + (StartPage >> 8) + (u8)StartPage
         + (PageNum >> 8) + (u8)PageNum;
  SendCheck(temp);
  data = JudgeStr(2000);
  if(data)
  {
    ensure = data[9];
    p->pageID 	= (data[10] << 8) + data[11];
    p->mathscore = (data[12] << 8) + data[13];
  }
  else
    ensure = 0xff;
  return ensure;
}
//¶ÁÓÐЧģ°å¸öÊý PS_ValidTempleteNum
//¹¦ÄÜ£º¶ÁÓÐЧģ°å¸öÊý
//²ÎÊý: ÎÞ
//˵Ã÷: Ä£¿é·µ»ØÈ·ÈÏ×Ö+ÓÐЧģ°å¸öÊýValidN
u8 PS_ValidTempleteNum(u16 *ValidN)
{
  u16 temp;
  u8  ensure;
  u8  *data;
  SendHead();
  SendAddr();
  SendFlag(0x01);//ÃüÁî°ü±êʶ
  SendLength(0x03);
  Sendcmd(0x1d);
  temp = 0x01 + 0x03 + 0x1d;
  SendCheck(temp);
  data = JudgeStr(2000);
  if(data)
  {
    ensure = data[9];
    *ValidN = (data[10] << 8) + data[11];
  }
  else
    ensure = 0xff;

  if(ensure == 0x00)
  {
    printf("\r\nÓÐÐ§Ö¸ÎÆ¸öÊý=%d", (data[10] << 8) + data[11]);
  }
  else
    printf("\r\n%s", EnsureMessage(ensure));
  return ensure;
}
//ÓëAS608ÎÕÊÖ PS_HandShake
//²ÎÊý: PS_AddrµØÖ·Ö¸Õë
//˵Ã÷: Ä£¿é·µÐµØÖ·£¨ÕýÈ·µØÖ·£©
u8 PS_HandShake(u32 *PS_Addr)
{
  SendHead();
  SendAddr();
  MYUSART_SendData(0X01);
  MYUSART_SendData(0X00);
  MYUSART_SendData(0X00);
  delay_ms(200);
  if(USART3_RX_STA & 0X8000) //½ÓÊÕµ½Êý¾Ý
  {
    if(//ÅжÏÊDz»ÊÇÄ£¿é·µ»ØµÄÓ¦´ð°ü
      USART3_RX_BUF[0] == 0XEF
      && USART3_RX_BUF[1] == 0X01
      && USART3_RX_BUF[6] == 0X07
    )
    {
      *PS_Addr = (USART3_RX_BUF[2] << 24) + (USART3_RX_BUF[3] << 16)
                 + (USART3_RX_BUF[4] << 8) + (USART3_RX_BUF[5]);
      USART3_RX_STA = 0;
      return 0;
    }
    USART3_RX_STA = 0;
  }
  return 1;
}
//Ä£¿éÓ¦´ð°üÈ·ÈÏÂëÐÅÏ¢½âÎö
//¹¦ÄÜ£º½âÎöÈ·ÈÏÂë´íÎóÐÅÏ¢·µ»ØÐÅÏ¢
//²ÎÊý: ensure
const char *EnsureMessage(u8 ensure)
{
  const char *p;
  switch(ensure)
  {
  case  0x00:   
    p = "       OK       ";
    break;
  case  0x01:
    p = " Êý¾Ý°ü½ÓÊÕ´íÎó ";
    break;
  case  0x02:
    p = "´«¸ÐÆ÷ÉÏûÓÐÊÖÖ¸";
    break;
  case  0x03:
    p = "¼ÈëÖ¸ÎÆÍ¼Ïñʧ°Ü";
    break;
  case  0x04:
    p = " Ö¸ÎÆÌ«¸É»òÌ«µ­ ";
    break;
  case  0x05:
    p = " Ö¸ÎÆÌ«Êª»òÌ«ºý ";
    break;
  case  0x06:
    p = "  Ö¸ÎÆÍ¼ÏñÌ«ÂÒ  ";
    break;
  case  0x07:
    p = " Ö¸ÎÆÌØÕ÷µãÌ«ÉÙ ";
    break;
  case  0x08:
    p = "  Ö¸ÎÆ²»Æ¥Åä    ";
    break;
  case  0x09:
    p = " ûÓÐËÑË÷µ½Ö¸ÎÆ ";
    break;
  case  0x0a:
    p = "   ÌØÕ÷ºÏ²¢Ê§°Ü ";
    break;
  case  0x0b:
    p = "µØÖ·ÐòºÅ³¬³ö·¶Î§";
  case  0x10:
    p = "  ɾ³ýÄ£°åʧ°Ü  ";
    break;
  case  0x11:
    p = " Çå¿ÕÖ¸ÎÆ¿âʧ°Ü ";
    break;
  case  0x15:
    p = "»º³åÇøÄÚÎÞÓÐЧͼ";
    break;
  case  0x18:
    p = " ¶ÁдFLASH³ö´í  ";
    break;
  case  0x19:
    p = "   䶨Òå´íÎó   ";
    break;
  case  0x1a:
    p = "  ÎÞЧ¼Ä´æÆ÷ºÅ  ";
    break;
  case  0x1b:
    p = " ¼Ä´æÆ÷ÄÚÈÝ´íÎó ";
    break;
  case  0x1c:
    p = " ¼Çʱ¾Ò³Âë´íÎó ";
    break;
  case  0x1f:
    p = "    Ö¸ÎÆ¿âÂú    ";
    break;
  case  0x20:
    p = "    µØÖ·´íÎó    ";
    break;
  default :
    p = " ·µ»ØÈ·ÈÏÂëÓÐÎó ";
    break;
  }
  return p;
}

//ÏÔʾȷÈÏÂë´íÎóÐÅÏ¢
void ShowErrMessage(u8 ensure)
{
  //OLED_ShowCH(5,0,(u8*)EnsureMessage(ensure));
}


//Â¼Ö¸ÎÆ
void Add_FR(void)
{
  u8 i, ensure, processnum = 0;
  u8 ID_NUM = 0;
  while(1)
  {
    switch (processnum)
    {
    case 0:
      i++;
      OLED_ShowCH(0, 2, "    Çë°´ÊÖÖ¸    ");
      ensure = PS_GetImage();
      if(ensure == 0x00)
      {
        ensure = PS_GenChar(CharBuffer1); //Éú³ÉÌØÕ÷
        if(ensure == 0x00)
        {
          OLED_ShowCH(0, 2, "    Ö¸ÎÆÕý³£    ");
          OLED_ShowCH(0, 4, "                ");
          i = 0;
          processnum = 1; //Ìøµ½µÚ¶þ²½
        }
        else ShowErrMessage(ensure);
      }
      else ShowErrMessage(ensure);
      break;

    case 1:
      i++;
      OLED_ShowCH(0, 2, "   ÇëÔÙ°´Ò»´Î   ");
      OLED_ShowCH(0, 4, "                ");
      ensure = PS_GetImage();
      if(ensure == 0x00)
      {
        ensure = PS_GenChar(CharBuffer2); //Éú³ÉÌØÕ÷
        if(ensure == 0x00)
        {
          OLED_ShowCH(0, 2, "    Ö¸ÎÆÕý³£    ");
          OLED_ShowCH(0, 4, "                ");
          i = 0;
          processnum = 2; //Ìøµ½µÚÈý²½
        }
        else ShowErrMessage(ensure);
      }
      else ShowErrMessage(ensure);
      break;

    case 2:
      OLED_ShowCH(0, 2, "  ¶Ô±ÈÁ½´ÎÖ¸ÎÆ  ");
      OLED_ShowCH(0, 4, "                ");
      ensure = PS_Match();
      if(ensure == 0x00)
      {
        OLED_ShowCH(0, 2, "    ¶Ô±È³É¹¦    ");
        OLED_ShowCH(0, 4, "                ");
        processnum = 3; //Ìøµ½µÚËIJ½
      }
      else
      {
        OLED_ShowCH(0, 2, "    ¶Ô±Èʧ°Ü    ");
        OLED_ShowCH(0, 4, "                ");
        ShowErrMessage(ensure);
        i = 0;
        processnum = 0; //Ìø»ØµÚÒ»²½
      }
      delay_ms(500);
      break;

    case 3:
      OLED_ShowCH(0, 2, "  Éú³ÉÖ¸ÎÆÄ£°å  ");
      OLED_ShowCH(0, 4, "                ");
      delay_ms(500);
      ensure = PS_RegModel();
      if(ensure == 0x00)
      {
        OLED_ShowCH(0, 2, "Éú³ÉÖ¸ÎÆÄ£°å³É¹¦");
        OLED_ShowCH(0, 4, "                ");
        processnum = 4; //Ìøµ½µÚÎå²½
      }
      else
      {
        processnum = 0;
        ShowErrMessage(ensure);
      }
      delay_ms(1000);
      break;

    case 4:
      OLED_ShowCH(0, 0, " °´K4¼Ó,°´K2¼õ ");
      OLED_ShowCH(0, 2, "    °´K3±£´æ    ");
      OLED_ShowCH(0, 4, "  0=< ID <=99   ");
      while(key_num != 3)
      {
        key_num = KEY_Scan(0);
        if(key_num == 2)
        {
          key_num = 0;
          if(ID_NUM > 0)
            ID_NUM--;
        }
        if(key_num == 4)
        {
          key_num = 0;
          if(ID_NUM < 99)
            ID_NUM++;
        }
        OLED_ShowCH(40, 6, "ID=");
        OLED_ShowNum(65, 6, ID_NUM, 2, 1);
      }
      key_num = 0;
      ensure = PS_StoreChar(CharBuffer2, ID_NUM); //´¢´æÄ£°å
      if(ensure == 0x00)
      {
        OLED_Clear();
        OLED_ShowCH(0, 2, "  ¼ÈëÖ¸ÎÆ³É¹¦  ");
        OLED_ShowCH(0, 4, "                ");
        delay_ms(1500);
        OLED_Clear();
        OLED_ShowCH(0, 0, "Ö¸ÎÆÄ£¿é²âÊÔ³ÌÐò");
        OLED_ShowCH(16, 2, "K1¼üÌí¼ÓÖ¸ÎÆ");
        OLED_ShowCH(16, 4, "K3¼üɾ³ýÖ¸ÎÆ");
        OLED_ShowCH(16, 6, "K5¼üÑéÖ¤Ö¸ÎÆ");
        return ;
      }
      else
      {
        OLED_Clear();
        processnum = 0;
        ShowErrMessage(ensure);
      }
      break;
    }
    delay_ms(400);
    if(i == 10) //³¬¹ý5´ÎûÓа´ÊÖÖ¸ÔòÍ˳ö
    {
      break;
    }
  }
}

SysPara AS608Para;//Ö¸ÎÆÄ£¿éAS608²ÎÊý
//Ë¢Ö¸ÎÆ
void press_FR(void)
{
  SearchResult seach;
  u8 ensure;
  char str[20];
  while(key_num != 1)
  {
    key_num = KEY_Scan(0);
    ensure = PS_GetImage();
    if(ensure == 0x00) //»ñȡͼÏñ³É¹¦
    {
      ensure = PS_GenChar(CharBuffer1);
      if(ensure == 0x00) //Éú³ÉÌØÕ÷³É¹¦
      {
        ensure = PS_HighSpeedSearch(CharBuffer1, 0, 99, &seach);
        if(ensure == 0x00) //ËÑË÷³É¹¦
        {
          OLED_ShowCH(0, 2, "  Ö¸ÎÆÑéÖ¤³É¹¦  ");
          sprintf(str, " ID:%d µÃ·Ö:%d ", seach.pageID, seach.mathscore);
          OLED_ShowCH(0, 4, (u8*)str);
          delay_ms(1500);
          delay_ms(1500);
        }
        else
        {
          OLED_ShowCH(32, 2, "Ñé֤ʧ°Ü");
          delay_ms(1500);
        }
      }
      else
			{};
      OLED_Clear();
      OLED_ShowCH(32, 2, "Çë°´ÊÖÖ¸");
    }
  }
  OLED_Clear();
  OLED_ShowCH(0, 0, "Ö¸ÎÆÄ£¿é²âÊÔ³ÌÐò");
  OLED_ShowCH(16, 2, "K1¼üÌí¼ÓÖ¸ÎÆ");
  OLED_ShowCH(16, 4, "K3¼üɾ³ýÖ¸ÎÆ");
  OLED_ShowCH(16, 6, "K5¼üÑéÖ¤Ö¸ÎÆ");
}

//ɾ³ýÖ¸ÎÆ
void Del_FR(void)
{
  u8  ensure;
  u16 ID_NUM = 0;
  OLED_ShowCH(0, 0, "K4¼Ó K2¼õ K3È·ÈÏ");
  OLED_ShowCH(0, 2, "  K5Çå¿ÕÖ¸ÎÆ¿â  ");
  OLED_ShowCH(0, 4, "K1·µ»Ø 0=<ID<=99");
  while(key_num != 3)
  {
    key_num = KEY_Scan(0);
    if(key_num == 2)
    {
      key_num = 0;
      if(ID_NUM > 0)
        ID_NUM--;
    }
    if(key_num == 4)
    {
      key_num = 0;
      if(ID_NUM < 99)
        ID_NUM++;
    }
    if(key_num == 1)
      goto MENU ; //·µ»ØÖ÷Ò³Ãæ
    if(key_num == 5)
    {
      key_num = 0;
      ensure = PS_Empty(); //Çå¿ÕÖ¸ÎÆ¿â
      if(ensure == 0)
      {
        OLED_Clear();
        OLED_ShowCH(0, 2, " Çå¿ÕÖ¸ÎÆ¿â³É¹¦ ");
      }
      else
        ShowErrMessage(ensure);
      delay_ms(1500);
      goto MENU ; //·µ»ØÖ÷Ò³Ãæ
    }
    OLED_ShowCH(40, 6, "ID=");
    OLED_ShowNum(65, 6, ID_NUM, 2, 1);
  }
  ensure = PS_DeletChar(ID_NUM, 1); //ɾ³ýµ¥¸öÖ¸ÎÆ
  if(ensure == 0)
  {
    OLED_Clear();
    OLED_ShowCH(0, 2, "  ɾ³ýÖ¸ÎÆ³É¹¦  ");
  }
  else
    ShowErrMessage(ensure);
  delay_ms(1500);
MENU:
  OLED_Clear();
  OLED_ShowCH(0, 0, "Ö¸ÎÆÄ£¿é²âÊÔ³ÌÐò");
  OLED_ShowCH(16, 2, "K1¼üÌí¼ÓÖ¸ÎÆ");
  OLED_ShowCH(16, 4, "K3¼üɾ³ýÖ¸ÎÆ");
  OLED_ShowCH(16, 6, "K5¼üÑéÖ¤Ö¸ÎÆ");
  key_num = 0;
}

在这里插入图片描述
识别成功case选择的是0x00可以看到当ensure等于0x00时执行识别成功对应的功能。
在这里插入图片描述

总结

一般来说只要是模块类的东西就不难,下一步用人脸识别和指纹一起做一个解锁的。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我与nano

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值