//程序移植时,请注意修改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)
|