STM32前言一、AS608模块
接线说明 二、使用步骤总结
指纹锁
前言封校生活无聊至极,手上还有个AS608指纹模块没玩过,闲着无聊做了个指纹锁。
一、AS608模块ATK-AS608 指纹识别模块是 ALIENTEK 推出的一款高性能的光学指纹识别模块。
ATK-AS608 模块采用了国内著名指纹识别芯片公司杭州晟元芯片技术有限公司(Synochip)的 AS608 指纹识别芯片。芯片内置 DSP 运算单元,集成了指纹识别算法,能高效快速采集图像并识别指纹特征。模块配备了串口、USB 通讯接口,用户无需研究复杂的图像处理及指纹识别算法,只需通过简单的串口、USB 按照通讯协议便可控制模块。本模块可应用于各种考勤机、保险箱柜、指纹门禁系统、指纹锁等场合。
切记不可以接5v
代码
#include#include #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] = ' '; 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:456 //˵Ã÷: Ä£¿é·µ»ØÈ·ÈÏ×Ö 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("rnÉèÖòÎÊý³É¹¦£¡"); else printf("rn%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("rnÄ£¿é×î´óÖ¸ÎÆÈÝÁ¿=%d", p->PS_max); printf("rn¶Ô±ÈµÈ¼¶=%d", p->PS_level); printf("rnµØÖ·=%x", p->PS_addr); printf("rn²¨ÌØÂÊ=%d", p->PS_N * 9600); } else printf("rn%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("rnÉèÖõØÖ·³É¹¦£¡"); else printf("rn%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("rnÓÐÐ§Ö¸ÎÆ¸öÊý=%d", (data[10] << 8) + data[11]); } else printf("rn%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= 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时执行识别成功对应的功能。
一般来说只要是模块类的东西就不难,下一步用人脸识别和指纹一起做一个解锁的。



