专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于单片机控制12864显示矩阵键盘输入的密码锁

作者:佚名   来源:本站原创   点击数:  更新时间:2011年10月18日   【字体:
/*----------------------------------------------------
程序设计:胥学辰--------绝对原创!
设计时间:2011-10-10----2011-10-11!
写程序用时一天,调程序用时一天,累死我了!不过也算很有收获啊!
程序功能:
1:输入密码对比,正确则解锁,错误则开始60秒倒计时。
2:用户必须在60秒内重新输入正确的密码,否则锁定键盘。
3:如果用户在60秒内没有输入正确密码,则键盘锁定。
4:如果用户在60秒内输入错误密码超过3次,即使没有记时完成也会锁定键盘。
5:在键盘锁定的同时,报警器会发出警报声。
6:以上操作过程中会有文字提示输入密码正确还是错误。
7:在键盘锁定的情况下,只有在24小时后键盘解锁,才再有上述的输入机会。
8:用户在使用过程中如果希望修改密码,可以进入密码修改界面,先输入原始密码。
9:如果输入与原始密码相同,则跳出新密码设置界面,用户可设置新密码。
10:在设置过程中的输入功能与前面的密码输入功能相同。
11:同样修改密码的输入错误次数有限,否则键盘锁死。
12:密码输入正确可以返回欢迎界面,重新开始。
13:初始密码见说明书,用户应该立即重新设置密码。
本程序的完整版本下载地址:http://www.51hei.com/f/12686412.rar
键盘功能说明:
1:输入密码:15键。
2:修改密码:14键。           
3:确定输入:13键。
4:重新输入:12键。
5:返回欢迎界面:11键。
注:返回按键只有在密码输入正确的情况下使用。
------------------------------------------------------*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint i3;
uchar t=15,time,s,g,num,temp,key1=1,Js,Js1,Js2,Js3;
uchar flag=1,flag1=1,flag2,flag3,j,j1,j2,Mi,Mi1,Mi2,m,m1=19891111,m2,m3;
uchar time1,time2,time3,time4,time5,flag4,flag5=2,flag6,flag7;
uchar xdata Sm,Sm1,Sm2,Sm3;
sbit rs=P2^6;
sbit rw=P2^5;
sbit en=P2^7;
sbit psb=P2^2;
uchar xdata dat_Sz_Ma[8]={0,0,0,0,0,0,0,0};
uchar xdata dat_Sz_Mi[8]={0,0,0,0,0,0,0,0};
uchar xdata dat_YS[8]={0,0,0,0,0,0,0,0};
uchar xdata dat_SR[8]={0,0,0,0,0,0,0,0};
uchar xdata table_Ts[]="15:输入密码!14:重置密码!13:确定输入!12:重新输入!密:码:密码输入错误!密码输入无误!剩余输入几次:键盘恢复:密码重置成功!输入新密码!";
void delay(uint z)
{
    uchar x,y;
 for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}
uchar key()
{
   P3=0xfe;
   temp=P3;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
     while(temp!=0xf0)
     {
      temp=P3;
     switch(temp)
      {
       case 0xee:num=0;Mi=1;
        break;
       case 0xde:num=1;Mi=1;
        break;
       case 0xbe:num=2;Mi=1;
        break;
       case 0x7e:num=3;Mi=1;
        break;
      }
      
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      // k=0;
      }
     }
    }

   P3=0xfd;
   temp=P3;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
     while(temp!=0xf0)
     {
      temp=P3;
     switch(temp)
      {
       case 0xed:num=4;Mi=1;
        break;
       case 0xdd:num=5;Mi=1;
        break;
       case 0xbd:num=6;Mi=1;
        break;
       case 0x7d:num=7;Mi=1;
        break;
      }
     
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      
      }
     }
    }


   P3=0xfb;
   temp=P3;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
     while(temp!=0xf0)
     {
      temp=P3;
     switch(temp)
      {
       case 0xeb:num=8;Mi=1;
        break;
       case 0xdb:num=9;Mi=1;
        break;
       case 0xbb:num=10;Mi=0;
        break;
       case 0x7b:num=11;Mi2=0;
        break;
      }
     // k=1;
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      
      }
     }
    }


   P3=0xf7;
   temp=P3;
   temp=temp&0xf0;
   while(temp!=0xf0)
    {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
     while(temp!=0xf0)
     {
      temp=P3;
     switch(temp)
      {
       case 0xe7:num=12;Mi=0;
        break;
       case 0xd7:num=13;Mi=0;
        break;
       case 0xb7:num=14;Mi1=0;
        break;
       case 0x77:num=15;Mi1=0;
        break;
      }
     // k=1;
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      
      }
     }
    }
return num;

}
void write_com(uchar com)
{
   rs=0;
   rw=0;
   P0=com;
   delay(5);
   en=1;
   delay(5);
   en=0;
}
void write_data(uchar dat)
{
   rs=1;
   rw=0;
   P0=dat;
   delay(5);
   en=1;
   delay(5);
   en=0;
}
void write_gw_sw(uchar add,uchar gs)
{
   uchar gw,sw;
   gw=gs%10;
   sw=gs/10;
   write_com(0x80+add);
   write_data(0x30+sw);
   write_data(0x30+gw);
}
void write_fz_mz(uchar add,uchar fm)
{
   uchar xdata gw,sw,bw,qw,ww,ws;
   gw=fm%10;
   sw=fm/10%10;
   bw=fm/100%10;
   qw=fm/1000%10;
   ww=fm/10000%10;
   ws=fm/100000%10;
   write_com(0x80+add);
   write_data(0x30+ws);
   write_data(0x30+ww);
   write_data(0x3a);
   write_data(0x30+qw);
   write_data(0x30+bw);
   write_data(0x3a);
   write_data(0x30+sw);
   write_data(0x30+gw);
   //write_data(0x3a);
}
void write_SR(uchar add)
{
    uchar i;
 write_com(0x80+add);
 for(i=0;i<j;i++)
   {
     write_data(0x2a);
   }
}
void write_SZ_Ma(uchar add)
{
    uchar i;
 write_com(0x80+add);
 for(i=0;i<j1;i++)
   {
     write_data(0x2a);
   }
}
void write_SZ_Mi(uchar add)
{
    uchar i;
 write_com(0x88+add);
 for(i=0;i<j2;i++)
   {
     write_data(0x2a);
   }
}
void Tishi_password(uchar add,uchar i1,uchar i2)
{
   uchar i;
   write_com(add);
   for(i=i1;i<i2;i++)
     {
  write_data(table_Ts[i]);
   }
}
void Remain_JS(uchar add)
{
 write_com(add);
 write_data(0x30+4-Js);
 }
void Remain_JS2(uchar add)
{
 write_com(add);
 write_data(0x30+4-Js2);
 }
void Yt()
{
    if(flag4==1)
   {
   write_com(0x01);
   TR1=0;
   TR0=0;
   flag4=0;
   flag=1;
   flag1=1;
   flag2=0;
   flag3=0;
   flag5=2;
   flag6=0;
   t=15;
   m=0;
   m2=0;
   m3=0;;
   j=0;
   j1=0;
   j2=0;
   Js=0;
   Js1=0;
   Js2=0;
   time1=0;
   time2=0;
   time3=0;
   time4=0;
   P1=0x0f;
   
    }  
}
void enter_shuru_Ma()
{
   //key1=key();
   if(key1<10&&Mi==1)
 {
  dat_SR[j]=key1;
  j++;
     Mi=0;
  m=m*10+dat_SR[j-1];        
  if(flag3==1)
    {
      j=0;
   m=0;
   Mi=1;
   flag3=0;
   time1=0;
   time2=0;
   time3=0;
   time4=0;
   write_com(0x01);
   write_com(0x82);
      }  
 }write_SR(0x02);
}
void enter_shezhi_Ma()
{
   //key1=key();
   if(key1<10&&Mi==1)
 {
  dat_Sz_Ma[j1]=key1;
  j1++;
     Mi=0;
  m2=m2*10+dat_Sz_Ma[j1-1];        
  if(flag3==1)
    {
      j1=0;
   m2=0;
   Mi=1;
   flag3=0;
   write_com(0x01);
   write_com(0x82);
      }  
 }write_SZ_Ma(0x02);
}
void enter_shezhi_Mi()
{
   //key1=key();
   if(key1<10&&Mi==1)
 {
  dat_Sz_Mi[j2]=key1;
  j2++;
     Mi=0;
  m3=m3*10+dat_Sz_Mi[j2-1];
          
  if(flag3==1)
    {
      j2=0;
   m3=0;
   Mi=1;
   flag3=0;
   write_com(0x01);
   write_com(0x8A);
      }  
 }
 write_SZ_Mi(0x02);
}
void anjian()
{
   if(key1==15&&Mi1==0)
     {
    flag1=0;
    flag5=0;
    Mi1=1;
   }
   if(key1==14&&Mi1==0)
     {
    flag1=0;
    flag5=1;
    Mi1=1;
   }
   if(flag1==0)
     {
    if(key1==13&&Mi==0)
      {
     flag2=1;
     Mi=1;
    }
    if(key1==12)
      {
     flag3=1;
    }
    if(key1==11&&Mi2==0&&flag7==1)
   {
     flag4=1;
     Mi2=1;
     flag7=0; 
     }
 }
}
void init()
{
   TMOD=0x11;
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   TH1=(65536-50000)/256;
   TL1=(65536-50000)%256;
   ET1=1;
   ET0=1;
   EA=1;
   psb=1;
   write_com(0x30);
   write_com(0x0e);
   write_com(0x01);
   write_com(0x80);
}
void main()
{
   init();
   P1=0x0f;
   while(1)
     {
  Yt();
  if(Js1==1||Js>=4||Js2>=4)
    {
   TR0=0;
   TR1=1;
   Tishi_password(0x90,99,107);
   write_fz_mz(0x07+13,time5);
   }
  if(t!=0&&Js<4&&Js2<4&&Js3!=1)
    {
      key1=key();
      anjian();
   }
  if(flag==1&&flag1==1)
    {
      Tishi_password(0x80,0,13);
   Tishi_password(0x90,13,26);
   Tishi_password(0x88,26,39);
   Tishi_password(0x98,39,52);
     }
  if(flag5==1)
    {
   if(flag==1&&flag1==0)
     {
       write_com(0x01);
    flag=0;
      }
    if(flag==0&&flag1==0)
     {  
       write_gw_sw(0x07,t);
    if(flag6==0)
        { 
       enter_shezhi_Ma();
       Tishi_password(0x80,52,56);
      }
    if(flag6==1)
        {   
       write_SZ_Ma(0x02);
       Tishi_password(0x80,52,56);
       enter_shezhi_Mi();
       Tishi_password(0x88,56,60);
       Tishi_password(0x90,121,132);
        if(flag2==1)
         {   
        flag2=0;
        m1=m3;
        Tishi_password(0x98,108,121);
        for(i3=0;i3<500;i3++)
        delay(20000);
        flag4=1;
       } 
      }
    }
     
     if(flag2==1||Js1==1)
     {
     Js1=0;
     flag2=0;
     if(m1==m2)
       { 
            t=15;
      TR0=0;
      Js2=0;
      flag6=1;
      }
      else
       {
      Js2++;
      TR0=1;
      Tishi_password(0x88,60,73);
      Tishi_password(0x98,86,99);
      Remain_JS2(0x9f);
      }
              }
     }
  if(flag5==0)
    {
   if(flag==1&&flag1==0)
     {
       write_com(0x01);
    flag=0;
      }
    if(flag==0&&flag1==0)
     {  
       enter_shuru_Ma();
    Tishi_password(0x80,52,56);
    write_gw_sw(0x07,t);
    }
    if(flag2==1||Js1==1)
     {
     flag2=0;
     Js1=0;
     if(m==m1)
       { 
            Js=0;
      flag7=1;
      t=15;
      TR0=0;
            P1=0xf0;
      Tishi_password(0x88,73,86);
      Tishi_password(0x98,86,99);
      Remain_JS(0x9f);
      }
      else
       {
      Js++;
         TR0=1;
      flag7=0;
      P1=0x00+Js;
      Tishi_password(0x88,60,73);
      Tishi_password(0x98,86,99);
      Remain_JS(0x9f);
      }
              }
    }
     }
}
void timer0() interrupt 1 using 0
{
    TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 time++;
 if(time==20)
   {
      t--;
   time=0;
   }
 
 if(t==0)
   {
      Js1=1;
   t=0;
   TR0=0;
   Js=3;
   Js2=3;
  }
}
void timer1() interrupt 3 using 0
{
    TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 time1++;
 if(time1==10)
   {
      time2++;
   time1=0;
    }
 if(time2==30)
   {
      time3++;
   time2=0;
   flag4=1;
   //Js3=1;
   //TR1=0; 
    }
 /*if(time3==60)
   {
      time4++;
   time3=0;
   //flag4=1;
    }
 if(time4==24)
   {
      flag4=1;
   time4=0;
    }*/
    
    time5=time2;//+time3*100;//+time4*10000;
}
关闭窗口

相关文章