单之六位按键密码
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
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库3x3按键可修改密码锁程序(2)在线全文阅读。
相关推荐: