标题:
基于单片机+LCD1602的简易电子密码锁程序
[打印本页]
作者:
枫树566
时间:
2019-5-13 19:53
标题:
基于单片机+LCD1602的简易电子密码锁程序
//程序移植时,请注意修改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
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1