📄 key lock (1).asm
字号:
;R3——输入错误次数
;R4——密码个数
;R7——输入密码暂存
;R2——键值暂存
;R6——延时参数
ORG 00H
SJMP START
ORG 0BH
START:
;设置初始密码
PASSWORD:
MOV R4,#08H ;密码个数8个
MOV R0,#40H ;密码暂存区
MOV A,#00H ;初始密码0,1,2,3,4,5,6,7
PASSNEXT:
MOV @R0,A
INC R0
INC A
DJNZ R4,PASSNEXT
MLOOP:
CLR P3.0 ;锁合
SETB P3.1 ;锁开
SETB P3.2 ;键有效
SETB P3.3 ;错误
SETB P3.4 ;报警
MOV R3,#03H ;错误次数3次
;输入密码
GETPW: MOV R4,#08H ;密码个数
MOV R0,#30H ;输入密码暂存区
AGAIN: ACALL KEY ;输入密码
CJNE A,#0AH,CONTIUE ;按确认键无效
SJMP AGAIN
CONTIUE:
MOV @R0,A
ACALL DISPLED ;按键有效显示
INC R0
DJNZ R4,AGAIN
AGAIN1: ACALL KEY ;按确认键
CJNE A,#0AH,AGAIN1
ACALL DISPLED ;按确认键有效显示
ACALL COMP ;比较密码
SETB P3.0 ;息锁合
CLR P3.1 ;开锁
WAIT: MOV C,P3.5 ;是否重新上锁
JNC MLOOP ;主循环
ACALL TestKey ;是否有键按下,是否修改密码
JZ WAIT ;累加器的内容为0,则转移;否则执行下一条指令
ACALL CHPSW ;修改密码子程序
SJMP WAIT
COMP: MOV R4,#08H
MOV R0,#30H
AGAI: MOV 50H,@R0 ;取输入密码到50H
MOV A,R0
ADD A,#010H ;40H
MOV R0,A
MOV A,@R0 ;取密码
MOV B,A
MOV A,R0
SUBB A,#010H ;30H
MOV R0,A
MOV A,B
CJNE A,50H,ONCEMORE ;比较
INC R0
DJNZ R4,AGAI
RET ;正确返回
ONCEMORE:
CLR P3.3 ;输入错误
MOV R6,#0FFH
ACALL DELAY
MOV R6,#0FFH
ACALL DELAY
SETB P3.3
DJNZ R3,GETPW ;3次错误输入
CLR P3.4 ;声报警
CLR P3.3 ;光报警
W: SJMP W
;修改密码子程序
CHPSW: MOV R4,#07H
MOV R0,#48H
ACALL KEY
CJNE A,#0AH,CONTIUE2 ;按确认键无效
LJMP WAIT ;返回
CONTIUE2:
MOV @R0,A
INC R0
ACALL DISPLED ;按键有效显示
ANOTHER:
ACALL KEY
CJNE A,#0AH,CONTIUE3 ;按确认键无效
SJMP ANOTHER
CONTIUE3:
MOV @R0,A
INC R0
ACALL DISPLED ;按键有效显示
DJNZ R4,ANOTHER
AGAIN2: ACALL KEY ;按确认键
CJNE A,#0AH,AGAIN2
ACALL DISPLED ;按确认键有效显示
MOV R4,#08H
MOV R0,#40H
MOV R1,#48H
CHANGE: ;确认后修改密码
MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R4,CHANGE
RET
;按键有效显示
DISPLED:
CLR P3.2 ;按键有效显示
MOV R6,#80H
ACALL DELAY
SETB P3.2
RET
TestKey:MOV P1,#0FH
MOV A,P1 ;读入键状态
CPL A ;累加器取
ANL A,#0F0H
RET
;取键值子程序,阵列式键盘
KEY: MOV P1,#0F0H
MOV A,P1
CJNE A,#0F0H,K11
K10: AJMP KEY
K11: MOV R6,#02H
ACALL DELAY
MOV P1,#0F0H
MOV A,P1
CJNE A,0F0H,K12
SJMP K10
K12: MOV B,A
MOV P1,#0FH
MOV A,P1
CJNE A,#0FH,K122
K121: AJMP KEY
K122: MOV R6,#02H
ACALL DELAY
MOV P1,#0FH
MOV A,P1
CJNE A,0FH,K13
AJMP K10
K13:
ANL A,B
MOV B,A
MOV R1,#11
MOV R2,#0
MOV DPTR,#K1TAB
K14: MOV A,R2
MOVC A,@A+DPTR
CJNE A,B,K16
MOV P1,#0FH
K15: MOV A,P1
CJNE A,#0FH,K15
MOV R6,#02H
ACALL DELAY
MOV A,R2
RET
K16: INC R2
DJNZ R1,K14
AJMP K10
;键码表
K1TAB: DB 81H,41H,21H,11H
DB 82H,42H,22H,12H
DB 84H,44H,24H
;延时子程序
DELAY: MOV R6,#80H
AA1: MOV R5,#0F8H
AA: NOP
NOP
DJNZ R5,AA
DJNZ R6,AA1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -