標(biāo)題:
AS608+stm32指紋鎖源程序(德飛萊核心板)
[打印本頁(yè)]
作者:
zht1998
時(shí)間:
2019-12-5 13:03
標(biāo)題:
AS608+stm32指紋鎖源程序(德飛萊核心板)
指紋模塊:AS608
單片機(jī):德飛萊stm32f103zet6(M3S)
需要中文字庫(kù)。
自己學(xué)習(xí)弄的,as608模塊給的是正點(diǎn)原子32的例程,沒有德飛萊32的,因此在正點(diǎn)原子戰(zhàn)艦版例程上進(jìn)行了修改,可以在德飛萊板子上運(yùn)行。
因?yàn)樗接邢,改的很粗糙,只是基本保留了功能,望見諒?br /> 有錯(cuò)誤請(qǐng)留言。
有疑問請(qǐng)留言。
侵刪
新建:
newxxx 接收 0x6e 0x65 0x77
fir st 發(fā)送 0x66 0x69 0x72
sec ond 發(fā)送 0x73 0x65 0x63
suc cess 發(fā)送 0x73 0x75 0x63
fai l 發(fā)送 0x66 0x61 0x69
nof inger 發(fā)送 0x6e 0x6f 0x66
dif 發(fā)送 兩次指紋不一
sam 發(fā)送 兩次指紋一致
識(shí)別:
rec ognize-xxx 發(fā)送 0x72 0x65 0x63
yes
no
刪除:
delxxx 接收 0x64 0x65 0x6c
delall 接收 0x64 0x65 0x6c 0x61 0x6C 0x6C
com plete 發(fā)送 0x63 0x6f 0x6d
連接失敗 error 發(fā)送 0x65 0x72 0x72
單片機(jī)源程序如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
#include "beep.h"
#include "touch.h"
#include "malloc.h"
#include "usmart.h"
#include "sdio_sdcard.h"
#include "w25qxx.h"
#include "ff.h"
#include "exfuns.h"
#include "fontupd.h"
#include "text.h"
#include "usart2.h"
#include "AS608.h"
#include "timer.h"
#include "adc.h"
#include "switch.h"
#define usart2_baund 57600//串口2波特率,根據(jù)指紋模塊波特率更改
SysPara AS608Para;//指紋模塊AS608參數(shù)
u16 ValidN;//模塊內(nèi)有效指紋個(gè)數(shù)
u8** kbd_tbl;
u8 unlock=0;
u8 lock=0;
float ADC_ConvertedValueLocal;
extern __IO uint16_t ADC_ConvertedValue;
const u8* kbd_menu[15]={"刪指紋"," : ","錄指紋","1","2","3","4","5","6","7","8","9","DEL","0","Enter",};//按鍵表
const u8* kbd_delFR[15]={"返回"," : ","清空指紋","1","2","3","4","5","6","7","8","9","DEL","0","Enter",};//按鍵表
void Add_FR(u8 fingerid); //錄指紋
void Del_FR(void); //刪除指紋
void press_FR(void);//刷指紋
void ShowErrMessage(u8 ensure);//顯示確認(rèn)碼錯(cuò)誤信息
void AS608_load_keyboard(u16 x,u16 y,u8 **kbtbl);//加載虛擬鍵盤
u8 AS608_get_keynum(u16 x,u16 y);//獲取鍵盤數(shù)
u16 GET_NUM(void);//獲取數(shù)值
int main(void)
{
u8 ensure;
// u8 key_num;
char *str;
ADC1_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
delay_init(); //初始化延時(shí)函數(shù)
uart_init(115200); //初始化串口1波特率為115200,用于支持USMART
usart2_init(usart2_baund);//初始化串口2,用于與指紋模塊通訊
// usart4_init(9600);//初始化串口3上位機(jī)
PS_StaGPIO_Init(); //初始化FR讀狀態(tài)引腳
BEEP_Init(); //初始化蜂鳴器
KEY_Init(); //按鍵初始化
LCD_Init(); //LCD初始化
W25QXX_Init(); //初始化W25Q128
tp_dev.init(); //初始化觸摸屏
usmart_dev.init(72); //初始化USMART
my_mem_init(SRAMIN); //初始化內(nèi)部?jī)?nèi)存池
exfuns_init(); //為fatfs相關(guān)變量申請(qǐng)內(nèi)存
f_mount(fs[1],"1:",1); //掛載FLASH.
POINT_COLOR=RED;
while(font_init()) //檢查字庫(kù)
{
LCD_ShowString(60,50,240,16,16,"Font Error!");
delay_ms(200);
LCD_Fill(60,50,240,66,WHITE);//清除顯示
delay_ms(200);
}
if(!(tp_dev.touchtype&0x80))//如果是電阻屏
{
// Show_Str_Mid(0,30,"是否進(jìn)行觸摸屏校準(zhǔn)",16,240);
// POINT_COLOR=BLUE;
// Show_Str_Mid(0,60,"是:KEY2 否:KEY0",16,240);
// while(1)
// {
// key_num=KEY_Scan(0);
// if(key_num==KEY0_PRES)
// break;
// if(key_num==KEY2_PRES)
// {
// LCD_Clear(WHITE);
// TP_Adjust(); //屏幕校準(zhǔn)
// TP_Save_Adjdata();//保存校準(zhǔn)參數(shù)
// break;
// }
// }
}
/*加載指紋識(shí)別實(shí)驗(yàn)界面*/
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str_Mid(0,0,"AS608指紋識(shí)別模塊測(cè)試程序",16,240);
//Show_Str_Mid(0,20,"正點(diǎn)原子 @ALIENTEK",16,240);
POINT_COLOR=BLUE;
Show_Str_Mid(0,40,"與AS608模塊握手....",16,240);
while(PS_HandShake(&AS608Addr))//與AS608模塊握手
{
delay_ms(400);
LCD_Fill(0,40,240,80,WHITE);
Show_Str_Mid(0,40,"檢測(cè)到模塊!!!",16,240);
delay_ms(800);
LCD_Fill(0,40,240,80,WHITE);
Show_Str_Mid(0,40,"嘗試連接模塊...",16,240);
}
LCD_Fill(30,40,240,100,WHITE);
Show_Str_Mid(0,40,"通訊成功!!!",16,240);
printf("連接成功");
str=mymalloc(SRAMIN,30);
sprintf(str,"波特率:%d 地址:%x",usart2_baund,AS608Addr);
Show_Str(0,60,240,16,(u8*)str,16,0);
ensure=PS_ValidTempleteNum(&ValidN);//讀庫(kù)指紋個(gè)數(shù)
if(ensure!=0x00)
ShowErrMessage(ensure);//顯示確認(rèn)碼錯(cuò)誤信息
ensure=PS_ReadSysPara(&AS608Para); //讀參數(shù)
if(ensure==0x00)
{
mymemset(str,0,50);
sprintf(str,"庫(kù)容量:%d 對(duì)比等級(jí): %d",AS608Para.PS_max-ValidN,AS608Para.PS_level);
Show_Str(0,80,240,16,(u8*)str,16,0);
}
else
ShowErrMessage(ensure);
myfree(SRAMIN,str);
AS608_load_keyboard(0,170,(u8**)kbd_menu);//加載虛擬鍵盤
while(1)
{
// key_num=AS608_get_keynum(0,170);
// if(key_num)
// {
// if(key_num==1)Del_FR(); //刪指紋
// if(key_num==3)Add_FR(); //錄指紋
// }
// GPIO_SetBits(GPIOB,GPIO_Pin_9);
// GPIO_ResetBits(GPIOB,GPIO_Pin_9);
ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3;
LCD_ShowxNum(0,120,ADC_ConvertedValueLocal*100,20,16,0);
information();
if(PS_Sta) //檢測(cè)PS_Sta狀態(tài),如果有手指按下
{
press_FR();//刷指紋
}
delay_ms(500);
}
}
//加載按鍵界面(尺寸x,y為240*150)
//x,y:界面起始坐標(biāo)(240*320分辨率的時(shí)候,x必須為0)
void AS608_load_keyboard(u16 x,u16 y,u8 **kbtbl)
{
u16 i;
POINT_COLOR=RED;
kbd_tbl=kbtbl;
LCD_Fill(x,y,x+240,y+150,WHITE);
LCD_DrawRectangle(x,y,x+240,y+150);
LCD_DrawRectangle(x+80,y,x+160,y+150);
LCD_DrawRectangle(x,y+30,x+240,y+60);
LCD_DrawRectangle(x,y+90,x+240,y+120);
POINT_COLOR=BLUE;
for(i=0;i<15;i++)
{
if(i==1)//按鍵表第2個(gè)‘:’不需要中間顯示
Show_Str(x+(i%3)*80+2,y+7+30*(i/3),80,30,(u8*)kbd_tbl[i],16,0);
else
Show_Str_Mid(x+(i%3)*80,y+7+30*(i/3),(u8*)kbd_tbl[i],16,80);
}
}
//按鍵狀態(tài)設(shè)置
//x,y:鍵盤坐標(biāo)
//key:鍵值(0~14)
//sta:狀態(tài),0,松開;1,按下;
void AS608_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
{
u16 i=keyx/3,j=keyx%3;
if(keyx>16)return;
if(sta &&keyx!=1)//按鍵表第2個(gè)‘:’不需要清除
LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,GREEN);
else if(keyx!=1)
LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,WHITE);
if(keyx!=1)//不是‘:’
Show_Str_Mid(x+j*80,y+7+30*i,(u8*)kbd_tbl[keyx],16,80);
}
//得到觸摸屏的輸入
//x,y:鍵盤坐標(biāo)
//返回值:(1~15,對(duì)應(yīng)按鍵表)
u8 AS608_get_keynum(u16 x,u16 y)
{
u16 i,j;
static u8 key_x=0;//0,沒有任何按鍵按下
u8 key=0;
tp_dev.scan(0);
if(tp_dev.sta&TP_PRES_DOWN)//觸摸屏被按下
{
for(i=0;i<5;i++)
{
for(j=0;j<3;j++)
{
if(tp_dev.x[0]<(x+j*80+80)&&tp_dev.x[0]>(x+j*80)&&tp_dev.y[0]<(y+i*30+30)&&tp_dev.y[0]>(y+i*30))
{
key=i*3+j+1;
break;
}
}
if(key)
{
if(key_x==key)key=0;
else
{
AS608_key_staset(x,y,key_x-1,0);
key_x=key;
AS608_key_staset(x,y,key_x-1,1);
}
break;
}
}
}else if(key_x)
{
AS608_key_staset(x,y,key_x-1,0);
key_x=0;
}
return key;
}
//獲取鍵盤數(shù)值
u16 GET_NUM(void)
{
u8 key_num=0;
u16 num=0;
while(1)
{
key_num=AS608_get_keynum(0,170);
if(key_num)
{
if(key_num==1)return 0xFFFF;//‘返回’鍵
if(key_num==3)return 0xFF00;//
if(key_num>3&&key_num<13&&num<99)//‘1-9’鍵(限制輸入3位數(shù))
num =num*10+key_num-3;
if(key_num==13)num =num/10;//‘Del’鍵
if(key_num==14&&num<99)num =num*10;//‘0’鍵
if(key_num==15)return num; //‘Enter’鍵
}
LCD_ShowNum(80+15,170+7,num,6,16);
}
}
//顯示確認(rèn)碼錯(cuò)誤信息
void ShowErrMessage(u8 ensure)
{
LCD_Fill(0,120,lcddev.width,160,WHITE);
Show_Str_Mid(0,120,(u8*)EnsureMessage(ensure),16,240);
}
//錄指紋
void Add_FR(u8 fingerid)
{
u8 i,ensure ,processnum=0;
u16 ID;
while(1)
{
switch (processnum)
{
case 0:
i++;
LCD_Fill(0,100,lcddev.width,160,WHITE);
Show_Str_Mid(0,100,"請(qǐng)按指紋",16,240);
if(i==1)
{printf("fir");}
ensure=PS_GetImage();
if(ensure==0x00)
{
BEEP=1;
ensure=PS_GenChar(CharBuffer1);//生成特征
BEEP=0;
if(ensure==0x00)
{
LCD_Fill(0,120,lcddev.width,160,WHITE);
Show_Str_Mid(0,120,"指紋正常",16,240);
i=0;
processnum=1;//跳到第二步
}else ShowErrMessage(ensure);
}else ShowErrMessage(ensure);
break;
case 1:
i++;
LCD_Fill(0,100,lcddev.width,160,WHITE);
Show_Str_Mid(0,100,"請(qǐng)按再按一次指紋",16,240);
if(i==1)
{printf("sec");}
ensure=PS_GetImage();
if(ensure==0x00)
{
BEEP=1;
ensure=PS_GenChar(CharBuffer2);//生成特征
BEEP=0;
if(ensure==0x00)
{
LCD_Fill(0,120,lcddev.width,160,WHITE);
Show_Str_Mid(0,120,"指紋正常",16,240);
i=0;
processnum=2;//跳到第三步
}else ShowErrMessage(ensure);
}else ShowErrMessage(ensure);
break;
case 2:
LCD_Fill(0,100,lcddev.width,160,WHITE);
Show_Str_Mid(0,100,"正在對(duì)比兩次指紋",16,240);
ensure=PS_Match();
if(ensure==0x00)
{
LCD_Fill(0,120,lcddev.width,160,WHITE);
Show_Str_Mid(0,120,"對(duì)比成功,兩次指紋一樣",16,240);
printf("sam");
processnum=3;//跳到第四步
}
else
{
LCD_Fill(0,100,lcddev.width,160,WHITE);
Show_Str_Mid(0,100,"對(duì)比失敗,請(qǐng)重新錄入指紋",16,240);
printf("dif");
ShowErrMessage(ensure);
i=0;
processnum=0;//跳回第一步
}
delay_ms(1200);
break;
case 3:
LCD_Fill(0,100,lcddev.width,160,WHITE);
Show_Str_Mid(0,100,"生成指紋模板",16,240);
ensure=PS_RegModel();
if(ensure==0x00)
{
LCD_Fill(0,120,lcddev.width,160,WHITE);
Show_Str_Mid(0,120,"生成指紋模板成功",16,240);
processnum=4;//跳到第五步
}else {processnum=0;ShowErrMessage(ensure);}
delay_ms(1200);
break;
case 4:
// LCD_Fill(0,100,lcddev.width,160,WHITE);
// Show_Str_Mid(0,100,"請(qǐng)輸入儲(chǔ)存ID,按Enter保存",16,240);
// Show_Str_Mid(0,120,"0=< ID <=299",16,240);
do
// ID=GET_NUM();
ID=fingerid;
while(!(ID<AS608Para.PS_max));//輸入ID必須小于指紋容量的最大值
ensure=PS_StoreChar(CharBuffer2,ID);//儲(chǔ)存模板
if(ensure==0x00)
{
LCD_Fill(0,100,lcddev.width,160,WHITE);
Show_Str_Mid(0,120,"錄入指紋成功",16,240);
printf("suc");
PS_ValidTempleteNum(&ValidN);//讀庫(kù)指紋個(gè)數(shù)
LCD_ShowNum(56,80,AS608Para.PS_max-ValidN,3,16);
delay_ms(1500);
LCD_Fill(0,100,240,160,WHITE);
return ;
}else {processnum=0;ShowErrMessage(ensure);}
break;
}
delay_ms(500);
if(i==8)//超過(guò)5次沒有按手指則退出
{
LCD_Fill(0,100,lcddev.width,160,WHITE);
// printf("nof");
break;
}
}
}
//刷指紋
void press_FR(void)
{
SearchResult seach;
u8 ensure;
char *str;
ensure=PS_GetImage();
if(ensure==0x00)//獲取圖像成功
{
BEEP=1;//打開蜂鳴器
ensure=PS_GenChar(CharBuffer1);
if(ensure==0x00) //生成特征成功
{
BEEP=0;//關(guān)閉蜂鳴器
ensure=PS_HighSpeedSearch(CharBuffer1,0,AS608Para.PS_max,&seach);
if(ensure==0x00)//搜索成功
{
LCD_Fill(0,100,lcddev.width,160,WHITE);
Show_Str_Mid(0,100,"刷指紋成功",16,240);
str=mymalloc(SRAMIN,50);
sprintf(str,"確有此人,ID:%d 匹配得分:%d",seach.pageID,seach.mathscore);
printf("rec");
printf("%d",(seach.pageID/100)%10);
printf("%d",(seach.pageID/10)%10);
printf("%d",seach.pageID%10);
Show_Str_Mid(0,140,(u8*)str,16,240);
myfree(SRAMIN,str);
}
else
ShowErrMessage(ensure);
}
else
ShowErrMessage(ensure);
BEEP=0;//關(guān)閉蜂鳴器
delay_ms(600);
LCD_Fill(0,100,lcddev.width,160,WHITE);
}
}
//刪除指紋
void Del_FR(void)
{
u8 ensure;
u16 num;
LCD_Fill(0,100,lcddev.width,160,WHITE);
Show_Str_Mid(0,100,"刪除指紋",16,240);
Show_Str_Mid(0,120,"請(qǐng)輸入指紋ID按Enter發(fā)送",16,240);
Show_Str_Mid(0,140,"0=< ID <=299",16,240);
delay_ms(50);
AS608_load_keyboard(0,170,(u8**)kbd_delFR);
num=GET_NUM();//獲取返回的數(shù)值
if(num==0xFFFF)
goto MENU ; //返回主頁(yè)面
else if(num==0xFF00)
ensure=PS_Empty();//清空指紋庫(kù)
else
ensure=PS_DeletChar(num,1);//刪除單個(gè)指紋
if(ensure==0)
{
LCD_Fill(0,120,lcddev.width,160,WHITE);
Show_Str_Mid(0,140,"刪除指紋成功",16,240);
printf("com");
}
else
ShowErrMessage(ensure);
delay_ms(1200);
PS_ValidTempleteNum(&ValidN);//讀庫(kù)指紋個(gè)數(shù)
LCD_ShowNum(56,80,AS608Para.PS_max-ValidN,3,16);
MENU:
LCD_Fill(0,100,lcddev.width,160,WHITE);
delay_ms(50);
AS608_load_keyboard(0,170,(u8**)kbd_menu);
}
復(fù)制代碼
所有資料51hei提供下載:
as608 defly stm32.7z
(1.37 MB, 下載次數(shù): 65)
2019-12-5 16:00 上傳
點(diǎn)擊文件名下載附件
指紋例程
下載積分: 黑幣 -5
as608 單片機(jī)設(shè)計(jì).7z
(1.37 MB, 下載次數(shù): 57)
2019-12-5 16:00 上傳
點(diǎn)擊文件名下載附件
指紋密碼鎖
下載積分: 黑幣 -5
作者:
QSM980405
時(shí)間:
2019-12-28 10:18
謝謝大佬的分享,幫頂
作者:
srr000
時(shí)間:
2020-2-13 15:33
謝謝分享
作者:
1376922746
時(shí)間:
2020-4-8 10:24
謝謝大佬!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1