;密码连续错误3次锁定灯亮,机器锁定 ;按下接触锁定方可继续运行;
;密码正确,正确灯亮,输入新密码,输入完成灯灭; ;密码被更改,开始新的循环;
;断电后整机复位,初始密码恢复000000;
KEYBUF EQU 30H ;键值暂存单元,查表时用 ;************************************* ;* * ;* 主程序和中断程序入口 * ;* * ;************************************* ORG 0000H ;程序执行开始地址
AJMP MAIN1 ;跳至MAIN执行 ;************************************* ;* * ;* 主 程 序 * ;* * ;************************************* ORG 0040H MAIN1: MOV R1,#30H ; 设置R1初始值30h CLR 21H.0 ; 清零设置的错误标志位
MOV R4,#00H MOV P2,#00H MAIN: MOV P1,#0FFH CLR P2.0
;
; ; ;
连续错误次数初始值0次
LCALL KEYSCAN ;主体程序。调用查键子程序
CJNE R1,#36H,JI ; 按键不到(36-30)=6次,跳转。 MOV R1,#30H ; 按键次数回归初始值
JNB 21H.0,JI1 ; 判断是否有错 ,无错跳转 INC R4 ; 连续错误次数加1 CLR 21H.0 ; 清除错误标志 SETB P2.1 ; LCALL DELAY1S ; CLR P2.1 ; CJNE R4,#3,JI ; 判断是否连续错3次,不到3次跳转。 MOV R4,#00H ; SETB P2.3 ; JB P1.3,$ ; CLR P2.3 ; AJMP JI ; JI1:
SETB P2.2 ; LCALL DELAY1S ; MOV R4,#00H ; SHURU: lcall keyscan ; CJNE R1,#36H,SHURU ;输入6位后继续往下 MOV R1,#30H CLR P2.2 JI:
LJMP MAIN ;转MAIN循环 NOP ;软件陷阱 NOP NOP
LJMP MAIN
;************************************* ;* * ;* 键盘工作子程序(4 * 4 阵列) * ;* 出口为各键工作程序入口 P1口 * ;************************************* KEYSCAN:
MOV P1,#0FFH;清P1口,初始化键低电平有效 CLR P1.4;清P1.4口
MOV A,P1;读P1口状态
ANL A,#0FH;清高4位,保留低四位低电平有效
XRL A,#0FH;异或相同则为0不同结果为1,为0则表示无键被按下(这一行) JZ NOKEY1;为0则转下一行键值处理
LCALL DL10MS;有键按下则延时10ms再测一次抗干扰 MOV A,P1 ANL A,#0FH XRL A,#0FH
JZ NOKEY1;是干扰则转下一行键值处理程序 MOV A,P1
ANL A,#0FH;保留低四? KB1:
CJNE A,#0EH,KB2;如果值为#0E则为P1.4与P1.0组合的键 MOV KEYBUF,#1;赋键值 LJMP KEYWORK;转键处理
KB2: CJNE A,#0DH,KB3;如果值为#0D则为P1.4与P1.1组合的键 MOV KEYBUF,#2 LJMP KEYWORK
KB3: CJNE A,#0BH,KB5;如果值为#0B则为P1.4与P1.2组合的 MOV KEYBUF,#3 LJMP KEYWORK KB5: NOP
NOKEY1:
MOV P1,#0FFH CLR P1.5 MOV A,P1 ANL A,#0FH XRL A,#0FH JZ NOKEY2 LCALL DL10MS MOV A,P1 ANL A,#0FH XRL A,#0FH JZ NOKEY2 MOV A,P1 ANL A,#0FH
CJNE A,#0EH,KB6 MOV KEYBUF,#4 LJMP KEYWORK KB6: CJNE A,#0DH,KB7 MOV KEYBUF,#5 LJMP KEYWORK
KB7: CJNE A,#0BH,KB9 MOV KEYBUF,#6 LJMP KEYWORK KB9: NOP
NOKEY2:
MOV P1,#0FFH CLR P1.6 MOV A,P1 ANL A,#0FH XRL A,#0FH JZ NOKEY3 LCALL DL10MS MOV A,P1 ANL A,#0FH XRL A,#0FH JZ NOKEY3 MOV A,P1 ANL A,#0FH
CJNE A,#0EH,KB10 MOV KEYBUF,#7 LJMP KEYWORK KB10: CJNE A,#0DH,KB11 MOV KEYBUF,#8 LJMP KEYWORK KB11: CJNE A,#0BH,KB13 MOV KEYBUF,#9 LJMP KEYWORK KB13: NOP
NOKEY3:
MOV P1,#0FFH CLR P1.7 MOV A,P1 ANL A,#0FH XRL A,#0FH JZ NOKEY4 LCALL DL10MS MOV A,P1 ANL A,#0FH XRL A,#0FH JZ NOKEY4
MOV A,P1 ANL A,#0FH
CJNE A,#0EH,KB14 MOV KEYBUF,#10 LJMP KEYWORK KB14: CJNE A,#0DH,KB15 MOV KEYBUF,#0 LJMP KEYWORK KB15: CJNE A,#0BH,KB17 MOV KEYBUF,#11 LJMP KEYWORK KB17: NOP
NOKEY4: RET
KEYWORK:
JNB P2.2,DUZHI ;正确灭,跳转,读取密码,否则输入密码。 MOV A,KEYBUF;得到键值
MOV @R1,A;输入密码到寄存器 INC R1 AJMP WAITFREE DUZHI: MOV A,KEYBUF;得到键值 MOV 22H,A ;存键值到22h中
MOV A,@R1 ;R1指向地址30h-35h内的数据送a CJNE A,22H,ERR INC R1 WAITFREE:
MOV A,P1;以下程序等待键释放 MOV KEYBUF,#00H ANL A,#0FH XRL A,#0FH JNZ WAITFREE RET
ERR:SETB 21H.0 INC R1
AJMP WAITFREE ;
;************************************* ;* * ;* 延时513 us * ;* * ;*************************************
;
;513微秒延时程序
DELAY: MOV R2,#0FEH DELAY1: DJNZ R2,DELAY1 RET ; ; ;
;************************************* ;* * ;* 延时10ms * ;* * ;************************************* ;
;10毫秒延时程序
DL10MS: MOV R3,#14H
DL10MS1: MOV R2,#0FEH DL10MS2: DJNZ R2,DL10MS2 DJNZ R3,DL10MS1 RET DELAY1S : MOV R3,#008H ZL10MS1: MOV R2,#0FEH
ZL10MS2: MOV R6,#0FEH ZL10MS3: DJNZ R6,ZL10MS3 DJNZ R2,ZL10MS2 DJNZ R3,ZL10MS1 RET;
end
因篇幅问题不能全部显示,请点此查看更多更全内容