<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > LCD1602密碼鎖設(shè)計

          LCD1602密碼鎖設(shè)計

          作者: 時間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
          密碼鎖說明:(KT實驗板調(diào)試成功)


          本密碼鎖是利用8051單片機的控制結(jié)合1602LCD,設(shè)計的一個微電腦LCD密碼鎖,可以用在需要密碼輸入的場合中,例如要當門禁用時,需要實際配合電子門鎖。也可以設(shè)計在保險中做密碼鎖控制中。本密碼鎖應(yīng)用的知識主要有:
          1. 8051 4x4矩陣鍵盤掃描輸入
          2. 1602 LCD顯示
          3. 密碼比較處理的設(shè)計方法
          4. 定時器的使用
          5. 24cxxx的應(yīng)用等

          本文引用地址:http://www.ex-cimer.com/article/201611/317316.htm

          功能說明:

          1. 使用LCD顯示器來顯示密碼輸入的相關(guān)消息及提示
          2. 可以設(shè)置6位數(shù)字(0-9)密碼
          3. 內(nèi)定另一組數(shù)字密碼為:000000
          4. 密碼輸入正確則繼電器啟動2s
          5. 密碼輸入正確或錯誤都有相應(yīng)的聲音提示
          6. 密碼輸入3次錯誤,系統(tǒng)將自動鎖定,30分鐘內(nèi)不準使用,30分鐘后自動開啟
          7. 密碼輸入時,如果在10秒內(nèi)沒有按鍵,表示放棄本次輸入,則自動跳出密碼輸入狀態(tài),進入歡迎界面
          8. 可以修改密碼或用原始密碼
          9. 斷電后密碼仍然存在(保存在24c02中)
          10.具有按鍵復位功能

          硬件連接:

          /*1602 LCD連接線圖:
          ---------------------------------------------------
          | LCM-----51  | LCM-----51  | LCM------51 |
          | ----------------------------------------------- |
          | DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 |
          | DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 |
          | DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
          | DB3-----P0.3 | DB7-----P0.7 | VLCD接1K電阻到GND |
          ---------------------------------------------------

          接口說明:1. P1口: 4x4矩陣鍵盤
          2. P2.4 工作指示燈
          3. P2.5 繼電器控制端
          4. P3.7 蜂鳴器控制端
          5. P3.3 24c02時鐘端
          6. P3.4 24c02數(shù)據(jù)端
          /*接盤按鍵說明:
          --------------------------------------------------
          | 1 | 2 | 3 | A |
          - - - - - - - - - - - - -
          | 4 | 5 | 6 | B |
          - - - - - - - - - - - - -
          | 7 | 8 | 9 | C |
          - - - - - - - - - - - - -
          | * | 0 | # | D |
          --------------------------------------------------
          注:A--表示輸入密碼
          B--表示設(shè)置新密碼
          C--復位端口

          附加說明:

          1. LCD1602驅(qū)動-----------明皓
          2. 4x4鍵盤掃描-----------KT學習綜合實驗源程序
          3. 密碼比較原理----------8051單片機課程設(shè)計實訓教材
          4. 24C02的讀寫操作-------偉納電子ME300B單片機開發(fā)系統(tǒng)演示程序

          zhaojun 2007/10/1

          zhaojun_xf@163.com

          部分代碼:

          //========================================== 主函數(shù)部分 ==================================================

          /*****************************************************
          函 數(shù) 名:void clearmen(void)
          功 能:系統(tǒng)初始化
          說 明:對系統(tǒng)用的標志位和定時器進行初始化
          入口參數(shù):無
          返 回 值:無
          *****************************************************/
          void clearmen(void)
          {
          flag1= 1; // Choice_menu()調(diào)用標志
          signx= 1; // 循環(huán)標志
          flag = 1; // 調(diào)用輸入新密碼提示標志位
          mark = 1; // 循環(huán)標志位
          num = 0; // 按鍵錯誤計數(shù)器
          TH0=0x3C;TL0=0xB0; // 50ms定時初值
          TH1=0x3C;TL1=0xB0; // 50ms定時初值
          TMOD=0x11;ET0=1;TR0=0;ET1=1;TR1=0;EA=1;
          }

          /*****************************************************
          函 數(shù) 名:main()
          功 能:主函數(shù)
          說 明:對按鍵和顯示進行控制
          入口參數(shù):無
          返 回 值:無
          *****************************************************/
          void main(void)
          {

          uchar Key_value;
          Delay400Ms(); // 啟動等待,等LCM講入工作狀態(tài)
          LCMInit(); // LCM初始化
          Delay400Ms();
          clearmen(); // 系統(tǒng)初始化
          while(1)
          {
          P1=0xf0;
          if(((P1&0xf0)!=0xf0)&(flag1==1)&(num<3)) // 有鍵按下
          {
          Key_value=Key_switch(); // 按鍵掃描
          if(Key_value!=0) // 的確有鍵按下
          {
          Choice_menu(); // 調(diào)用選擇程序
          flag1=0; // Choice_menu()調(diào)用標志
          signx=1; // 循環(huán)標志
          }
          while(signx==1)
          {
          TR0=0; // 定時器0關(guān),從先開始計時
          TR0=1; // 定時器0開
          P1=0xf0; // P1口賦值,從而判斷有無按鍵
          if((P1&0xf0)!=0xf0)
          {
          Key_value=Key_switch(); // 按鍵掃描
          if(Key_value==65) // 如果按鍵是"A",則輸入密碼
          {
          while(mark==1)
          {
          Password_importation(); // 密碼輸入
          }
          flag1=1; // Choice_menu()調(diào)用標志
          signx=0; // 循環(huán)標志
          }
          if(Key_value==66) // 如果按鍵是"B",則輸入新密碼
          {
          while(mark==1) // 輸入前比較秘密,密碼正確進入新密碼設(shè)置
          { // 密碼錯誤退出密碼設(shè)置
          Password_importation(); // 密碼輸入
          }
          //-------------------------------
          if(mark0!=0) // mark0=1:密碼比較正確可以輸入新密碼
          { // mark0=0:密碼比較錯誤不能輸入新密碼
          mark=1; // 進入循環(huán)標志
          while(mark==1)
          {
          NewPassword_set(); // 新密碼設(shè)置函數(shù)
          }
          mark=1; // 進入循環(huán)標志
          while(mark==1)
          {
          NewPassword_set_again(); // 再次輸入密碼
          }
          }
          flag1=1; // Choice_menu()調(diào)用標志
          signx=0; // 循環(huán)標志
          }
          }
          }
          }
          else
          {
          Welcome_face(); // 歡迎界面
          mark = 1; // 循環(huán)標志
          mark0= 0; // 是否輸入新密碼標志位
          flag1=1; // Choice_menu()調(diào)用標志
          WriteCommandLCM(0x0C,1); // 關(guān)光標顯示
          sign=(bit)ReadCurrent(10); // 密碼比較標志位
          }
          if(num==3) // 3次輸入錯誤密碼,系統(tǒng)鎖定30min
          {
          ET1=1;TR1=1; // 開定時器T1,定時30分鐘
          }
          }
          }

          //========================================== 密碼控制部分 ==================================================

          /*****************************************************
          函 數(shù) 名:void NewPassword_set_again(void)
          功 能:第二次輸入密碼
          說 明:第二次輸入密碼并存入暫存器,再調(diào)用比較程序
          入口參數(shù):無
          返 回 值:無
          *****************************************************/
          void NewPassword_set_again(void)
          {
          bit sign1;
          uchar key_data;
          P1=0xf0; // 判斷是否有鍵按下
          if(flag==1)
          {
          NewPassword_again(); // 顯示密碼輸入界面
          Delay400Ms();
          flag=0; // 調(diào)用輸入新密碼提示標志位
          Count=0; // 按鍵次數(shù)計數(shù)器置0
          Delay400Ms();
          }
          if((P1&0xf0)!=0xf0) // 判斷是否有鍵按下
          {
          key_data=Key_switch(); // 調(diào)用按鍵轉(zhuǎn)換程序
          if((key_data!=0)&(key_data!=65)&(key_data!=66)&(key_data!=67)&(key_data!=68)&(key_data!=35)&(key_data!=42))
          {//按鍵不能為數(shù)字(0~9)以外.A B C D # *
          Count++; // 按鍵次數(shù)器加1
          Led_hint(); // 按鍵指示
          Beep(); // 按一下鍵發(fā)一音
          sign1=1; // 有鍵按下標志位
          }
          }
          if((sign1==1)&(flag==0)) // 有鍵按下
          {
          Scan_starnumber(); // 在密碼顯示區(qū)顯示" ****** "
          sign1=0; // 按鍵標志位清0
          T_Password[Count-1]=key_data; // 按鍵值放入密碼暫存器
          }
          if(Count==6) // 6次按鍵則進行密碼比較
          {
          Count=0; // 計算清0,從先計數(shù)
          flag =1; // 調(diào)用輸入新密碼提示標志位
          mark =0; // 循環(huán)標志位
          WriteCommandLCM(0x0C,1); // 關(guān)光標顯示
          Newpassword_comparison(); // 新密碼設(shè)置比較
          }
          }

          /*****************************************************
          函 數(shù) 名:void Newpassword_comparison(void)
          功 能:第二次輸入密碼比較
          說 明:對第一次輸入的密碼與第二次輸入的密碼進行比較
          入口參數(shù):無
          返 回 值:無
          *****************************************************/
          void Newpassword_comparison(void)
          {
          uchar Number=0;
          while((T_Password[Number]==N_Password[Number])&(Number<6))// 密碼比較
          {
          Number++; // 計數(shù)值加1
          }
          if(Number>=6) // 密碼正確
          {
          Newpassword_OK(); // 新密碼設(shè)置成功提示
          WriteToROM(T_Password,0,6); // 密碼設(shè)置成功,則把密碼存入24c02中
          sign =1; // 比較新密碼標志
          WriteCurrent((uchar)sign,10); // 存入標志位
          Delay400Ms();
          Beep(); // 正確提示音
          Delay400Ms();
          Beep();
          mark=0;
          }
          else // 密碼錯誤,報警
          {
          Newpassword_ERROR(); // 新密碼設(shè)置失敗提示
          num=0;
          sign =0; // 比較舊密碼標志
          Delay400Ms();
          Beep();Beep();Beep(); // 錯誤提示音
          Delay400Ms();
          Beep();Beep();Beep();
          Delay1s(); // 延時1s
          mark=0;
          }
          }

          /*****************************************************
          函 數(shù) 名:void NewPassword_set(void)
          功 能:新密碼設(shè)置
          說 明:修改密碼
          入口參數(shù):無
          返 回 值:無
          *****************************************************/
          void NewPassword_set(void)
          {
          bit sign1;
          uchar key_data;
          P1=0xf0; // 判斷是否有鍵按下
          if(flag==1)
          {
          NewPassword_face(); // 顯示密碼輸入界面
          Delay400Ms();
          flag=0; // 調(diào)用輸入新密碼提示標志位
          Count=0; // 按鍵次數(shù)計數(shù)器置0
          Delay400Ms();
          }
          if((P1&0xf0)!=0xf0) // 判斷是否有鍵按下
          {
          key_data=Key_switch(); // 調(diào)用按鍵轉(zhuǎn)換程序
          if((key_data!=0)&(key_data!=65)&(key_data!=66)&(key_data!=67)&(key_data!=68)&(key_data!=35)&(key_data!=42))
          {//按鍵不能為數(shù)字(0~9)以外.A B C D # *
          Count++; // 按鍵次數(shù)器加1
          Led_hint(); // 按鍵指示
          Beep(); // 按一下鍵發(fā)一音
          sign1=1; // 有鍵按下標志位
          }
          }
          if((sign1==1)&(flag==0)) // 有鍵按下
          {
          Scan_starnumber(); // 在密碼顯示區(qū)顯示" ****** "
          sign1=0; // 按鍵標志位清0
          N_Password[Count-1]=key_data; // 按鍵值放入密碼暫存器
          }
          if(Count==6) // 6次按鍵則進行密碼比較
          {
          Count=0; // 計算清0,從先計數(shù)
          flag =1; // 調(diào)用輸入新密碼提示標志位
          mark =0; // 循環(huán)標志位
          WriteCommandLCM(0x0C,1); // 關(guān)光標顯示
          }
          }
          /*****************************************************
          函 數(shù) 名:void Password_importation(void)
          功 能:密碼輸入
          說 明:輸入密碼并調(diào)用密碼比較函數(shù)進行比較
          入口參數(shù):無
          返 回 值:無
          *****************************************************/
          void Password_importation(void)
          {
          bit sign1;
          uchar key_data;
          P1=0xf0; // 判斷是否有鍵按下
          if(((P1&0xf0)!=0xf0)&(flag==1)) // 有鍵按下,且是第一次
          {
          key_data=Key_switch();
          if(key_data!=0)
          {
          Pass_face(); // 顯示密碼輸入界面
          Delay400Ms();
          flag=0; // 調(diào)用密碼輸入提示標志位
          Count=0; // 輸入密碼個數(shù)計數(shù)器置0
          Delay400Ms();
          }
          }
          if((P1&0xf0)!=0xf0) // 判斷是否有鍵按下
          {
          key_data=Key_switch(); // 調(diào)用按鍵轉(zhuǎn)換程序
          if((key_data!=0)&(key_data!=65)&(key_data!=66)&(key_data!=67)&(key_data!=68)&(key_data!=35)&(key_data!=42))
          {//按鍵不能為數(shù)字(0~9)以外.A B C D # *
          Count++; // 按鍵次數(shù)器加1
          Led_hint(); // 按鍵指示
          Beep(); // 按一下鍵發(fā)一音
          sign1=1; // 有鍵按下標志位
          }
          }
          if((sign1==1)&(flag==0)) // 有鍵按下
          {
          Scan_starnumber(); // 在密碼顯示區(qū)顯示" ****** "
          sign1=0; // 按鍵標準位清0
          T_Password[Count-1]=key_data; // 按鍵值放入密碼暫存器
          }
          if(Count==6) // 6次按鍵則進行密碼比較
          {
          Count=0; // 計算清0,從先計數(shù)
          flag =1; // 調(diào)用密碼輸入提示標志位
          mark =0; // 循環(huán)標志位
          WriteCommandLCM(0x0C,1); // 關(guān)光標顯示

          if(sign==0)
          PasswordComparison(0); // 輸入按鍵與原始密碼比較
          else PasswordComparison(1); // 輸入按鍵與新密碼比較
          }
          }

          /*****************************************************
          函 數(shù) 名:void Scan_starnumber(void)
          功 能:顯示密碼位為星號
          說 明:在密碼顯示區(qū)顯示 " ****** "
          入口參數(shù):無
          返 回 值:無
          *****************************************************/
          void Scan_starnumber(void)
          {
          switch(Count) // 在相應(yīng)的地方顯示"*"
          {
          case 1:DisplayOneChar(5,1,42);break; //-----*-----------//
          case 2:DisplayOneChar(6,1,42);break; //------*----------//
          case 3:DisplayOneChar(7,1,42);break; //-------*---------//
          case 4:DisplayOneChar(8,1,42);break; //--------*--------//
          case 5:DisplayOneChar(9,1,42);break; //---------*-------//
          case 6:DisplayOneChar(10,1,42);break; //----------*------//
          } //-----*******-----//
          }

          /*****************************************************
          函 數(shù) 名:void PasswordComparison(bit mark)
          功 能:密碼比較程序
          說 明:對輸入密碼進行比較
          入口參數(shù):mark:當mark=1時,對原始密碼進行比較;當mark=0時,對原始密碼進行比較
          返 回 值:無
          *****************************************************/
          void PasswordComparison(bit mark1)
          {
          uchar Number=0;
          if(mark1==0) // 輸入按鍵與原始密碼比較
          {
          while((T_Password[Number]==O_Password[Number])&(Number<6)) // 密碼比較
          {
          Number++; // 計數(shù)值加1
          }
          }
          else // 輸入按鍵與新密碼比較
          {
          ReadFromROM(N_Password,0,6);
          while((T_Password[Number]==N_Password[Number])&(Number<6)) // 密碼比較
          {
          Number++; // 計數(shù)值加1
          }
          }
          if(Number>=6) // 密碼正確
          {
          mark0=1; // 進入新密碼設(shè)置
          Password_OK(); // 調(diào)用密碼輸入正確提示函數(shù)
          REL=0; // 繼電器開啟,即密碼鎖開啟
          Delay400Ms();
          Beep();Beep(); // 正確提示音
          Delay400Ms();
          Beep();Beep();
          Delay1s(); // 延時2s
          Delay1s();
          REL=1; // 繼電器關(guān)閉,即密碼鎖開啟
          mark=0; // 退出循環(huán)
          num=0;
          }
          else // 密碼錯誤,報警
          {
          mark0=0; // 新密碼輸入控制位
          Password_ERROR(); // 調(diào)用密碼輸入錯誤提示函數(shù)
          Delay400Ms();
          Beep();Beep();Beep();Beep(); // 錯誤提示音
          Delay400Ms();
          Beep();Beep();Beep();Beep();
          Delay1s(); // 延時1s
          mark=0; // 退出循環(huán)
          num++; // 密碼錯誤輸入計數(shù)器
          }
          }



          關(guān)鍵詞: LCD1602密碼

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();