STM32

文章目录

  • STM32
  • 前言
  • 一、AS608模块
    • 接线说明
  • 二、使用步骤
  • 总结

指纹锁

前言

封校生活无聊至极,手上还有个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];elseensure = 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];elseensure = 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];elseensure = 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];}elseensure = 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];elseensure = 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];elseensure = 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];elseensure = 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];elseensure = 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];elseensure = 0xff;if(ensure == 0)printf("\r\nÉèÖòÎÊý³É¹¦£¡");elseprintf("\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];}elseensure = 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);}elseprintf("\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];elseensure = 0xff;AS608Addr = PS_addr;if(ensure == 0x00)printf("\r\nÉèÖõØÖ·³É¹¦£¡");elseprintf("\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];elseensure = 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];}}elseensure = 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];}elseensure = 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];}elseensure = 0xff;if(ensure == 0x00){printf("\r\nÓÐЧָÎƸöÊý=%d", (data[10] << 8) + data[11]);}elseprintf("\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, " Çå¿ÕÖ¸ÎÆ¿â³É¹¦ ");}elseShowErrMessage(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, "  ɾ³ýÖ¸ÎƳɹ¦  ");}elseShowErrMessage(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时执行识别成功对应的功能。

总结

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

基于STM32的指纹锁相关推荐

  1. 基于stm32的指纹锁系统

    如题 使用到的传感器以及开发板,软件介绍 开发板 stm32f407ZE 蓝牙 https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.w4011-1653 ...

  2. 基于STM32的指纹识别智能锁设计

    本设计是基于stm32的指纹识别智能锁设计,主要实现以下功能: 1,OLED显示输入锁的状态,解锁状态,开锁成功,开锁失败,确定,清除 2,通过矩阵键盘输入开门密码.修改密码.确认密码等操作: 3,可 ...

  3. 基于stm32的指纹识别系统设计与系统

    指纹识别系统设计与系统 详细功能模块描述: 1.系统硬件模块设计与实现: 指纹通过指纹识别模块采集处理:并将处理后的指纹特征值等以数据包的形式发给主控模块;主控模块发送指令包对指纹识别模块进行控制以及 ...

  4. 基于单片机的指纹锁密码锁电路设计(#0202)

    随着社会的发展和技术的进步,传统的安全防盗系统面临极大的挑战.生物识别技术是根据人的体貌.声音等生物特征进行身份验证的科学解决方案,现有的生物识别技术大致上包括指纹识别技术.掌纹识别技术.视网膜识别技 ...

  5. 基于STM32智能马蹄锁设计

    1. 前言 设计一款基于单片机的家用马蹄锁,主要用在自行车.共享单车上. 主要要求: 1.手机蓝牙直连控制开关:手机直接连接智能马蹄锁可以控制其开锁关锁的功能. 2.即连即开: 手机端与智能马蹄锁第一 ...

  6. u盘解密软件_【精彩文章】基于STM32的指纹识别U盘设计

    U盘是我们日常生活工作中经常使用到的工具之一,它能够帮我们存储和拷贝重要的文件和数据信息.它小巧便于携带.存储容量大.价格便宜.性能可靠.U盘体积很小,仅大拇指般大小,重量极轻,一般在15克左右,特别 ...

  7. 基于stm32智能门禁系统,指纹锁(RFID+键盘+指纹+OLED)

    基于stm32智能门禁系统,指纹锁(RFID+键盘+指纹+OLED) 主要功能: 1.同时支持指纹,密码,RFID开锁 2.支持删除.修改用户,断电保存(flash模拟EEPROM) 3.4×4矩阵键 ...

  8. 基于STM32指纹密码锁设计

    基于STM32指纹密码锁设计 程序.仿真.原文 本设计主要由stm32f103rct6单片机.AS608指纹模块.LCD1602显示屏.AT24C02存储模块.继电器和指示灯组成,该指纹密码锁是以st ...

  9. STM32项目设计:基于STM32指纹密码锁

    一.项目功能概述 1.可通过指纹模块增删查改家庭成员的指纹信息,增删查改是否成功的相关信息显示在TFTLCD屏幕,可存储500个指纹信息. 2.在指纹匹配过程中,如果采集的指纹与指纹模块库相匹配,TF ...

最新文章

  1. linux修改主机名+免密认证+关闭防火墙
  2. 利用DAC(Data-tier Application)实现数据库结构迁移
  3. 导致溢出_1篇文章搞清楚8种JVM内存溢出(OOM)的原因和解决方法
  4. scala中rdd无法join的问题
  5. Mach 微内核的命名趣闻
  6. Windows Phone开发之路(6) XAML基础(下)
  7. java中同步代码块具体步骤,Java同步块
  8. 关于系统集成的设计方案(一)
  9. C语言编译.bat为 .exe
  10. gmsk的matlab仿真,MSKGMSK 导师传给我的关于MSK和GMSK的一些相关MATLAB仿真源码 - 下载 - 搜珍网...
  11. XP连接网络计算机未启动服务,网络不存在或尚未启动/以及局域网互访的解决办法...
  12. HttpClient使用详解
  13. java 内部类的实例化_如何在Java中实例化成员内部类?
  14. at android.widget.Toast$TN.handleShow(Toast.java:501)自定义布局异常
  15. Excel表格多个工作表数据汇总求和
  16. FPGA 11 基础 8421BCD码
  17. android红外接收api,关于安卓红外API:ConsumerIrManager类
  18. html怎么把图片做成抖动效果,js实现鼠标触发图片抖动效果的方法
  19. Angular 的 ngOnInit 和 Constructor 的区别
  20. 7000字长文深度解读:DTC商业模式,对品牌增长的颠覆式影响

热门文章

  1. Hexo Next动态背景Canvas_nest
  2. 云服务器Redis集群部署及客户端通过公网IP连接问题
  3. qt 3d迷宫游戏_玩迷宫也能解锁孩子空间思维,各年龄必备迷宫书单推荐(附游戏资源下载)...
  4. 绕过tp路由器管理密码_怎么用手机设置路由器?TPlink无线路由器安装设置方法...
  5. MT4跟单软件更新至v4.23.0——HOOKSWORK多帐户跨平台
  6. ASP无限分类数据库版
  7. 第九篇论文读后总结-相似森林
  8. VectorMapNet | 端到端的矢量化高精地图学习
  9. 程序员常见英文缩写及其意义
  10. c语言中的英语缩写,英文短信缩写:超实用总结(C开头)