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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機12864顯示的電子密碼鎖源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:372470 發表于 2018-8-1 15:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是一個基于STC89C52的指紋識別和鍵盤密碼鎖,里面包括程
1.當要想從標志位中退出來就一定要知道程序當前在哪個標志位中讀取,然后就是在這個里面設定退出方可,
否則是不能使用的,相當于是沒有一樣。

單片機源程序如下:
  1. /*************************************************************************************
  2.         密碼鎖,可以改個人密碼和管理員密碼的一個基于單片機的鎖。
  3.         按鍵值碼:           1  2  3  set        輸入密碼只能按0~9,10位確定鍵,11位取消鍵(輸入密碼小                  
  4.                                                 4  5  6  ↑                于8時取消輸入的密碼),12是時鐘功能鍵,13是時鐘“+”,
  5.                                                 7  8  9  ↓                14是時鐘“-”,15改密碼的時候的確定鍵
  6.                                                 ok 0  c  fun
  7. **************************************************************************************/
  8. /******************************頭文件****************************************/
  9. #include<reg52.h>
  10. #include<stdio.h>
  11. #include<math.H>
  12. #include"lcd.h"
  13. #include"ds1302.h"
  14. #include"keyboard.h"
  15. #include"delay.h"
  16. #include"deal.h"
  17. #include "i2c.h"
  18. #include "uart.h"
  19. /*************************宏定義*************************************/
  20. #define uchar unsigned char
  21. #define uint unsigned int

  22. //========================IO口定義==================================//
  23. sbit s = P2^2;                           //控制背光
  24. sbit k2 = P3^2;              //
  25. sbit JDQ_key = P3^7;   //繼電器控制

  26. unsigned char flag4,flag5=0,flag8=1,flag1=0,flag_time=0,
  27.                                 flag_time2=0;flag3=0;
  28. unsigned char wrongtimes=0,k,p=1,miao=59,t=0,snum=0,
  29.                                 c=0,up=0,down=0,a=0;
  30. //===========================密碼的初始值==========================//
  31. unsigned char MIMAword[8]={1,2,3,4,5,6,7,8};                //密碼的初始值
  32. unsigned char G_MIMA[8]={8,8,8,8,8,8,8,8};                         //管理員密碼,可以更改

  33. void MIMA_input();     //EEPROM寫
  34. void MIMA_output();    //EEPROM讀

  35. //===========================配置定時器============================//
  36. void init_conf()
  37. {
  38.         TH0=(65536-50000)/256;                                          //
  39.         TL0=(65536-50000)%256;

  40.         EA=1;
  41.         ET0=1;
  42.         IT0=1;                                                                                                    //跳變沿出發方式(下降沿)
  43.         EX0=1;                                                                                                    //打開INT0的中斷允許。

  44.         TR1 = 1;
  45.         ET1 = 1;
  46. }
  47. //===============================主函數===========================//
  48. void main()
  49. {       
  50.         unsigned char num,i = 0,j;                  
  51.         unsigned char temp[8];
  52.        
  53.         unsigned char Ztemp[8]={'1','2','3','4','5','6','7','8'};
  54.         unsigned char Zresponsuccess[4]={0x55,0x11,0x01,0x00};
  55.         unsigned char Zresponfail[]="your command is wrong";
  56.         unsigned char ch[8]={0},z1=0,        Znum[8]={0};
  57.         bit Flag;
  58. /***********************以下是斷電后重啟的讀出EEPROM的數據*******************************/
  59. //第一次上電先隱去 88888888修改管理員密碼 然后取隱用修改后的管理員進入修改個人密碼
  60.         G_MIMA[0] =  EEPROMread_add(11,19);
  61.         delay(20);
  62.         G_MIMA[1] =  EEPROMread_add(12,20);
  63.         delay(20);
  64.         G_MIMA[2] =  EEPROMread_add(13,21);
  65.         delay(20);
  66.         G_MIMA[3] =  EEPROMread_add(14,22);
  67.         delay(20);
  68.         G_MIMA[4] =  EEPROMread_add(15,23);
  69.         delay(20);
  70.         G_MIMA[5] =  EEPROMread_add(16,24);
  71.         delay(20);
  72.         G_MIMA[6] =  EEPROMread_add(17,25);
  73.         delay(20);
  74.         G_MIMA[7] =  EEPROMread_add(18,26);
  75.         delay(20);
  76. /***********************以上是斷電重啟后讀出EEPROM里面的數據*********************************/
  77.         s=0;                                                                                                                                        //背光控制,上電時低電平將三極管導通
  78.         JDQ_key=1;                                                                                                                                  //繼電器驅動裝置,低電平(三極管不導通,則繼電器工作,則鎖關
  79.                                                                                                                                                                                 //換為J3Y后更改電平
  80.         init_conf();                                                                                                                  //配置定時器
  81.         LCD12864_Init();                                                                                                        //12864初始化
  82.         Ds1302Init();                                                                                                                        //1302初始化
  83.         UartInit();                                                                                                                                //串口初始化     

  84.         LCD12864_SetWindow(0,2,"歡迎光臨");                           //第一行顯示信息
  85.         LCD12864_SetWindow(1,1,"華北科技學院");                 //第二行顯示信息
  86.         LCD12864_SetWindow(2,1,"單片機實驗室");                 //第三行顯示信息
  87.         LCD12864_SetWindow(3,1,"輸入八位密碼");                //第四行顯示信息
  88.         Delay3000ms();
  89.         LCD12864_SetWindow(0,0,"                ");
  90.         LCD12864_SetWindow(1,0,"                ");       
  91.         while(1)
  92.         {       
  93. //=============================串口處理函數=====================================//
  94.                  while(UART_Re_N(8,ch))
  95.                  {
  96.                                 for(z1=0;z1<8;z1++)
  97.                                 {
  98.                                         Znum[z1]= ch[z1];
  99.                                 }
  100.                                 if((Ztemp[0]==Znum[0])&&(Ztemp[1]==Znum[1]))
  101.                                 {
  102.                                                         UART_Send_Strs(Zresponsuccess);
  103.                                                         UART_Send_Enter();
  104.                                                         JDQ_key=0;//三極管不導通,則繼電器不工作,則鎖開
  105.                                                         LCD12864_SetWindow(3,0,"                ");
  106.                                                             //經測試發現正確的“正”不能正常顯示,
  107.                                                             //需要打補丁才能顯示,“正”的內碼缺失,
  108.                                                             //運用GBK國標擴展碼顯示如下
  109.                                                         LCD12864_WriteCmd(0x98+2);
  110.                                                         LCD12864_WriteData(0xc3);//密
  111.                                                         LCD12864_WriteData(0xdc);
  112.                                                         LCD12864_WriteData(0xc2);//碼
  113.                                                         LCD12864_WriteData(0xeb);
  114.                                                         LCD12864_WriteData(0xd5);//正
  115.                                                         LCD12864_WriteData(0xfd);
  116.                                                         LCD12864_WriteData(0xc8);//確
  117.                                                         LCD12864_WriteData(0xb7);
  118.                                                         Delay5000ms();//5s后把繼電器導通,使鎖鎖上       
  119.                                                         LCD12864_SetWindow(2,0,"                ");                       
  120.                                                         LCD12864_SetWindow(3,0,"                ");//清除該行
  121.                                                         LCD12864_SetWindow(2,1,"單片機實驗室");    //寫入第3行信息
  122.                                                         LCD12864_SetWindow(3,1,"輸入八位密碼");                                                       
  123.                                                         JDQ_key=1;    //三極管導通,則繼電器工作,則鎖關
  124.                                 }
  125.                                 else
  126.                                 {
  127.                                                         UART_Send_Strs(Zresponfail);
  128.                                                         UART_Send_Enter();
  129.                                 }
  130.                 }
  131.                 if(flag3 == 1)
  132.                 {
  133.                         MIMA_input();//修改密碼       
  134.                 }
  135.                 else
  136.                 {       
  137.                         if(flag_time2==0)
  138.                         {       
  139.                                 p=1;
  140.                                 LCD12864_WriteCmd(0x0c);
  141.                                 LCD12864_SetWindow(2,1,"單片機實驗室");        //第三行顯示信息
  142.                                 Ds1302Write(0x90,0xa9);                                //涓細充電
  143.                                 Ds1302ReadTime();                                        //時間讀取
  144.                                 LcdDisplaytime();                       //顯示時間
  145.                                 delay(5);                                                 
  146.                                 week();                                 //顯示星期
  147.                                 delay(5);                                                                               
  148.                                 displayday();                           //顯示日期
  149.                                 delay(5);                                                                                                                                 
  150.                                
  151.                                 while(UART_Re_N(8,ch))                                        //串口處理
  152.                                 {
  153.                                         for(z1=0;z1<8;z1++)
  154.                                         {
  155.                                                 Znum[z1]= ch[z1];
  156.                                         }
  157.                                         if((Ztemp[0]==Znum[0])&&(Ztemp[1]==Znum[1]))
  158.                                         {
  159.                                                         UART_Send_Strs(Zresponsuccess);
  160.                                                         UART_Send_Enter();
  161.                                                         JDQ_key=0;//三極管不導通,則繼電器不工作,則鎖開
  162.                                                         LCD12864_SetWindow(3,0,"                ");
  163.                                                             //經測試發現正確的“正”不能正常顯示,
  164.                                                             //需要打補丁才能顯示,“正”的內碼缺失,
  165.                                                             //運用GBK國標擴展碼顯示如下
  166.                                                         LCD12864_WriteCmd(0x98+2);
  167.                                                         LCD12864_WriteData(0xc3);//密
  168.                                                         LCD12864_WriteData(0xdc);
  169.                                                         LCD12864_WriteData(0xc2);//碼
  170.                                                         LCD12864_WriteData(0xeb);
  171.                                                         LCD12864_WriteData(0xd5);//正
  172.                                                         LCD12864_WriteData(0xfd);
  173.                                                         LCD12864_WriteData(0xc8);//確
  174.                                                         LCD12864_WriteData(0xb7);
  175.                                                         Delay5000ms();//5s后把繼電器導通,使鎖鎖上       
  176.                                                         LCD12864_SetWindow(2,0,"                ");                       
  177.                                                         LCD12864_SetWindow(3,0,"                ");//清除該行
  178.                                                         LCD12864_SetWindow(2,1,"單片機實驗室");    //寫入第3行信息
  179.                                                         LCD12864_SetWindow(3,1,"輸入八位密碼");                                                       
  180.                                                         JDQ_key=1;    //三極管導通,則繼電器工作,則鎖關
  181.                                         }
  182.                                         else
  183.                                         {
  184.                                                         UART_Send_Strs(Zresponfail);
  185.                                                         UART_Send_Enter();
  186.                                         }
  187.                                 }
  188.                                
  189.                                 num=KeyPro();
  190.                                 delay(5);                                                            //按鍵掃描                               
  191.                                 if(num!=0xff)
  192.                                 {       
  193.                                         if(num==12)                                                                                                          //設置時間的標志位
  194.                                                 flag_time=1;                                                                                                
  195.                                         if(num>=0&&num<10)                                                                                //設置密碼數位為0~9有效
  196.                                         {
  197.                                                 if(i==0)
  198.                                                 {
  199.                                                           LCD12864_SetWindow(3,0,"                ");//顯示空,相當于清屏
  200.                                                 }
  201.                                                 if(i<8)                                                                                                     //密碼是8位,大于8位時不再輸入按鍵值
  202.                                                 {
  203.                                                         temp[i]=num;
  204.                                                         LCD12864_char(3,i,'*');                        //顯示*號
  205.                                                 }
  206.                                                 i++;
  207.                                         }
  208.                                         if(num==11)                                                                       //取消清零鍵,只有密碼少于8位時有效
  209.                                         {                                               
  210.                                                 i=0;                                                                           //計數清零
  211.                                                 LCD12864_SetWindow(3,0,"                ");
  212.                                                 LCD12864_SetWindow(3,1,"輸入八位密碼");                                                  
  213.                                         }
  214.                                         while(i==8)                                                                       
  215.                                         {
  216.                                                  num=KeyPro();
  217.                                                 if(num==10)        //確定鍵
  218.                                                 i=9;
  219.                                         }
  220.                                         if(i==9)                                                                             //8位后的按鍵不輸入數值
  221.                                         {
  222.                                                 i=0;                                                                               //計數器復位
  223.                                                 Flag=1;                                                                      //先把比較位置1
  224.                                                 flag4 = 1;
  225.                                                 MIMA_output();                                       // p = 1       
  226.                                                 for(k = 0; k < 8; k++)
  227.                                                         flag4=flag4&&((temp[k]==G_MIMA[k]));         //管理員密碼比較
  228.                                                 if(flag4)                                                               //flag4為管理員的更改密碼
  229.                                                 {       
  230.                                                         unsigned char m;
  231.                                                         flag8 = 0;
  232.                                                     flag5 = 1;
  233.                                                         LCD12864_WriteCmd(0x01);
  234.                                                         LCD12864_SetWindow(0,2,"修改密碼");
  235.                                                         LCD12864_SetWindow(1,0,"1.個人密碼修改");
  236.                                                         LCD12864_SetWindow(2,0,"2.管理員密碼修改"); //管理員密碼正確顯示的信息       
  237.                                                         LCD12864_SetWindow(1,0,"");
  238.                                                         LCD12864_WriteCmd(0x0f);                                        //顯示光標
  239.                                                         m=KeyPro();
  240.                                                         delay(50);         
  241.                                                         m=0XFF;
  242.                                                         while(m != 10)                                            //改密碼按鍵
  243.                                                         {
  244.                                                            m=0XFF;
  245.                                                                  while(m==0XFF)
  246.                                                                  {
  247.                                                                                 m=KeyPro();                                                       
  248.                                                                                 if( m == 14)                //下
  249.                                                                                 {                                                                               
  250.                                                                                                 p = 0;                        //管理員密碼修改的標志位
  251.                                                                                                 LCD12864_SetWindow(2,0,"");
  252.                                                                                                 LCD12864_WriteCmd(0x0f);
  253.                                                                     }

  254.                                                                           if( m == 13)                      //上
  255.                                                                           {
  256.                                                                                           p = 1;                              //個人密碼修改的標志位
  257.                                                                                           LCD12864_SetWindow(1,0,"");
  258.                                                                                           LCD12864_WriteCmd(0x0f);
  259.                                                                           }
  260.                                                      }           
  261.                                                         }         
  262.                                                         k2=0;                                         //可以進入改密碼中斷
  263.                                                         MIMA_input();
  264.                                                         flag8 = 0;
  265.                                                 }
  266.                                                 for(j=0;j<8;j++)                  //循環比較8個數值,如果有一個不等 則最終Flag值為0
  267.                                                         Flag=Flag&&(temp[j]==MIMAword[j]);//比較輸入值和已有密碼
  268.                                                 if(Flag)                                                              //如果比較全部相同,標志位置1
  269.                                                 {       
  270.                                                         wrongtimes=0;
  271.                                                         JDQ_key=0;//三極管不導通,則繼電器不工作,則鎖開
  272.                                                         LCD12864_SetWindow(3,0,"                ");
  273.                                                             //經測試發現正確的“正”不能正常顯示,
  274.                                                             //需要打補丁才能顯示,“正”的內碼缺失,
  275.                                                             //運用GBK國標擴展碼顯示如下
  276.                                                         LCD12864_WriteCmd(0x98+2);
  277.                                                         LCD12864_WriteData(0xc3);//密
  278.                                                         LCD12864_WriteData(0xdc);
  279.                                                         LCD12864_WriteData(0xc2);//碼
  280.                                                         LCD12864_WriteData(0xeb);
  281.                                                         LCD12864_WriteData(0xd5);//正
  282.                                                         LCD12864_WriteData(0xfd);
  283.                                                         LCD12864_WriteData(0xc8);//確
  284.                                                         LCD12864_WriteData(0xb7);
  285.                                                         Delay5000ms();//5s后把繼電器導通,使鎖鎖上       
  286.                                                         LCD12864_SetWindow(2,0,"                ");                       
  287.                                                         LCD12864_SetWindow(3,0,"                ");//清除該行
  288.                                                         LCD12864_SetWindow(2,1,"單片機實驗室");    //寫入第3行信息
  289.                                                         LCD12864_SetWindow(3,1,"輸入八位密碼");                                                       
  290.                                                         JDQ_key=1;    //三極管導通,則繼電器工作,則鎖關
  291.                                                 }
  292.                                                 else
  293.                                                         flag1=1;
  294.                                                 if(flag8)
  295.                                                 {
  296.                                                         if(flag1==1)
  297.                                                         {
  298.                                                                 flag1=0;
  299.                                                                 LCD12864_SetWindow(3,0,"                ");
  300.                                                                 LCD12864_SetWindow(2,0,"                ");
  301.                                                                 LCD12864_SetWindow(2,2,"密碼錯誤");        //密碼錯誤,提示重新輸入
  302.                                                                 LCD12864_SetWindow(3,2,"重新輸入");
  303.                                                                 Delay2000ms();
  304.                                                                 wrongtimes++;                    //錯誤次數累加
  305.                                                                 LCD12864_SetWindow(2,0,"                ");//清除該行
  306.                                                                 LCD12864_SetWindow(3,0,"                ");
  307.                                                                 LCD12864_SetWindow(2,1,"單片機實驗室");
  308.                                                                 LCD12864_SetWindow(3,1,"輸入八位密碼");   
  309.                                                                 if(wrongtimes>=5)                 //當錯誤達到n次后
  310.                                                                 {       
  311.                                                                          TR0=1;                                     //啟動定時
  312.                                                                          wrongtimes=0;                //清零
  313.                                                                    LCD12864_SetWindow(2,0,"                ");//清除該行
  314.                                                                           LCD12864_SetWindow(3,0,"                ");//清除該行
  315.                                                                          nop();
  316.                                                                    LCD12864_SetWindow(2,2,"錯誤五次");
  317.                                                                          LCD12864_SetWindow(3,2,"等59秒");
  318.                                                                          while(TR0);                  //鎖定屏幕
  319.                                                                 }
  320.                                                         }
  321.                                                 }
  322.                                          }
  323.                                  }
  324.                      }
  325.                         }//flag3的else
  326.                     if(flag_time==1)//顯示的是更改時間的頁面
  327.                    {
  328.                            i = 0;
  329.                                  flag_time=0;  //要將標志位置零,不然會一直掃描
  330.                            flag_time2=1;
  331.                            LCD12864_WriteCmd(0x01);//清屏
  332.                            LCD12864_SetWindow(0,1,"修改時間日期");delay(10);//第一行顯示內容                          
  333.                            week1();delay(10);             //星期                          
  334.                            displayday1();delay(10);//日期                          
  335.                            LcdDisplaytime1();delay(10);//時間                             
  336.                          }
  337.                          if(flag_time2==1)
  338.                          {
  339.                             num=KeyPro();
  340.                            if(num==15)//改時間的確定鍵
  341.                                  {
  342.                                                 snum=0;//清零0
  343.                                                 //下面將改過的時間寫進去
  344.                                                 Ds1302Write(0x80,TIME[0]);delay(10);//秒
  345.                                                 Ds1302Write(0x82,TIME[1]);delay(10);//分
  346.                                                 Ds1302Write(0x84,TIME[2]);delay(10);//時
  347.                                                 Ds1302Write(0x8a,TIME[5]);delay(10);//星期
  348.                                                 Ds1302Write(0x86,TIME[3]);delay(10);//日
  349.                                                 Ds1302Write(0x88,TIME[4]);delay(10);//月
  350.                                                 Ds1302Write(0x8c,TIME[6]);delay(10);//年
  351.                                                 Ds1302Write(0x8E,0x80);
  352.                                                 LCD12864_WriteCmd(0x01);
  353.                                                 LCD12864_WriteCmd(0x0c);
  354.                                                 LCD12864_SetWindow(3,1,"輸入八位密碼");
  355.                                                 flag_time2=0;//在這里就可以實現退出的功能,因為當       
  356.                                                                                //flag_time2==1時,程序一直會掃描這里
  357.                                  }
  358.                            if(num==12)
  359.                            {
  360.                                                 Ds1302Write(0x8E,0x00);                                 //關閉寫保護
  361.                                                 LCD12864_WriteCmd(0x0f);
  362.                                                 delay(10);
  363.                                                 snum++;
  364.                                                 switch(snum)
  365.                                                 {
  366.                                                         case 1:        LCD12864_SetWindow(3,2,"調整秒");LCD12864_WriteCmd(0x88+5);break;
  367.                                                         case 2:        LCD12864_SetWindow(3,2,"調整分");LCD12864_SetWindow(2,3,"");break;
  368.                                                         case 3:        LCD12864_SetWindow(3,2,"調整時");LCD12864_SetWindow(2,1,"");break;
  369.                                                         case 4:        LCD12864_SetWindow(3,2,"調整星期");LCD12864_SetWindow(1,7,"");break;
  370.                                                         case 5:        LCD12864_SetWindow(3,0,"                ");
  371.                                                                         LCD12864_SetWindow(3,2,"調整日");
  372.                                                                         LCD12864_SetWindow(1,5,"");break;
  373.                                                         case 6:        LCD12864_SetWindow(3,2,"調整月");LCD12864_SetWindow(1,3,"");break;
  374.                                                         case 7:        LCD12864_SetWindow(3,2,"調整年");LCD12864_SetWindow(1,1,"");break;
  375.                                                         case 8:
  376.                                                         {
  377.                                                                         snum=0;
  378.                                                                         LCD12864_WriteCmd(0x01);
  379.                                                                         LCD12864_SetWindow(3,1,"輸入八位密碼");
  380.                                                                         LCD12864_WriteCmd(0x0c);delay(20);
  381.                                                                         Ds1302Write(0x80,TIME[0]);delay(10);
  382.                                                                         Ds1302Write(0x82,TIME[1]);delay(10);
  383.                                                                         Ds1302Write(0x84,TIME[2]);delay(10);
  384.                                                                         Ds1302Write(0x8a,TIME[5]);delay(10);
  385.                                                                         Ds1302Write(0x86,TIME[3]);delay(10);
  386.                                                                         Ds1302Write(0x88,TIME[4]);delay(10);
  387.                                                                         Ds1302Write(0x8c,TIME[6]);delay(10);
  388.                                                                         Ds1302Write(0x8E,0x80);        //打開寫保護
  389.                                                                         flag_time2=0;
  390.                                                         }break;
  391.                                                 }                                       
  392.                            }
  393.                            if(snum!=0)
  394.                            {
  395. //*******************************以下是按鍵按下減的計數******************************************/
  396.                                     if(num==13)
  397.                                    {                                          
  398.                                            LCD12864_WriteCmd(0x0c);                                          
  399.                                            switch(snum)
  400.                                            {
  401.                                               case 1: //秒
  402.                                                            {
  403.                                                               TIME[0]++;
  404.                                                                          if((TIME[0]&0x0f)==10)
  405.                                                                          {
  406.                                                                                         TIME[0]&=0xf0;
  407.                                                                                         TIME[0]+=0x10;
  408.                                                                          }
  409.                                                                          if(TIME[0]>=0x60)
  410.                                                                             TIME[0]=0;
  411.                                                                          LCD12864_WriteCmd(0x88+5);
  412.                                                                                         Ds1302Write(0,'0'+TIME[0]);
  413.                                                                                         LCD12864_WriteData('0'+TIME[0]/16);//秒
  414.                                                                                         LCD12864_WriteData('0'+(TIME[0]&0x0f));       
  415.                                                      }break;
  416.                                                                 case 2:                   //分
  417.                                                                 {
  418.                                                                         TIME[1]++;
  419.                                                                         if((TIME[1]&0x0f)==10)
  420.                                                                         {
  421.                                                                                 TIME[1]&=0xf0;
  422.                                                                                 TIME[1]+=0x10;
  423.                                                                         }
  424.                                                                         if(TIME[1]>=0x60)
  425.                                                                                 TIME[1]=0;                                                               
  426.                                                                         LCD12864_WriteCmd(0x88+3);
  427.                                                                                 Ds1302Write(0,'0'+TIME[1]);
  428.                                                                                 LCD12864_WriteData('0'+TIME[1]/16);//分
  429.                                                                                 LCD12864_WriteData('0'+(TIME[1]&0x0f));
  430.                                                                 }break;
  431.                                                                 case 3:                 //時
  432.                                                                 {
  433.                                                                         TIME[2]++;
  434.                                                                         if((TIME[2]&0x0f)==10)
  435.                                                                         {
  436.                                                                                 TIME[2]&=0xf0;
  437.                                                                                 TIME[2]+=0x10;
  438.                                                                         }
  439.                                                                         if(TIME[2]>=0x24)
  440.                                                                                 TIME[2]=0;
  441.                                                                         LCD12864_WriteCmd(0x88+1);
  442.                                                                                 Ds1302Write(0,'0'+TIME[2]);
  443.                                                                                 LCD12864_WriteData('0'+TIME[2]/16);//時
  444.                                                                                 LCD12864_WriteData('0'+(TIME[2]&0x0f));       
  445.                                                                 }break;
  446.                                                                 case 4:                //星期
  447.                                                                 {
  448.                                                                         TIME[5]++;
  449.                                                                         if(TIME[5]>=0x08)//星期最大到7
  450.                                                                                 TIME[5]=0x01;//最小到1
  451.                                                                         LCD12864_WriteCmd(0x90+7);
  452.                                                                                 Ds1302Write(0,'0'+TIME[5]);
  453.                                                                         c=TIME[5];
  454.                                                                         switch(c)
  455.                                                                         {
  456.                                                                                 case 1:LCD12864_SetWindow(1,7,"一");break;
  457.                                                                                 case 2:LCD12864_SetWindow(1,7,"二");break;
  458.                                                                                 case 3:{
  459.                                                                                                 LCD12864_WriteCmd(0x90+7);
  460.                                                                                                 DelayUs2x(10);
  461.                                                                                                 LCD12864_WriteData(0xc8);//三
  462.                                                                                                 LCD12864_WriteData(0xfd);
  463.                                                                                                 }break;
  464.                                                                                 case 4:LCD12864_SetWindow(1,7,"四");break;
  465.                                                                                 case 5:LCD12864_SetWindow(1,7,"五");break;
  466.                                                                                 case 6:LCD12864_SetWindow(1,7,"六");break;
  467.                                                                                 case 7:LCD12864_SetWindow(1,7,"日");break;
  468.                                                                         }//switch  星期的                                                                                       
  469.                                                                 }break;
  470.                                                                 case 5:           //日
  471.                                                                 {
  472.                                                                         TIME[3]++;
  473.                                                                         if((TIME[3]&0x0f)==10)
  474.                                                                         {
  475.                                                                                 TIME[3]&=0xf0;
  476.                                                                                 TIME[3]+=0x10;
  477.                                                                         }
  478.                                                                         if(TIME[3]==0x32)
  479.                                                                                 TIME[3]=0x01;
  480.                                                                         LCD12864_WriteCmd(0x90+5);

  481.                                                                                 Ds1302Write(0,'0'+TIME[3]);
  482.                                                                                 LCD12864_WriteData('0'+TIME[3]/16);//日
  483.                                                                                 LCD12864_WriteData('0'+(TIME[3]&0x0f));       
  484.                                                                 }break;
  485.                                                                 case 6:           //月
  486.                                                                 {
  487.                                                                         TIME[4]++;
  488.                                                                         if((TIME[4]&0x0f)==10)
  489.                                                                         {
  490.                                                                                 TIME[4]&=0xf0;
  491.                                                                                 TIME[4]+=0x10;
  492.                                                                         }
  493.                                                                         if(TIME[4]>=0x13)
  494.                                                                                 TIME[4]=0x01;
  495.                                                                         LCD12864_WriteCmd(0x90+3);
  496.                                                                                 Ds1302Write(0,'0'+TIME[4]);
  497.                                                                                 LCD12864_WriteData('0'+TIME[4]/16);//月
  498.                                                                                 LCD12864_WriteData('0'+(TIME[4]&0x0f));
  499.                                                                 }break;
  500.                                                                 case 7:           //年
  501.                                                                 {
  502.                                                                         TIME[6]++;
  503.                                                                         if((TIME[6]&0x0f)==10)
  504.                                                                         {
  505.                                                                                 TIME[6]&=0xf0;
  506.                                                                                 TIME[6]+=0x10;
  507.                                                                         }
  508.                                                                         if(TIME[6]==0xa0)
  509.                                                                                 TIME[6]=0;
  510.                                                                         LCD12864_WriteCmd(0x90+1);
  511.                                                                                 Ds1302Write(0,'0'+TIME[6]);
  512.                                                                                 LCD12864_WriteData('0'+TIME[6]/16);//年
  513.                                                                                 LCD12864_WriteData('0'+(TIME[6]&0x0f));
  514.                                                                 }break;
  515.                                            }  //switch
  516.                                    }
  517. //*******************************以下是按鍵按下減的計數******************************************/
  518.                                    if(num==14)                                                //減
  519.                                    {               
  520.                                                         LCD12864_WriteCmd(0x0c);
  521.                                                         switch(snum)
  522.                                                         {
  523.                                                                 case 1:          //秒
  524.                                                                 {
  525.                                                                         TIME[0]--;
  526.                                                                         if((TIME[0]&0x0f)==0x0f)
  527.                                                                         {
  528.                                                                                 TIME[0]&=0xf0;
  529.                                                                                 TIME[0]|=0x09;
  530.                                                                         }
  531.                                                                         if(TIME[0]==0xf9)
  532.                                                                                 TIME[0]=0x59;                                       
  533.                                                                         LCD12864_WriteCmd(0x88+5);
  534.                                                                                 Ds1302Write(0,'0'+TIME[0]);
  535.                                                                                 LCD12864_WriteData('0'+TIME[0]/16);//秒
  536.                                                                                 LCD12864_WriteData('0'+(TIME[0]&0x0f));
  537.                                                                 }break;
  538.                                                                 case 2:           //分
  539.                                                                 {
  540.                                                                          TIME[1]--;
  541.                                                                          if((TIME[1]&0x0f)==0x0f)
  542.                                                                          {
  543.                                                                                 TIME[1]&=0xf0;
  544.                                                                                 TIME[1]|=0x09;
  545.                                                                          }
  546.                                                                          if(TIME[1]==0xf9)
  547.                                                                                  TIME[1]=0x59;
  548.                                                                         LCD12864_WriteCmd(0x88+3);
  549.                                                                                 Ds1302Write(0,'0'+TIME[1]);
  550.                                                                                 LCD12864_WriteData('0'+TIME[1]/16);//分
  551.                                                                                 LCD12864_WriteData('0'+(TIME[1]&0x0f));
  552.                                                                 }break;
  553.                                                                 case 3:                //時
  554.                                                                 {
  555.                                                                         TIME[2]--;
  556.                                                                         if((TIME[2]&0x0f)==0x0f)
  557.                                                                         {
  558.                                                                                 TIME[2]&=0xf0;
  559.                                                                                 TIME[2]|=0x09;
  560.                                                                         }
  561.                                                                         if(TIME[2]==0xf9)
  562.                                                                                 TIME[2]=0x23;
  563.                                                                         LCD12864_WriteCmd(0x88+1);
  564.                                                                                 Ds1302Write(0,'0'+TIME[2]);
  565.                                                                                 LCD12864_WriteData('0'+TIME[2]/16);//時
  566.                                                                                 LCD12864_WriteData('0'+(TIME[2]&0x0f));
  567.                                                                 }break;
  568.                                                                 case 4:                //星期
  569.                                                                 {
  570.                                                                         TIME[5]--;                                               
  571.                                                                         if(TIME[5]<=0x00)
  572.                                                                                 TIME[5]=0x07;
  573.                                                                         c=TIME[5];                                       
  574.                                                                         LCD12864_WriteCmd(0x90+7);
  575.                                                                                 Ds1302Write(0,'0'+TIME[5]);
  576.                                                                         switch(c)
  577.                                                                         {
  578.                                                                                 case 1:LCD12864_SetWindow(1,7,"一");break;
  579.                                                                                 case 2:LCD12864_SetWindow(1,7,"二");break;
  580.                                                                                 case 3:{
  581.                                                                                                 LCD12864_WriteCmd(0x90+7);
  582.                                                                                                 DelayUs2x(10);
  583.                                                                                                 LCD12864_WriteData(0xc8);//三
  584.                                                                                                 LCD12864_WriteData(0xfd);
  585.                                                                                          }break;
  586.                                                                                 case 4:LCD12864_SetWindow(1,7,"四");break;
  587.                                                                                 case 5:LCD12864_SetWindow(1,7,"五");break;
  588.                                                                                 case 6:LCD12864_SetWindow(1,7,"六");break;
  589.                                                                                 case 7:LCD12864_SetWindow(1,7,"日");break;
  590.                                                                         }//switch  星期的
  591.                                                                 }break;
  592.                                                                 case 5:         //日
  593.                                                                 {
  594.                                                                         TIME[3]--;
  595.                                                                         if((TIME[3]&0x0f)==0x0f)
  596.                                                                         {
  597.                                                                                 TIME[3]&=0xf0;
  598.                                                                                 TIME[3]|=0x09;
  599.                                                                         }
  600.                                                                         if(TIME[3]==0x00)
  601.                                                                                 TIME[3]=0x31;
  602.                                                                         LCD12864_WriteCmd(0x90+5);
  603.                                                                                 Ds1302Write(0,'0'+TIME[3]);
  604.                                                                                 LCD12864_WriteData('0'+TIME[3]/16);//日
  605.                                                                                 LCD12864_WriteData('0'+(TIME[3]&0x0f));
  606.                                                                 }break;
  607.                                                                 case 6:         //月
  608.                                                                 {
  609.                                                                         TIME[4]--;
  610.                                                                         if((TIME[4]&0x0f)==0x0f)
  611.                                                                         {
  612.                                                                                 TIME[4]&=0xf0;
  613.                                                                                 TIME[4]|=0x09;
  614.                                                                         }
  615.                                                                         if(TIME[4]==0x00)
  616.                                                                                 TIME[4]=0x12;
  617.                                                                        
  618.                                                                         LCD12864_WriteCmd(0x90+3);
  619.                                                                                 Ds1302Write(0,'0'+TIME[4]);
  620.                                                                                 LCD12864_WriteData('0'+TIME[4]/16);//月
  621.                                                                                 LCD12864_WriteData('0'+(TIME[4]&0x0f));
  622.                                                                 }break;
  623.                                                                 case 7:           //年
  624.                                                                 {
  625.                                                                         TIME[6]--;
  626.                                                                         if((TIME[6]&0x0f)==0x0f)
  627.                                                                         {
  628.                                                                                 TIME[6]&=0xf0;
  629.                                                                                 TIME[6]|=0x09;
  630.                                                                         }
  631.                                                                         if(TIME[6]==0xf9)
  632.                                                                                 TIME[6]=0x99;                                       
  633.                                                                         LCD12864_WriteCmd(0x90+1);
  634.                                                                                 Ds1302Write(0,'0'+TIME[6]);
  635.                                                                                 LCD12864_WriteData('0'+TIME[6]/16);//年
  636.                                                                                 LCD12864_WriteData('0'+(TIME[6]&0x0f));
  637.                                                                 }break;
  638.                                                         }//switch                        
  639.                                     }       
  640.                             }
  641.                     }
  642.             } //while
  643. }
  644. //===============================中斷處理函數===============================//
  645. //是錯誤次數達到一定次數后的中斷         
  646. void init_irq1()interrupt 1 using 0
  647. {
  648.         TH0=(65536-50000)/256;
  649.         TL0=(65536-50000)%256;
  650.         a++;
  651.         if(a>=20)
  652.         {
  653.                 a=0;                                                                                        //a大于等于20時說明一秒到了
  654.                 miao--;                                                                                        //五次錯誤后將會鎖屏1分鐘后才能輸入密碼
  655.                 clock(3,miao);
  656.         }
  657.         if(miao<=0)
  658.         {
  659.                 TR0=0;
  660.                 miao=59;                                                                                //當倒計時完成后將時間重新置于一分鐘即是60
  661.                 LCD12864_SetWindow(2,0,"                ");
  662.                 LCD12864_SetWindow(3,0,"                ");
  663.                 LCD12864_SetWindow(2,1,"單片機實驗室");                    //寫入第一行信息,主循環中不再更改此信息,所以在while之前寫入
  664.                 LCD12864_SetWindow(3,1,"輸入八位密碼");
  665.                 flag_time2=0;
  666.         }
  667.        
  668. }
  669. //==============================密碼輸入(密碼修改)=============================//
  670. void MIMA_input()
  671. {       
  672.         unsigned char i=0,m,k=1,flag7 = 1;
  673.        
  674.         if(flag5 == 1)
  675.   {
  676.                 if(k2 == 0)
  677.     {
  678.                         delay(5);
  679.                         if(k2 == 0)                                                                  //如果掃描是按鍵有效值則進行處理
  680.                         {        
  681.                                 flag7 = 0;
  682.                                 flag8 = 1;       
  683.                                 if(i == 0)                                                           
  684.                                 LCD12864_WriteCmd(0x01);//輸入是第一個字符的時候需要把改行清空,方便觀看密碼
  685.                                 if(p==1)//修改個人密碼
  686.                                 {
  687.                                         LCD12864_SetWindow(0,0,"修改個人密碼");
  688.                                          LCD12864_SetWindow(1,2,"新密碼");
  689.                                         LCD12864_SetWindow(2,1,"請輸入密碼");
  690.                                         LCD12864_WriteCmd(0x0c);
  691.                                 }
  692.                                 if(p==0)//修改管理員密碼
  693.                                 {
  694.                                         LCD12864_SetWindow(0,0,"修改管理員密碼");
  695.                                          LCD12864_SetWindow(1,2,"新密碼");
  696.                                         LCD12864_SetWindow(2,1,"請輸入密碼");
  697.                                         LCD12864_WriteCmd(0x0c);
  698.                                 }
  699.                             for(i = 0; i < 8 ; i++)                             //密碼是8位,大于8位時不再輸入按鍵值
  700.                             {
  701.                                           delay(10);          
  702.                                          m=0XFF;
  703.                                          while(m==0XFF)
  704.                                          {
  705.                                             m=KeyPro();                                          //掃描鍵盤
  706.                                                  if(m == 11)
  707.                                                  {
  708.                                                          delay(20);
  709.                                                          if(m == 11)
  710.                                                          {
  711.                                                                  i= -1;                                         //計數清零
  712.                                                                    LCD12864_SetWindow(2,0,"                ");
  713.                                                          }
  714.                                                  }
  715.                               }
  716.                                          delay(10);
  717.                                          if(m != 11)
  718.                                          {
  719.                                                   if(m >= 10)
  720.                                                  {
  721.                                                          i--;
  722.                                                  }
  723.                                                  if(i==0)
  724.                                                      LCD12864_SetWindow(2,0,"*              ");
  725.                                                   if( m>=0 && m<10 )                        //設置密碼數位為0~9有效
  726.                                                  {                  
  727.                                                                 LCD12864_char(2,i,'*');                //星號(*)
  728.                                                                 if(p == 1)
  729.                                                                 {
  730. ……………………

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

所有資料51hei提供下載:
密碼鎖1.12864 720.zip (152.87 KB, 下載次數: 107)




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

使用道具 舉報

沙發
ID:647748 發表于 2019-12-31 23:17 來自手機 | 只看該作者
樓主仿真有沒有
回復

使用道具 舉報

板凳
ID:232129 發表于 2020-2-13 20:40 | 只看該作者
謝謝老板
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 综合色在线 | 日韩久久久久 | jlzzjlzz国产精品久久 | 狠狠综合久久av一区二区老牛 | 91直接看 | 亚洲精品2区 | 四虎在线观看 | 婷婷丁香激情 | 99精品99久久久久久宅男 | 99re视频在线 | 国产黄色大片 | 福利二区| 国产在线资源 | 亚洲国产一区二区三区 | 九九精品视频在线 | 日本欧美大片 | 这里有精品 | 亚洲国产一区二区三区 | 四虎影视1304t| 日韩毛片在线视频 | 999免费观看视频 | 国产高清视频在线 | 成人h片在线观看 | 亚洲高清在线观看 | 亚洲二区精品 | 欧美日韩亚洲在线 | 亚洲一区二区三区在线播放 | 成人国产精品久久 | 高清国产午夜精品久久久久久 | 日韩在线视频一区二区三区 | 欧美日韩国产一区二区三区 | 久久1区 | 亚洲精品aⅴ | 中文字幕久久久 | 亚洲国产成人av | 欧美一级在线免费观看 | 久久久久国产精品一区三寸 | 操久久| 第一av| 久色视频在线 | 美日韩一区二区 |