📄 12864lcdlocker.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;*****************************************
; 蜂鸣器鸣响程序
;*****************************************
FMQ:
MOV 58H,#200
MOV 59H,#250
FMQ1:
CPL BEEP
DJNZ 59H,$
MOV 59H,#125
CPL BEEP
DJNZ 59H,$
MOV 59H,#250
DJNZ 58H,FMQ1
SETB BEEP
RET
;*****************************************
; 按键识别子程序
;*****************************************
SBIE:
MOV R0,#0F7H ;识别按键子程序,数据送A保存,课本P146页。
MOV R1,#00H
LK4:
MOV A,R0
MOV P1,A
nop
nop
nop
nop
JB ACC.0,L_JUMP ;判断第四行的键值,0,CLR,MODI,ENTER
MOV A,P1
JB ACC.7,LLONE
MOV A,#11H ;CLR 清除键
AJMP LKP1
LLONE:
JB ACC.6,LLTWO
MOV A,#00H ;0
AJMP LKP1
LLTWO:
JB ACC.5,LLTHR
MOV A,#14H ;ENTER 回车键
AJMP LKP1
LLTHR:
JB ACC.4,KND
MOV A,#12H ;
AJMP LKP1
L_JUMP:
NOP
MOV A, P1
JB ACC.7,LONE ;数字键1-9和特殊功能键
MOV A,#01H
AJMP LKP
LONE:
JB ACC.6,LTWO
MOV A,#02H
AJMP LKP
LTWO:
JB ACC.5,LTHR
MOV A,#03h
AJMP LKP
LTHR:
JB ACC.4,NEXTT ;判断下一列
MOV A,#10H
LKP:
ADD A,R1
LKP1:
PUSH ACC
LCALL FMQ
LK3:
LCALL KS
JNZ LK3 ;判断按键是否松开,防止按键误触发
POP ACC
RET
NEXTT:
INC R1
INC R1
INC R1
MOV A,R0
JNB ACC.0,KND
RR A
MOV R0,A
AJMP LK4
KND:
LJMP CH_KEY
;*****************************************
; 判断按键功能子程序
;*****************************************
CH_KF:
CLR C
MOV A,BUFF ;判断是数字按键还是功能按键,为1表示功能键
CJNE A,#10H,KY ;如果按键值<10H,CY=1,如果按键值>=10H,CY=0
KY:
JC SET_CH
setb FLAG1 ;假若是数字按键则标志位置0
AJMP CH_END
SET_CH:
clr FLAG1 ;假若是功能按键则标志位置1
CH_END:
NOP
RET
;*********************************
;* 分离程序 *
;*********************************
DIVIDE:
MOV A,R0
ANL A,#0FH
MOV R1,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV R2,A
RET
;===================================================
; 电子密码锁开机之后工作界面
;===================================================
MENU1:
MOV DPTR,#TAB1
MOV A,#1
LCALL LCD_SHOW
RET
TAB1: DB "20 年 月 日",0
MENU2:
MOV DPTR,#TAB2
MOV A,#2
LCALL LCD_SHOW
RET
TAB2: DB "星期",0
MENU3:
MOV DPTR,#TAB3
MOV A,#3
LCALL LCD_SHOW
RET
TAB3: DB "当前温度:",0
MENU4:
MOV DPTR,#TAB4
MOV A,#4
LCALL LCD_SHOW
RET
TAB4: DB "密码",0
;===================================================
; 电子密码锁几种输入状态
;===================================================
MENU_A1:
MOV DPTR,#ATAB1
MOV A,#4
LCALL LCD_SHOW
RET
ATAB1: DB "密码正确,开锁。",0
MENU_A2:
MOV DPTR,#ATAB2
MOV A,#4
LCALL LCD_SHOW
RET
ATAB2: DB "第一次输入错误",0
MENU_A3:
MOV DPTR,#ATAB3
MOV A,#4
LCALL LCD_SHOW
RET
ATAB3: DB "第二次输入错误",0
MENU_A4:
MOV DPTR,#ATAB4
MOV A,#4
LCALL LCD_SHOW
RET
ATAB4: DB "三次输入错误报警",0
;===================================================
; 电子密码锁修改密码几种状态
;===================================================
MENU_B1:
MOV DPTR,#BTAB1
MOV A,#1
LCALL LCD_SHOW
RET
BTAB1: DB " [ 修改密码 ]",0
MENU_B2:
MOV DPTR,#BTAB2
MOV A,#2
LCALL LCD_SHOW
RET
BTAB2: DB "请输入原始密码:",0
MENU_B3:
MOV DPTR,#BTAB3
MOV A,#2
LCALL LCD_SHOW
RET
BTAB3: DB "请输入新的密码:",0
MENU_B4:
MOV DPTR,#BTAB4
MOV A,#2
LCALL LCD_SHOW
RET
BTAB4: DB "请确认新的密码:",0
MENU_B5:
MOV DPTR,#BTAB5
MOV A,#2
LCALL LCD_SHOW
RET
BTAB5: DB "密码修改成功",0
MENU_B6:
MOV DPTR,#BTAB6
MOV A,#3
LCALL LCD_SHOW
RET
BTAB6: DB "新密码是:",0
MENU_B8:
MOV DPTR,#BTAB8
MOV A,#2
LCALL LCD_SHOW
RET
BTAB8: DB " 两次输入密码",0
MENU_B9:
MOV DPTR,#BTAB9
MOV A,#3
LCALL LCD_SHOW
RET
BTAB9: DB "不正确, 很抱歉",0
MENU_B10:
MOV DPTR,#BTAB10
MOV A,#4
LCALL LCD_SHOW
RET
BTAB10: DB "密码修改失败....",0
;===================================================
; 遥控器解码几种状态
;===================================================
MENU_C1:
MOV DPTR,#CTAB1
MOV A,#1
LCALL LCD_SHOW
RET
CTAB1: DB " [ 遥控器解码 ]",0
MENU_C2:
MOV DPTR,#CTAB2
MOV A,#2
LCALL LCD_SHOW
RET
CTAB2: DB "KBLKING@163.COM",0
MENU_C3:
MOV DPTR,#CTAB3
MOV A,#3
LCALL LCD_SHOW
RET
CTAB3: DB "地址码: - - H",0
MENU_C4:
MOV DPTR,#CTAB4
MOV A,#4
LCALL LCD_SHOW
RET
CTAB4: DB "数据码: - - H",0
MENU_C5:
MOV DPTR,#CTAB5
MOV A,#3
LCALL LCD_SHOW
RET
CTAB5: DB " 地址码和数据码",0
MENU_C6:
MOV DPTR,#CTAB6
MOV A,#4
LCALL LCD_SHOW
RET
CTAB6: DB "保存成功!",0
MENU_C7:
MOV DPTR,#CTAB7
MOV A,#4
LCALL LCD_SHOW
RET
CTAB7: DB "保存失败!",0
;===================================================
; 后门查看界面
;===================================================
MENU_E1:
MOV DPTR,#ETAB1
MOV A,#1
LCALL LCD_SHOW
RET
ETAB1: DB " [ 后门查看 ]",0
MENU_E2:
MOV DPTR,#ETAB2
MOV A,#2
LCALL LCD_SHOW
RET
ETAB2: DB "KBLKING@163.COM",0
MENU_E3:
MOV DPTR,#ETAB3
MOV A,#3
LCALL LCD_SHOW
RET
ETAB3: DB "密码是:",0
MENU_E4:
MOV DPTR,#ETAB4
MOV A,#3
LCALL LCD_SHOW
RET
ETAB4: DB "13",0
; 9月21
;星期一
;北京时间22:12:12
;===================================================
;在 LCM 各行显示信息字符
;===================================================
WEEK_SHOW:
MOV A,#92H ;设置 LCD 的第一行地址
CALL SEND_I ;写入命令
JMP FILL
LCD_SHOW:
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1:
MOV A,#80H ;设置 LCD 的第一行地址
CALL SEND_I ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置 LCD 的第一行地址
CALL SEND_I ;写入命令
JMP FILL
LINE2:
CJNE A,#2,LINE3 ;判断是否为第三行
MOV A,#090H ;设置 LCD 的第三行地址
CALL SEND_I ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#090H ;设置 LCD 的第三行地址
CALL SEND_I
JMP FILL
LINE3:
CJNE A,#3,LINE4 ;判断是否为第三行
MOV A,#088H ;设置 LCD 的第三行地址
CALL SEND_I ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#088H ;设置 LCD 的第三行地址
CALL SEND_I
JMP FILL
LINE4:
CJNE A,#4,LINE5 ;判断是否为第三行
MOV A,#098H ;设置 LCD 的第三行地址
CALL SEND_I ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#098H ;设置 LCD 的第三行地址
CALL SEND_I
FILL:
CLR A ;填入字符
MOVC A,@A+DPTR ;由消息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
LINE5:
RET
LC1:
CALL SEND_D ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
RET
;=================================================
;清除该行 LCM 的字符
;=================================================
CLR_LINE:
MOV R0,#16 ;
CL1: MOV A,#' '
CALL SEND_D
DJNZ R0,CL1
RET
;==================================================
;清屏
;==================================================
CLEAR_P:
MOV A,#01H ;清屏
LCALL SEND_I
RET
;===============================================
;写数据子程序
;RS=1,RW=0,E=高脉冲,D0-D7=数据
;===============================================
SEND_D:
LCALL CHK_BUSY ;写数据子程序
SETB RS
CLR RW
MOV P2,A
SETB E
NOP
NOP
CLR E
RET
;===============================================
;写指令子程序
;RS=0,RW=0,E=高脉冲,D0-D7=指令码
;===============================================
SEND_I:
LCALL CHK_BUSY
CLR RS
CLR RW
MOV P2,A
SETB E
NOP
NOP
CLR E
RET
;================================================
;;测忙碌子程序
;RS=0,RW=1,E=H,D0-D7=状态字
;================================================
CHK_BUSY:
MOV P2,#0FFH ;测忙碌子程序
CLR RS
SETB RW
SETB E
JB P2.7,$
CLR E
RET
;****************************************************
;---------------------------------------------
; DS18B20温度转换程序
;---------------------------------------------
get_temper:
CLR EA
lcall rest ;复位DS18B20
jb F1,dss2 ;判断DS18B20是否存在
ret
dss2:
mov a,#0cch ;跳过ROM匹配
lcall DSWR
mov a,#44h ;向DS18B20发出温度转换命令
lcall DSWR
lcall rest ;读温度前先复位
mov a,#0cch ;跳过ROM匹配
lcall DSWR
mov a,#0beh ;向DS18B20发出度温度命令
lcall DSWR
lcall DSRE ;读取温度数据
SETB EA
ret
;DS18B20 RESET
rest:
setb date_line
nop
clr date_line
mov r0,#6bh ;主机发出延时复位低脉冲
mov r1,#04h
tsr1:
djnz r0,$
mov r0,#6bh
djnz r1,tsr1
setb date_line ;然后拉高数据线
nop
nop
nop
mov r0,#32h
tsr2:
jnb date_line,tsr3 ;等待DS18B20回应
djnz r0,tsr2
jmp tsr4 ; 延时
tsr3:
setb f1 ; 置标志位,表示DS1820存在
jmp tsr5
tsr4:
clr f1 ; 清标志位,表示DS1820不存在
jmp tsr7
tsr5:
mov r0,#06bh
tsr6:
djnz r0,$ ; 时序要求延时一段时间
tsr7:
setb date_line
ret
;WRITE DS18B20 2007-05-28>>MON
DSWR:
mov r2,#8 ;一共8位数据
CLR C
wr1:
clr date_line ;开始写入DS18B20总线要处于复位(低)状态
mov r3,#07
djnz r3,$ ;总线复位保持16微妙以上
rrc a
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -