📄 password lock programme.asm
字号:
;LP1.ASM 8051 LCD PASSWORD 4
;8051 ASM USE:KELL
;COPYRIGHT CMY 2003
;
KA EQU 0AH
KB EQU 0BH
KC EQU 0CH
KD EQU 0DH
KE EQU 0EH
KF EQU 0FH
;变量定义
PASS EQU 30H
PASSNEW EQU 34H
BUF_KEY EQU 4AH
KEY_NO EQU 4BH
CO EQU 4CH
LCDE EQU 4DH
X EQU 53H
FKEY EQU 20H.0
;LCD信号引脚定义
EN EQU P0.1
RS EQU P0.0
SPK EQU P3.4
REL EQU P3.5
WLED EQU P3.7
;
ORG 0H
JMP BEGIN
;
BEGIN:
CALL INIT_PORT
CALL LED_BL
CALL BZ
CALL SET_LCD
CALL MLOOP
JMP $
;
MESS: DB "LP1.ASM 8051 PASSWORD WITH LCD"
PASS0: DB 1,2,3,4
;
;延时子程序
DELAY:
MOV R6,#50
D1: MOV R7,#100
DJNZ R7, $
DJNZ R6,D1
DJNZ R5,DELAY
RET
;
LED_BL:
MOV R4,#6
LE1: CPL WLED
MOV R5,#3
CALL DELAY
DJNZ R4,LE1
RET
;
;键盘按键编码
TABLE_DIG:
DB 0FH,0BH,00H,0AH
DB 0EH,09H,08H,07H
DB 0DH,06H,05H,04H
DB 0CH,03H,02H,01H
;
SCAN:
MOV R3,#0FEH
MOV R4,#0
MOV R1,#4
CLR PSW.5
;
L1:
MOV A,R3
MOV P2,A
;
MOV R5,#1
CALL DELAY
MOV A,P2
ANL A,#0F0H
MOV R2,#4
;
L2:
JB ACC.4, N1
MOV KEY_NO, R4
SETB PSW.5
N1:
INC R4
RR A
DJNZ R2, L2
;
MOV A, R3
RL A
MOV R3,A
DJNZ R1,L1
;
BACK:
JNB PSW.5,NO_KEY
SETB FKEY
RET
NO_KEY:
CLR FKEY
RET
;
SCAN_KEY:
CLR FKEY
CALL SCAN
JB FKEY,WAIT_OFF
RET
WAIT_OFF:
CALL SCAN
JB FKEY,WAIT_OFF
RET
;
;等待按键并传回按键码
GET_KEY:
CLR FKEY ;清除按键标志
CALL SCAN
JB FKEY,G1
JMP GET_KEY
G1:
CALL SCAN
JB FKEY,G1
MOV A,KEY_NO
MOV DPTR,#TABLE_DIG
MOVC A,@A+DPTR
RET
;
LOOK:
MOV CO,#4
MOV R0,#PASSNEW
LO1:
MOV A,@R0
INC R0
DJNZ CO,LO1
RET
;
CHECK_PASS:
CALL IP_PASS
CALL LOOK
;
MOV CO,#4
MOV R0,#PASS
MOV DPTR,#PASS0
CH1:
MOV A,#0
MOVC A,@A+DPTR
MOV B,@R0
CJNE A,B,CH2
INC DPTR
INC R0
;
DJNZ CO,CH1
CALL OK
CALL LED_BL
CALL LED_BL
RET
CH2:
JMP COMP
ERROR:
CALL ERR
CALL LED_BL
RET
;
COMP:
MOV CO,#4
MOV R0,#PASS
MOV R1,#PASSNEW
C1:
MOV A,@R0
MOV B,@R1
CJNE A,B,ERROR
INC R0
INC R1
;
DJNZ CO,C1
CALL OK
CALL LED_BL
CALL LED_BL
RET
;
IP_PASS:
MOV DPTR,#M_IP
MOV A,#2
CALL LCD_PRINT ;在LCD上显示执行信息
MOV B,#9
MOV CO,#4
MOV R0,#PASS
I1:
CALL GET_KEY
MOV @R0,A
ADD A,#30H
CALL LCDP2
INC B
INC R0
DJNZ CO,I1
RET
;
OK:MOV DPTR,#M_OK
MOV A,#2
CALL LCD_PRINT
CALL DOOR_OPEN
RET
;
ERR: MOV DPTR,#M_ERR
MOV A,#2
CALL LCD_PRINT
CALL ALARM
RET
;
SLINE2:
MOV DPTR,#LMESS2
MOV A,#2
CALL LCD_PRINT
RET
;
SET_PASS:
MOV DPTR, #M_IP_NEW
MOV A,#2
CALL LCD_PRINT
MOV B,#12
MOV CO,#4
MOV R0, #PASSNEW
S1:
CALL GET_KEY
MOV @R0,A
ADD A,#30H
CALL LCDP2
INC B
INC R0
DJNZ CO, S1
RET
;
M_IP: DB "I/P PASS:....",0
M_OK: DB "PASSWORD OK !!!",0
M_ERR: DB "PASSWORD ERROR !",0
M_IP_NEW: DB "I/P NEWPASS:....",0
;
LOOK_PASS:
MOV B,#0
MOV CO,#4
MOV R0,#PASSNEW
LL:
MOV A,@R0
ADD A,#30H
CALL LCDP2
INC R0
INC B
DJNZ CO,LL
MOV R5,#100
CALL DELAY
CALL SLINE2
RET
;
RET_ON:SETB REL
RET
;
REL_OFF: CLR REL
CLR SPK
RET
;
INIT_PORT:
CALL REL_OFF
RET
;
DOOR_OPEN:
CALL RET_ON
MOV R5,#200
CALL DELAY
CALL REL_OFF
RET
;
ALARM:
MOV R2,#3
AL1: CALL LED_BL
CALL BZ
DJNZ R2,AL1
RET
;
BZ:
SETB SPK
MOV R5,#100
CALL DELAY
CLR SPK
RET
;
; DEL: MOV R7,#180
; DE1:NOP
; DJNZ R7,DE1
; RET
;
MLOOP:
CALL GET_KEY
;比较是否为A键
CJNE A,#KA,M1
CALL SET_PASS
CALL SLINE2
JMP MLOOP
;比较是否为B键
M1:CJNE A,#KB,M2
CALL CHECK_PASS
CALL SLINE2
JMP MLOOP
M2:
JMP MLOOP
RET
;
SET_LCD:
CLR EN; en=0
CALL INIT_LCD
MOV R5,#10
CALL DELAY
MOV DPTR,#LMESS1
MOV A,#1
CALL LCD_PRINT
MOV DPTR, #LMESS2
MOV A,#2
CALL LCD_PRINT
RET
;
LMESS1:DB "8051 PASSWORD ",0
LMESS2:DB "A OR B KEY....",0
INIT_LCD1:
MOV A,#28H ;双列显示,字型使用5*7
CALL WCOM
MOV A,#0CH ;光标出现,不闪烁
CALL WCOM
MOV A,#06H ;每次向右移动一位,显示屏不移动
CALL WCOM
MOV A,#01H ;清除LCD显示屏
CALL WCOM
RET
;
LCD_PRINT:
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1: MOV A,#80H
CALL WCOM
CALL CLR_LINE
MOV A,#80H
CALL WCOM
JMP FILL
LINE2:MOV A,#0C0H
CALL WCOM
CALL CLR_LINE
MOV A,#0C0H
CALL WCOM
FILL:
CLR A
MOVC A,@A+DPTR
CJNE A,#0,LC1
RET
LC1:
CALL WDATA
INC DPTR
JMP FILL
RET
;
CLR_LINE:
MOV R0,#24
CL1:
MOV A,#' '
CALL WDATA
DJNZ R0,CL1
RET
DE: MOV LCDE,#100 ;短暂延时
DJNZ LCDE,$
RET
;
EN1:
SETB EN
CALL DE
CLR EN
CALL DE
RET
;
INIT_LCD:
MOV P0,#30H
CALL EN1
MOV P0,#30H
CALL EN1
MOV P0,#30H
CALL EN1
MOV P0,#20H ;启动四位接口指令
CALL EN1
CALL INIT_LCD1
RET
;
WCOM: ;以四位控制方式将命令写至LCD
MOV P0,A
CLR RS
CALL EN1
RLC A
RLC A
RLC A
RLC A
MOV P0,A
CLR RS
CALL EN1
RET
;
WDATA:
MOV P0,A ;以四位控制方式将数据写入LCD
SETB RS
CALL EN1
RLC A
RLC A
RLC A
RLC A
MOV P0,A
SETB RS
CALL EN1
RET
;
LCDP1:
PUSH ACC
MOV A,B
ADD A,#80H
CALL WCOM
POP ACC
CALL WDATA
RET
;
LCDP2:
PUSH ACC
MOV A,B
ADD A,#0C0H
CALL WCOM
POP ACC
CALL WDATA
RET
;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -