📄 密码锁.asm
字号:
CALL LCD_SHOW
RET
;-----------------------------------------------------
INFO1: DB " ",0 ;LCD 第一行显示信息
INFO2: DB "PASSWORD ------ ",0 ;LCD 第二行显示信息
;-----------------------------------------------------
INIT_LCD: ;8位I/O控制 LCD 接口初始化
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#0CH ;开显示,关光标,
CALL WCOM
CALL DELAY1
MOV A,#01H ;清除 LCD 显示屏
CALL WCOM
CALL DELAY1
RET
;----------------------------------------------------
LCD_SHOW: ;在LCD的第一行或第二行显示信息字符
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1: MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
JMP FILL
LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM
FILL: CLR A ;填入字符
MOVC A,@A+DPTR ;由消息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
RET
LC1: CALL WDATA ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
RET
;---------------------------------------------------
CLR_LINE: ;清除该行 LCD 的字符
MOV R0,#24
CL1: MOV A,#' '
CALL WDATA
DJNZ R0,CL1
RET
;-----------------------------------------------------
; 写指令、数据使能子程序
;-----------------------------------------------------
ENABLE: ;写指令使能
CLR RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
CLR RW
SETB EN
CALL DELAY0
CLR EN
RET
ENABLE1: ;写数据使能
SETB RS ;RS=H,RW=L,D0-D7=数据,E=高脉冲
CLR RW
SETB EN
CALL DELAY0
CLR EN
RET
DELAY0: MOV R7,#250 ;延时500微秒
DJNZ R7,$
RET
;----------------------------------------------------
;写入命令子程序
;----------------------------------------------------
WCOM: ;以8位控制方式将命令写至LCD
MOV P0,A ;写入命令
CALL ENABLE
RET
;----------------------------------------------------
;写入数据子程序
;----------------------------------------------------
WDATA: ;以8位控制方式将数据写至LCD
MOV P0,A ;写入数据
CALL ENABLE1
RET
;---------------------------------------------------
;在 LCD 第二行显示字符
;A=ASC DATA, B=LINE X POS
;---------------------------------------------------
LCDP2: ;在LCD的第二行显示字符
PUSH ACC ;
MOV A,B ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
CALL WCOM ;写入命令
POP ACC ;由堆栈取出A
CALL WDATA ;写入数据
RET
;-------------------------------------------------------
;ASCII 转换并显示子程序
;-------------------------------------------------------
CONV:
MOV X,#9 ;设置显示起始位置
MOV A,R3
ANL A,#0F0H ;取出高四位二进制数
SWAP A ;高四位与低四位互换
PUSH ACC ;压入堆栈
CLR C ;C=0
SUBB A,#0AH ;减10
POP ACC ;弹出堆栈
JC ASCII0 ;该数小于10,转ASCII0
ADD A,#07H ;大于10的数加上37H
ASCII0: ADD A,#30H ;小于10的数加上30H
MOV B,X
CALL LCDP2
MOV A,R3
ANL A,#0FH ;取出低四位二进制数
PUSH ACC
CLR C
SUBB A,#0AH ;减10
POP ACC
JC ASCII1 ;该数小于10,转ASCII1
ADD A,#07H ;大于10的数加上37H
ASCII1: ADD A,#30H ;小于10的数加上30H
INC X
MOV B,X
CALL LCDP2
RET
;-----------------------------------------------------
DELAY2: MOV R5,#15H
DELAY: ;延时R5×10MS
MOV R6,#50
D1: MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY
RET
;-----------------------------------------------------
DELAY1: ;延时5MS
MOV R6,#25
D2: MOV R7,#100
DJNZ R7,$
DJNZ R6,D2
RET
;-----------------------------------------------------
KEYTABLE:
DB 0EEH,0EDH,0EBH,0E7H,0DEH ;0,1,2,3,4, 顺序码
DB 0DDH,0DBH,0D7H,0BEH,0BDH ;5,6,7,8,9,
DB 0BBH,0B7H,07EH,07DH,07BH ;A,B,C,D,E,
DB 077H,0FFH ;F 0FF为结束码
DB 0DBH,0EEH,0DEH,0BEH,07EH ;0,1,2,3,4, 顺序码
DB 0EDH,0DDH,0BDH,07DH,0EBH ;5,6,7,8,9,
DB 0BBH,07BH,0E7H,0D7H,0B7H ;A,B,C,D,E,
DB 077H,067H,066H,065H,0FFH ;F,C+F,1+F,8+C
;-------------------------------------------------------
INIT_TIMER: ;初始化定时器
MOV TMOD,#01H ;设置定时器0 工作模式为模式1
MOV IE, #82H ;启用定时器0 中断产生
MOV TL0,#TLOW
MOV TH0,#THIGH
RET
;-------------------------------------------------------
;定时器0计时中断子程序
;-------------------------------------------------------
T0_INT:
PUSH ACC
MOV TL0,#TLOW
MOV TH0,#THIGH
INC D_TIME
MOV A,D_TIME ;5ms 计数值加1
CJNE A,#COUN0,T0_T
MOV D_TIME,#0
INC SEC ;秒加1
MOV A,SEC
CJNE A,#03H,TO_INT0
SETB 20H.3
TO_INT0: CJNE A,#8,T0_T ;是否到8秒?
MOV SEC,#0 ;秒单元清0
SETB 20H.0
T0_T: POP ACC
RETI
;----------------------------------------------------
;读密码值子程序
;-----------------------------------------------------
PASS_READ:
CALL EEPR
RET
MOV COUN1,#06H ;6位密码数值
MOV R7,#00H
MOV R1,#PASS_NEW
P_READ: MOV A,R7
MOV DPTR,#R_TABLE
MOVC A,@A+DPTR
MOV @R1,A
INC R1
INC R7
DJNZ COUN1,P_READ
RET
R_TABLE:
DB 35H,36H,34H,34H,38H,38H
;-----------------------------------------------------
COMP_ERR:
MOV DPTR,#COMP_ERR1 ;
MOV A,#2 ;
CALL LCD_SHOW
RET
COMP_ERR1:
DB " PASSWORD ERROR ",0
;------------------------------------------------------
COMP_OK:
MOV DPTR,#COMP_OK0 ;
MOV A,#2 ;
CALL LCD_SHOW
RET
COMP_OK0:
DB " PASSWORD RIGHT ",0
;------------------------------------------------------
RESET_ERR:
MOV DPTR,#RESET_ERR0 ;
MOV A,#2 ;
CALL LCD_SHOW
RET
RESET_ERR0:
DB " RESET ERROR ",0
;------------------------------------------------------
RESET_OK:
MOV DPTR,#RESET_OK0 ;
MOV A,#2 ;
CALL LCD_SHOW
RET
RESET_OK0:
DB " RESET RIGHT ",0
;------------------------------------------------------
;------------------------------------------------------
INPUT_ERR:
MOV DPTR,#INPUT_ERR0 ;
MOV A,#2 ;
CALL LCD_SHOW
RET
INPUT_ERR0:
DB " INPUT ERROR ",0
;------------------------------------------------------
INPUT_OK:
MOV DPTR,#INPUT_OK0 ;
MOV A,#2 ;
CALL LCD_SHOW
RET
INPUT_OK0:
DB " INPUT RIGHT ",0
;=================================================
;写串行E2PROM子程序
;(R1)=欲写数据存放地址指针
;(R7)=连续读字节数
;24CO1一次可连续写8个字节,12个字节分两次写。
;=================================================
EEPW: PUSH ACC
PUSH PSW
CLR PSW.3
SETB PSW.4
MOV R1,#PASS_NEW
MOV R7,#06H ;连续写8个字节
LCALL START
MOV A,#0A0H ;送器件地址
ACALL SUBS
MOV A,#00H ;送片内字节地址
ACALL SUBS
AGAIN1:
MOV A,@R1
ACALL SUBS ;调发送单字节子程序
INC R1
DJNZ R7,AGAIN1 ;连续写8个字节
LCALL STOP ;发停止信号
POP PSW
POP ACC
RET
SUBS:
MOV R0,#08H ;发送单字节子程序
LOOP: CLR SCLK24
RLC A
MOV SDA,C
NOP
SETB SCLK24
ACALL DELAY24
DJNZ R0,LOOP ;循环8次送8个bit
CLR SCLK24
ACALL DELAY24
SETB SCLK24
REP: MOV C,SDA
JC REP ;判应答到否,未到则等待
CLR SCLK24
RET
DELAY24:
NOP
NOP
RET
;=========================================================
;读串行E2PROM子程序EEPR
;(R1)=欲读数据存放地址指针
;(R7)=连续读字节数
;=========================================================
EEPR: PUSH ACC
PUSH PSW
CLR PSW.3
SETB PSW.4
MOV R7,#06H
MOV R1,#PASS_NEW
LCALL START ;发开始信号
MOV A,#0A0H ;送器件地址
ACALL SUBS ;调发送单字节子程序
MOV A,#00H ;送片内字节地址
ACALL SUBS
LCALL START ;再发开始信号
MOV A,#0A1H
ACALL SUBS
MORE: ACALL SUBR
MOV @R1,A
MOV A,#00H
INC R1
DJNZ R7,MORE
LCALL STOP ;送停止信号
POP PSW
POP ACC
RET
SUBR: MOV R0,#08H ;接受单字节子程序
SUBR2: SETB SCLK24
ACALL DELAY24
MOV C,SDA
RLC A
CLR SCLK24
ACALL DELAY24
DJNZ R0,SUBR2
CJNE R7,#01H,ALOW
SETB SDA ;若是最后一个字节置SDA=1
AJMP SETOK
ALOW:
CLR SDA ;否则置SDA=0
SETOK: ACALL DELAY24
SETB SCLK24
ACALL DELAY24
CLR SCLK24
ACALL DELAY24
SETB SDA ;应答毕,SDA置1
RET
START:
CLR SDA
ACALL DELAY24
SETB SDA
SETB SCLK24
ACALL DELAY24
CLR SDA
SETB SCLK24
RET
STOP:
CLR SDA
SETB SCLK24
ACALL DELAY24
SETB SDA
ACALL DELAY24
RET
;------------------------------------------------------
BZ: ;蜂鸣器
MOV R6,#100
B1: CALL DEX
CPL BEEP
DJNZ R6,B1
MOV R5,#20
CALL DELAY
RET
DEX: MOV R7,#180
DE1: NOP
DJNZ R7,DE1
RET
;-----------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -