基于STM32的指纹锁
生活随笔
收集整理的这篇文章主要介绍了
基于STM32的指纹锁
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
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的指纹锁的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: n1怎么进入线刷模式_OPPO N1怎么
- 下一篇: 自动上色论文《Deep Exemplar