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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于STC單片機的AS608指紋密碼鎖設計

  [復制鏈接]
跳轉到指定樓層
樓主
基于STC的指紋密碼鎖 采用0.96寸oled屏(SPI)、AS608指紋模塊、 4*4矩陣鍵盤、并且有DS1302時間顯示。
因為初學單片機和c語言程序有許多地方是根據范例程序更改,寫的有點亂,不過是可以使用,現已經在社團的門上正常運行一段時間(寫的不好高手勿噴)。程序已及原理圖都已打包壓縮(編程用的是 keil 5,電路圖是用的ad2004)

電路原理圖如下:


單片機源程序如下:
  1. #include <STC12C5A60S2.h>
  2. #include <setjmp.h>
  3. #include "ZK.h"
  4. #include "oled.h"          //包含液晶函數
  5. #include "eeprom.h"
  6. #include "AS608.h"  
  7. #include <intrins.h>
  8. #include <DS1302.h>
  9. #define uchar unsigned char
  10. #define uint unsigned int         //宏定義
  11. #define GPIO_KEY P2
  12. #define GLY      10                //管理員
  13. #define ST_up    11                //上調
  14. #define XT_down  12                //下調
  15. #define Sign_out 13                //退出
  16. #define Delete   15                //刪除
  17. #define Confirm  14                //確認
  18. #define User 1                        //用戶                                                                                               
  19. sbit Beep = P1^0;
  20. sbit Lock = P1^1;
  21. sbit FingerPrint_KEY=P3^7;
  22. bit          GLY_use = 0;        //管理員使能位 :0、關閉管理員,1、開啟管理員
  23. bit           GLY_dj =  1;        //管理員凍結密碼使能位:0、凍結密碼,1、關閉凍結
  24. bit                 init_complete=0;//初始化完成標志:0、初始化未完成,1、允許執行程序
  25. bit     GLY_Password_ok = 0;//管理員密碼輸入好標志:0、密碼未輸好,1、密碼已經輸好
  26. bit     Password_ok = 0;//密碼輸入好標志:0、密碼未輸好,1、密碼已經輸好
  27. bit     Password_rd = 0;
  28. bit     ZW_GLY = 0;
  29. bit     CLose_OLED = 0;
  30. uchar  code  AT_password[6] = {0,1,0,8,2,9};                                                //管理員密碼           020403
  31. uchar  code  PW_BUFFER[6]   = {0,2,0,4,0,3};                                                //用戶密碼
  32. uchar  xdata  User_Password[16]   = {0};                //用戶密碼緩存
  33. uchar  xdata   GLY_Password[16] = {0};                //管理員密碼緩存
  34. uchar  xdata T0RH = 0;  //T0重載值的高字節
  35. uchar  xdata T0RL = 0;  //T0重載值的低字節
  36. uchar code KEY_switch[16]={0xeb,0x77,0x7b,0x7d,0xb7,0xbb,0xbd,0xd7,0xdb,0xdd,0x7e,0xbe,0xde,0xee,0xed,0xe7};//0-15
  37. jmp_buf JMP_BUF;
  38. struct sTime CurTime;    //當前日期時間
  39. long OLED_num = 0;
  40. volatile unsigned char  xdata AS608_Buff[32];
  41. void  GLY_Menu();
  42. void RefreshTime();
  43. void RefreshDate(uchar ops);
  44. void Beep_10ms();
  45. //void soft_reset(void)
  46. //{
  47. //   ((void (code *) (void)) 0x3745)();
  48. //}
  49. void JMP()
  50. {
  51.         if(setjmp(JMP_BUF)!=0) OLED_Clear();
  52. }
  53. void OPen_T0()
  54. {
  55.         TR0 = 1;               //啟動T0
  56.         ET0 = 1;        //使能T0中斷       
  57. }
  58. void Close_T0()
  59. {
  60.         TR0 = 0;               //啟動T0
  61.         ET0 = 0;        //使能T0中斷       
  62. }
  63. void CLOSE_OLED_TEST()
  64. {
  65.          if(CLose_OLED)
  66.         {
  67.                 CLose_OLED=0;
  68.                 longjmp (JMP_BUF, 1);
  69. //                soft_reset();
  70.         }
  71. }
  72. uchar code  LedChar[]={
  73.         0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, //定義八個燈的工作狀態。
  74.         0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  75.         };
  76. void delay(uint xdata t);
  77. uchar keyscan()        //帶返回值的子函數
  78. {
  79.                 uchar Key_H,Key_L,Key_Vaul,i;
  80.         GPIO_KEY = 0xf0;//1111 0000
  81.         if( (GPIO_KEY & 0xf0) != 0xf0)//判斷是否有按鍵按下(按下就為與)
  82.         {
  83.                 delay(10);//軟件消抖
  84.                 if( (GPIO_KEY & 0xf0) != 0xf0)//再次判斷是否有按鍵按下
  85.                 {
  86.                           Key_L = GPIO_KEY & 0xf0;// 儲存列線值
  87.                           GPIO_KEY = Key_L | 0x0f;
  88.                           Key_H = GPIO_KEY & 0x0f;// 儲存行線值
  89.                                                   Key_Vaul=Key_H+Key_L;
  90.                                                   for(Key_H=0;Key_H<16;Key_H++)
  91.                                                   if(Key_Vaul==KEY_switch[Key_H])break;               
  92.                                                    Beep_10ms();       
  93.                           while( (GPIO_KEY & 0x0f) != 0x0f );//松手檢測
  94.                           return (Key_H);//返回鍵值碼
  95.                 }        
  96.         }      
  97. }
  98. uchar Uart_Receive_Byte()//接收一個字節
  99. {       
  100.         uchar xdata Byte;
  101.         while((!RI)&&(!CLose_OLED));         
  102.         RI = 0;
  103.         Byte = SBUF;
  104.         return (Byte);
  105. }
  106. void Uart_Receive_Date(uchar   length)        //接收緩存
  107. {
  108.    uchar xdata i;
  109.     for(i=0;i<length;i++)
  110.         {
  111.                
  112.                 AS608_Buff[i]=Uart_Receive_Byte();       

  113.         }
  114. }
  115. /* 配置并啟動T0*/
  116. void key_int(uint ms)
  117. {
  118. unsigned long tmp;  //臨時變量
  119.    
  120.     tmp = 11059200 / 12;      //定時器計數頻率
  121.     tmp = (tmp * ms) / 1000;  //計算所需的計數值
  122.     tmp = 65536 - tmp;        //計算定時器重載值
  123.     tmp = tmp + 18;           //補償中斷響應延時造成的誤差
  124.     T0RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節
  125.     T0RL = (unsigned char)tmp;
  126.     TMOD &= 0xF0;   //清零T0的控制位
  127.     TMOD |= 0x01;   //配置T0為模式1
  128.     TH0 = T0RH;     //加載T0重載值
  129.     TL0 = T0RL;
  130.     ET0 = 0;        //使能T0中斷
  131.     TR0 = 0;        //啟動T0
  132. }
  133. /* 串口配置函數,baud-通信波特率 */
  134. void UART_int(unsigned int baud)
  135. {
  136.     SCON  = 0x50;  //配置串口為模式1
  137.         PCON=0x00;   //SMOD=0:波特率不加倍
  138.     TMOD &= 0x0F;  //清零T1的控制位
  139.     TMOD |= 0x20;  //配置T1為模式2
  140.     TH1 = 256 - (11059200/12/32)/baud;  //計算T1重載值
  141.     TL1 = TH1;     //初值等于重載值
  142.         PT1 = 1;
  143.         IPH = 0X08;
  144.     ET1 = 0;       //禁止T1中斷
  145. //    ES  = 1;       //使能串口中斷
  146.     TR1 = 0;       //啟動T1
  147. }
  148. void delay(uint xdata t)//@12MHz
  149. {
  150.         uint xdata a,b,c;
  151.         for(a=t;a>0;a--)
  152.        
  153.         for(b=10;b>0;b--)
  154.        
  155.         for(c=95;c>0;c--);
  156. }
  157. void Open_ES()//打開串口
  158. {
  159.         TR1 = 1;       //啟動T1
  160. //        TR0=0;
  161. //        ET0=0;
  162. }
  163. void Close_ES()//關閉串口
  164. {
  165.         TR1 = 0;       //禁止T1
  166. //        TR0=1;
  167. //        ET0=1;
  168. }
  169. void Beep_10ms()
  170. {
  171.         Beep=0;
  172.         delay(50);
  173.         Beep=1;
  174. }
  175. /*添加指紋*/
  176. void Add_Fingerprint()
  177. {
  178.         uchar data ID[2],i;
  179.         uchar data finger_id;
  180.         finger_id=byte_read(0x2400);         
  181.     Add:_nop_();
  182.         ZK_QSRZWH();
  183.         ZK_GLYMS();
  184.         while(1)
  185.         {

  186.                  //指紋iD值顯示處理
  187.          ID[0]=finger_id/100;       
  188.          ID[1]=finger_id%100/10;
  189.          ID[2]=finger_id%100%10;
  190.          OLED_Show_Number(30,5,ID,3,1);
  191.          if(CLose_OLED)
  192.          {
  193.                 CLose_OLED=0;
  194.                 longjmp (JMP_BUF, 1);
  195. //                soft_reset();
  196.          }
  197.          if(keyscan()==ST_up)//上調按鍵
  198.          {
  199.                   if(finger_id == 0xc8)finger_id = 0;                       
  200.                   else
  201.                   finger_id = finger_id + 1;
  202.          }       
  203.           if(keyscan()==XT_down)if(finger_id>0x00)finger_id = finger_id-1;//下調按鍵
  204.           if(keyscan()==Sign_out)break;        //退出
  205.           //按確認鍵開始錄入指紋信息
  206.           if(keyscan()==Confirm)                                //確認
  207.           {
  208.             Open_ES();
  209.                 ZK_QAYZW();
  210.                 ZK_GLYMS();
  211.                 while(1)
  212.                 {
  213.                    if(CLose_OLED)
  214.                    {
  215.                         CLose_OLED=0;
  216.                         longjmp (JMP_BUF, 1);
  217.         //                soft_reset();
  218.                         }
  219.                    if(keyscan()==Sign_out)break;        //退出
  220.                    AS608_Send_PS_GetImage(); //獲得指紋圖像
  221.                    Uart_Receive_Date(12);//判斷接收到的確認碼,等于0指紋獲取成功
  222.                    if(AS608_Buff[9]==0)
  223.                     {
  224.                                         AS608_Buff[9]=1;
  225.                                         delay(500);
  226.                                         AS608_GenChar(0x01);
  227.                                     Uart_Receive_Date(12);
  228.                                     ZK_QAYzZCZW();
  229.                                     ZK_GLYMS();
  230.                                         while(1)
  231.                                         {
  232.          
  233.                                         AS608_Send_PS_GetImage(); //獲得指紋圖像
  234.                                         Uart_Receive_Date(12);
  235.                                         //判斷接收到的確認碼,等于0指紋獲取成功
  236.                                                  
  237.                                         if(AS608_Buff[9]==0)
  238.                                         {
  239.                                                 AS608_Buff[9]=1;
  240.                                                 delay(500);
  241.                                                 ZK_ZWYTJ();
  242.                                                 ZK_GLYMS();
  243.                                                  //指紋iD值顯示處理
  244.                                                 ID[0]=finger_id/100;       
  245.                                                 ID[1]=finger_id%100/10;
  246.                                                 ID[2]=finger_id%100%10;
  247.                                                 OLED_Show_Number(70,5,ID,3,1);
  248.                                                 AS608_GenChar(0x02);
  249.                                                   Uart_Receive_Date(12);
  250.                                                 AS608_RegMode1();//合并特征生成模板
  251.                                          Uart_Receive_Date(12);
  252.                                                   AS608_StoreChar(0x01,finger_id);                                        
  253.                                           Uart_Receive_Date(12);
  254.                                                 delay(500);
  255.                                                 finger_id=finger_id+1;
  256.                                                 Close_ES();
  257.                                                 OLED_Clear();
  258.                                             goto Add;
  259.                                           }
  260.                                    }                                  
  261.                         }
  262.                 }
  263.     }
  264.    }
  265.         SectorErase(0x2400);
  266.         byte_write(0x2400,finger_id);
  267. }  
  268. //高速搜索指紋
  269. void HignhSpeedSearch()
  270. {
  271.         uchar  ID[2],i;
  272.         uchar  finger_id;
  273.         ZK_YZZW();
  274.         CLose_OLED=100;       
  275.         while(1)
  276.         {
  277.                 Open_ES();
  278.                 AS608_Send_PS_GetImage();//獲取指紋圖像
  279.                 Uart_Receive_Date(12);
  280.                 if(AS608_Buff[9]==0)
  281.                 {
  282.                   AS608_Buff[9]=1;
  283.                   delay(500);
  284.                   AS608_GenChar(0x01);
  285.                   Uart_Receive_Date(12);          
  286.                   AS608_HignhSpeedSearch(0x01);//高速搜索0-255指紋
  287.                   Uart_Receive_Date(16);
  288.                   if(AS608_Buff[9]==0)
  289.                   {
  290.                         AS608_Buff[9]=1;
  291.                         ZK_ZWZZMYK();
  292.                         ZK_YHMS();
  293.                         finger_id=AS608_Buff[11];
  294.                         if((finger_id==100)||(finger_id==99)||(finger_id==101))
  295.                         {
  296.                                 ID[0]=finger_id/100;       
  297.                                 ID[1]=finger_id%100/10;
  298.                                 ID[2]=finger_id%100%10;
  299.                                 OLED_Show_Number(70,5,ID,3,1);
  300.                                 delay(500);
  301.                                 OLED_Clear();
  302.                                 GLY_Menu();
  303.                                 OLED_Clear();
  304.                                 break;
  305.                         }
  306.                         else
  307.                         {
  308.                                 ID[0]=finger_id/100;       
  309.                                 ID[1]=finger_id%100/10;
  310.                                 ID[2]=finger_id%100%10;
  311.                                 OLED_Show_Number(70,5,ID,3,1);
  312.                                 Close_ES();       
  313.                                 Lock = 0;
  314.                                 delay(50);
  315.                                 Lock = 1;
  316.                                 delay(500);
  317.                                 OLED_Clear();
  318.                                 break;
  319.                         }
  320.                   }
  321.                   else
  322.                   {                       
  323.                           Close_ES();
  324.                           ZK_ZWCW();
  325.                           ZK_YHMS();
  326.                           delay(500);
  327.                           OLED_Clear();
  328.                           break;
  329.                   }
  330.                 }
  331.                 if(CLose_OLED)
  332.             {
  333.                    CLose_OLED=0;
  334.                    longjmp (JMP_BUF, 1);
  335. //                   soft_reset();
  336.                 }
  337.                 if(keyscan()==Sign_out)break;        //退出
  338.         }
  339. }
  340. //刪除指紋
  341. void DeletChar()
  342. {
  343.          
  344.         uchar data ID[2],i;
  345.         uchar data finger_id=0x01;
  346.         abb:_nop_();
  347.         ZK_QSRZWH();
  348.         ZK_GLYMS();
  349.         while(1)
  350.         {
  351.          ID[0]=finger_id/100;       
  352.          ID[1]=finger_id%100/10;
  353.          ID[2]=finger_id%100%10;
  354.          OLED_Show_Number(30,5,ID,3,1);
  355.           if(CLose_OLED)
  356.           {
  357.                 CLose_OLED=0;
  358.                 longjmp (JMP_BUF, 1);
  359. //                soft_reset();
  360.           }               
  361.          if(keyscan()==ST_up)//上調按鍵
  362.           {
  363.                  if(finger_id == 0xc8)finger_id = 0;                       
  364.                  else finger_id = finger_id + 1;                 
  365.           }       
  366.           if(keyscan()==XT_down) if(finger_id>0x00)finger_id = finger_id-1;//下調按鍵
  367.           if(keyscan()==Sign_out)break;        //退出
  368.         //按確認鍵開始錄入指紋信息
  369.          if(keyscan()==Confirm)                                //確認
  370.          {
  371.                 Open_ES();
  372.                 AS608_DeletChar(finger_id);
  373.                 Uart_Receive_Date(12);
  374.                 if(AS608_Buff[9]==0)
  375.                 {
  376.                         ZK_ZWYSC();
  377.                         ZK_GLYMS();
  378.                         ID[0]=finger_id/100;       
  379.                         ID[1]=finger_id%100/10;
  380.                         ID[2]=finger_id%100%10;
  381.                         OLED_Show_Number(70,5,ID,3,1);
  382.                         Close_ES();
  383.                         delay(500);
  384.                         goto abb;
  385.                 }
  386.          }
  387.    }
  388. }
  389. /*用戶密碼初始化:只在程序下入的第一上電運行一次*/
  390. void Password_init()                                       
  391. {       
  392.         uchar xdata i ;
  393.         uchar xdata x;
  394.        
  395.         x=byte_read(0x2201);
  396.         if(x!=2)
  397.         {
  398.                 SectorErase(0x0000);
  399.                 byte_write(0x0001,1);
  400.                 SectorErase(0x2400);
  401.                 byte_write(0x2400,0);
  402.                 SectorErase(0x2000);
  403.                 for(i=0;i<6;i++)
  404.                 {
  405.                         byte_write(0x2001+i,PW_BUFFER[i]);
  406.                 }
  407.                 SectorErase(0x2200);
  408.                 byte_write(0x2201,2);
  409.                 InitDS1302();       
  410.         }
  411. }


  412. /*管理員密碼輸入*/
  413. void GLY_Password_in()                               
  414. {
  415.         uchar xdata i,x;
  416.         end:_nop_();
  417.         ZK_QSRGLYMM();
  418.         ZK_GLYMS();
  419.         for(i=0;i<10;)
  420.    {                 
  421.           while((GPIO_KEY==0XF0)&&(CLose_OLED==0));       
  422.          if(CLose_OLED)
  423.          {
  424.                 CLose_OLED=0;
  425.                 longjmp (JMP_BUF, 1);
  426. //                soft_reset();
  427.          }        
  428.           if(keyscan()<GLY)
  429.          {
  430.                  GLY_Password[i] = keyscan();                                       
  431.                  OLED_Show_sChar(10*i,6, SChar2 ,1);//顯示*
  432.                     i++;
  433.          }                   
  434.           else if(keyscan()==Delete)                                //退位
  435.          {       

  436.                 if(i>0)
  437.                 {         
  438.                 OLED_Show_sChar(10*i,6, SChar3 ,1);
  439.                 i--;
  440.                  
  441.                 }
  442.          }         
  443.           else if(keyscan()==Confirm)                                //確認
  444.          {
  445.            if(i>0)
  446.            {
  447.                 if(i==6)
  448.                 {
  449.                         GLY_Password_ok = 1;
  450.                         break;                       
  451.                 }
  452.                 else
  453.                 {
  454.                         GLY_Password_ok = 0;
  455.                         ZK_MMWSCW();
  456.                         ZK_GLYMS();
  457.                         delay(500);
  458.                         OLED_Clear();
  459.                         goto end;

  460.                 }
  461.            }
  462.                                                  
  463.          }
  464.          else if(keyscan()==Sign_out)                                //退出
  465.          {       
  466.                  GLY_Password_ok = 0;
  467.                  OLED_num = 0;
  468.                  Close_T0();
  469.                  break;                                 
  470.          }
  471.          if(i==9)                                                                //密碼位數到達最大值自行退出
  472.          {          
  473.                 GLY_Password_ok = 0;
  474.                 ZK_MMWSCW();
  475.                 ZK_GLYMS();
  476.                 delay(500);
  477.                 OLED_Clear();
  478.                 goto end;
  479.          }

  480.         }
  481.        
  482.           
  483. }
  484. /*用戶密碼輸入*/
  485. void Password_in()                               
  486. {       
  487.         uchar i ;
  488.         end:_nop_();
  489.         ZK_QSRMM();
  490.         ZK_YHMS();
  491.         for(i=0;i<10;)
  492.    {
  493.           while((GPIO_KEY==0XF0)&&(CLose_OLED==0));
  494.          if(CLose_OLED)
  495.          {
  496.                 CLose_OLED=0;
  497.                 longjmp (JMP_BUF, 1);
  498. //                soft_reset();
  499.          }           
  500.           if(keyscan()<10)
  501.          {
  502.                  User_Password[i] = keyscan();                                       
  503.                  OLED_Show_sChar(10*i,5, SChar2 ,1);//顯示*
  504.                    i++;
  505.          }          
  506.          
  507.           else if(keyscan()==Delete)                                //退位
  508.          {       
  509.                 if(i> 0)
  510.                 {
  511.                 OLED_Show_sChar(10*i,5, SChar3 ,1);       
  512.                  i--;
  513.                 }               
  514.          }
  515.          
  516.           else if(keyscan()==Confirm)                                //確認
  517.          {
  518.            if(i>0)
  519.            {  
  520.                 if(i==6)
  521.                 {
  522.                          Password_ok = 1;
  523.                                 break;                       
  524.                 }
  525.                 else
  526.                 {
  527.                         Password_ok = 0;
  528.                         ZK_MMWSCW();
  529.                         ZK_YHMS();
  530.                         delay(500);
  531.                         OLED_Clear();
  532.                         goto end;
  533.                 }
  534.            }                                                 
  535.          }
  536.          else if(keyscan()==Sign_out)                           //取消
  537.          {       
  538.                   Password_ok = 0;
  539.                   OLED_num = 0;
  540.                   Close_T0();
  541.                   break;                                 
  542.          }
  543.           if(i==9)                                                           //密碼位數到達最大值自行退出
  544.          {          
  545.                 Password_ok = 0;
  546.                 ZK_MMWSCW();
  547.                 ZK_YHMS();
  548.                 delay(500);
  549.                 OLED_Clear();
  550.                 goto end;
  551.          }
  552.    }

  553. }
  554. /*用戶密碼重置*/
  555. void PassWord_Reset()                       
  556. {       
  557.         uchar i;
  558.         SectorErase(0x2000);               
  559.         for(i=0;i<6;i++)
  560.         {
  561.                 byte_write(0x2001+i,PW_BUFFER[i]);
  562.         }
  563.         SectorErase(0x2200);
  564.         byte_write(0x2201,5);
  565.         ZK_MMYCZ();
  566.         ZK_GLYMS();
  567.         delay(500);
  568. }
  569. /*用戶密碼修改*/
  570. void  Use_Password_Change()               
  571. {       
  572.          uchar i;
  573.         retry:_nop_();
  574.          SectorErase(0x2000);       
  575.          ZK_QSRXMM();
  576.          ZK_GLYMS();
  577.        
  578.          for(i=0;i<10;)
  579.         {
  580.                   while((GPIO_KEY==0XF0)&&(CLose_OLED==0));
  581.                   if(CLose_OLED)
  582.               {
  583.                     CLose_OLED=0;
  584.                     longjmp (JMP_BUF, 1);
  585.                         //                soft_reset();
  586.               }
  587.                   if(keyscan()<10)
  588.                   {
  589.                           
  590.                         byte_write(0x2001+i,keyscan());                               
  591.                         OLED_Show_sChar(10*i,5, SChar2 ,1);//顯示*
  592.                         i++;
  593.                   }
  594.                   else if(keyscan()==Delete)goto retry;                                //退位
  595.                   else if(keyscan()==Confirm)                                //確認
  596.                   {
  597.                    if(i>0)
  598.                    {
  599.                         if(i==6)
  600.                     {
  601.                                   ZM_MMXGCG();
  602.                                 ZK_GLYMS();
  603.                                 delay(500);
  604.                                 OLED_Clear();
  605.                                 break;
  606.                         }
  607.                     else
  608.                     {
  609.                                  
  610.                             ZK_MMWSCW();
  611.                             ZK_GLYMS();
  612.                             delay(500);
  613.                             OLED_Clear();
  614.                                 goto retry;
  615.                     }
  616.                    }                                                  
  617.                   }
  618.                   else if(keyscan()==Sign_out)break;                           //取消                                           
  619.                   if(i==9)                                                           //密碼位數到達最大值自行退出
  620.               {          
  621.                            Password_ok = 0;
  622.                            ZK_MMWSCW();
  623.                            ZK_GLYMS();
  624.                            delay(500);
  625.                            OLED_Clear();
  626.                            goto retry;
  627.                             
  628.               }       
  629.         }

  630. }
  631. /*用戶密碼凍結*/
  632. void PassWord_DJ()
  633. {
  634.         ZK_MMYDJ();
  635.         ZK_GLYMS();
  636.         SectorErase(0x0000);
  637.         byte_write(0x0001,0);
  638.         delay(500);
  639. }
  640. /*用戶密碼解凍*/
  641. void PassWord_JD()
  642. {        ZK_MMYJD();
  643.         ZK_GLYMS();
  644.         SectorErase(0x0000);
  645.         byte_write(0x0001,1);
  646.         delay(500);
  647. }
  648. /*管理員菜單(僅有顯示屏菜單顯示)*/
  649. void GLY_Password_Meun(uchar menu_num,uchar choose )       
  650. {
  651.        
  652. //        OLED_Clear();
  653. //        ZK_GLYMS();         
  654.         switch(menu_num)
  655.         {
  656.                 case 1:
  657.                         OLED_Show_CHinese(2,Chartxt_4,!(choose==1));
  658.                         OLED_Show_CHinese(4,Chartxt_5,!(choose==2));
  659.                         OLED_Show_CHinese(6,Chartxt_6,!(choose==3));
  660.                         break;
  661.                 case 2:
  662.                         OLED_Show_CHinese(2,Chartxt_5,!(choose==2));
  663.                         OLED_Show_CHinese(4,Chartxt_6,!(choose==3));
  664.                         OLED_Show_CHinese(6,Chartxt_7,!(choose==4));
  665.                         break;
  666.         }

  667. }
  668. /*用戶密碼的管理菜單(無法修改管理員密碼)*/
  669. void GLY_PassWord_Meum()                                                               
  670. {
  671.          
  672.    uchar first_num = 1;
  673.    uchar choose_2  = 1;
  674.    OLED_num =0;
  675.    while(1)
  676.    {
  677.         GLY_PassWord:ZK_GLYMS();
  678.         GLY_Password_Meun(first_num,choose_2);//根據first_num和choose的動態刷新顯示函數
  679.          if(CLose_OLED)
  680.         {
  681.                 CLose_OLED=0;
  682.                 longjmp (JMP_BUF, 1);
  683. //                soft_reset();
  684.         }          
  685.         if(keyscan()==Sign_out)break;
  686.         if(keyscan()==ST_up)
  687.         {
  688.                 choose_2--;
  689.                 if(choose_2==0)choose_2=1;//選項最少不能小于1
  690.                 if(choose_2<first_num)first_num--;
  691.         }
  692.         if(keyscan()==XT_down)
  693.         {
  694.             choose_2++;
  695.                 if(choose_2==5)choose_2=4;//選項最大不能大于4
  696.                 if(choose_2>first_num+2)first_num++;
  697.         }
  698.         if(keyscan()==Confirm)
  699.     {
  700.         switch(choose_2)
  701.                 {
  702.                   case(1): Use_Password_Change();goto GLY_PassWord;
  703.                   case(2): PassWord_Reset();goto GLY_PassWord;
  704.                   case(3): PassWord_DJ();goto GLY_PassWord;
  705.                   case(4): PassWord_JD();goto GLY_PassWord;
  706.                 }               
  707.         }
  708.    }
  709. }
  710. /*指紋管理菜單*/
  711. void Fingerprint_Meum()
  712. {
  713.         uchar   choose_1=1;
  714.         OLED_num =-200;
  715.         Meun:_nop_();
  716.         ZK_GLYMS();       
  717.    while(1)       
  718.    {       
  719.          
  720.         switch(choose_1)
  721.         {
  722.                 case(1):OLED_Show_CHinese(2,Chartxt_8,0);OLED_Show_CHinese(4,Chartxt_9,1);OLED_Show_CHinese(6,Chartxt_10,1);break;
  723.                 case(2):OLED_Show_CHinese(2,Chartxt_8,1);OLED_Show_CHinese(4,Chartxt_9,0);OLED_Show_CHinese(6,Chartxt_10,1);break;
  724.                 case(3):OLED_Show_CHinese(2,Chartxt_8,1);OLED_Show_CHinese(4,Chartxt_9,1);OLED_Show_CHinese(6,Chartxt_10,0);break;
  725.         }
  726.          if(CLose_OLED)
  727.         {
  728.                 CLose_OLED=0;
  729.                 longjmp (JMP_BUF, 1);
  730. //                soft_reset();
  731.         }
  732.         if(keyscan()==Sign_out)break;
  733.         if(keyscan()==ST_up)//上調按鍵
  734.         {
  735.                 choose_1--;
  736.                 if(choose_1==0)choose_1=1;//選項最少不能小于1
  737.         }       
  738.         if(keyscan()==XT_down)
  739.         {
  740.                 choose_1++;
  741.                 if(choose_1==4)choose_1=3;//選項最大不能大于2
  742.         }
  743.         if(keyscan()==Confirm)
  744.         {
  745.                  switch(choose_1)
  746.                  {
  747.                         case(1): Add_Fingerprint();goto Meun;  
  748.                         case(2): DeletChar();goto Meun;
  749.                         case(3): goto Meun;
  750.                  }
  751.         }
  752.    }
  753. }
  754. void bbxx()
  755. {
  756.         OLED_Clear();
  757.         while(1)
  758.         {
  759.         OLED_DrawBMP(32, 0,96,8,BMP1);
  760.         if(CLose_OLED)
  761.         {
  762.                 CLose_OLED=0;
  763.                 OLED_Clear();
  764.                 longjmp (JMP_BUF, 1);
  765. //                soft_reset();
  766.         }
  767.         if(keyscan()==Sign_out)
  768.         {
  769.                 OLED_num = 0;
  770.                 Close_T0();
  771.                 OLED_Clear();
  772. //                longjmp (JMP_BUF, 1);//退出
  773.                 break;
  774.         }       
  775.         }
  776. }
  777. /*管理員菜單*/
  778. void  GLY_Menu()                                               
  779. {       

  780.     uchar   choose_1=1;
  781.         OLED_num =-200;
  782.         Meun:_nop_();
  783.         ZK_GLYMS();
  784.        
  785.    while(1)       
  786.    {       
  787.          
  788.         switch(choose_1)
  789.         {
  790.                 case(1):OLED_Show_CHinese(2,Chartxt_1,0);OLED_Show_CHinese(4,Chartxt_2,1);OLED_Show_CHinese(6,Chartxt_3,1);break;
  791.                 case(2):OLED_Show_CHinese(2,Chartxt_1,1);OLED_Show_CHinese(4,Chartxt_2,0);OLED_Show_CHinese(6,Chartxt_3,1);break;
  792.                 case(3):OLED_Show_CHinese(2,Chartxt_1,1);OLED_Show_CHinese(4,Chartxt_2,1);OLED_Show_CHinese(6,Chartxt_3,0);break;
  793.         }
  794.         if(CLose_OLED)
  795.         {
  796.                 CLose_OLED=0;
  797.                 longjmp (JMP_BUF, 1);
  798. //                soft_reset();
  799.         }
  800.         if(keyscan()==ST_up)//上調按鍵
  801.         {
  802.                 choose_1--;
  803.                 if(choose_1==0)choose_1=1;//選項最少不能小于1
  804.         }
  805.        
  806.         if(keyscan()==XT_down)//下調按鍵
  807.         {
  808.                 choose_1++;
  809.                 if(choose_1==4)choose_1=3;//選項最大不能大于2
  810.         }
  811.    
  812.     if(keyscan()==Confirm)        //確認
  813.     {
  814.                  switch(choose_1)
  815.                  {
  816.                         case(1):GLY_PassWord_Meum();goto Meun;  
  817.                         case(2):Fingerprint_Meum(); goto Meun;
  818.                         case(3):bbxx(); goto Meun;
  819.                  }
  820.     }
  821.         if(keyscan()==Sign_out)
  822.         {
  823.                 OLED_num = 0;
  824.                 Close_T0();
  825.                 longjmp (JMP_BUF, 1);//退出
  826.         }
  827.    }
  828. }
  829. /* 獲取當前日期時間,并刷新時間和星期的顯示 */
  830. void RefreshTime()
  831. {
  832.         uchar xdata str_1[8];
  833.         uchar xdata str_2[8];
  834.         uchar i;
  835.     GetRealTime(&CurTime);                  //獲取當前日期時間
  836.         str_1[0] = (CurTime.hour>>4);
  837.         str_1[1] = (CurTime.hour&0xF);
  838.         str_1[2] = 17;
  839.         str_1[3] = (CurTime.min>>4);
  840.         str_1[4] = (CurTime.min&0xF);
  841.         str_1[5] = 17;
  842.         str_1[6] = (CurTime.sec>>4);
  843.         str_1[7] = (CurTime.sec&0xF);
  844.         for(i=0;i<8;i++)str_2[i]=16;
  845.         OLED_Show_Number(32,4,str_1,8,1);
  846.         OLED_Show_Number(0,4,str_2,4,1);
  847.         OLED_Show_Number(96,4,str_2,4,1);
  848.         OLED_Show_Number(32,0,str_2,8,1);
  849.         OLED_Show_Number(0,2,str_2,4,1);
  850.         OLED_Show_Number(96,2,str_2,4,1);
  851.         OLED_ShowCHinese(80,6,65,1);
  852.         OLED_ShowCHinese(96,6,66,1);
  853.         OLED_ShowCHinese(112,6,67+CurTime.week,1);
  854.         ZK_SZXS();
  855. }
  856. /* 日期刷新函數,ops-刷新選項:為0時只當日期變化才刷新,非0則立即刷新 */
  857. void RefreshDate(uchar ops)
  858. {
  859.     uchar  xdata str[]=0;
  860.     static uchar  backup = 0;
  861.    
  862.     if ((backup!=CurTime.day) || (ops!=0))
  863.     {
  864.         str[0] = ((CurTime.year>>12) & 0xF);  //4位數年份
  865.         str[1] = ((CurTime.year>>8) & 0xF);
  866.         str[2] = ((CurTime.year>>4) & 0xF);
  867.         str[3] = (CurTime.year & 0xF);
  868.         str[4] = 16;                        //分隔符
  869.         str[5] = (CurTime.mon >> 4);   //月份
  870.         str[6] = (CurTime.mon & 0xF);
  871.         str[7] = 16;                        //分隔符
  872.         str[8] = (CurTime.day >> 4);   //日期
  873.         str[9] = (CurTime.day & 0xF) ;
  874.         OLED_Show_Number(0,6,str,10,1);
  875.         backup = CurTime.day;   //刷新上次日期值
  876.     }
  877. }
  878. /*總和函數*/
  879. void Subject()
  880. {
  881.                   
  882.             uchar i,error=0;                         
  883. //                ZK_HYGLJGKJ();
  884.                 if(keyscan() ==GLY)                                //按下A進入管理員模式
  885.                 {                                                                                
  886.                         GLY_PassWord:_nop_();                       
  887.                         OPen_T0();                                        //開啟超時計時
  888.                         GLY_Password_in();                        //輸密碼               
  889.                         if( GLY_Password_ok==1)                //密碼輸好
  890.                         {                         
  891.                          for(i=0;i<6;i++)
  892.                          if(AT_password[i]!=GLY_Password[i])        //密碼比較
  893.                          error++;               
  894.                          if(error==0)                                //密碼正確
  895.                          {
  896.                                 ZK_MMZQMYK();
  897.                                 ZK_GLYMS();                               
  898.                                 Lock = 0;
  899.                                 delay(50);                               
  900.                                 Lock = 1;
  901.                                 delay(500);
  902.                                 OLED_Clear();
  903.                                 GLY_Menu();
  904.                                 OLED_Clear();
  905.                                 EX0 = 1;                                   
  906.                          }
  907.                          else                                                 //密碼錯誤
  908.                          {
  909.                                 error=0;
  910.                                 ZK_MMCW();
  911. ……………………

  912. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
Desktop.zip (1.1 MB, 下載次數: 90)
ycx.7z (117.17 KB, 下載次數: 78)


評分

參與人數 3黑幣 +92 收起 理由
qlytsfs + 30 很有用,正在改著用
rianbow000 + 12 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:676417 發表于 2019-12-30 10:55 來自手機 | 只看該作者
最近也在研究這個,0基礎起步,不知道能走到哪里。
回復

使用道具 舉報

板凳
ID:657264 發表于 2019-12-30 16:40 | 只看該作者
厲害,收藏了,備用,希望能用。
回復

使用道具 舉報

地板
ID:864237 發表于 2024-2-17 15:28 | 只看該作者
  1. 原版代碼
  2. void HignhSpeedSearch()
  3. {
  4.         uchar  ID[2],i;
  5.         uchar  finger_id;
  6.         ZK_YZZW();                                                                                                                                                                                        //驗證指紋
  7.         CLose_OLED=100;        
  8.         while(1)
  9.         {
  10.                 Open_ES();
  11.                 PS_AutoIdentify();//獲取指紋圖像
  12.          
  13.                 delay(500);                                                                                                                                                                                                                //高速搜索0-255指紋
  14.                 Uart_Receive_Date(17);
  15.                   if(AS608_Buff[10]==0x00 )
  16.                                                 {
  17.                                                 AS608_Buff[10]=1;
  18.                                                 ZK_ZWZZMYK();                                                                                                                                                        //字庫 指紋正確門已開
  19.                                                 ZK_YHMS();                                                                                                                                                                //字庫 用戶模式
  20.                                                 finger_id=AS608_Buff[13];
  21.                                                         ID[0]=finger_id/100;        
  22.                                                         ID[1]=finger_id%100/10;
  23.                                                         ID[2]=finger_id%100%10;
  24.                                                         OLED_Show_Number(70,5,ID,3,1);
  25.                                                         Close_ES();        
  26.                                                         Lock = 0;                                                                  //開鎖
  27.                                                         delay(500);
  28.                                                         Lock = 1;
  29.                                                         delay(500);
  30.                                                         OLED_Clear();
  31.                                                         break;
  32.                                                 }
  33.                         if(AS608_Buff[10]==0x09 )
  34.                                                         {
  35. Close_ES();        
  36.                                                                 OLED_Clear();
  37.                                                                 ZK_QSRZWH();
  38.                                                                 delay(500);
  39.                                                                 OLED_Clear();
  40.                                                                 break;
  41.                                                         }
  42.                                                         
  43.                   


  44.                 if(keyscan()==Sign_out)
  45.                                                                 break;
  46.         }        //退出
  47.         }
復制代碼
哥們你好,請原諒我五年之后掘墓,實在是這個問題太奇怪了
哥們我正在基于你這款作品的基礎上做DIY小玩意,遇到一個很有意思的問題,就是你這里的CLose_OLED=1;
當我把這行代碼注釋掉之前,UART串口接受進來的數據永遠是00000000,偶然間注釋掉之后他就正常了,我在翻看這行代碼,死活沒搞明白原因在哪,以及這行代碼本身是干什么用的
不知道你會不會有什么頭緒
回復

使用道具 舉報

5#
ID:334202 發表于 2024-3-22 17:12 | 只看該作者
qlytsfs 發表于 2024-2-17 15:28
哥們你好,請原諒我五年之后掘墓,實在是這個問題太奇怪了哥們我正在基于你這款作品的基礎上做DIY小玩意, ...

看了一下,這個變量應該是超時用的,你說和串口有問題,我看了一下這個變量確實和串口接收中斷里使用,可以去看一下哪里     太久了這個代碼我也不清楚了

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品视频一区二区三区在线观看 | 日本a在线 | 秋霞电影一区二区三区 | 91新视频| 欧美黄色大片在线观看 | 久久综合一区 | 欧美性久久 | av一区二区三区四区 | 午夜视频在线观看网址 | 久草网免费 | 91精品国产综合久久婷婷香蕉 | 久色网 | 少妇一级淫片免费放播放 | 国产精品美女久久久久久久久久久 | 日韩电影在线一区 | 欧美a级网站 | 亚洲另类春色偷拍在线观看 | 992tv人人草 久久精品超碰 | 国产精品色av | 九色av| 国产一区二区在线视频 | 在线观看国产视频 | 玖玖精品视频 | 国产在线精品一区二区三区 | 成人三级av | 成人免费视频 | 97av视频| 国产精品一级 | 伊人一区 | 国产精品1区2区3区 国产在线观看一区 | 亚洲第一天堂 | 久久久青草婷婷精品综合日韩 | 欧美黄色一区 | 91色视频在线观看 | 久久最新精品视频 | 午夜免费在线观看 | 国产福利在线看 | 久久综合一区二区三区 | 日本免费在线看 | 欧美视频二区 | 中文字幕在线精品 |