專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

基于單片機(jī)控制12864顯示矩陣鍵盤輸入的密碼鎖

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2011年10月18日   【字體:
/*----------------------------------------------------
程序設(shè)計(jì):胥學(xué)辰--------絕對(duì)原創(chuàng)!
設(shè)計(jì)時(shí)間:2011-10-10----2011-10-11!
寫程序用時(shí)一天,調(diào)程序用時(shí)一天,累死我了!不過也算很有收獲啊!
程序功能:
1:輸入密碼對(duì)比,正確則解鎖,錯(cuò)誤則開始60秒倒計(jì)時(shí)。
2:用戶必須在60秒內(nèi)重新輸入正確的密碼,否則鎖定鍵盤。
3:如果用戶在60秒內(nèi)沒有輸入正確密碼,則鍵盤鎖定。
4:如果用戶在60秒內(nèi)輸入錯(cuò)誤密碼超過3次,即使沒有記時(shí)完成也會(huì)鎖定鍵盤。
5:在鍵盤鎖定的同時(shí),報(bào)警器會(huì)發(fā)出警報(bào)聲。
6:以上操作過程中會(huì)有文字提示輸入密碼正確還是錯(cuò)誤。
7:在鍵盤鎖定的情況下,只有在24小時(shí)后鍵盤解鎖,才再有上述的輸入機(jī)會(huì)。
8:用戶在使用過程中如果希望修改密碼,可以進(jìn)入密碼修改界面,先輸入原始密碼。
9:如果輸入與原始密碼相同,則跳出新密碼設(shè)置界面,用戶可設(shè)置新密碼。
10:在設(shè)置過程中的輸入功能與前面的密碼輸入功能相同。
11:同樣修改密碼的輸入錯(cuò)誤次數(shù)有限,否則鍵盤鎖死。
12:密碼輸入正確可以返回歡迎界面,重新開始。
13:初始密碼見說明書,用戶應(yīng)該立即重新設(shè)置密碼。
本程序的完整版本下載地址:http://www.torrancerestoration.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:重新輸入!密:碼:密碼輸入錯(cuò)誤!密碼輸入無誤!剩余輸入幾次:鍵盤恢復(fù):密碼重置成功!輸入新密碼!";
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;
}
關(guān)閉窗口

相關(guān)文章