[应用方案] AS608指纹

[复制链接]
 楼主| dzfansman 发表于 2024-2-17 23:50 | 显示全部楼层 |阅读模式
  1. #include <setjmp.h>
  2. #include "ZK.h"
  3. #include "oled.h"          //包含液晶函数
  4. #include "eeprom.h"
  5. #include "AS608.h"  
  6. #include <intrins.h>
  7. #include <DS1302.h>
  8. #define uchar unsigned char
  9. #define uint unsigned int         //宏定义
  10. #define GPIO_KEY P2
  11. #define GLY      10                //管理员
  12. #define ST_up    11                //上调
  13. #define XT_down  12                //下调
  14. #define Sign_out 13                //退出
  15. #define Delete   15                //删除
  16. #define Confirm  14                //确认
  17. #define User 1                        //用户                                                                                               
  18. sbit Beep = P1^0;
  19. sbit Lock = P1^1;
  20. sbit FingerPrint_KEY=P3^7;
  21. bit          GLY_use = 0;        //管理员使能位 :0、关闭管理员,1、开启管理员
  22. bit           GLY_dj =  1;        //管理员冻结密码使能位:0、冻结密码,1、关闭冻结
  23. bit                 init_complete=0;//初始化完成标志:0、初始化未完成,1、允许执行程序
  24. bit     GLY_Password_ok = 0;//管理员密码输入好标志:0、密码未输好,1、密码已经输好
  25. bit     Password_ok = 0;//密码输入好标志:0、密码未输好,1、密码已经输好
  26. bit     Password_rd = 0;
  27. bit     ZW_GLY = 0;
  28. bit     CLose_OLED = 0;
  29. uchar  code  AT_password[6] = {0,1,0,8,2,9};                                                //管理员密码           020403
  30. uchar  code  PW_BUFFER[6]   = {0,2,0,4,0,3};                                                //用户密码
  31. uchar  xdata  User_Password[16]   = {0};                //用户密码缓存
  32. uchar  xdata   GLY_Password[16] = {0};                //管理员密码缓存
  33. uchar  xdata T0RH = 0;  //T0重载值的高字节
  34. uchar  xdata T0RL = 0;  //T0重载值的低字节
  35. uchar code KEY_switch[16]={0xeb,0x77,0x7b,0x7d,0xb7,0xbb,0xbd,0xd7,0xdb,0xdd,0x7e,0xbe,0xde,0xee,0xed,0xe7};//0-15
  36. jmp_buf JMP_BUF;
  37. struct sTime CurTime;    //当前日期时间
  38. long OLED_num = 0;
  39. volatile unsigned char  xdata AS608_Buff[32];
  40. void  GLY_Menu();
  41. void RefreshTime();
  42. void RefreshDate(uchar ops);
  43. void Beep_10ms();
  44. //void soft_reset(void)
  45. //{
  46. //   ((void (code *) (void)) 0x3745)();
  47. //}
  48. void JMP()
  49. {
  50.         if(setjmp(JMP_BUF)!=0) OLED_Clear();
  51. }
  52. void OPen_T0()
  53. {
  54.         TR0 = 1;               //启动T0
  55.         ET0 = 1;        //使能T0中断      
  56. }
  57. void Close_T0()
  58. {
  59.         TR0 = 0;               //启动T0
  60.         ET0 = 0;        //使能T0中断      
  61. }
  62. void CLOSE_OLED_TEST()
  63. {
  64.          if(CLose_OLED)
  65.         {
  66.                 CLose_OLED=0;
  67.                 longjmp (JMP_BUF, 1);
  68. //                soft_reset();
  69.         }
  70. }
  71. uchar code  LedChar[]={
  72.         0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, //定义八个灯的工作状态。
  73.         0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  74.         };
  75. void delay(uint xdata t);
  76. uchar keyscan()        //带返回值的子函数
  77. {
  78.                 uchar Key_H,Key_L,Key_Vaul,i;
  79.         GPIO_KEY = 0xf0;//1111 0000
  80.         if( (GPIO_KEY & 0xf0) != 0xf0)//判断是否有按键按下(按下就为与)
  81.         {
  82.                 delay(10);//软件消抖
  83.                 if( (GPIO_KEY & 0xf0) != 0xf0)//再次判断是否有按键按下
  84.                 {
  85.                           Key_L = GPIO_KEY & 0xf0;// 储存列线值
  86.                           GPIO_KEY = Key_L | 0x0f;
  87.                           Key_H = GPIO_KEY & 0x0f;// 储存行线值
  88.                                                   Key_Vaul=Key_H+Key_L;
  89.                                                   for(Key_H=0;Key_H<16;Key_H++)
  90.                                                   if(Key_Vaul==KEY_switch[Key_H])break;               
  91.                                                    Beep_10ms();      
  92.                           while( (GPIO_KEY & 0x0f) != 0x0f );//松手检测
  93.                           return (Key_H);//返回键值码
  94.                 }        
  95.         }      
  96. }
  97. uchar Uart_Receive_Byte()//接收一个字节
  98. {      
  99.         uchar xdata Byte;
  100.         while((!RI)&&(!CLose_OLED));         
  101.         RI = 0;
  102.         Byte = SBUF;
  103.         return (Byte);
  104. }
  105. void Uart_Receive_Date(uchar   length)        //接收缓存
  106. {
  107.    uchar xdata i;
  108.     for(i=0;i<length;i++)
  109.         {
  110.                
  111.                 AS608_Buff[i]=Uart_Receive_Byte();      

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

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


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

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

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

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

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

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

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

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


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

本版积分规则

12

主题

2023

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

12

主题

2023

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部