📄 lock.asm
字号:
MOV PS_OK,#01H
LJMP W00
;;;;;;;;;更改密码
CHA_PS:
MOV A,MODIFY_F
JB ACC.1,CHA_M
LCALL CHPS_U ;;; 修用户密码
LCALL DISP_CLR
LCALL DISP_CHOK ;显示修改成功
MOV R3,#40H
CHU_DEL:
LCALL DELAY1
DJNZ R3,CHU_DEL
MOV MODE_FLAG,#00H
MOV IN_TIME,#00H
MOV MODIFY_F,#00H
MOV PS_OK,#00H
MOV PS_ALL,#00H
LCALL DISP_CLR
LCALL DISP_MODE
LJMP W00
CHA_M:
LCALL CHPS_M ;修管理密码
LCALL DISP_CLR
LCALL DISP_CHOK ;显示修改成功
MOV R3,#40H
CHM_DEL:
LCALL DELAY1
DJNZ R3,CHM_DEL
MOV MODE_FLAG,#00H
MOV IN_TIME,#00H
MOV MODIFY_F,#00H
MOV PS_OK,#00H
MOV PS_ALL,#00H
LCALL DISP_CLR
LCALL DISP_MODE
LJMP W00 ;等键抬起
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;按下解锁键
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NO_ENT1:
MOV A,VAL
CJNE A,#0CH,NO_M ;不是管理键转至NO_M
MOV A,IN_TIME
CJNE A,#03H,NOT_M
MOV MODE_FLAG,#01H
LCALL DISP_CLR
LCALL DISP_MODE
NOT_M:
LJMP W00 ; 等键抬起
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;按下修改用户密码键
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NO_M:
MOV A,VAL
CJNE A,#0DH,NO_USER ;不是修改用户密码的键
MOV A,IN_TIME
CJNE A,#03H,GO_TEXT1
LCALL DISP_START
LJMP W00 ;解锁时无效
GO_TEXT1:
LCALL DISP_CLR
LCALL DISP_TEXT1 ;提示输入管理密码
MOV MODIFY_F,#01H ;修改用户密码
MOV PS_OK,#00H
MOV PS_ALL,#00H
LJMP W00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;按下修改管理密码键
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NO_USER:
MOV A,VAL
CJNE A,#0EH,NO_MA ;不是修改管理密码的键
MOV A,IN_TIME
CJNE A,#03H,GO_TEXT2
LCALL DISP_START
LJMP W00 ;解锁时无效
GO_TEXT2:
LCALL DISP_CLR
LCALL DISP_TEXT1
MOV MODIFY_F,#02H ;修改管理密码
MOV PS_ALL,#00H
MOV PS_OK,#00H
LJMP W00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;按下门铃键
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NO_MA:
MOV A,VAL
CJNE A,#0FH,NO_B ;不是门铃键
SETB BELL ;门铃响
LJMP START1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;按下数字键
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NO_B: ;按下数字键
INC PS_ALL
MOV A,PS_ALL
CJNE A,#07H,R_IN
LCALL ALARM_KEY ;报警
MOV R3,#0AH
NUM_ALARM:
LCALL DELAY1
DJNZ R3,NUM_ALARM
LCALL ALARM_KEY
MOV PS_ALL,#06H
LCALL DISP_START
LJMP W00
R_IN:
MOV PS1,PS2
MOV PS2,PS3
MOV PS3,PS4
MOV PS4,PS5
MOV PS5,PS6
MOV PS6,VAL
LCALL DISP_START
LJMP W00
LJMP START
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;定时器0中断子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INT_T0:
CLR TF0
MOV TH0,#TMH
MOV TL0,#TML
DJNZ R6,T0_EXIT
DJNZ R7,T0_EXIT
MOV MODE_FLAG,#00H
MOV PS_OK,#00H
MOV PS_ALL,#00H
MOV MODIFY_F,#00H
MOV IN_TIME,#00H
MOV LCD_OPEN,#01H ;关显示器
LCALL DISP_CLR ;显示器清屏
LCALL DISP_MODE ;显示模式
MOV COMMAND,#0AEH ;;关显示器
LCALL WINSTR1
MOV COMMAND,#0AEH
LCALL WINSTR2
T0_EXIT:
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;标志初始化子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT_FLAG:
MOV MODE_FLAG,#00H ; 用户模式
MOV ROW,#00H ;行
MOV COL,#00H ;列
MOV VAL,#00H ;键值
MOV IN_TIME,#00H ;连续输入的次数
MOV PS_ALL,#00H ;本次密码的位数
MOV COMMAND,#00H ;显示器指令
MOV DATA1,#00H ;显示器数据
MOV LEFT_ALL,#00H ;左边*为0
MOV RIGHT_ALL,#00H ;右边*为0
MOV MODIFY_F,#00H ;没修改密码
MOV PS_OK,#00H ;密码错
MOV LCD_OPEN,#00H ;显示器开
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;密码初始化子程序 从24LC02中读入用户和管理密码 ;;;;;;;;;;;;;;;待修改
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
READ_PS:
MOV SUPPER1,#06H ;管理密码654321
MOV SUPPER2,#05H
MOV SUPPER3,#04H
MOV SUPPER4,#03H
MOV SUPPER5,#02H
MOV SUPPER6,#01H
MOV USER1,#01H ;用户密码123456
MOV USER2,#02H
MOV USER3,#03H
MOV USER4,#04H
MOV USER5,#05H
MOV USER6,#06H
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;输入密码清至FF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT_PS:
MOV PS1,#0FFH
MOV PS2,#0FFH
MOV PS3,#0FFH
MOV PS4,#0FFH
MOV PS5,#0FFH
MOV PS6,#0FFH
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示器初始化
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT_LCD:
;;;;;;;;;;;;;;;;;;;;初始E1
MOV COMMAND,#0AEH
LCALL WINSTR1
MOV COMMAND,#0C0H
LCALL WINSTR1
MOV COMMAND,#0A4H
LCALL WINSTR1
MOV COMMAND,#00H
LCALL WINSTR1
MOV COMMAND,#0BBH
LCALL WINSTR1
MOV COMMAND,#0A9H
LCALL WINSTR1
MOV COMMAND,#0A0H
LCALL WINSTR1
MOV COMMAND,#0EEH
LCALL WINSTR1
MOV COMMAND,#0AFH
LCALL WINSTR1
;;;;;;;;;;;;;;;;; 初始 E2
MOV COMMAND,#0AEH
LCALL WINSTR2
MOV COMMAND,#0C0H
LCALL WINSTR2
MOV COMMAND,#0A4H
LCALL WINSTR2
MOV COMMAND,#00H
LCALL WINSTR2
MOV COMMAND,#0BBH
LCALL WINSTR2
MOV COMMAND,#0A9H
LCALL WINSTR2
MOV COMMAND,#0A1H
LCALL WINSTR2
MOV COMMAND,#0EEH
LCALL WINSTR2
MOV COMMAND,#0AFH
LCALL WINSTR2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;WINSTR1 显示器写指令 E1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WINSTR1:
CLR A0
MOV LCDP,COMMAND
SETB E1
CLR E1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;WINSTR2 显示器写指令 E2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WINSTR2:
CLR A0
MOV LCDP,COMMAND
SETB E2
CLR E2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;WDATA1 显示器写数据 E1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WDATA1:
SETB A0
MOV LCDP,DATA1
SETB E1
CLR E1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;WDATA2 显示器写数据 E2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WDATA2:
SETB A0
MOV LCDP,DATA1
SETB E2
CLR E2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示模式 MODE_FLAG: 0为用户模式 1:管理模式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP_MODE:
MOV A,MODE_FLAG
CJNE A,#00H,GUAN
;输入
MOV DPTR,#SHURU
LCALL DISP_2E1
MOV DPTR,#MIMA ;密码
LCALL DISP_2E2
RET
;;;;;;;显示 "模式"
GUAN:
MOV DPTR,#MOSHI
LCALL DISP_2E2
;;;;;;;;;;;;;;显示 "管理"
MOV DPTR,#GUANLI
LCALL DISP_2E1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;开始计时中断
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BEGIN_TIME:
MOV TMOD,#11H
CLR TR0
MOV TH0,#TMH
MOV TL0,#TML
CLR TF0
SETB TR0
SETB ET0
SETB EA
MOV R7,#05H ;计时延时
MOV R6,#0FFH
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;延时
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY1:
MOV R5,#50
D1:
MOV R4,#200
DJNZ R4,$
DJNZ R5,D1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; BUZZER响
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ALARM_KEY:
SETB BUZZER
LCALL DELAY1
CLR BUZZER
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示*
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP_START:
MOV R5,PS_ALL ;;;;计算LEFT_ALL,RIGHT_ALL的值
MOV R1,#00H ;右 *
MOV B,#00H ;左 *
MOV R4,#03H ;右边空格
MOV A,PS_ALL
JB ACC.2,LR
JB ACC.1,LR
JB ACC.0,LR
JMP LL
LR:
CJNE R1,#03H,R
INC B
JMP L
R:
INC R1
DEC R4
L:
DJNZ R5,LR
LL:
MOV RIGHT_ALL,R1
MOV LEFT_ALL,B
LCALL DISP_RIGHT
LCALL DISP_LEFT
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示左边*
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP_LEFT:
MOV COMMAND,#0BBH
LCALL WINSTR1
MOV COMMAND,#00H
LCALL WINSTR1
MOV A,LEFT_ALL
MOV R1,LEFT_ALL
JB ACC.1,t6
JB ACC.0,t6
JMP START_EXIT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -