📄 lock.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;密码锁源程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;端口定义
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEYPAD EQU P0 ;键盘扫描用P0口
LCDP EQU P1 ;LCD用P1口
LOCK EQU P2.0 ;开锁用p2.0
A0 EQU P2.3 ;lcd的A0
E1 EQU P2.1 ;lcd的E1
E2 EQU P2.2 ;lcd的E2
BUZZER EQU P2.4 ;蜂鸣器 高为响,低为不响
BELL EQU P2.4 ;门铃 高为响,低为不响
SCK EQU P3.0 ;24lc02 的SCK
SDK EQU P3.1 ;24lc02 的SDK
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;以下六字节存放外部输入的六位密码
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PS1 EQU 4FH
PS2 EQU 4EH
PS3 EQU 4DH
PS4 EQU 4CH
PS5 EQU 4BH
PS6 EQU 4AH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;以下六字节存放管理员的六位密码
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SUPPER1 EQU 49H
SUPPER2 EQU 48H
SUPPER3 EQU 47H
SUPPER4 EQU 46H
SUPPER5 EQU 45H
SUPPER6 EQU 44H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;以下六字节存放用户的六位密码
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
USER1 EQU 43H
USER2 EQU 42H
USER3 EQU 41H
USER4 EQU 40H
USER5 EQU 3FH
USER6 EQU 3EH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;标志位定义
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MODE_FLAG EQU 3DH ; 0: 用户模式 1:管理模式
ROW EQU 3CH ;按键行号
COL EQU 3BH ;按键列号
VAL EQU 3AH ;键值
IN_TIME EQU 39H ;连续输入错误的次数
PS_ALL EQU 38H ;本次输入密码的位数
COMMAND EQU 37H ;显示器指令
DATA1 EQU 36H ;显示器写入数据
LEFT_ALL EQU 35H ;左边*个数
RIGHT_ALL EQU 34H ;右边*个数
MODIFY_F EQU 33H ;是否在修改密码 0:没改 1:改用户密码 2:改管理密码
PS_OK EQU 32H ;修改密码前管理密码正确标志 0:错,1:对
LCD_OPEN EQU 31H ;显示器开关标志 0:开 1:关
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;常数定义
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MS50 EQU 15536 ;50ms定义
TMH EQU (MS50)/256
TML EQU (MS50) mod 256
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 00H
SJMP MAIN
ORG 0BH
LJMP INT_T0 ;定时器0中断
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;待加入串型通信
ORG 0030H
MAIN:
MOV SP,#50H
LCALL INIT_FLAG ;标志初始化
LCALL READ_PS ;密码初始化
LCALL INIT_LCD ;显示器初始化
START:
CLR BUZZER ;蜂鸣器不响
CLR LOCK ;关锁
CLR BELL ;门铃不响
LCALL INIT_PS ;输入密码至FF
LCALL DISP_CLR ;显示器清屏
LCALL DISP_MODE ;显示模式
LCALL BEGIN_TIME ;开始计时
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;键盘
START1:
CLR BELL ;关门铃
CLR BUZZER
ROWSCAN:
MOV KEYPAD,#0F0H ;扫描行码
ROW00:
JNB KEYPAD.4,ROW0
ROW01:
JNB KEYPAD.5,ROW1
ROW02:
JNB KEYPAD.6,ROW2
ROW03:
JNB KEYPAD.7,ROW3
JMP ROWSCAN
ROW0:
LCALL DELAY1
JB KEYPAD.4,ROW00
MOV ROW,#00H
JMP COLSCAN
ROW1:
LCALL DELAY1
JB KEYPAD.5,ROW01
MOV ROW,#01H
JMP COLSCAN
ROW2:
LCALL DELAY1
JB KEYPAD.6,ROW02
MOV ROW,#02H
JMP COLSCAN
ROW3:
LCALL DELAY1
JB KEYPAD.7,ROW03
MOV ROW,#03H
COLSCAN:
MOV KEYPAD,#0FH ;扫描列码
COL00:
JNB KEYPAD.3,COL0
COL01:
JNB KEYPAD.2,COL1
COL02:
JNB KEYPAD.1,COL2
COL03:
JNB KEYPAD.0,COL3
JMP ROWSCAN
COL0:
LCALL DELAY1
JB KEYPAD.3,COL00
MOV COL,#00H
JMP KEYVAL
COL1:
LCALL DELAY1
JB KEYPAD.2,COL01
MOV COL,#01H
JMP KEYVAL
COL2:
LCALL DELAY1
JB KEYPAD.1,COL02
MOV COL,#02H
JMP KEYVAL
COL3:
LCALL DELAY1
JB KEYPAD.0,COL03
MOV COL,#03H
KEYVAL: ;;;;;;;;;;;;;;计算键值
MOV A,ROW
RL A
RL A
ADD A,COL
MOV VAL,A
LCALL ALARM_KEY ;按键声
MOV A,LCD_OPEN
CJNE A,#01H,LCDISOPEN
MOV COMMAND,#0AFH ;开显示器
LCALL WINSTR1
MOV COMMAND,#0AFH
LCALL WINSTR2
MOV LCD_OPEN,#00H
LJMP W00
LCDISOPEN:
LCALL BEGIN_TIME ;开始计时
;是否锁定
MOV A,IN_TIME
CJNE A,#03H,N_L
MOV A,VAL
CJNE A,#0CH,N_LL ;按下不是解锁键
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;对不同按键进行处理
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
N_L:
MOV A,PS_OK
JNB ACC.0,CH_CODE2
MOV A,MODIFY_F
CJNE A,#01,CH_CODE1
JMP CH_CODE3
CH_CODE1:
CJNE A,#02,CH_CODE2
CH_CODE3:
LCALL DISP_CLR
LCALL DISP_CH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;按下CLR 清除键
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CH_CODE2:
MOV A,VAL
CJNE A,#0AH,NO_CLR ;不是CLR键则跳至NO_CLR
MOV R3,PS_ALL
CJNE R3,#00H,CAN_CLR ;输入密码位数不为0至CAN_CLR
LCALL ALARM_KEY ;输入有误,报警
MOV R3,#0AH
DEL_A1:
LCALL DELAY1
DJNZ R3,DEL_A1
LCALL ALARM_KEY
MOV MODE_FLAG,#00H ;返回用户模式
MOV PS_OK,#00H
MOV PS_ALL,#00H
MOV MODIFY_F,#00H
LCALL DISP_CLR
LCALL DISP_MODE
LJMP W00
CAN_CLR: ;删除一位密码 PS6
MOV PS6,PS5
MOV PS5,PS4
MOV PS4,PS3
MOV PS3,PS2
MOV PS2,PS1
MOV PS1,#0FFH ;PS1值为0ffh
DEC PS_ALL ;密码位数减一
LCALL DISP_START ;显示"*"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;等键抬起
W00:
MOV A,KEYPAD
CJNE A,#0F0H,W01
LJMP START1
W01:
MOV A,KEYPAD
CJNE A,#0FH,W02
LJMP START1
W02: SJMP W00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
N_LL:
LCALL DISP_CLR
LCALL DISP_LOCK
MOV A,MODE_FLAG
CJNE A,#01H,N_LLL ;不是管理模式
LJMP N_L
N_LLL:
MOV A,VAL ;门铃可以用
CJNE A,#0FH,N_LLLL
LJMP N_L
N_LLLL:
LJMP W00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;按下ENT 确认键
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NO_CLR:
MOV A,VAL
CJNE A,#0BH,NO_ENT ;不是ENT键则转至NO_ENT
MOV R3,PS_ALL
CJNE R3,#06H,ERR_IN
MOV A,PS_OK
JB ACC.0,CHA_PS1 ;修改密码
MOV A, MODE_FLAG
JB ACC.0,M_PS1 ;跳至管理密码比较
;用户密码比较
MOV A,PS1
CJNE A,USER1,PS_ERR
MOV A,PS2
CJNE A,USER2,PS_ERR
MOV A,PS3
CJNE A,USER3,PS_ERR
MOV A,PS4
CJNE A,USER4,PS_ERR
MOV A,PS5
CJNE A,USER5,PS_ERR
MOV A,PS6
CJNE A,USER6,PS_ERR
OPEN:
SETB LOCK ; 开门
MOV IN_TIME,#00H ;连续错误清零
MOV PS_ALL,#00H;密码位数清零
LCALL DISP_CLR
LCALL DISP_OPEN ;显示"密码正确"
MOV R3,#40H
PS_R:
LCALL DELAY1
DJNZ R3,PS_R
LJMP START
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CHA_PS1: LJMP CHA_PS ;跳转搭桥
M_PS1: LJMP M_PS ;跳转搭桥
NO_ENT: LJMP NO_ENT2 ;跳转搭桥
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ERR_IN:
LCALL ALARM_KEY ;输入有误,报警
MOV R3,#0AH
ENT_A1:
LCALL DELAY1
DJNZ R3,ENT_A1
LCALL ALARM_KEY
LCALL DISP_START
LJMP W00
PS_ERR:
MOV A,MODE_FLAG
JB ACC.0,M_O
INC IN_TIME
LCALL ALARM_KEY ;用户模式报警2声
MOV R3,#0AH
PS_ALARM:
LCALL DELAY1
DJNZ R3,PS_ALARM
LCALL ALARM_KEY
M_O:
MOV A,MODE_FLAG
JNB ACC.0,U_O
SETB BUZZER
MOV R3,#0AH
PS_ALARM1:
LCALL DELAY1
DJNZ R3,PS_ALARM1
U_O:
MOV PS_ALL,#00H ;密码位数置0
LCALL DISP_CLR
LCALL DISP_PSERR ;显示密码错误
MOV R3,#40H
DEL_PS:
LCALL DELAY1
DJNZ R3,DEL_PS
LCALL DISP_CLR
LCALL DISP_MODE
MOV A,MODE_FLAG
JB ACC.0,M_OO
MOV A,IN_TIME
CJNE A,#03H,M_OO
LCALL DISP_CLR
LCALL DISP_LOCK
M_OO:
LJMP W00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NO_ENT2: LJMP NO_ENT1 ;跳转搭桥
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
M_PS: ;管理员密码比较
MOV A,PS1
CJNE A,SUPPER1,PS_ERR
MOV A,PS2
CJNE A,SUPPER2,PS_ERR
MOV A,PS3
CJNE A,SUPPER3,PS_ERR
MOV A,PS4
CJNE A,SUPPER4,PS_ERR
MOV A,PS5
CJNE A,SUPPER5,PS_ERR
MOV A,PS6
CJNE A,SUPPER6,PS_ERR
;密码正确
CLR BUZZER
MOV A,IN_TIME
CJNE A,#03H,C_PS
MOV IN_TIME,#00H
MOV PS_ALL,#00H
MOV MODE_FLAG,#00H
LCALL DISP_CLR
LCALL DISP_UNLOCK ;显示解锁成功
MOV R3,#40H
DEL_UL:
LCALL DELAY1
DJNZ R3,DEL_UL
LCALL DISP_CLR
LCALL DISP_MODE
LJMP W00
C_PS: ;不解锁
MOV IN_TIME,#00H ;连续错误清零
MOV PS_ALL,#00H;密码位数清零
LCALL DISP_CLR
LCALL DISP_OPEN ;显示"密码正确"
MOV R3,#40H
CPS_R:
LCALL DELAY1
DJNZ R3,CPS_R
LCALL DISP_CLR
LCALL DISP_CH ;显示"修改密码"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -