课程设计密码锁程序文档格式.docx
- 文档编号:22091742
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:34
- 大小:20.28KB
课程设计密码锁程序文档格式.docx
《课程设计密码锁程序文档格式.docx》由会员分享,可在线阅读,更多相关《课程设计密码锁程序文档格式.docx(34页珍藏版)》请在冰豆网上搜索。
USERCODE:
"
ucharcodewithchance[14]="
WITHCHANCES"
ucharcodechances[4]="
0123"
ucharcodenewcode[9]="
NEWCODE:
ucharcodesetup[16]="
SETUPSUCCESSFUL"
ucharcodeadmincode[10]="
ADMINCODE:
ucharcodecorrect[8]="
CORRECT!
ucharcodeopenthedoor[13]="
OPENTHEDOOR"
ucharcodeclosethedoor[14]="
CLOSETHEDOOR"
ucharcodeerror[6]="
ERROR!
ucharcodekeylocked[11]="
KEYLOCKED!
ucharcodemanagemode[11]="
MANAGEMODE"
ucharcodenumber[10]="
ucharcodestar[]="
*"
ucharcodeblank[]="
ucharcodekeytable[16]={0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77};
ucharucode[6];
//用户密码表
ucharacode[6]={9,9,9,9,9,9};
//管理员密码表
ucharkcode[6];
//输入按键密码表
ucharpt;
//LCD字符指针
ucharcodeposi;
//每位密码在按键密码表中的位置
ucharchance;
//用户输入密码的剩余机会
ucharlength=0;
//输入的密码位数
ucharcorrectcnt;
//正确输入计数
ucharerrorcnt=0;
//用户输入密码出错次数
ucharreinputcnt=0;
//重新输入计数
ucharcountt0,countt1,sec8,sec16,sec30;
//中断计数器,秒计数器
ucharnum,l,ktable;
//主函数及中断函数使用
intstop;
voiddelay_ms(uintt)//延时t毫秒
{
uchara,b;
for(;
t>
0;
t--)
for(b=142;
b>
b--)
for(a=2;
a>
a--);
voidrelay_on()
relay=0;
voidrelay_off()
relay=1;
/*====键盘扫描返回1-15值,无按键返回nokey====*/
ucharkey_scan()
uchartemp,knum,k;
P2=0xf0;
if(P2!
=0xf0)
{
delay_ms(10);
if(P2!
{
temp=P2;
P2=0x0f;
temp=temp|P2;
for(k=0;
k<
16;
k++)
{
if(temp==keytable[k])
{
knum=keytable[k];
break;
}
}
}
returnknum;
}
else
return0;
/*========将按键值编码为数值========*/
ucharkey_find(ucharm)
ucharkeynum=0;
switch(m)
case0xeb:
keynum=1;
break;
case0xdb:
keynum=2;
case0xbb:
keynum=3;
case0x7e:
keynum='
A'
case0xed:
keynum=4;
case0xdd:
keynum=5;
case0xbd:
keynum=6;
case0x7d:
B'
case0xee:
keynum=7;
case0xde:
keynum=8;
case0xbe:
keynum=9;
case0x7b:
C'
case0xe7:
E'
case0xd7:
keynum=0;
case0xb7:
F'
case0x77:
D'
return(keynum);
voidwrite_command(ucharcmd)//LCD写命令子程序
lcdrs=0;
lcdrw=0;
P0=cmd;
lcden=1;
delay_ms(5);
lcden=0;
voidwrite_data(uchardat)//LCD写数据子程序
lcdrs=1;
P0=dat;
voiddis_welcome()
write_command(0x80);
//设置字符显示的首地址
for(pt=0;
pt<
pt++)//显示字符串“WELCOME!
”
write_data(welcome[pt]);
delay_ms(20);
write_command
(2);
//显示回车换行,在第二行显示以下内容
write_command(0x80+0x40);
pt++)//显示字符串“================”
write_data(line[pt]);
delay_ms(100);
voiddis_mainmenu()//主菜单显示函数
6;
pt++)//显示字符串“UNLOCK”
write_data(unlock[pt]);
4;
pt++)//显示字符串“LOCK”
write_data(lock[pt]);
voiddis_newcode()
9;
pt++)//显示字符串“NEWCODE:
”
write_data(newcode[pt]);
voiddis_setup()
pt++)//显示字符串“SETUPSUCCESSFUL”
write_data(setup[pt]);
voiddis_admincode()
10;
pt++)//显示字符串“ADMINCODE:
write_data(admincode[pt]);
voiddis_usercode()
pt++)//显示字符串“USERCODE:
write_data(usercode[pt]);
voiddis_withchance()
14;
pt++)//显示字符串“WITHCHANCES”
write_data(withchance[pt]);
voiddis_num(uchart)
write_command(0x80+0x45);
write_data(chances[t]);
//显示字符串“3”
voiddis_clear()
write_command(0x01);
//清屏显示
voiddis_star(ucharadd)
write_command(0x80+0x0a+add);
//设置字符显示的地址
write_data(star[0]);
delay_ms(20);
voiddis_correctopen()
8;
pt++)//显示字符串“CORRECT!
write_data(correct[pt]);
13;
pt++)//显示字符串“OPENTHEDOOR”
write_data(openthedoor[pt]);
}
voiddis_closethedoor()
pt++)//显示字符串“CLOSETHEDOOR”
write_data(closethedoor[pt]);
voiddis_error()
pt++)//显示字符串"
write_data(error[pt]);
voiddis_locked()
11;
pt++)//显示字符串“KEYLOCKED!
write_data(keylocked[pt]);
pt++)//显示字符串“MANAGEMODE”
write_data(managemode[pt]);
voidring(uintt)
buzzer=0;
delay_ms(t);
buzzer=1;
voidflash(uintt)
led=1;
led=0;
voidiic_start(void)
sda=1;
_nop_();
scl=1;
somenop;
sda=0;
scl=0;
voidiic_stop(void)
voidiic_ack(bitackbit)
if(ackbit)
else
sda=1;
bitiic_waitack(void)
if(sda)
{
scl=0;
iic_stop();
else
return1;
voidiic_sendbyte(ucharbyt)
uchari;
for(i=0;
i<
i++)
if(byt&
0x80)
sda=1;
else
sda=0;
somenop;
scl=1;
byt<
<
=1;
uchariic_recbyte(void)
ucharda;
da<
if(sda)
da|=0x01;
returnda;
voidwrbyte_at(ucharadd,uchardat)
iic_start();
iic_sendbyte(0xa0);
iic_waitack();
iic_sendbyte(add);
iic_sendbyte(dat);
iic_stop();
delay_ms
(1);
ucharrdbyte_at(ucharadd)
iic_sendbyte(0xa1);
da=iic_recbyte();
iic_ack(0);
voidset_ucode()
wrbyte_at(0x01,kcode[0]);
ucode[0]=rdbyte_at(0x01);
wrbyte_at(0x02,kcode[1]);
ucode[1]=rdbyte_at(0x02);
wrbyte_at(0x03,kcode[2]);
ucode[2]=rdbyte_at(0x03);
wrbyte_at(0x04,kcode[3]);
ucode[3]=rdbyte_at(0x04);
wrbyte_at(0x05,kcode[4]);
ucode[4]=rdbyte_at(0x05);
wrbyte_at(0x06,kcode[5]);
ucode[5]=rdbyte_at(0x06);
voidread_ucode()
voidread_acode()
acode[0]=rdbyte_at(0x11);
acode[1]=rdbyte_at(0x12);
acode[2]=rdbyte_at(0x13);
acode[3]=rdbyte_at(0x14);
acode[4]=rdbyte_at(0x15);
acode[5]=rdbyte_at(0x16);
/*========确认键,并通过相应标志位执行相应功能========*/
voidensure()
{
uchari,j;
TR0=0;
TH0=0x3C;
TL0=0xB0;
countt0=0;
sec16=0;
if(beset==1&
&
open==0)//重置密码功能未开启
if(length==6&
adminflag==0)
for(i=0;
)
{
if(ucode[i]==kcode[i])
i++;
else
{
errorcnt++;
if(errorcnt<
3)//错误输入计数达三次时,报警并锁定键盘
{
dis_clear();
dis_error();
dis_withchance();
dis_num(3-errorcnt);
length=0;
break;
}
else
disable=1;
adminflag=1;
TR1=1;
do
{
dis_locked();
}
while(disable);
errorcnt=0;
TR1=0;
sec30=0;
TH1=0x3c;
TL1=0xb0;
dis_mainmenu();
if(i==6)
i=0;
dis_clear();
dis_correctopen();
relay_on();
open=1;
//置修改密码标志位
errorcnt=0;
delay_ms(1000);
dis_mainmenu();
for(j=0;
j<
j++)//将输入清除
kcode[j]=0;
if(length<
6)
errorcnt++;
if(errorcnt<
dis_clear();
dis_error();
dis_withchance();
dis_num(3-errorcnt);
else
disable=1;
adminflag=1;
TR1=1;
do
dis_locked();
while(disable);
errorcnt=0;
TR1=0;
sec30=0;
TH1=0x3c;
TL1=0xb0;
dis_mainmenu();
}
length=0;
//将输入数据计数器清零,为下一次输入作准备
voidcancel()
dis_clear();
dis_mainmenu();
//输入位数计数器清零
sec8=0;
voidreset()
open==1&
saved==0)//修改密码函数只能在已初始化、门开、按下修改键时才能进入
change=1;
dis_clear();
dis_newcode();
length=0;
void
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 密码锁 程序
