找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6874|回复: 1
收起左侧

AS608指纹识别模块的stm32源码等资料

[复制链接]
ID:378695 发表于 2018-7-24 21:01 | 显示全部楼层 |阅读模式
stm32单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "lcd.h"
  5. #include "key.h"
  6. #include "beep.h"
  7. #include "touch.h"          
  8. #include "malloc.h"
  9. #include "usmart.h"  
  10. #include "sdio_sdcard.h"   
  11. #include "w25qxx.h"   
  12. #include "ff.h"  
  13. #include "exfuns.h"   
  14. #include "fontupd.h"
  15. #include "text.h"       
  16. #include "usart2.h"
  17. #include "AS608.h"
  18. #include "timer.h"

  19. #define usart2_baund  57600//串口2波特率,根据指纹模块波特率更改
  20. u8** kbd_tbl;
  21. SysPara AS608Para;//指纹模块AS608参数
  22. u16 ValidN;//模块内有效指纹个数
  23. const  u8* kbd_menu[15]={"删指纹"," : ","录指纹","1","2","3","4","5","6","7","8","9","DEL","0","Enter",};//按键表
  24. const  u8* kbd_delFR[15]={"返回"," : ","清空指纹","1","2","3","4","5","6","7","8","9","DEL","0","Enter",};//按键表

  25. void Add_FR(void);        //录指纹
  26. void Del_FR(void);        //删除指纹
  27. void press_FR(void);//刷指纹
  28. void ShowErrMessage(u8 ensure);//显示确认码错误信息
  29. void AS608_load_keyboard(u16 x,u16 y,u8 **kbtbl);//加载虚拟键盘
  30. u8  AS608_get_keynum(u16 x,u16 y);//获取键盘数
  31. u16 GET_NUM(void);//获取数值

  32. int main(void)
  33. {   
  34.         u8 ensure;
  35.         u8 key_num;
  36.         char *str;       
  37.        
  38.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  39.         delay_init();          //初始化延时函数
  40.         uart_init(115200);        //初始化串口1波特率为115200,用于支持USMART
  41.         usart2_init(usart2_baund);//初始化串口2,用于与指纹模块通讯
  42.         PS_StaGPIO_Init();        //初始化FR读状态引脚
  43.         BEEP_Init();                          //初始化蜂鸣器
  44.         KEY_Init();                                        //按键初始化
  45.         LCD_Init();                                        //LCD初始化        
  46.         W25QXX_Init();                        //初始化W25Q128
  47.         tp_dev.init();                        //初始化触摸屏
  48.         usmart_dev.init(72);                //初始化USMART
  49.         my_mem_init(SRAMIN);                //初始化内部内存池
  50.         exfuns_init();                        //为fatfs相关变量申请内存  
  51.         f_mount(fs[1],"1:",1);  //挂载FLASH.
  52.         POINT_COLOR=RED;
  53.         while(font_init())                         //检查字库
  54.         {            
  55.                 LCD_ShowString(60,50,240,16,16,"Font Error!");
  56.                 delay_ms(200);                                  
  57.                 LCD_Fill(60,50,240,66,WHITE);//清除显示
  58.                 delay_ms(200);       
  59.         }
  60.         if(!(tp_dev.touchtype&0x80))//如果是电阻屏
  61.         {
  62.                 Show_Str_Mid(0,30,"是否进行触摸屏校准",16,240);
  63.                 POINT_COLOR=BLUE;
  64.                 Show_Str_Mid(0,60,"是:KEY2   否:KEY0",16,240);       
  65.                 while(1)
  66.                 {
  67.                         key_num=KEY_Scan(0);
  68.                         if(key_num==KEY0_PRES)
  69.                                 break;
  70.                         if(key_num==KEY2_PRES)
  71.                         {
  72.                                 LCD_Clear(WHITE);
  73.                                 TP_Adjust();           //屏幕校准
  74.                                 TP_Save_Adjdata();//保存校准参数
  75.                                 break;                               
  76.                         }
  77.                 }
  78.         }
  79.         /*加载指纹识别实验界面*/
  80.         LCD_Clear(WHITE);
  81.         POINT_COLOR=RED;
  82.         Show_Str_Mid(0,0,"AS608指纹识别模块测试程序",16,240);                                                 
  83.         Show_Str_Mid(0,20,"正点原子 @ALIENTEK",16,240);                                             
  84.         POINT_COLOR=BLUE;
  85.         Show_Str_Mid(0,40,"与AS608模块握手....",16,240);       
  86.         while(PS_HandShake(&AS608Addr))//与AS608模块握手
  87.         {
  88.                 delay_ms(400);
  89.                 LCD_Fill(0,40,240,80,WHITE);
  90.                 Show_Str_Mid(0,40,"未检测到模块!!!",16,240);
  91.                 delay_ms(800);
  92.                 LCD_Fill(0,40,240,80,WHITE);
  93.                 Show_Str_Mid(0,40,"尝试连接模块...",16,240);                  
  94.         }
  95.         LCD_Fill(30,40,240,100,WHITE);
  96.         Show_Str_Mid(0,40,"通讯成功!!!",16,240);
  97.         str=mymalloc(SRAMIN,30);
  98.         sprintf(str,"波特率:%d   地址:%x",usart2_baund,AS608Addr);
  99.         Show_Str(0,60,240,16,(u8*)str,16,0);
  100.         ensure=PS_ValidTempleteNum(&ValidN);//读库指纹个数
  101.         if(ensure!=0x00)
  102.                 ShowErrMessage(ensure);//显示确认码错误信息       
  103.         ensure=PS_ReadSysPara(&AS608Para);  //读参数
  104.         if(ensure==0x00)
  105.         {
  106.                 mymemset(str,0,50);
  107.                 sprintf(str,"库容量:%d     对比等级: %d",AS608Para.PS_max-ValidN,AS608Para.PS_level);
  108.                 Show_Str(0,80,240,16,(u8*)str,16,0);
  109.         }
  110.         else
  111.                 ShowErrMessage(ensure);       
  112.         myfree(SRAMIN,str);
  113.         AS608_load_keyboard(0,170,(u8**)kbd_menu);//加载虚拟键盘
  114.         while(1)
  115.         {
  116.                 key_num=AS608_get_keynum(0,170);       
  117.                 if(key_num)
  118.                 {
  119.                         if(key_num==1)Del_FR();                //删指纹
  120.                         if(key_num==3)Add_FR();                //录指纹                                                                       
  121.                 }
  122.                 if(PS_Sta)         //检测PS_Sta状态,如果有手指按下
  123.                 {
  124.                         press_FR();//刷指纹                       
  125.                 }                                 
  126.         }        
  127. }


  128. //加载按键界面(尺寸x,y为240*150)
  129. //x,y:界面起始坐标(240*320分辨率的时候,x必须为0)
  130. void AS608_load_keyboard(u16 x,u16 y,u8 **kbtbl)
  131. {
  132.         u16 i;
  133.         POINT_COLOR=RED;
  134.         kbd_tbl=kbtbl;
  135.         LCD_Fill(x,y,x+240,y+150,WHITE);
  136.         LCD_DrawRectangle(x,y,x+240,y+150);                                                  
  137.         LCD_DrawRectangle(x+80,y,x+160,y+150);         
  138.         LCD_DrawRectangle(x,y+30,x+240,y+60);
  139.         LCD_DrawRectangle(x,y+90,x+240,y+120);
  140.         POINT_COLOR=BLUE;
  141.         for(i=0;i<15;i++)
  142.         {
  143.                 if(i==1)//按键表第2个‘:’不需要中间显示
  144.                         Show_Str(x+(i%3)*80+2,y+7+30*(i/3),80,30,(u8*)kbd_tbl[i],16,0);       
  145.                 else
  146.                         Show_Str_Mid(x+(i%3)*80,y+7+30*(i/3),(u8*)kbd_tbl[i],16,80);
  147.         }
  148. }
  149. //按键状态设置
  150. //x,y:键盘坐标
  151. //key:键值(0~14)
  152. //sta:状态,0,松开;1,按下;
  153. void AS608_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
  154. {                  
  155.         u16 i=keyx/3,j=keyx%3;
  156.         if(keyx>16)return;
  157.         if(sta &&keyx!=1)//按键表第2个‘:’不需要清除
  158.                 LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,GREEN);
  159.         else if(keyx!=1)
  160.                 LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,WHITE);
  161.         if(keyx!=1)//不是‘:’
  162.                 Show_Str_Mid(x+j*80,y+7+30*i,(u8*)kbd_tbl[keyx],16,80);       
  163. }
  164. //得到触摸屏的输入
  165. //x,y:键盘坐标
  166. //返回值:(1~15,对应按键表)
  167. u8 AS608_get_keynum(u16 x,u16 y)
  168. {
  169.         u16 i,j;
  170.         static u8 key_x=0;//0,没有任何按键按下
  171.         u8 key=0;
  172.         tp_dev.scan(0);                  
  173.         if(tp_dev.sta&TP_PRES_DOWN)//触摸屏被按下
  174.         {       
  175.                 for(i=0;i<5;i++)
  176.                 {
  177.                         for(j=0;j<3;j++)
  178.                         {
  179.                                  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))
  180.                                 {       
  181.                                         key=i*3+j+1;         
  182.                                         break;                           
  183.                                 }
  184.                         }
  185.                         if(key)
  186.                         {          
  187.                                 if(key_x==key)key=0;
  188.                                 else
  189.                                 {
  190.                                         AS608_key_staset(x,y,key_x-1,0);
  191.                                         key_x=key;
  192.                                         AS608_key_staset(x,y,key_x-1,1);
  193.                                 }
  194.                                 break;
  195.                         }
  196.           }  
  197.         }else if(key_x)
  198.         {
  199.                 AS608_key_staset(x,y,key_x-1,0);
  200.                 key_x=0;
  201.         }
  202.         return key;
  203. }
  204. //获取键盘数值
  205. u16 GET_NUM(void)
  206. {
  207.         u8  key_num=0;
  208.         u16 num=0;
  209.         while(1)
  210.         {
  211.                 key_num=AS608_get_keynum(0,170);       
  212.                 if(key_num)
  213.                 {
  214.                         if(key_num==1)return 0xFFFF;//‘返回’键
  215.                         if(key_num==3)return 0xFF00;//               
  216.                         if(key_num>3&&key_num<13&&num<99)//‘1-9’键(限制输入3位数)
  217.                                 num =num*10+key_num-3;               
  218.                         if(key_num==13)num =num/10;//‘Del’键                       
  219.                         if(key_num==14&&num<99)num =num*10;//‘0’键
  220.                         if(key_num==15)return num;  //‘Enter’键
  221.                 }
  222.                 LCD_ShowNum(80+15,170+7,num,6,16);
  223.         }       
  224. }
  225. //显示确认码错误信息
  226. void ShowErrMessage(u8 ensure)
  227. {
  228.         LCD_Fill(0,120,lcddev.width,160,WHITE);
  229.         Show_Str_Mid(0,120,(u8*)EnsureMessage(ensure),16,240);
  230. }
  231. //录指纹
  232. void Add_FR(void)
  233. {
  234.         u8 i,ensure ,processnum=0;
  235.         u16 ID;
  236.         while(1)
  237.         {
  238.                 switch (processnum)
  239.                 {
  240.                         case 0:
  241.                                 i++;
  242.                                 LCD_Fill(0,100,lcddev.width,160,WHITE);
  243.                                 Show_Str_Mid(0,100,"请按指纹",16,240);
  244.                                 ensure=PS_GetImage();
  245.                                 if(ensure==0x00)
  246.                                 {
  247.                                         BEEP=1;
  248.                                         ensure=PS_GenChar(CharBuffer1);//生成特征
  249.                                         BEEP=0;
  250.                                         if(ensure==0x00)
  251.                                         {
  252.                                                 LCD_Fill(0,120,lcddev.width,160,WHITE);
  253.                                                 Show_Str_Mid(0,120,"指纹正常",16,240);
  254.                                                 i=0;
  255.                                                 processnum=1;//跳到第二步                                               
  256.                                         }else ShowErrMessage(ensure);                               
  257.                                 }else ShowErrMessage(ensure);                                               
  258.                                 break;
  259.                        
  260.                         case 1:
  261.                                 i++;
  262.                                 LCD_Fill(0,100,lcddev.width,160,WHITE);
  263.                                 Show_Str_Mid(0,100,"请按再按一次指纹",16,240);
  264.                                 ensure=PS_GetImage();
  265.                                 if(ensure==0x00)
  266.                                 {
  267.                                         BEEP=1;
  268.                                         ensure=PS_GenChar(CharBuffer2);//生成特征
  269.                                         BEEP=0;
  270.                                         if(ensure==0x00)
  271.                                         {
  272.                                                 LCD_Fill(0,120,lcddev.width,160,WHITE);
  273.                                                 Show_Str_Mid(0,120,"指纹正常",16,240);
  274.                                                 i=0;
  275.                                                 processnum=2;//跳到第三步
  276.                                         }else ShowErrMessage(ensure);       
  277.                                 }else ShowErrMessage(ensure);               
  278.                                 break;

  279.                         case 2:
  280.                                 LCD_Fill(0,100,lcddev.width,160,WHITE);
  281.                                 Show_Str_Mid(0,100,"对比两次指纹",16,240);
  282.                                 ensure=PS_Match();
  283.                                 if(ensure==0x00)
  284.                                 {
  285.                                         LCD_Fill(0,120,lcddev.width,160,WHITE);
  286.                                         Show_Str_Mid(0,120,"对比成功,两次指纹一样",16,240);
  287.                                         processnum=3;//跳到第四步
  288.                                 }
  289.                                 else
  290.                                 {
  291.                                         LCD_Fill(0,100,lcddev.width,160,WHITE);
  292.                                         Show_Str_Mid(0,100,"对比失败,请重新录入指纹",16,240);
  293.                                         ShowErrMessage(ensure);
  294.                                         i=0;
  295.                                         processnum=0;//跳回第一步               
  296.                                 }
  297.                                 delay_ms(1200);
  298.                                 break;

  299.                         case 3:
  300.                                 LCD_Fill(0,100,lcddev.width,160,WHITE);
  301.                                 Show_Str_Mid(0,100,"生成指纹模板",16,240);
  302.                                 ensure=PS_RegModel();
  303.                                 if(ensure==0x00)
  304.                                 {
  305.                                         LCD_Fill(0,120,lcddev.width,160,WHITE);
  306.                                         Show_Str_Mid(0,120,"生成指纹模板成功",16,240);
  307.                                         processnum=4;//跳到第五步
  308.                                 }else {processnum=0;ShowErrMessage(ensure);}
  309.                                 delay_ms(1200);
  310.                                 break;
  311.                                
  312.                         case 4:       
  313.                                 LCD_Fill(0,100,lcddev.width,160,WHITE);
  314.                                 Show_Str_Mid(0,100,"请输入储存ID,按Enter保存",16,240);
  315.                                 Show_Str_Mid(0,120,"0=< ID <=299",16,240);
  316.                                 do
  317.                                         ID=GET_NUM();
  318.                                 while(!(ID<AS608Para.PS_max));//输入ID必须小于指纹容量的最大值
  319.                                 ensure=PS_StoreChar(CharBuffer2,ID);//储存模板
  320.                                 if(ensure==0x00)
  321.                                 {                       
  322.                                         LCD_Fill(0,100,lcddev.width,160,WHITE);                                       
  323.                                         Show_Str_Mid(0,120,"录入指纹成功",16,240);
  324.                                         PS_ValidTempleteNum(&ValidN);//读库指纹个数
  325.                                         LCD_ShowNum(56,80,AS608Para.PS_max-ValidN,3,16);
  326.                                         delay_ms(1500);
  327.                                         LCD_Fill(0,100,240,160,WHITE);
  328.                                         return ;
  329.                                 }else {processnum=0;ShowErrMessage(ensure);}                                       
  330.                                 break;                               
  331.                 }
  332.                 delay_ms(400);
  333.                 if(i==5)//超过5次没有按手指则退出
  334.                 {
  335.                         LCD_Fill(0,100,lcddev.width,160,WHITE);
  336.                         break;       
  337.                 }                               
  338.         }
  339. }

  340. //刷指纹
  341. void press_FR(void)
  342. {
  343.         SearchResult seach;
  344.         u8 ensure;
  345.         char *str;
  346.         ensure=PS_GetImage();
  347.         if(ensure==0x00)//获取图像成功
  348.         {       
  349.                 BEEP=1;//打开蜂鸣器       
  350.                 ensure=PS_GenChar(CharBuffer1);
  351.                 if(ensure==0x00) //生成特征成功
  352.                 {               
  353.                         BEEP=0;//关闭蜂鸣器       
  354.                         ensure=PS_HighSpeedSearch(CharBuffer1,0,AS608Para.PS_max,&seach);
  355.                         if(ensure==0x00)//搜索成功
  356.                         {                               
  357.                                 LCD_Fill(0,100,lcddev.width,160,WHITE);
  358.                                 Show_Str_Mid(0,100,"刷指纹成功",16,240);                               
  359.                                 str=mymalloc(SRAMIN,50);
  360.                                 sprintf(str,"确有此人,ID:%d  匹配得分:%d",seach.pageID,seach.mathscore);
  361.                                 Show_Str_Mid(0,140,(u8*)str,16,240);
  362.                                 myfree(SRAMIN,str);
  363.                         }
  364.                         else
  365.                                 ShowErrMessage(ensure);                                       
  366.           }
  367.                 else
  368.                         ShowErrMessage(ensure);
  369.          BEEP=0;//关闭蜂鸣器
  370.          delay_ms(600);
  371.          LCD_Fill(0,100,lcddev.width,160,WHITE);
  372.         }
  373.                
  374. }

  375. //删除指纹
  376. void Del_FR(void)
  377. {
  378.         u8  ensure;
  379.         u16 num;
  380.         LCD_Fill(0,100,lcddev.width,160,WHITE);
  381.         Show_Str_Mid(0,100,"删除指纹",16,240);
  382.         Show_Str_Mid(0,120,"请输入指纹ID按Enter发送",16,240);
  383.         Show_Str_Mid(0,140,"0=< ID <=299",16,240);
  384.         delay_ms(50);
  385.         AS608_load_keyboard(0,170,(u8**)kbd_delFR);
  386.         num=GET_NUM();//获取返回的数值
  387.         if(num==0xFFFF)
  388.                 goto MENU ; //返回主页面
  389.         else if(num==0xFF00)
  390.                 ensure=PS_Empty();//清空指纹库
  391.         else
  392.                 ensure=PS_DeletChar(num,1);//删除单个指纹
  393.         if(ensure==0)
  394.         {
  395.                 LCD_Fill(0,120,lcddev.width,160,WHITE);
  396.                 Show_Str_Mid(0,140,"删除指纹成功",16,240);               
  397.         }
  398.   else
  399.                 ShowErrMessage(ensure);       
  400.         delay_ms(1200);
  401.         PS_ValidTempleteNum(&ValidN);//读库指纹个数
  402.         LCD_ShowNum(56,80,AS608Para.PS_max-ValidN,3,16);
  403. MENU:       
  404.         LCD_Fill(0,100,lcddev.width,160,WHITE);
  405.         delay_ms(50);
  406.         AS608_load_keyboard(0,170,(u8**)kbd_menu);
  407. }
复制代码

所有资料51hei提供下载:
AS608-2.0.rar (1.67 MB, 下载次数: 82)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:429262 发表于 2018-11-19 16:32 | 显示全部楼层
这个指纹识别好用吗/?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表