找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4005|回复: 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 单片机教程网

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