久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5018|回復: 2
打印 上一主題 下一主題
收起左側

51單片機的AS608指紋鎖源程序

  [復制鏈接]
跳轉到指定樓層
樓主
AS608 指紋識別模塊主要是指采用了杭州晟元芯片技術有限公司(Synochip)的 AS608 指紋識別芯片 而做成的指紋模塊,模塊廠商只是基于該芯片設計外圍電路,集成一個可供2次開發的指紋模塊;所以,只要是基于AS608芯片的指紋模塊,其控制電路及控制協議幾乎是一樣的,只是廠家和性能不同而已。      

制作出來的實物圖如下:


單片機源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define MAIN_Fosc 11059200//宏定義主時鐘頻率
  4. #define LINE1         0x80                        //1602屏地址定義 第一行地址
  5. #define LINE2         0xc0                        //1602屏地址定義 第二行地址
  6. #define DataPort P0          //LCD1602操作位定義

  7. typedef unsigned char INT8U;
  8. typedef unsigned char uchar;
  9. typedef unsigned int INT16U;
  10. typedef unsigned int uint;

  11. sbit EN = P3^4;     //讀寫數據使能   0:停止 1:啟動
  12. sbit RS = P3^5;     //寄存器選擇 0:指令寄存器 1:數據寄存器
  13. sbit RW = P3^6;     //讀寫控制 0:寫  1:讀
  14. sbit KEY_DOWN=P2^4;
  15. sbit KEY_OK=P2^2;
  16. sbit KEY_CANCEL=P2^0;
  17. sbit beep=P2^6;

  18. uchar flag=0;
  19. extern char local_date=0;  //全局變量,當前箭頭位置
  20. extern unsigned int finger_id = 0;

  21. //uart 函數
  22. void Uart_Init(void)
  23. {
  24.     SCON=0x50;   //UART方式1:8位UART;   REN=1:允許接收
  25.     PCON=0x00;   //SMOD=0:波特率不加倍
  26.     TMOD=0x20;   //T1方式2,用于UART波特率
  27.     TH1=0xFD;
  28.     TL1=0xFD;   //UART波特率設置:FDFD,9600;FFFF,57600
  29.     TR1=1;         //允許T1計數
  30.     EA=1;         //開總中斷
  31. }

  32. void Uart_Send_Byte(unsigned char c)//UART Send a byte
  33. {
  34.         SBUF = c;
  35.         while(!TI);                //發送完為1
  36.         TI = 0;
  37. }

  38. unsigned char Uart_Receive_Byte()//UART Receive a byteg
  39. {        
  40.         unsigned char dat;
  41.         while(!RI);         //接收完為1
  42.         RI = 0;
  43.         dat = SBUF;
  44.         return (dat);
  45. }
  46. //延時函數
  47. void Delay_us(int i)
  48. {
  49.         while(--i);
  50. }

  51. void Delay_ms(INT16U ms)
  52. {
  53.      INT16U i;
  54.          do{
  55.               i = MAIN_Fosc / 96000;
  56.                   while(--i);   //96T per loop
  57.      }while(--ms);
  58. }

  59. //蜂鳴器函數
  60. void Beep_Times(unsigned char times)
  61. {
  62.         unsigned char i=0;
  63.         for(i=0;i<times;i++)
  64.         {
  65.                  beep=0;
  66.                  Delay_ms(200);
  67.                  beep=1;
  68.                  Delay_ms(200);
  69.         }
  70. }

  71. //按鍵操作函數
  72. void Key_Init(void)
  73. {
  74.     //定義按鍵輸入端口
  75.         KEY_DOWN=1;                // 下一項
  76.         KEY_OK=1;                // 確認
  77.         KEY_CANCEL=1;        // 取消
  78. }

  79. // 1602液晶函數
  80. //寫指令
  81. void LCD1602_WriteCMD(unsigned char cmd)  
  82. {
  83.           EN=0;
  84.           RS=0;
  85.           RW=0;
  86.           Delay_us(10);
  87.           EN=1;
  88.           Delay_us(10);
  89.           DataPort=cmd;
  90.           Delay_us(10);
  91.           EN=0;
  92. }
  93. //寫數據
  94. void LCD1602_WriteDAT(unsigned char dat)
  95. {
  96.           EN=0;
  97.           RS=1;
  98.           RW=0;
  99.           Delay_us(10);
  100.           EN=1;
  101.           Delay_us(10);
  102.           DataPort=dat;
  103.           Delay_us(10);
  104.           EN=0;
  105. }
  106. //液晶繁忙檢測
  107. void LCD1602_CheckBusy(void)
  108. {
  109.         
  110.         uchar busy;
  111.         DataPort=0xff;
  112.         RS=0;
  113.         RW=1;
  114.         do
  115.         {
  116.                 EN=1;
  117.                 busy=DataPort;
  118.                 EN=0;
  119.         }while(busy&0x80);
  120.         
  121. }
  122. //液晶初始化函數
  123. void LCD1602_Init(void)  
  124. {
  125.         Delay_ms(15);                      //上電延時15ms
  126.           LCD1602_WriteCMD(0x38); //寫顯示指令(不檢測忙信號)
  127.           Delay_ms(5);
  128.           LCD1602_CheckBusy();
  129.           LCD1602_WriteCMD(0x38); //寫顯示指令
  130.           LCD1602_CheckBusy();
  131.           LCD1602_WriteCMD(0x01); //清屏
  132.           LCD1602_CheckBusy();
  133.           LCD1602_WriteCMD(0x06); //顯示光標移動設置
  134.           LCD1602_CheckBusy();
  135.           LCD1602_WriteCMD(0x0c); //顯示開及光標設置  
  136. }

  137. //液晶顯示函數                入口參數:addr起始地址,pointer指針地址,index下標,num個數
  138. void LCD1602_Display(unsigned char addr,unsigned char* pointer,unsigned char index,unsigned char num)
  139. {
  140.           unsigned char i;
  141.           LCD1602_CheckBusy();        //判斷忙信號
  142.           LCD1602_WriteCMD(addr);        //寫入地址
  143.           for(i=0;i<num;i++)                //寫入數據
  144.           {
  145.              LCD1602_CheckBusy();                           //判斷忙信號
  146.              LCD1602_WriteDAT(pointer[index+i]);//寫入數據     
  147.           }
  148. }

  149. //AS608指紋模塊
  150. volatile unsigned char AS608_RECEICE_BUFFER[32]; //volatile:系統總是重新從它所在的內存讀取數據,即使它前面的指令剛剛從該處讀取過數據

  151. //FINGERPRINT通信協議定義
  152. code unsigned char AS608_Get_Device[10] ={0x01,0x00,0x07,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};//口令驗證
  153. code unsigned char AS608_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};  //協議包頭
  154. code unsigned char AS608_Get_Img[6] = {0x01,0x00,0x03,0x01,0x00,0x05};    //獲得指紋圖像
  155. code unsigned char AS608_Get_Templete_Count[6] ={0x01,0x00,0x03,0x1D,0x00,0x21 }; //獲得模版總數
  156. code unsigned char AS608_Search[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x03,0xE7,0x00,0xF8}; //搜索指紋搜索范圍0 - 999,使用BUFFER1中的特征碼搜索
  157. code unsigned char AS608_Search_0_9[11]={0x01,0x00,0x08,0x04,0x01,0x00,0x00,0x00,0x13,0x00,0x21}; //搜索0-9號指紋
  158. code unsigned char AS608_Img_To_Buffer1[7]={0x01,0x00,0x04,0x02,0x01,0x00,0x08}; //將圖像放入到BUFFER1
  159. code unsigned char AS608_Img_To_Buffer2[7]={0x01,0x00,0x04,0x02,0x02,0x00,0x09}; //將圖像放入到BUFFER2
  160. code unsigned char AS608_Reg_Model[6]={0x01,0x00,0x03,0x05,0x00,0x09}; //將BUFFER1跟BUFFER2合成特征模版
  161. code unsigned char AS608_Delete_All_Model[6]={0x01,0x00,0x03,0x0d,0x00,0x11};//刪除指紋模塊里所有的模版
  162. volatile unsigned char  AS608_Save_Finger[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};//將BUFFER1中的特征碼存放到指定的位置
  163. //code unsigned char AS608_num_of_finger_in_lib1[7]={0x01,0x00,0x04,0x1F,0x00,0x00,0x24};//查看指紋庫的命令
  164. //code unsigned char AS608_num_of_finger_in_lib2[7]={0x01,0x00,0x04,0x1F,0x01,0x00,0x25};
  165. //code unsigned char AS608_num_of_finger_in_lib3[7]={0x01,0x00,0x04,0x1F,0x02,0x00,0x26};
  166. //code unsigned char AS608_num_of_finger_in_lib4[7]={0x01,0x00,0x04,0x1F,0x03,0x00,0x27};

  167. //發送包頭
  168. void AS608_Cmd_Send_Pack_Head(void)
  169. {
  170.         int i;        
  171.         for(i=0;i<6;i++) //包頭
  172.         {
  173.                 Uart_Send_Byte(AS608_Pack_Head[i]);   
  174.         }               
  175. }

  176. //發送指令
  177. void AS608_Cmd_Check(void)
  178. {
  179.         int i=0;
  180.         AS608_Cmd_Send_Pack_Head(); //發送通信協議包頭
  181.         for(i=0;i<10;i++)
  182.         {               
  183.                 Uart_Send_Byte(AS608_Get_Device[i]);
  184.         }
  185. }

  186. //接收反饋數據緩沖
  187. void AS608_Receive_Data(unsigned char ucLength)
  188. {
  189.         unsigned char i;                                 
  190.         for (i=0;i<ucLength;i++)
  191.                 AS608_RECEICE_BUFFER[i] = Uart_Receive_Byte();
  192. }

  193. //FINGERPRINT_獲得指紋圖像命令
  194. void AS608_Cmd_Get_Img(void)
  195. {
  196.     unsigned char i;
  197.     AS608_Cmd_Send_Pack_Head(); //發送通信協議包頭
  198.     for(i=0;i<6;i++) //發送命令 0x1d
  199.         {
  200.        Uart_Send_Byte(AS608_Get_Img[i]);
  201.         }
  202. }

  203. //將圖像轉換成特征碼存放在Buffer1中
  204. void FINGERPRINT_Cmd_Img_To_Buffer1(void)
  205. {
  206.          unsigned char i;
  207.         AS608_Cmd_Send_Pack_Head(); //發送通信協議包頭      
  208.            for(i=0;i<7;i++)   //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
  209.         {
  210.                 Uart_Send_Byte(AS608_Img_To_Buffer1[i]);
  211.         }
  212. }
  213. //將圖像轉換成特征碼存放在Buffer2中
  214. void FINGERPRINT_Cmd_Img_To_Buffer2(void)
  215. {
  216.         unsigned char i;
  217.         AS608_Cmd_Send_Pack_Head(); //發送通信協議包頭
  218.         for(i=0;i<7;i++)   //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
  219.         {
  220.                 Uart_Send_Byte(AS608_Img_To_Buffer2[i]);
  221.         }
  222. }

  223. //搜索全部用戶999枚
  224. void AS608_Cmd_Search_Finger(void)
  225. {
  226.         unsigned char i;                       
  227.         AS608_Cmd_Send_Pack_Head(); //發送通信協議包頭
  228.         for(i=0;i<11;i++)
  229.         {
  230.                 Uart_Send_Byte(AS608_Search[i]);   
  231.         }
  232. }

  233. //轉換成特征碼
  234. void AS608_Cmd_Reg_Model(void)
  235. {
  236.         unsigned char i;                              
  237.         AS608_Cmd_Send_Pack_Head(); //發送通信協議包頭
  238.         for(i=0;i<6;i++)
  239.         {
  240.                 Uart_Send_Byte(AS608_Reg_Model[i]);   
  241.         }
  242. }

  243. //刪除指紋模塊里的所有指紋模版
  244. void FINGERPRINT_Cmd_Delete_All_Model(void)
  245. {
  246.         unsigned char i;   
  247.     AS608_Cmd_Send_Pack_Head(); //發送通信協議包頭   
  248.     for(i=0;i<6;i++) //命令刪除指紋模版
  249.         {
  250.               Uart_Send_Byte(AS608_Delete_All_Model[i]);   
  251.         }        
  252. }

  253. //保存指紋
  254. void AS608_Cmd_Save_Finger( unsigned int storeID )
  255. {
  256.         unsigned long temp = 0;
  257.         unsigned char i;
  258.         AS608_Save_Finger[5] =(storeID&0xFF00)>>8;
  259.         AS608_Save_Finger[6] = (storeID&0x00FF);
  260.         for(i=0;i<7;i++)   //計算校驗和
  261.                 temp = temp + AS608_Save_Finger[i];
  262.         AS608_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校驗數據
  263.         AS608_Save_Finger[8]= temp & 0x0000FF;                  
  264.         AS608_Cmd_Send_Pack_Head(); //發送通信協議包頭        
  265.         for(i=0;i<9;i++)  
  266.                 Uart_Send_Byte(AS608_Save_Finger[i]);      //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
  267. }

  268. //查看當前指紋庫中指紋模板數
  269. int AS608_number_of_fingers()
  270. {
  271.          int num=1;//默認模板庫中有一個模板
  272.         uchar i=0;
  273.         AS608_Cmd_Send_Pack_Head(); //發送通信協議包頭
  274.         for(i=0;i<6;i++)
  275.         {
  276.                   Uart_Send_Byte(AS608_Get_Templete_Count[i]);
  277.         }
  278.         AS608_RECEICE_BUFFER[9]=1;//方便后續判斷是否接收成功
  279.         AS608_Receive_Data(14);//接收數據
  280.         if(AS608_RECEICE_BUFFER[9]==0) //接收成功
  281.         {
  282.                  num=AS608_RECEICE_BUFFER[10]*256+AS608_RECEICE_BUFFER[11];//拼接模板總個數                        
  283.         }
  284.         return num;
  285. }
  286. //另一種方法查看指紋庫中是否有模板 //本來應該查看所有1000個模板位置是否存在模板,但一般只用得到前256個,故從簡
  287. /*
  288. uchar AS608_notEmpty()
  289. {
  290.          uchar exist=0;
  291.         char i=0;
  292.         AS608_Cmd_Send_Pack_Head(); //發送通信協議包頭
  293.         for(i=0;i<7;i++)
  294.         {
  295.                   Uart_Send_Byte(AS608_num_of_finger_in_lib1[i]);
  296.         }
  297.         AS608_Receive_Data(10);//接收前10byte數據,除第10字節的確認碼外,其余全部丟棄
  298.         if(AS608_RECEICE_BUFFER[9]==0) //接收成功
  299.         {
  300.         AS608_Receive_Data(32);//接收后續32byte數據,此即0~255個模板為是否存在指紋模板的數據
  301.         for(i=0;i<32;i++)//查看這32byte數據,任何一個位置存在模板則返回值為真,否則為假
  302.         {
  303.                  if(AS608_RECEICE_BUFFER[i])
  304.                         exist=1;
  305.         }
  306.         return exist;
  307.         }
  308. }
  309. */
  310. //添加指紋
  311. void AS608_Add_Fingerprint()
  312. {
  313.         unsigned char id_show[]={0,0,0};
  314.         LCD1602_WriteCMD(0x01); //清屏  
  315.         while(1)
  316.         {
  317.                 LCD1602_Display(0x80,"   Add  finger  ",0,16);
  318.                 LCD1602_Display(0xc0,"    ID is       ",0,16);
  319.                 //按返回鍵直接回到主菜單
  320.                 if(KEY_CANCEL == 0)
  321.                 {
  322.                          Delay_ms(5);
  323.                          if(KEY_CANCEL == 0)
  324.                          {
  325.                                  while(KEY_CANCEL==0);
  326.                                  break;
  327.                          }         
  328.                 }

  329.                 //按切換鍵指紋iD值加1
  330.                 if(KEY_DOWN == 0)
  331.                 {
  332.                         Delay_ms(5);
  333.                         if(KEY_DOWN == 0)
  334.                         {
  335.                                 while(KEY_DOWN==0);
  336.                                 if(finger_id == 1000)
  337.                                 {
  338.                                         finger_id = 1;
  339.                                 }
  340.                                 else
  341.                                         finger_id = finger_id + 1;
  342.                         }               
  343.                 }

  344.                  //指紋iD值顯示處理
  345.                  LCD1602_WriteCMD(0xc0+10);
  346.                  LCD1602_WriteDAT(finger_id/100+48);
  347.                 LCD1602_WriteDAT(finger_id%100/10+48);
  348.                  LCD1602_WriteDAT(finger_id%100%10+48);

  349.                  //按確認鍵開始錄入指紋信息                                          
  350.                  if(KEY_OK == 0)
  351.                  {
  352.                  Delay_ms(5);
  353.                  if(KEY_OK == 0)
  354.                   {        
  355.                                 while(KEY_OK==0);
  356.                                   LCD1602_Display(0x80," Please  finger ",0,16);
  357.                                   LCD1602_Display(0xc0,"                ",0,16);
  358.                                 while(KEY_CANCEL == 1)
  359.                                   {
  360.                                           //按下返回鍵退出錄入返回fingerID調整狀態   
  361.                                         if(KEY_CANCEL == 0)
  362.                                          {
  363.                                                   Delay_ms(5);
  364.                                                 if(KEY_CANCEL == 0)
  365.                                                 {
  366.                                                         while(KEY_CANCEL==0);
  367.                                                           break;
  368.                                                 }
  369.                                                 
  370.                                           }
  371.                                         AS608_Cmd_Get_Img(); //獲得指紋圖像
  372.                                         AS608_Receive_Data(12);
  373.                                         //判斷接收到的確認碼,等于0指紋獲取成功
  374.                                         if(AS608_RECEICE_BUFFER[9]==0)
  375.                                          {
  376.                                                 Delay_ms(100);
  377.                                                 FINGERPRINT_Cmd_Img_To_Buffer1();
  378.                                             AS608_Receive_Data(12);
  379.                                                 LCD1602_Display(0x80,"Successful entry",0,16);
  380.                                                 Beep_Times(1);
  381.                                                 Delay_ms(1000);
  382.                                                 LCD1602_Display(0x80," Please  finger ",0,16);
  383.                                                   LCD1602_Display(0xc0,"                ",0,16);
  384.                                                 while(1)
  385.                                                 {
  386.                                                         if(KEY_CANCEL == 0)
  387.                                                          {
  388.                                                                   Delay_ms(5);
  389.                                                                 if(KEY_CANCEL == 0)
  390.                                                                 {
  391.                                                                         while(KEY_CANCEL==0);
  392.                                                                           break;
  393.                                                                 }
  394.                                                           }
  395.                                                          AS608_Cmd_Get_Img(); //獲得指紋圖像
  396.                                                          AS608_Receive_Data(12);
  397.                                                         //判斷接收到的確認碼,等于0指紋獲取成功
  398.                                                         if(AS608_RECEICE_BUFFER[9]==0)
  399.                                                         {
  400.                                                         Delay_ms(200);
  401.                                                         LCD1602_Display(0x80,"Successful entry",0,16);
  402.                                                         LCD1602_Display(0xc0,"    ID is       ",0,16);
  403.                                                          //指紋iD值顯示處理
  404.                                                          LCD1602_WriteCMD(0xc0+10);
  405.                                                          LCD1602_WriteDAT(finger_id/100+48);
  406.                                                          LCD1602_WriteDAT(finger_id%100/10+48);
  407.                                                          LCD1602_WriteDAT(finger_id%100%10+48);
  408.                                                         FINGERPRINT_Cmd_Img_To_Buffer2();
  409.                                                           AS608_Receive_Data(12);
  410.                                                         AS608_Cmd_Reg_Model();//轉換成特征碼
  411.                                                  AS608_Receive_Data(12);
  412.                                                           AS608_Cmd_Save_Finger(finger_id);                                         
  413.                                                   AS608_Receive_Data(12);
  414.                                                         Beep_Times(1);
  415.                                                         Delay_ms(1000);
  416.                                                         finger_id=finger_id+1;
  417.                                                     break;
  418.                                                           }
  419.                                                    }
  420.                                                    break;
  421.                                         }
  422.                                 }
  423.                 }
  424.                 }
  425.         }
  426. }

  427. //搜索指紋
  428. void AS608_Find_Fingerprint()
  429. {
  430.         unsigned int find_fingerid = 0;
  431.         unsigned char id_show[]={0,0,0};
  432.         do
  433.         {
  434.                 LCD1602_Display(0x80," Please  finger ",0,16);
  435.                 LCD1602_Display(0xc0,"                ",0,16);
  436.                 AS608_Cmd_Get_Img(); //獲得指紋圖像
  437.                 AS608_Receive_Data(12);               
  438.                 //判斷接收到的確認碼,等于0指紋獲取成功
  439.                 if(AS608_RECEICE_BUFFER[9]==0)
  440.                 {                        
  441.                         Delay_ms(100);
  442.                         FINGERPRINT_Cmd_Img_To_Buffer1();
  443.                         AS608_Receive_Data(12);               
  444.                         AS608_Cmd_Search_Finger();
  445.                         AS608_Receive_Data(16);                        
  446.                         if(AS608_RECEICE_BUFFER[9] == 0) //搜索到  
  447.                         {
  448.                                 //解鎖成功//
  449.                                 
  450.                                 LCD1602_Display(0x80," Search success ",0,16);
  451.                                 LCD1602_Display(0xc0,"    ID is       ",0,16);
  452.                                 Beep_Times(1);                                       
  453.                                 //拼接指紋ID數
  454.                                 find_fingerid = AS608_RECEICE_BUFFER[10]*256 + AS608_RECEICE_BUFFER[11];                                       
  455.                                  //指紋iD值顯示處理
  456.                                  LCD1602_WriteCMD(0xc0+10);
  457.                                  LCD1602_WriteDAT(find_fingerid/100+48);
  458.                                  LCD1602_WriteDAT(find_fingerid%100/10+48);
  459.                                  LCD1602_WriteDAT(find_fingerid%100%10+48);
  460.                                 //配置IO口,執行開鎖操作
  461.                                 if(flag)
  462.                                 {
  463.                                 P1=0xfe;                                                
  464.                                 Delay_ms(3800);
  465.                                 P1=0xff;        //電動機停止轉動
  466.                                 Delay_ms(1000);
  467.                                 P1=0xfd;        //電動機反轉復位
  468.                                 Delay_ms(3600);//電機正轉阻力遠大于反轉,旋轉相同角度時,正轉需要更多時間        
  469.                                 P1=0xff;        //電動機停止轉動
  470.                                 }
  471.                                 flag=1;        //允許后續相關操作:添加或刪除指紋模板
  472.                                 break;                                                        
  473.                         }
  474.                         else //沒有找到
  475.                         {
  476.                                         LCD1602_Display(0x80," Search  failed ",0,16);
  477.                                         LCD1602_Display(0xc0,"                ",0,16);
  478.                                          Beep_Times(3);
  479.                         }
  480.                         }               
  481.                 }while(KEY_CANCEL == 1);
  482. }
  483. //刪除所有存貯的指紋庫
  484. void AS608_Delete_All_Fingerprint()
  485. {
  486.                 unsigned char i=0;
  487.                                 LCD1602_Display(0x80,"   empty all    ",0,16);
  488.                                 LCD1602_Display(0xc0,"   Yes or no ?  ",0,16);
  489.                 do
  490.                  {
  491.                         if(KEY_OK==0)
  492.                         {
  493.                         Delay_ms(5);
  494.                         if(KEY_OK==0)
  495.                         {
  496.                                 while(KEY_OK==0);
  497.                                 LCD1602_Display(0x80,"   emptying     ",0,16);
  498.                                 LCD1602_Display(0xc0,"                ",0,16);
  499.                                 Delay_ms(300);
  500.                                 LCD1602_WriteCMD(0xc0);
  501.                                 for(i=0;i<16;i++)
  502.                                  {
  503.                                         LCD1602_WriteDAT(42);// 即'*'
  504.                                         Delay_ms(100);
  505.                                  }
  506.                                 FINGERPRINT_Cmd_Delete_All_Model();
  507.                                   AS608_Receive_Data(12);
  508.                                 LCD1602_Display(0x80,"   All empty    ",0,16);
  509.                                 LCD1602_Display(0xc0,"                ",0,16);
  510.                                 Beep_Times(3);
  511.                                 break;
  512.                         }
  513.                         }
  514.                  }while(KEY_CANCEL==1);
  515. }

  516. void Device_Check(void)
  517. {
  518.                 unsigned char i=0;
  519.                 AS608_RECEICE_BUFFER[9]=1;                                           //串口數組第九位可判斷是否通信正常
  520.                 LCD1602_Display(0xc0,"Loading",0,7);                   //設備加載中界面                                                           
  521.                 for(i=0;i<8;i++)                                                           //進度條式更新,看起來美觀
  522.                 {
  523.                         LCD1602_WriteDAT(42);                               //42對應ASIC碼的 *
  524.                         Delay_ms(20);                                                           //控制進度條速度
  525.                 }                                                                        
  526.                 LCD1602_Display(0xc0,"Docking  failure",0,16);      //液晶先顯示對接失敗,如果指紋模塊插對的話會將其覆蓋        
  527.                 AS608_Cmd_Check();                                                                //單片機向指紋模塊發送校對命令
  528.                 AS608_Receive_Data(12);                                                        //將串口接收到的數據轉存
  529.                  if(AS608_RECEICE_BUFFER[9] == 0)                                        //判斷數據低第9位是否接收到0
  530.                 {
  531.                         LCD1602_Display(0xc0,"Docking  success",0,16);        //符合成功條件則顯示對接成功
  532.                 }
  533. }

  534. //主函數
  535. void main()
  536. {                                                        
  537.         finger_id=0;
  538.         LCD1602_Init();                        //初始化液晶
  539.         LCD1602_Display(0x80,"Fingerprint Test",0,16);         //液晶開機顯示界面
  540.           Uart_Init();                        //初始化串口
  541.         Key_Init();                                //初始化按鍵
  542.          Delay_ms(200);          //延時500MS,等待指紋模塊復位
  543.         Device_Check();                           //校對指紋模塊是否接入正確,液晶做出相應的提示
  544.         Delay_ms(1000);                        //對接成功界面停留一定時間
  545.         while(1)
  546.         {
  547.             
  548.                 /**************進入主功能界面****************/
  549.                 LCD1602_Display(0x80,"  search finger ",0,16);         //第一排顯示搜索指紋
  550.                 LCD1602_Display(0xc0,"  Add     delete",0,16);         //添加和刪除指紋
  551.                 if(local_date==0)
  552.                 {
  553.                         LCD1602_Display(0x80,  " *",0,2);
  554.                         LCD1602_Display(0xc0,  "  ",0,2);
  555.                         LCD1602_Display(0xc0+8,"  ",0,2);        
  556.                 }
  557.                 else if(local_date==1)
  558.                 {
  559.                         LCD1602_Display(0x80,  "  ",0,2);
  560.                         LCD1602_Display(0xc0,  " *",0,2);
  561.                         LCD1602_Display(0xc0+8,"  ",0,2);        
  562.                 }
  563.                 else if(local_date==2)
  564.                 {
  565.                         LCD1602_Display(0x80,  "  ",0,2);
  566.                         LCD1602_Display(0xc0,  "  ",0,2);
  567.                         LCD1602_Display(0xc0+8," *",0,2);        
  568.                 }                        
  569.                 //確認鍵
  570.                 if(KEY_OK == 0)
  571.                 {
  572.                 Delay_ms(5);
  573.                 if(KEY_OK == 0)
  574.                 {         
  575.                          while(KEY_OK == 0);//等待松開按鍵                                                               
  576.                         switch(local_date)
  577.                         {
  578.                                         case 0:  //搜索指紋        
  579.                                         flag=1;                                       
  580.                                         AS608_Find_Fingerprint();                                                                                                                                                                                                
  581.                                         break;        
  582.                                        
  583.                                         case 1:         //添加指紋
  584.                                         flag=1;        //flag=1,若指紋庫為空,則可以直接添加指紋                                
  585.                                         if(AS608_number_of_fingers())
  586.                                         {
  587.                                                 flag=0;//flag置0由兩重作用:
  588.                                                 //1、指紋庫中已有指紋,則需要搜索匹配成功,由AS608_Find_Fingerprint()將flag置1,才能添加指紋
  589.                                                 //2、flag=0,則在搜索指紋成功后不執行開鎖操作
  590.                                                 AS608_Find_Fingerprint();
  591.                                         }
  592.                                         if(flag)
  593.                                         {
  594.                                                 AS608_Add_Fingerprint();
  595.                                         }
  596.                                         break;                                         
  597.                                        
  598.                                         case 2:        //清空指紋
  599.                                         flag=0;        //1、在搜索指紋成功后不執行開鎖操作;2、若搜索不成功,不執行清空操作
  600.                                         AS608_Find_Fingerprint();//搜索匹配成功后,函數內部將flag置1,才能清空指紋庫
  601.                                         if(flag)
  602.                                         {
  603.                                                 AS608_Delete_All_Fingerprint();
  604.                                           }
  605.                                         break;
  606.                         }
  607.                 }
  608.                 }
  609.                     //切換鍵
  610.                         if(KEY_DOWN == 0)
  611.                         {
  612.                         Delay_ms(5);
  613.                         if(KEY_DOWN == 0)
  614.                         {
  615.                                  while(KEY_DOWN == 0); //等待松開按鍵                                
  616.                                    if(local_date<=2)
  617.                                 {
  618.                                         local_date++;
  619.                                         if(local_date==3) local_date=0;                                                
  620.                                 }               
  621.                         }
  622.                         }                                                
  623.                         Delay_ms(100); //延時判斷100MS檢測一次               
  624.         }
  625. }
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:968021 發表于 2023-2-20 23:36 | 只看該作者
實測有用
回復

使用道具 舉報

板凳
ID:433219 發表于 2023-12-6 15:06 | 只看該作者
指紋打卡,,,
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品欧美精品 | 黄在线免费观看 | 中文字幕在线观看一区 | 91av大全 | 亚洲精品视频在线 | 国产美女免费视频 | 日韩欧美不卡 | 久草青青草 | 黄视频免费 | 黄片毛片 | 久草在线 | 亚洲天堂久久新 | 日韩成人精品在线 | 国产999精品久久久 午夜天堂精品久久久久 | 日韩免费一二三区 | 欧美精品久久久久 | 日韩三级免费网站 | pacopacomama在线 | 亚洲狠狠爱一区二区三区 | 黄色网络在线观看 | 日日摸天天添天天添破 | 久久伊| h视频在线观看免费 | 国产精品久久久久久久久久免费看 | 日本中文字幕日韩精品免费 | 91精品一区| 精品日韩在线 | 成人av网站在线观看 | 日日干日日 | 久久伊人在 | 色综合一区二区 | 天天综合久久 | 在线免费看黄 | 国产精品成人在线播放 | 日本一本视频 | 91精品国产777在线观看 | www.日韩在线 | 亚洲一区二区视频在线播放 | 日韩在线综合 | 韩国电影久久 | 国产激情精品视频 |