//程序移植時,請注意修改I/O端口
- /*-----------------------------------------------
- 名稱:基于1602的簡易密碼鎖
- 描述:當密碼驗證正確后,會在1602上顯示: password right!
- 密碼驗證錯誤時,會在1602上顯示: password error!
- 矩陣按鍵分布: 0 1 2 3
- 4 5 6 7
- 8 9 10 11
- 12 13 14 15
-
- 矩陣按鍵功能:11:功能選擇界面 0:輸入密碼開鎖界面(這里以1602顯示password right!代表開鎖成功)
- 13:修改密碼界面 1~9:為密碼元素 15:驗證密碼
- 14:撤銷誤操作輸入的錯誤密碼元素
- 具體流程如下:
- 程序燒錄到單片機后,1602會顯示:“ Welcome! Input password! ”
- 這時按按鍵11,進入功能選擇界面,1602會顯示:“ 0:enter mima 13:alter mima ”
- 如果按按鍵0,1602會顯示:“ password: ”
- 那么此時你就可以按按鍵1~9輸入密碼(我的初始密碼為12345678)輸入完成后按按鍵15,
- 如果密碼正確,1602會顯示:“ password right! ”,否則,1602顯示:“ password error! ”。
- 這時可以再按按鍵0,重新輸入密碼。
- 在1602顯示:“ password right! ”或“ password error! ”狀態下,按按鍵11,返回功能界面。
- 如果按按鍵13,1602會顯示:“ old password: ”,這時需要輸入舊密碼(我這里輸入12345678);
- 輸入完成后按按鍵15,如果舊密碼正確,1602會快速顯示:“ oldpassword right! ”,然后顯示:
- “ new password: ”,這時輸入8位新密碼后,1602會顯示:“ alter success! ”。這時按按鍵11,返回
- 功能界面。
-
- ------------------------------------------------*/
- #include <stc8.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
- #include <stdio.h>
- #include "1602.h"
- #include "delay.h"
- #include "key.h"
- #include "intrins.h"
- #include "AT24C0X.h"
- unsigned char password[8]={1,2,3,4,5,6,7,8};// 可以更改此密碼做多組測試
- u16 bool = 0;
- /*------------------------------------------------
- 主程序
- ------------------------------------------------*/
- void main()
- {
- unsigned char keyvalue = '#',i=0,j=0,val=0x00;
- bit Flag=0 , flag=0 ,flag_ok=0,flag_enter=0; // Flag用于判斷密碼對錯標志,flag用于是否進入密碼輸入界面
- u8 table[8] = {0}; // 用于接收輸入的密碼,用于與設定的密碼進行對比工作
- u8 newtable[8] = {0}; // 用于存儲輸入的新密碼
- // 將初始化密碼寫入AT24C04中
- write_24c04(0x00,password[0]);
- DELAY();
- write_24c04(0x01,password[1]);
- DELAY();
- write_24c04(0x02,password[2]);
- DELAY();
- write_24c04(0x03,password[3]);
- DELAY();
- write_24c04(0x04,password[4]);
- DELAY();
- write_24c04(0x05,password[5]);
- DELAY();
- write_24c04(0x06,password[6]);
- DELAY();
- write_24c04(0x07,password[7]);
- DELAY();
- LCD_Init(); // 初始化液晶屏
- DelayMs(10); // 延時用于穩定,可以去掉
- LCD_Clear(); // 清屏
- LCD_Write_String(0,0," Welcome!"); // 寫入第一行信息,主循環中不再更改此信息,所以在while之前寫入
- LCD_Write_String(0,1,"Input password!"); // 寫入第二行信息,提示輸入密碼
- while (1) // 主循環
- {
- keyvalue = key_scan(); // 掃描鍵盤
- if(keyvalue == 11)
- {
- LCD_Clear();
- LCD_Write_String(0,0,"0 : enter mima");
- LCD_Write_String(0,1,"13: alter mima");
- flag = 1;
- }
- // 進入密碼輸入界面
- if((keyvalue == 0) && (flag==1))
- {
- LCD_Clear();
- LCD_Write_String(0,0,"password:");
- i=0;
- flag=2;
- while(1)
- {
- keyvalue = key_scan();
-
- if((keyvalue != '#') && (flag==2)) // 輸入的密碼顯示
- {
- if(keyvalue > 0 && keyvalue <= 9)
- {
- switch(bool)
- {
- case 0:
- if(i==8)
- {
- i=0;break;
- }
- table[i]=keyvalue;
- LCD_Write_Com(0xc0+i);
- LCD_Write_Data(0x30+keyvalue);
- i++;
- DelayMs(300);
- break;
- }
- }
- }
- if((keyvalue == 15)&&(flag==2)) // 驗證密碼
- {
- val = 0x00;
- // 從at24c04中讀出密碼
- password[0] = read_24c04(0x00);
- DELAY();
- password[1] = read_24c04(0x01);
- DELAY();
- password[2] = read_24c04(0x02);
- DELAY();
- password[3] = read_24c04(0x03);
- DELAY();
- password[4] = read_24c04(0x04);
- DELAY();
- password[5] = read_24c04(0x05);
- DELAY();
- password[6] = read_24c04(0x06);
- DELAY();
- password[7] = read_24c04(0x07);
- DELAY();
- if(i != 0)
- {
- for(j=i;j<8;j++)
- table[i] = 0;
- }
- for(j=0;j<8;j++)
- {
- if(password[j]!=table[j])
- {
- LCD_Clear();
- LCD_Write_String(0,0,"password error!");
- Flag = 1; //密碼錯誤標志
- i=0;
- //該注釋代碼用于密碼輸入錯誤時,查看正確密碼
- // for(j=0;j<8;j++)
- // {
- // LCD_Write_Com(0xc0+j);
- // LCD_Write_Data(0x30+password[j]);
- // }
- break;
- }
- }
- if(!Flag) // 密碼正確
- {
- LCD_Clear();
- LCD_Write_String(0,0,"password right!");
- i=0;
- }
- Flag=0;
- for(j=0;j<8;j++)
- table[j] = 0;
- break;
- }
- if((keyvalue==14)&&(flag==2)) // 撤銷錯誤密碼元素
- {
- i=i-1;
- table[i]=0;
- LCD_Write_Com(0xc0+i);
- LCD_Write_Data(' ');
- }
- }
-
- }
- // 修改密碼界面
- if((keyvalue == 13) && (flag == 1))
- {
- LCD_Clear();
- LCD_Write_String(0,0,"old password:");
- flag=3;
- flag_ok = 0;
- flag_enter = 0;
- for(j=0;j<8;j++)
- newtable[j]=0;
- i=0;
- while(1)
- {
- keyvalue = key_scan();
- if((keyvalue != '#') && (flag==3)) // 輸入的密碼顯示
- {
- if(keyvalue > 0 && keyvalue <= 9)
- {
- switch(bool)
- {
- case 0:
- if(i==8)
- {
- i=0;break;
- }
- if(flag_ok==1)
- {
- newtable[i]=keyvalue;
- LCD_Write_Com(0xc0+i);
- LCD_Write_Data(0x30+keyvalue);
- i++;
- DelayMs(300);
- }
- if(flag_ok==0)
- {
- table[i]=keyvalue;
- LCD_Write_Com(0xc0+i);
- LCD_Write_Data(0x30+keyvalue);
- i++;
- DelayMs(300);
- }
- break;
- }
- }
- }
-
-
- if((keyvalue == 15)&&(flag==3)) // 驗證密碼
- {
- val = 0x00;
- for(j=0;j<8;j++) // 從at24c04中讀出密碼
- {
- password[j] = read_24c04(val);
- DELAY();
- val = val + 0x01;
- if(j==8)
- val=0x00;
- }
- if((i!=0)&&(table[i]!=0))
- {
- for(j=i;j<8;j++)
- table[j] = 0;
- }
- if((i!=0)&&(newtable[i]!=0))
- {
- for(j=i;j<8;j++)
- newtable[j]=0;
- }
- for(j=0;j<8;j++)
- {
- if(password[j]!=table[j])
- {
- LCD_Clear();
- LCD_Write_String(0,0,"oldpassword err!");
- Flag = 1; //密碼錯誤標志
- flag_ok = 0;
- i=0;
- break;
- }
- }
- if(!Flag) // 密碼正確
- {
- LCD_Clear();
- LCD_Write_String(0,0,"oldpassword ok!");
- DelayMs(1000);
- DelayMs(1000);
- DelayMs(1000);
- DelayMs(1000);
- flag_ok = 1;
- LCD_Clear();
- LCD_Write_String(0,0,"new password:");
- i=0;
- }
- Flag=0;
- for(j=0;j<8;j++)
- table[j] = 0;
- }
- if((keyvalue==14)&&(flag==3)) // 撤銷錯誤密碼元素
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
- #include <stc8.h>
- #include <stdio.h>
- #include "1602.h"
- #include "delay.h"
- #include "key.h"
- #include "intrins.h"
- #include "AT24C0X.h"
- unsigned char password[8]={1,2,3,4,5,6,7,8}; //初始密碼
- u16 bool = 0;
- void main()
- {
- unsigned char keyvalue = '#',i=0,j=0,val=0x00;
- bit Flag=0 , flag=0 ,flag_ok=0; // Flag標志,用于判斷密碼真假。flag標志,用于是進密碼輸入界面還是修改密碼界面
- // flag_ok標志,用于區別此時輸入的是舊密碼還是新密碼
- u8 table[8] = {0}; // 用于存儲輸入的數字,與密碼比較時使用
- u8 newtable[8] = {0}; // 用于存儲輸入的新密碼
- // 將初始密碼寫入到at24c04中
- write_24c04(0x00,password[0]);
- DELAY();
- write_24c04(0x01,password[1]);
- DELAY();
- write_24c04(0x02,password[2]);
- DELAY();
- write_24c04(0x03,password[3]);
- DELAY();
- write_24c04(0x04,password[4]);
- DELAY();
- write_24c04(0x05,password[5]);
- DELAY();
- write_24c04(0x06,password[6]);
- DELAY();
- write_24c04(0x07,password[7]);
- DELAY();
- LCD_Init(); // 1602液晶初始化
- DelayMs(10);
- LCD_Clear(); // 清屏
- LCD_Write_String(0,0," Welcome!");
- LCD_Write_String(0,1,"Input password!")
- while (1)
- {
- keyvalue = key_scan(); // 按鍵掃描
- if(keyvalue == 11)
- {
- LCD_Clear();
- LCD_Write_String(0,0,"0 : enter mima");
- LCD_Write_String(0,1,"13: alter mima");
- flag = 1;
- }
- // 進入輸入密碼界面
- if((keyvalue == 0) && (flag==1))
- {
- LCD_Clear();
- LCD_Write_String(0,0,"password:");
- i=0;
- flag=2;
- while(1)
- {
- keyvalue = key_scan();
-
- if((keyvalue != '#') && (flag==2)) //輸入密碼
- {
- if(keyvalue > 0 && keyvalue <= 9)
- {
- switch(bool)
- {
- case 0:
- if(i==8)
- {
- i=0;break;
- }
- table=keyvalue;
- LCD_Write_Com(0xc0+i);
- LCD_Write_Data(0x30+keyvalue);
- i++;
- DelayMs(300);
- break;
- }
- }
- }
- if((keyvalue == 15)&&(flag==2)) // 驗證密碼
- {
- val = 0x00;
- // 從at24c04中讀取密碼
- password[0] = read_24c04(0x00);
- DELAY();
- password[1] = read_24c04(0x01);
- DELAY();
- password[2] = read_24c04(0x02);
- DELAY();
- password[3] = read_24c04(0x03);
- DELAY();
- password[4] = read_24c04(0x04);
- DELAY();
- password[5] = read_24c04(0x05);
- DELAY();
- password[6] = read_24c04(0x06);
- DELAY();
- password[7] = read_24c04(0x07);
- DELAY();
- if(i != 0)
- {
- for(j=i;j<8;j++)
- table = 0;
- }
- for(j=0;j<8;j++)
- {
- if(password[j]!=table[j])
- {
- LCD_Clear();
- LCD_Write_String(0,0,"password error!");
- Flag = 1; //密碼錯誤標志
- i=0;
- //該注釋代碼用于密碼錯誤時,提示正確密碼,調試時使用
- // for(j=0;j<8;j++)
- // {
- // LCD_Write_Com(0xc0+j);
- // LCD_Write_Data(0x30+password[j]);
- // }
- break;
- }
- }
- if(!Flag) //密碼正確
- {
- LCD_Clear();
- LCD_Write_String(0,0,"password right!");
- i=0;
- }
- Flag=0;
- for(j=0;j<8;j++)
- table[j] = 0;
- break;
- }
- if((keyvalue==14)&&(flag==2)) // 撤銷錯誤密碼元素
- {
- i=i-1;
- table[ i ]=0;
- LCD_Write_Com(0xc0+i);
- LCD_Write_Data(' ');
- }
- }
-
- }
- // 修改密碼界面
- 詳情請下載文件。
復制代碼
全部資料51hei下載地址:
基于1602的電子密碼鎖源碼.rar
(88.01 KB, 下載次數: 43)
2019-5-13 19:36 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|