📄 集成开发板s52程序.txt
字号:
HC0 EQU 4AH
HC1 EQU 4BH
HC2 EQU 4CH
CODE1 EQU 50H
CODE2 EQU 51H
CODE3 EQU 52H
CODE4 EQU 53H
SHOW1 EQU 55H
SHOW2 EQU 56H
SHOW3 EQU 57H
SHOW4 EQU 58H
INPUT1 EQU 60H
INPUT2 EQU 61H
INPUT3 EQU 62H
INPUT4 EQU 63H
TIMES EQU 64H
ORG 00H ;复位入口
AJMP INIT
ORG 0BH
AJMP T0INT ;T0中断入口
ORG 30H
INIT: MOV CODE1,#00H
MOV CODE2,#00H
MOV CODE3,#00H
MOV CODE4,#00H
MOV INPUT1,#00H
MOV INPUT2,#00H
MOV INPUT3,#00H
MOV INPUT4,#00H
MOV SHOW1,#16
MOV SHOW2,#17
MOV SHOW3,#17
MOV SHOW4,#17 ;以上为初始化
START1: MOV A,#00H ;位密码存储器A初始化
MOV P0,#28H
MOV P2,#87H ;数码管四位显示0000
LCALL DELAY2S ;延时2秒
MOV P2,#0FFH ;四位数码管断开
MOV P0,#0FFH ;四位数码管熄灭
LCALL KEY ;调用键盘扫描程序输入第1位密码
MOV SHOW1,A ;第1位密码存入SHOW1
MOV SHOW2,#16 ;SHOW2存入下划线对应的序号
LCALL KEY ;调用键盘扫描程序输入第2位密码
MOV SHOW2,A ;第2位密码存入SHOW2
MOV SHOW3,#16 ;SHOW3存入下划线对应的序号
LCALL KEY ;调用键盘扫描程序输入第3位密码
MOV SHOW3,A ;第3位密码存入SHOW3
MOV SHOW4,#16 ;SHOW4存入下划线对应的序号
LCALL KEY ;调用键盘扫描程序输入第4位密码
MOV SHOW4,A ;第4位密码存入SHOW4
LCALL RDISP ;调用延时显示子程序
MOV R1,#SHOW1
MOV CODE1,@R1
INC R1
MOV CODE2,@R1
INC R1
MOV CODE3,@R1
INC R1
MOV CODE4,@R1 ;4位密码存入CODE区
CLR P2.7 ;灯2.7亮,表示上锁
ENTER: CLR P2.7 ;灯2.7亮,表示上锁
MOV TIMES,#03H ;设定开锁次数为3次
START2: MOV A,#00H ;位密码存储器A初始化
MOV SHOW1,#16
MOV SHOW2,#17
MOV SHOW3,#17
MOV SHOW4,#17 ;SHOW存储区初始化
LCALL KEY ;调用键盘扫描程序输入第1位开锁密码
MOV SHOW1,A ;第1位开锁密码存入SHOW1
MOV SHOW2,#16 ;SHOW2存入下划线对应的序号
LCALL KEY ;调用键盘扫描程序输入第2位开锁密码
MOV SHOW2,A ;第2位开锁密码存入SHOW2
MOV SHOW3,#16 ;SHOW3存入下划线对应的序号
LCALL KEY ;调用键盘扫描程序输入第3位开锁密码
MOV SHOW3,A ;第3位开锁密码存入SHOW3
MOV SHOW4,#16 ;SHOW4存入下划线对应的序号
LCALL KEY ;调用键盘扫描程序输入第4位开锁密码
MOV SHOW4,A ;第4位开锁密码存入SHOW4
LCALL RDISP ;调用延时显示子程序
MOV R1,#SHOW1
MOV INPUT1,@R1
INC R1
MOV INPUT2,@R1
INC R1
MOV INPUT3,@R1
INC R1
MOV INPUT4,@R1 ;4位开锁密码存入INPUT区
COMPARE:MOV R2,#04H ;4位密码进行比较
MOV R0,#CODE1
MOV R1,#INPUT1
AGAIN: CLR C ;以下为4位密码比较过程
MOV A,@R0
SUBB A,@R1 ;带Cy相减
CJNE A,#00H,WRONG ;判断一位密码是否相同
INC R1
INC R0
DJNZ R2,AGAIN ;判断是否4位密码都已比较
SETB P2.7 ;灯2.7灭,表示开锁
LCALL DELAY10S ;延时10秒
AJMP ENTER
WRONG: DJNZ TIMES,NEXT1 ;判断是否是第3次输入开锁密码错误
LCALL ALARM10S
AJMP ENTER
NEXT1: LCALL ALARM2S
AJMP START2
KEY: ;键盘扫描子程序,最终扫描结果存入A
LCALL KS ;调用按键检测子程序
JNZ K1 ;有键按下继续
LCALL DELAY2 ;无键按下调用延时去抖动子程序
AJMP KEY ;返回,继续检测有无按键按下
K1: LCALL DELAY2
LCALL DELAY2 ;有键按下继续延时去抖动
LCALL KS ;再次调用检测按键子程序
JNZ K2 ;确认有键按下进行下一步
AJMP KEY ;无键按下返回继续检测
K2: MOV R3,#0EFH ;将扫描值送入R3暂存
MOV R4,#00H ;将第1列的列值00H送入R4暂存,R4用于存放列值
K3: MOV P1,R3 ;将R3的值送入P1口
L6: JB P1.0,L1 ;P1.0等于1跳转到L1
MOV A,#00H ;将第1行的行值00H送入A
AJMP LK ;跳转到键值处理程序
L1: JB P1.1,L2 ;P1.1等于1跳转到L2
MOV A,#04H ;将第2行的行值04H送入A
AJMP LK ;跳转到键值处理程序
L2: JB P1.2,L3 ;P1.2等于1跳转到L3
MOV A,#08H ;将第3行的行值08H送入A
AJMP LK ;跳转到键值处理程序
L3: JB P1.3,NEXT ;P1.3等于1跳转到NEXT处
MOV A,#0CH ;将第4行的行值#0CH送入A
LK: ADD A,R4 ;行值与列值相加后的键值送入A
MOV R5,A ;将A中的值送入R5暂存
K4: LCALL DELAY2 ;调用延时去抖动子程序
LCALL KS ;调用按键检测子程序
JNZ K4 ;按键没有松开继续返回检测
MOV A,R5 ;将R5的值送入A
RET
NEXT: INC R4 ;将列值加一
MOV A,R3 ;将R3的值送入A
JNB ACC.7,KEY ;扫描完成跳至KEY处进行下一回合的扫描
RL A ;扫描未完成将A中的值左环移一位进行下一列的扫描
MOV R3,A ;将A的值送入R3暂存
AJMP K3 ;跳转到K3继续
KS: LCALL DISPLAY ;调用显示子程序
MOV P1,#0FH ;将P1口高四位置0,低四位置1
MOV A,P1 ;读P1口
XRL A,#0FH ;判断是否有键按下
RET
DELAY2: ;15ms延时去抖动子程序(30*250*2=15ms)
MOV HC0,#30
L7: MOV HC1,#250
L8: DJNZ HC1,L8
DJNZ HC0,L7
RET
RDISP: ;延时2秒显示子程序
MOV R7,#200
DL3: LCALL DISPLAY ;调用显示程序
DJNZ R7,DL3
RET
DISPLAY: ;四位数码管显示子程序(并行逐位显示)
MOV DPTR,#NUMTAB
MOV R1,#SHOW1 ;四位数码管依次显示SHOW存储区数据
MOV A,@R1
MOVC A,@A+DPTR ;查表转换成对应按键数字
CLR P2.3 ;选通第1位数码管
MOV P0,A ;显示
LCALL DELAY ;延时
MOV P0,#0FFH ;数码管熄灭
SETB P2.3 ;断开第1位数码管
INC R1
MOV A,@R1
MOVC A,@A+DPTR ;查表转换成对应按键数字
CLR P2.4 ;选通第2位数码管
MOV P0,A ;显示
LCALL DELAY ;延时
MOV P0,#0FFH ;数码管熄灭
SETB P2.4 ;断开第2位数码管
INC R1
MOV A,@R1
MOVC A,@A+DPTR ;查表转换成对应按键数字
CLR P2.5 ;选通第3位数码管
MOV P0,A ;显示
LCALL DELAY ;延时
MOV P0,#0FFH ;数码管熄灭
SETB P2.5 ;断开第3位数码管
INC R1
MOV A,@R1
MOVC A,@A+DPTR ;查表转换成对应按键数字
CLR P2.6 ;选通第4位数码管
MOV P0,A ;显示
LCALL DELAY ;延时
MOV P0,#0FFH ;数码管熄灭
SETB P2.6 ;断开第4位数码管
RET
NUMTAB: DB 28H,34H,28H,0F7H,0A9H,60H ;0(D) 1(#) 2(0) 3(*) 4(C) 5(9)
DB 20H,7AH,20H,21H,61H,74H ;6(8) 7(7) 8(B) 9(6) 10(5) 11(4)
DB 30H,62H,0A2H,7EH,0EFH,0FFH ;12(A) 13(3) 14(2) 15(1) 16(下划线) 17(熄灭)
DELAY: ;DISPLAY子程序中的延时程序
MOV HC0,#5
DL1: MOV HC1,#250
DL2: DJNZ HC1,DL2
DJNZ HC0,DL1
RET
ALARM2S:MOV TH0,#0F0H ;报警器报警2秒子程序
MOV TL0,#0CH
MOV TMOD,#00H
SETB TR0
SETB ET0
SETB EA
LCALL DELAY2S
CLR EA
RET
ALARM10S:MOV TH0,#0F0H ;报警器报警10秒子程序
MOV TL0,#0CH
MOV TMOD,#00H
SETB TR0
SETB ET0
SETB EA
LCALL DELAY10S
CLR EA
RET
T0INT: CPL P2.0 ;周期为1ms的方波
MOV TH0,#0F0H
MOV TL0,#0CH
RETI
DELAY2S:MOV HC0,#20 ;延时2秒子程序
DL4: MOV HC1,#200
DL5: MOV HC2,#250
DL6: DJNZ HC2,DL6
DJNZ HC1,DL5
DJNZ HC0,DL4
RET
DELAY10S:MOV HC0,#100 ;延时10秒子程序
DL7: MOV HC1,#200
DL8: MOV HC2,#250
DL9: DJNZ HC2,DL9
DJNZ HC1,DL8
DJNZ HC0,DL7
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -