📄 密码锁_成功.asm
字号:
ORG 0000H
AJMP START
ORG 000BH
AJMP T_0
ORG 0100H
START: LCALL INIT ;初始化程序
TEMP: LCALL DISPLAY ;数码管显示程序
LCALL KEY_TEST ;键盘测试,把所测得的键值存入40H
LCALL KEY_PRG ;键盘响应程序
SJMP TEMP
INIT: MOV SP, #60H
MOV TMOD, #10H
MOV TH0, #3CH
MOV TL0, #0B0H
MOV IE, #82H
SETB TR0
LCALL TEST_S ;密码是否保存过
CLR 09H ;09H为高电平表示控制灯闪三闪,以示修改密码成功
INIT0: CLR 00H ;控制R0每一次按键只加1
SETB 01H ;初始化灯亮
SETB 02H
SETB 03H
SETB 04H
MOV R0, #0
MOV 39H, #100 ;表时闹钟响的时间
MOV 41H, #0BFH
MOV 42H, #0BFH
MOV 43H, #0BFH
MOV 44H, #0BFH
MOV 50H, #00H ;灯灭位
RET
TEST_S: LCALL READ_S ;08H为1时表示首次使用,需设置初始用户密码
CLR 08H
MOV A, #01H
CJNE A, 38H, S_EXIT
SETB 08H
S_EXIT: RET
DISPLAY:JB 01H, D1 ;数码管显示程序
MOV P2, #00H
SJMP ND1
D1: MOV P2, #01H
ND1: MOV P0, 41H
LCALL RING
LCALL DELAY
JB 02H, D2
MOV P2, #00H
SJMP ND2
D2: MOV P2, #02H
ND2: MOV P0, 42H
LCALL RING
LCALL DELAY
JB 03H, D3
MOV P2, #00H
SJMP ND3
D3: MOV P2, #04H
ND3: MOV P0, 43H
LCALL RING
LCALL DELAY
JB 04H, D4
MOV P2, #00H
SJMP ND4
D4: MOV P2, #08H
ND4: MOV P0, 44H
LCALL RING
LCALL DELAY
RET
RING: JNB 08H, RING_EXIT
SETB P2.5
RING_EXIT:RET
KEY_TEST:MOV P3, #0FH ;检测是否按键被按下
MOV A, P3
ANL A, #0CH
CJNE A, #0CH, TEST
RET
TEST: MOV R7, #4H
LCALL DE
CJNE A, #0CH, J_IN
RET
J_IN: MOV R7, #2 ;键盘测试,把所测得的键值存入40H
LCALL DE
MOV R2, #4
MOV R3, #80H
J_IN1: MOV A, R3
CPL A
MOV P3, A
MOV A, P3
ANL A, #0CH
CJNE A, #0CH, J_IN2
MOV A, R3
RR A
MOV R3, A
DJNZ R2, J_IN1
RET
J_IN2: MOV R1, #0
JNB ACC.3, J_IN3
MOV R1, #4
J_IN3: MOV A, R1
ADD A, R2
MOV 40H, A
SETB 00H
RET
KEY_PRG:MOV P3, #0FH ;键盘响应程序
MOV A, P3 ;检测是否按键被按下
ANL A, #0CH
CJNE A, #0CH, PRG_EXIT
MOV R7, #4
LCALL DE
CJNE A, #0CH, PRG_EXIT
JNB 00H, PRG_EXIT
MOV A, 40H
CJNE A, #8, K_7_PRG
LCALL OPEN
SJMP PRG_E
K_7_PRG:CJNE A, #7, K_6_PRG
LCALL SETTING
SJMP PRG_E
K_6_PRG:MOV A, #41H
ADD A, R0
MOV R1, A
MOV A, 40H
MOV DPTR, #TABLE
MOVC A, @A+DPTR
MOV @R1, A
INC R0
CJNE R0, #4H, CONTINUE
MOV R0, #0
CONTINUE:MOV 50H, #00H
PRG_E: CLR 00H
MOV R7, #4H
LCALL DE
PRG_EXIT:RET
OPEN: MOV A, 41H ;厂家密码为1234
CJNE A, #0F9H, OPEN_EE
MOV A, 42H
CJNE A, #0A4H, OPEN_EE
MOV A, 43H
CJNE A, #0B0H, OPEN_EE
MOV A, 44H
CJNE A, #99H, OPEN_EE
SJMP OPEN_OK
OPEN_EE:LCALL READ_EE
MOV A, 41H
CJNE A, 31H, OPEN_EXIT
MOV A, 42H
CJNE A, 32H, OPEN_EXIT
MOV A, 43H
CJNE A, 33H, OPEN_EXIT
MOV A, 44H
CJNE A, 34H, OPEN_EXIT
OPEN_OK:SETB P2.5
SETB 08H
OPEN_EXIT:LCALL INIT0
RET
SETTING:JNB 08H, SETTING_EXIT
MOV A, #0BFH
CJNE A, 41H, INPUT1
SJMP SETTING_EXIT
INPUT1: CJNE A, 42H, INPUT2
SJMP SETTING_EXIT
INPUT2: CJNE A, 43H, INPUT3
SJMP SETTING_EXIT
INPUT3: CJNE A, 44H, INPUT_OK
SJMP SETTING_EXIT
INPUT_OK:LCALL WRITE_EE
LCALL SAVE_S
CLR 08H
SETB 09H
SETB 01H
SETB 02H
SETB 03H
SETB 04H
MOV 37H, #10H
SJMP S_E
SETTING_EXIT:LCALL INIT0
S_E: RET
DELAY: MOV R7, #5
DE: MOV R2, #250
DJNZ R2, $
DJNZ R7, DE
RET
T_0: DJNZ R6, EXIT0 ;T0 中断
MOV R6, #40
JNB 09H, ONELIGHT
DJNZ 37H, EXIT0_1
CLR 09H
LCALL INIT0
SJMP EXIT0
ONELIGHT:LCALL LIGHT
JNB 08H, EXIT0
DJNZ 39H, EXIT0 ;39H表示声音响的时间长,也是开锁时间
LCALL INIT0
CLR 08H
CLR P2.5
SJMP EXIT0
EXIT0_1:CLR 08H
CLR P2.5
LCALL THREELIGHT
EXIT0: MOV TH0, #3CH
MOV TL0, #0B0H
RETI
LIGHT: CJNE R0, #0, LIGHT1 ;灯的亮灭,01H-04H分别代表四个数码管的亮灭
CPL 01H
SJMP LIGHT0
LIGHT1: SETB 01H
CJNE R0, #1, LIGHT2
CPL 02H
SJMP LIGHT_EXIT
LIGHT2: SETB 02H
CJNE R0, #2, LIGHT3
CPL 03H
SJMP LIGHT_EXIT
LIGHT3: SETB 03H
CJNE R0, #3, LIGHT0
CPL 04H
SJMP LIGHT_EXIT
LIGHT0: SETB 04H
LIGHT_EXIT:RET
THREELIGHT:CPL 01H
CPL 02H
CPL 03H
CPL 04H
RET
;EEPROM的读写子程序
WRITE_EE:LCALL INIT_EE
MOV R1, #41H
WR_CODE:MOV A, @R1
LCALL WBYTE
LCALL RACK
INC R1
CJNE R1, #45H, WR_CODE
LCALL WAITE
LCALL STOP
RET
READ_EE:LCALL INIT_EE ;写放入31H,32H,33H,34H
LCALL STA
MOV A, #0A1H
LCALL WBYTE
LCALL RACK
MOV R5, #4
MOV R1, #31H
LCALL RBYTE
LCALL SNACK
LCALL STOP
RET
INIT_EE:LCALL STA
MOV A, #0A0H
LCALL WBYTE
LCALL RACK
MOV A, #00H
LCALL WBYTE
LCALL RACK
RET
;是否已经写入密码放在EEPROM的10H位
SAVE_S: LCALL STA
MOV A, #0A0H
LCALL WBYTE
LCALL RACK
MOV A, #10H
LCALL WBYTE
LCALL RACK
MOV A, #01H
LCALL WBYTE
LCALL RACK
LCALL STOP
RET
READ_S: LCALL STA ;读出在38H
MOV A, #0A0H
LCALL WBYTE
LCALL RACK
MOV A, #10H
LCALL WBYTE
LCALL RACK
LCALL STA
MOV A, #0A1H
LCALL WBYTE
LCALL RACK
MOV R5, #1
MOV R1, #38H
LCALL RBYTE
LCALL SNACK
LCALL STOP
RET
STA: CLR P1.1
SETB P1.0 ;SDA=P1.0 启动信号
SETB P1.2 ;SCL=P1.2
LCALL WAITE
CLR P1.0
LCALL WAITE
CLR P1.2
RET
STOP: CLR P1.2
LCALL WAITE
CLR P1.0
LCALL WAITE
SETB P1.2
LCALL WAITE
SETB P1.0
RET
WBYTE: MOV R3, #8
WBY24: CLR P1.2
LCALL WAITE
RLC A
MOV P1.0, C
LCALL WAITE
SETB P1.2
LCALL WAITE
CLR P1.2
DJNZ R3, WBY24
RET
RBYTE: MOV R3, #8
RBY24: CLR P1.2
LCALL WAITE
SETB P1.0
LCALL WAITE
SETB P1.2
LCALL WAITE
MOV C, P1.0
LCALL WAITE
RLC A
CLR P1.2
LCALL WAITE
DJNZ R3, RBY24
LCALL SACK
MOV @R1, A
INC R1
DJNZ R5, RBYTE
RET
RACK: CLR P1.2
LCALL WAITE
SETB P1.0
LCALL WAITE
SETB P1.2
LCALL WAITE
MOV C, P1.0
MOV F0, C
CLR P1.2
RET
SACK: CLR P1.2
LCALL WAITE
CLR P1.0
LCALL WAITE
SETB P1.2
LCALL WAITE
LCALL WAITE
CLR P1.2
LCALL WAITE
SETB P1.0
LCALL WAITE
RET
SNACK: CLR P1.2
LCALL WAITE
SETB P1.0
LCALL WAITE
SETB P1.2
LCALL WAITE
LCALL WAITE
CLR P1.2
LCALL WAITE
RET
RNACK: CLR P1.2
LCALL WAITE
SETB P1.0
SETB P1.2
LCALL WAITE
LCALL WAITE
CLR P1.2
CLR P1.0
RET
WAITE: NOP ;延时至少5uS
NOP
NOP
NOP
NOP
RET
;////////EEPROM读写结束子程序
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H ;0-9数码显示
DB 92H,82H,0F8H,80H,90H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -