单片机设计方案密码锁程序和仿真图.docx
- 文档编号:2067931
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:14
- 大小:62.40KB
单片机设计方案密码锁程序和仿真图.docx
《单片机设计方案密码锁程序和仿真图.docx》由会员分享,可在线阅读,更多相关《单片机设计方案密码锁程序和仿真图.docx(14页珍藏版)》请在冰豆网上搜索。
单片机设计方案密码锁程序和仿真图
#include
#defineucharunsignedchar
#defineuintunsignedint
uintnum=10;//开始让数码管什么都不显示
bitset=0;//定义设置密码的位
charcount=-1;//开始让COUNT=-1,方便后面显示数码管
sbitBeep=P1^2;//蜂鸣器
uchartemp;
ucharpws[6]={3,6,2,3,3,0};//原始密码
ucharpwx[6];//按下的数字存储区
bitrightflag;//密码正确标志位
ucharworkbuf[6];
ucharcodetabledu[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40
};//段选码,共阴极
ucharcodetablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf
};//位选码
uintkeyscan();
voiddelay(ucharz)//延时,ms级
{
uchary;
for(;z>0;z--)
for(y=120;y>0;y--);
}
voidsetpw()//设置密码函数
{
keyscan();
}
uintkeyscan()//键盘扫描函数
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);//键盘去抖,最好ms以上,这里用了ms
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
count++;//按键计数加
temp=P3;
switch(temp)
{
case0xee:
{
num=7;
if(count<6)//六位密码,所以COUNT<6
{
if(set==0)//设置密码键没有按下时
pwx[count]=num;//存储按下的数字
else
pws[count]=num;//设置密码键按下时,设置新密码
workbuf[count]=tabledu[11];//相应位的数码管显示"--",不显示相应的数字,密码是保密的
}
}
break;
case0xde:
{
num=8;
if(count<6)//以下扫描键盘的原理差不多同上
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
case0xbe:
{
num=9;
{
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
}
break;
case0x7e:
//设置密码键按下
{
set=1;//设置密码标志位置
P1_3=0;//设置密码指示灯亮
workbuf[0]=0x00;//数码管第一位不显示
workbuf[1]=0x00;//......
workbuf[2]=0x00;//......
workbuf[3]=0x00;
workbuf[4]=0x00;
workbuf[5]=0x00;//......
count=-1;//按键计数复位为-1
if(count<6)//密码没有设置完,继续设置密码
{
setpw();//设置密码
}
}
break;
}
while(temp!
=0xf0)//按键抬起检测
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
count++;
temp=P3;
switch(temp)
{
case0xed:
{
num=4;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
case0xdd:
{
num=5;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
case0xbd:
{
num=6;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
count++;
temp=P3;
switch(temp)
{
case0xeb:
{
num=1;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
case0xdb:
{
num=2;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
case0xbb:
{
num=3;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
count++;
temp=P3;
switch(temp)
{
case0xd7:
{
num=0;
if(count<6)
{
if(set==0)
pwx[count]=num;
else
pws[count]=num;
workbuf[count]=tabledu[11];
}
}
break;
case0xe7:
num=20;break;//确定键按下检测
case0x77:
//复位键或者输入密码全部一次删除
{
P1_1=0;//锁关
P1_3=1;//密码设置指示灯灭
set=0;//不设置密码
num=10;//num复位
count=-1;//COUNT复位
workbuf[0]=tabledu[10];//第一位数码管不显示
workbuf[1]=tabledu[10];//第二位数码管不显示
workbuf[2]=tabledu[10];
workbuf[3]=tabledu[10];
workbuf[4]=tabledu[10];
workbuf[5]=tabledu[10];//......
P1_0=1;//锁关
}
break;
case0xb7:
//输入密码删除键(一位一位删除)
{
count--;
workbuf[count]=0x00;//因确定键按下时,COUNT也会加,而确定键不是密码,所以这里是COUNT,而不是COUNT+1
count--;//因确定键按下时,确定键不是密码,COUNT也会加,这里COUNT再自减
if(count<=-1)
count=-1;
}
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
return
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 设计方案 密码锁 程序 仿真