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时执行识别成功对应的功能。
总结
一般来说只要是模块类的东西就不难,下一步用人脸识别和指纹一起做一个解锁的。