找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3600|回复: 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, 下载次数: 87)
ycx.7z (117.17 KB, 下载次数: 76)


评分

参与人数 3黑币 +92 收起 理由
qlytsfs + 30 很有用,正在改着用
rianbow000 + 12 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶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 单片机教程网

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