3x3按键可修改密码锁程序

更新时间:2023-07-26 10:08:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单之六位按键密码

/***************************************************************************
标题:3*3按键输入调试,按键密码6位,密码可修改
效果:输入密码正确LED显示,P2=55H,否则P2=7FH
工作于:LY5A-L2A开发板
作者:梦西湖
邮箱:1005910987@
参数设定:
P0.0--P0.2行键3个
P1.0--P1.2列键3个
P3.7为密码修改键
R0列数判断,并依此从左向右扫描
R1行数判断,并依此从上向下扫描
R2指示按键输出值
50H用于存储行数据值
51H存储待显示的数据值
52H暂时调用设定的密码值,用于数值比较
53H暂时调用读取的密码值,用于数值比较
54H判断是否调用修改密码程序
55H采集密码完成信号
56H为密码修改时转换参数,相当于第三个杯子
31H--36H存储读取的6位密码
41H--46H存储设置的6位密码
若此程序用作子程序,则调用是记得现场保护!
关于设置的密码值是否要不断重新输入--【本次采用重复赋值模式】
*****************************************************************************/
ORG 0000H
LJMP MAIN
ORG 0050H

MAIN:
MOV R0,#00H
MOV R1,#41H
/*密码6位赋值循环*/
S0:
MOV DPTR,#TAB2
MOV A,R0;
MOVC A,@A+DPTR
MOV @R1,A
INC R0
INC R1
CJNE R0,#6H,S0
MAIN1:
MOV P0,#0FFH
MOV P1,#00H
LCALL DELAY;
JNB P3.7,GAIMIMA;判断此键是否按下,是则转修改密码子程序
MOV A,P0
MOV 54H,#0FFH
MOV 55H,#0FFH
CJNE A,#0FFH,ANJ;判断按键是否按下
LJMP MAIN1;
/*修改密码,先输入旧密码程序*/
GAIMIMA:
LCALL DELAY;延时10MS去抖
JB P3.7,MAIN1;
MOV P2,#7EH;判断此键为按下时,则指示闪灯一次
LCALL DELAY1S;判断此键为按下时,则指示闪灯一次
JNB P3.7,$;等待修改密码键松开
MOV P2,#0FFH;判断此键为按下时,则指示闪灯一次
MOV 54H,#0FH
LJMP ANJ;采集旧密码程序
/*采集新密码程序*/
MIMAZHI:
MOV P2,#0F9H;P2指示旧密码验证完毕
LCALL DELAY1S;P2指示旧密码验证完毕
MOV P2,#0FFH;P2指示旧密码验证完毕
MOV 55H,#0FH;采集密码完成信号
LJMP ANJ;采集新密码程序
/*更新密码程序*/
/*将31H--36H中的值对应赋值到41H--46H中去*/
MIMAGAI:
MOV P2,#0BDH;判断此键为按下时,则指示闪灯一次
LCALL DELAY1S;判断此键为按下时,则指示闪灯一次
MOV P2,#0FFH;判断此键为按下时,则指示闪灯一次
PUSH 00H
PUSH 01H
PUSH 02H
PUSH ACC
MOV R0,#31H
MOV R1,#41H
MOV R2,#06H
M1:
MOV 56H,@R0
MOV A,56H
MOV @R1,A
INC R0
INC R1
DJNZ R2,M1;
POP ACC
POP 02H
POP 01H
POP 00H
LJMP MAIN1;



ANJ:
MOV R
0,#06H;循环扫瞄次数设定=密码位数=6
MOV R1,#31H;36H存储读取的6位密码
MOV R2,#00H;用于LED显示已经输入的位数
/*扫描是否有六次按键按下*/
S1:
PUSH 00H;有效数据堆栈处理;现场保护
PUSH 01H
PUSH 02H

单之六位按键密码

LCALL ANJIAN;调用键盘扫描程序
POP 02H
POP 01H
POP 00H
MOV @R1,51H;将扫描的数值保存在31H_36H中
MOV DPTR,#TAB3
MOV A,R2
MOVC A,@A+DPTR
MOV P2,A
INC R2
INC R1
SB:
MOV A,P0
CJNE A,#0FFH,SB;等待按键松开
DJNZ R0,S1
/*添加的修改密码程序*/
MOV A,55H
CJNE A,#0FFH,MIMAGAI
/*比较六位密码是否正确*/
MOV R0,#31H;31H_36H存储读取的6位密码
MOV R1,#41H;41H--46H存储设置的6位密码
MOV R2,#06H;比较次数设定=密码位数=6
S2:
MOV 53H,@R0;暂时调用读取的密码值,用于数值比较
MOV A,53H
MOV 52H,@R1;暂时调用设定的密码值,用于数值比较
CJNE A,52H,S3;密码数值比较
INC R0
INC R1
DJNZ R2,S2
PUSH ACC
MOV A,54H;判断密码是否正确,是则调用修改密码程序
CJNE A,#0FFH,MIMAZHI;判断密码是否正确,是则调用修改密码程序
POP ACC
MOV P2,#55H;密码正确显示;用于输出控制锁
LCALL DELAY1S;
LJMP MAIN1
S3:
MOV P2,#7FH;密码错误显示;用于输出控制锁
LCALL DELAY1S;
LJMP MAIN1






ANJIAN:;若此程序用作子程序,则改MAIN为ANJIAN
MOV P1,#00H
MOV R2,#00H
LCALL DELAY;延时10MS去抖
MOV A,P0;读取行键数据
CJNE A,#0FFH,W0;行键有数据则继续判断
LJMP ANJIAN;若此程序用作子程序,则改LJMP MAIN为RET
/*判断第几列有按键按下*/
W0:
MOV R0,#00H;列数判断
MOV R1,#03H;行数判断
W2:
MOV DPTR,#TAB
MOV A,R0;按顺序调用列数数据
MOVC A,@A+DPTR
MOV P1,A;按顺序调用列数数据第N位
MOV A,P0;读取行键数据
CJNE A,#0FFH,W3;判断该列是否有按键按下,有则转
INC R0
INC R2;指示按键输出值
INC R2
INC R2
DJNZ R1,W2;跳出按键程序;调试时调回MAIN
LJMP ANJIAN;若此程序用作子程序,则改LJMP MAIN为RET
/*确定第几列第几行有按键按下*/
W3:
MOV R0,#00H;列数判断
MOV R1,#03H;行数判断
W4:
MOV DPTR,#TAB
MOV 50H,P0;50H用于存储行数据值
MOV A,R0
MOVC A,@A+DPTR
CJNE A,50H,W5
MOV DPTR,#TAB1
MOV A,R2
MOVC A,@A+DPTR
MOV 51H,A;51H存储待显示的数据值
RET;若此程序用作子程序,则改ANJIAN为RET
W5:
INC R0
INC R2
DJNZ R1,W4
LJMP ANJIAN;若此程序用作子程序,则改LJMP MAIN为RET

/*延时1S子程序*/
DELAY1S: ;延时1S
MOV R7,#0A7H
DL11:
MOV R6,#0ABH
DL10:
MOV R5,#10H
DJNZ R5,$
DJNZ R6,DL10
DJNZ R7,DL11
NOP
RET

/*延时10MS子程序*/
DELAY:
MOV R7,#01H;延时10MS
DL1:
MOV R6,#26H
DL0:
MOV R5,#82H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET

TAB:DB
0FEH,0FDH,0FBH;按键扫描顺序
TAB1:DB 1,4,7,2,5,8,3,6,9;按键值确定输出
TAB2:DB 1,2,3,4,5,6;密码设置
TAB3:DB 0FEH,0FCH,0F8H,0F0H,0E0H,0C0H;P2--LED显示按键次数

END

本文来源:https://www.bwwdw.com/article/bf4m.html

Top