📄 sunliang2.asm
字号:
ORG 0000H
LJMP START
ORG 0003H
LJMP SERVE0
ORG 000BH
LJMP TIME
ORG 0013H
LJMP SERVE1
ORG 0200H
START: MOV SP,#08H
MOV IE,#83H
MOV IP,#80H
MOV TMOD,#01H
MOV R4,#1EH
MOV R5,#14H
MOV TH0,#0FEH
MOV TL0,#0CH
MOV P1,#00H
MOV P3,#0FFH
MOV 2FH,#00H
MOV 2EH,#00H
MOV 44H,#00H
MOV 45H,#00H
MOV 46H,#00H
MOV 47H,#00H
MOV 50H,#64H
MOV 51H,#14H
MOV 52H,#1EH
MOV 53H,#03H
MOV 54H,#10H
MOV 55H,#10H
MOV 57H,#04H
SETB TR0 ;启动密码计时
WAIT: MOV A,P3 ;查询是否遥控开锁
RLC A
RLC A
RLC A
JNC XUNZ0
MOV P3,#0FFH
WAIT1: JB 7FH,BJ
MOV P1,#0FH ;查询是否按动键盘
MOV A,P1
CJNE A,#0FH,WAIT2
LJMP WAIT
WAIT2: LCALL DELAY
MOV P1,#0FH
MOV A,P1
CJNE A,#0FH,MIMA1
LJMP WAIT
XUNZ0: LJMP XUN
ORG 02A0H
MIMA1: LCALL JP
LCALL JPCL
JNB 7EH,MIMA2
LCALL JPS
MIMA2: LCALL DISUP
JB 7FH,BJ
JB 72H,XUNZ1
MOV A,P3 ;查询是否遥控开锁
RRC A
RRC A
RRC A
JNC XUNZ1
MOV P3,#0FFH
LJMP MIMA1
BJ: NOP ;报警
LJMP BJ
XUNZ1: LJMP XUN
ORG 0300H
GMIMA: LCALL JP ;修改密码
LCALL JPCL
JNB 7EH,GMIMA2
LCALL JPS
GMIMA2: LCALL DISUP
JB 72H,XUNZ2
LJMP GMIMA
XUNZ2: LJMP XUN
ORG 0380H
XUN: CLR TR0 ;已开锁,关闭密码计时
SETB EX1
MOV A,4AH ;处理电量数据
MOV B,#0AH
MOV 48H,A
MOV 49H,B
LCALL DISUPS
SETB P1.7 ;启动AD转换
NOP
CLR P1.7
XUN1: NOP ;等待转换结束
LJMP XUN1
ORG 0500H
SERVE0: PUSH PSW
PUSH A
PUSH B
CLR TR0 ;修改密码,关闭密码计时
SETB 70H ;标志位
POP DPH
POP DPL
MOV DPTR,#0300H
PUSH DPL
PUSH DPH
POP B
POP A
POP PSW
RETI
ORG 0540H
TIME: PUSH PSW
PUSH A
PUSH B
JB 7FH,TIME1 ;判断使用状态
DJNZ 50H,TIMEO ;密码输入30秒计时
MOV 50H,#64H
DJNZ 51H,TIMEO
MOV 51H,#14H
DJNZ 52H,TIMEO
SETB 7FH
LJMP TIMEO
TIME1: CPL P2.7 ;警报脉冲
TIMEO: MOV TH0,#0FEH
MOV TL0,#0CH
POP B
POP A
POP PSW
RETI
ORG 0580H
SERVE1: PUSH PSW ;AD转换信号
PUSH A
PUSH B
MOV A,P0
MOV 4AH,A
POP DPH
POP DPL
MOV DPTR,#0380H
PUSH DPL
PUSH DPH
POP B
POP A
POP PSW
RETI
ORG 1000H
JP: CLR C ;扫描键盘
MOV 54H,#10H ;初始化当前数据单元
JP1: MOV P1,#03FH
MOV A,P1
LCALL SAOM1
JC JPO
JP2: MOV P1,#05FH
MOV A,P1
LCALL SAOM2
JC JPO
JP3: MOV P1,#06FH
MOV A,P1
LCALL SAOM3
JC JPO
JPO: RET
SAOM1: CJNE A,#037H,SAOM11 ;扫描键盘第一行
MOV 54H,#0BH
SETB C
LJMP SAOM1O
SAOM11: CJNE A,#03BH,SAOM12
MOV 54H,#03H
SETB C
LJMP SAOM1O
SAOM12: CJNE A,#03DH,SAOM13
MOV 54H,#02H
SETB C
LJMP SAOM1O
SAOM13: CJNE A,#03EH,SAOM1O
MOV 54H,#01H
SETB C
LJMP SAOM1O
SAOM1O: RET
SAOM2: CJNE A,#057H,SAOM21 ;扫描键盘第二行
MOV 54H,#0AH
SETB C
LJMP SAOM2O
SAOM21: CJNE A,#05BH,SAOM22
MOV 54H,#06H
SETB C
LJMP SAOM2O
SAOM22: CJNE A,#05DH,SAOM23
MOV 54H,#05H
SETB C
LJMP SAOM2O
SAOM23: CJNE A,#05EH,SAOM2O
MOV 54H,#04H
SETB C
LJMP SAOM2O
SAOM2O: RET
SAOM3: CJNE A,#067H,SAOM31 ;扫描键盘第三行
MOV 54H,#00H
SETB C
LJMP SAOM3O
SAOM31: CJNE A,#06BH,SAOM32
MOV 54H,#09H
SETB C
LJMP SAOM3O
SAOM32: CJNE A,#06DH,SAOM33
MOV 54H,#08H
SETB C
LJMP SAOM3O
SAOM33: CJNE A,#06EH,SAOM3O
MOV 54H,#07H
SETB C
LJMP SAOM3O
SAOM3O: RET
JPCL: XCH A,55H ;处理数据,查看备用数据单元所存的数据是否已改变(初试数据为10H)
CJNE A,#10H,JPCL1 ;若已改变,指针跳往JPCL1继续查看
MOV A,54H ;若未改变,将当前数据单元所存数据送入备用数据单元
CLR 71H ;并清理数据相同记录次数,然后跳出
LJMP JPCLE
JPCL1: CJNE A,54H,JPCL2 ;查看备用数据单元与当前数据单元所存数据是否相同
SETB 71H ;是则记录数据相同次数,否则指针跳往JPCL2继续查看
LJMP JPCLE
JPCL2: JB 71H,JPCL3 ;查看是否已有数据相同次数
MOV A,#10H ;没有则说明上次数据改变是由抖动引起的
LJMP JPCLE
JPCL3: XCH A,54H ;查看当前数据单元所存数据是否为初始数值
CJNE A,#10H,JPCL4 ;不是则说明当前数据改变是由抖动引起
XCH A,54H ;是则说明一次按键活动结束,应记录数据
MOV 56H,A
MOV A,#10H
SETB 7EH
LJMP JPCLE
JPCL4: XCH A,54H
JPCLE: XCH A,55H
RET
JPS: MOV A,56H ;再次处理数据
CJNE A,#10H,JPS1 ;检查是否为错误数据
LJMP JPSE
JPS1: CJNE A,#0AH,JPS2 ;清零键
MOV 44H,#00H
MOV 45H,#00H
MOV 46H,#00H
MOV 47H,#00H
MOV 57H,#04H
LJMP JPSE
JPS2: CJNE A,#0BH,JPS3 ;确认键
JB 70H,JPS21 ;判断当前状态
MOV A,44H ;密码验证状态
CJNE A,40H,BJZ
MOV A,45H
CJNE A,41H,BJZ
MOV A,46H
CJNE A,42H,BJZ
MOV A,47H
CJNE A,43H,BJZ
SETB 72H
LJMP JPSE
JPS21: MOV 40H,44H ;修改密码状态
MOV 41H,45H
MOV 42H,46H
MOV 43H,47H
CLR 70H
SETB 72H
LJMP JPSE
BJZ: MOV A,53H ;密码错误输入计数(3次)
CJNE A,#00H,BJZ1
SETB 7FH
LJMP JPSE
BJZ1: DEC 53H
LJMP JPSE
JPS3: MOV A,57H ;数字键
CJNE A,#00H,JPS31 ;只许输入四位密码
LJMP JPSE
JPS31: MOV 44H,45H
MOV 45H,46H
MOV 46H,47H
MOV 47H,56H
MOV 56H,#00H
DEC 57H
JPSE: CLR 7EH
RET
DISUP: MOV DPTR,#TAB ;显示子程序1,密码显示用(4位)
MOV A,44H
MOVC A,@A+DPTR
MOV P2,A
CLR P3.0
LCALL DELAY
SETB P3.0
MOV DPTR,#TAB
MOV A,45H
MOVC A,@A+DPTR
MOV P2,A
CLR P3.1
LCALL DELAY
SETB P3.1
MOV A,46H
MOVC A,@A+DPTR
MOV P2,A
CLR P3.6
LCALL DELAY
SETB P3.6
MOV A,47H
MOVC A,@A+DPTR
MOV P2,A
CLR P3.7
LCALL DELAY
SETB P3.7
RET
DISUPS: MOV A,48H ;显示子程序2,电量显示用(2位)
MOVC A,@A+DPTR
MOV P2,A
CLR P3.6
LCALL DELAY
SETB P3.6
MOV A,49H
MOVC A,@A+DPTR
MOV P2,A
CLR P3.7
LCALL DELAY
SETB P3.7
RET
DELE: MOV 4EH,#4 ;延时程序
LOOP1: MOV 4FH,#200
LOOP2: NOP
NOP
NOP
DJNZ 4FH,LOOP2
DJNZ 4EH,LOOP1
RET
DELAY: LCALL DELE
LCALL DELE
RET
TAB: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -