📄 12864lcdlocker.asm
字号:
;****************************
; 汉字密码锁
;****************************
E BIT P0.7 ;定义液晶屏的三个控制信号,使能信号
RW BIT P0.6 ;读写信号,高电平读,低电平写
RS BIT P0.5 ;寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器或者读忙信号。
PSB BIT P0.4
LCDRST BIT P0.3
OKEY BIT P0.0 ;定义开锁输出端口
BEEP BIT P3.1 ;定义蜂鸣器端口
SCL BIT P0.2 ;24L04串行时钟端口
SDA BIT P0.1 ;24L04串行数据端口
SCLK BIT P3.5 ;定义1302串行时钟
IO BIT P3.6 ;定义1302输入输出
RST BIT P3.7 ;定义1302复位端
date_line BIT P3.3 ;定义温度传感器输入输出
IRIN BIT P3.2
FLAG1 BIT 00H ;功能键标志位,为1表示功能按键,为0表示数字按键。
BUF_FULL BIT 01H ;密码已经够六位的标志位,为1表示满,为0表示未满。
F_1 BIT 02H ;后门处理标志位
F_2 BIT 03H
F_3 BIT 04H
F_4 BIT 05H
PSW_TF BIT 06H ;密码是否正确标志位,为1表示密码正确,为0表示密码不正确。
F_5 BIT 07H ;密码输入,修改密码切换标志位
F_6 BIT 08H
BK_BIT BIT 09H
FLASH BIT 0AH
IRIN_1 BIT 0BH ;遥控解码执行标志位
IRIN_2 BIT 0CH ;遥控解码识别标志位
IRIN_SF BIT 0DH ;判断是否有红外信号输入
TEMPBIT BIT 0EH ;温度正负标志位,为1表示温度为负,为0表示温度为正。
ADJ_RL BIT 0FH ;调整日历标志位
KF BIT 10H ;顺序调整标志位
KO BIT 11H ;逆序调整标志位
KADD BIT 12H ;加1调整标志位
KDEC BIT 13H ;减1调整标志位
kBL1 BIT 14H
KBL2 BIT 15H
KBL3 BIT 16H
KBL4 BIT 17H
F_7 BIT 18H ;修改日历标志位
YEARBIT BIT 19H ;年闪标志位
MONTHBIT BIT 1AH ;月闪标志位
DATEBIT BIT 1BH ;日闪标志位
HOURBIT BIT 1CH ;时闪标志位
MINBIT BIT 1DH ;分闪标志位
PASSBIT1 BIT 1EH
PASSBIT2 BIT 20H
PASSBIT3 BIT 21H
PASSBIT4 BIT 22H
PASSBIT5 BIT 23H
;密码缓冲区
PS1 EQU 28H
PS2 EQU 29H
PS3 EQU 2AH
PS4 EQU 2BH
PS5 EQU 2CH
PS6 EQU 2DH
;AT24C02读取缓冲区
AT1 EQU 2EH
AT2 EQU 2FH
AT3 EQU 30H
AT4 EQU 31H
AT5 EQU 32H
AT6 EQU 33H
;后门密码缓冲区
BKPS1 EQU 34H
BKPS2 EQU 35H
BKPS3 EQU 36H
BKPS4 EQU 37H
BKPS5 EQU 38H
BKPS6 EQU 39H
BUFF EQU 3AH ;暂时存放数字键和功能键
TIMERS EQU 3BH ;输入数字的位数
TIMERS1 EQU 3CH ;密码输入的次数
;新密码缓冲区
NEWPRD1 EQU 3DH
NEWPRD2 EQU 3EH
NEWPRD3 EQU 3FH
NEWPRD4 EQU 40H
NEWPRD5 EQU 41H
NEWPRD6 EQU 42H
;修改密码,二次比较密码缓冲区
TWOPRD1 EQU 43H
TWOPRD2 EQU 44H
TWOPRD3 EQU 45H
TWOPRD4 EQU 46H
TWOPRD5 EQU 47H
TWOPRD6 EQU 48H
;延时缓冲区
DELBUF1 EQU 49H
DELBUF2 EQU 4AH
DELBUF3 EQU 4BH
DELBUF4 EQU 4CH
DELBUF5 EQU 4DH
DELBUF6 EQU 4EH
DELBUF7 EQU 4FH
DELBUF8 EQU 50H
LCD_X EQU 51H
LCD_Y EQU 52H
COUNT1 EQU 53H
COUNT2 EQU 54H
COUNT3 EQU 55H
IRCOM EQU 75H
X EQU 56H
IRRD EQU 57H
DS1302_ADDR EQU 59H ;DS1302寄存器地址单元
DS1302_DATA EQU 5AH ;DS1302寄存器数据单元
TEMPL EQU 5BH ;DS18B20温度低字节位地址单元
TEMPH EQU 5CH ;DS18B20温度高字节位地址单元
TEMP_TEN EQU 5DH
TEMP_UNIT EQU 5EH
TEMP_DEC EQU 5FH
TEMP_BUF EQU 60H
week_byte1 EQU 61H
WEEK_BYTE2 EQU 62H
WEEK_BYTE3 EQU 63H
WEEK_BYTE4 EQU 64H
WEEK_BYTE5 EQU 65H
TIME_YEAR EQU 66H ;日历地址单元,年
TIME_MONTH EQU 67H ;月地址单元
WEEK EQU 68H ;星期地址单元
TIME_DAY EQU 69H ;日地址单元
HOUR EQU 6AH ;小时地址单元
MINTUE EQU 6BH ;分钟地址单元
SECOND EQU 6CH ;秒钟地址单元
;********************************************
;********* 12864汉字密码锁 *********
;********************************************
ORG 0000H
AJMP MAIN
ORG 0003H ;外部中断P3.2脚INT0入口地址
LJMP INT ;转入外部中断服务子程序(解码程序)
ORG 30H
;*****************************************
; 主程序
;*****************************************
MAIN:
;*********************************主程序入口地址
MOV SP,#7EH
MOV R1,#126 ;清RAM 128单元
MOV R0,#2
MOV A,#0
CLEAR:
MOV @R0,A
INC R0
DJNZ R1,CLEAR
MOV R0,A
MOV TMOD,#11H ;设置定时器0工作方式1,定时器1工作方式1
SETB EA ;打开总中断
SETB ET1 ;打开定时器1中断
SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发
SETB EX0 ;打开外部中断0中断
SETB PX0 ;设置外部中断0为最高中断级别
MOV BKPS1,#7 ;后门密码唯一:778166
MOV BKPS2,#7
MOV BKPS3,#8
MOV BKPS4,#1
MOV BKPS5,#6
MOV BKPS6,#6
CLR PSB ;复位
LCALL DELAY50MS
NOP
SETB PSB ;通讯方式为8位数据并口
;********************初始化**********************
LGS0:
MOV A,#34H ;34H--扩充指令操作
LCALL SEND_I
LCALL DEL100US
MOV A,#30H ;30H--基本指令操作
LCALL SEND_I
LCALL DEL100US
MOV A,#01H ;清除显示
LCALL SEND_I
LCALL DEL100US
MOV A,#06H ;指定在资料写入或读取时,光标的移动方向
LCALL SEND_I ;DDRAM 的地址计数器(AC)加1
LCALL DEL100US
MOV A,#0CH ;开显示,关光标,不闪烁
LCALL SEND_I
LCALL DEL100US
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;写1302,目的是防止断电以后,再次上电使数据错乱,不能够正常读取
LCALL WRITE
MOV DS1302_ADDR,#90H
MOV DS1302_DATA,#0A7H ;1302充电,充电电流1.1mA
LCALL WRITE
MOV DS1302_ADDR,#80H ;1302开始工作
MOV DS1302_DATA,#00H
LCALL WRITE
MOV DS1302_ADDR,#8EH ;禁止写1302,目的是防止断电以后,再次上电使数据错乱,不能够正常读取
MOV DS1302_DATA,#80H
LCALL WRITE
LCALL FMQ
;===============================================
MAIN1: ;显示图形
;LCALL PHOTO
;LCALL AAFLASH ;连续闪烁3次,每次间隔0.4秒
MOV A,#0CH
LCALL SEND_I
LCALL MENU1 ;开机工作画面显示 年 月 日
LCALL MENU2 ;开机工作画面显示 星期
LCALL MENU3 ;开机工作画面显示 当年温度是:
LCALL MENU4 ;开机工作画面显示 密码
;LCALL PASS_FK1 ;开机工作画面显示 输入密码方框
START:
LCALL TEMPDIS ;温度显示
LCALL TIMEDIS ;日历时间,显示
CH_KEY:
LCALL KS ;检查有没有按键按下
JNZ LK1
JB F_7,CH_KEY
JB F_1,CH_KEY
JB F_5,CH_KEY
AJMP START
LK1:
LCALL DELAY6MS ;防止按键误触发
LCALL KS
JNZ LK2
JB F_7,CH_KEY
JB F_1,CH_KEY
JB F_5,CH_KEY
AJMP START
LK2:
LCALL DELAY6MS ;再次延时防止按键误触发
LCALL KS
JNZ LK_3
JB F_7,CH_KEY
JB F_1,CH_KEY
JB F_5,CH_KEY
AJMP START
LK_3:
NOP
LCALL SBIE ;按键识别子程序
MOV BUFF,A ;送缓冲区以识别是数字键还是功能键?
LCALL CH_KF ;判断按键功能。
JB FLAG1,KEY_FUN1 ;标志为1,则为功能键
AJMP KEY_DIG
KEY_FUN1:
AJMP KEY_FUN ;跳转到功能按键执行程序
;===================================================
; 日历时间显示子程序
;===================================================
TIMEDIS:
JB ADJ_RL,TIMEDIS1
MOV A,#0CH
LCALL SEND_I
AJMP TIMEDIS2
TIMEDIS1:
MOV A,#0FH
LCALL SEND_I
TIMEDIS2:
MOV DS1302_ADDR,#8DH ;读出年数据
LCALL READ
MOV TIME_YEAR,DS1302_DATA
MOV R0,TIME_YEAR
LCALL DIVIDE
MOV A,#81H
LCALL SEND_I
MOV A,R2
ADD A,#30H
LCALL SEND_D
MOV A,R1
ADD A,#30H
LCALL SEND_D
MOV DS1302_ADDR,#89H ;读出月数据
LCALL READ
MOV TIME_MONTH,DS1302_DATA
MOV R0,TIME_MONTH
LCALL DIVIDE
MOV A,#83H
LCALL SEND_I
MOV A,R2
ADD A,#30H
LCALL SEND_D
MOV A,R1
ADD A,#30H
LCALL SEND_D
MOV DS1302_ADDR,#87H ;读出日数据
LCALL READ
MOV TIME_DAY,DS1302_DATA
MOV R0,TIME_DAY
LCALL DIVIDE
MOV A,#85H
LCALL SEND_I
MOV A,R2
ADD A,#30H
LCALL SEND_D
MOV A,R1
ADD A,#30H
LCALL SEND_D
MOV A,#92H ;星期几
LCALL SEND_I
LCALL GETWEEK
MOV A,WEEK
CJNE A,#0,WE_1
MOV DPTR,#WE_TAB0
AJMP WEEK_DIS
WE_1:
CJNE A,#1,WE_2
MOV DPTR,#WE_TAB1
AJMP WEEK_DIS
WE_2:
CJNE A,#2,WE_3
MOV DPTR,#WE_TAB2
AJMP WEEK_DIS
WE_3:
CJNE A,#3,WE_4
MOV DPTR,#WE_TAB3
AJMP WEEK_DIS
WE_4:
CJNE A,#4,WE_5
MOV DPTR,#WE_TAB4
AJMP WEEK_DIS
WE_5:
CJNE A,#5,WE_6
MOV DPTR,#WE_TAB5
AJMP WEEK_DIS
WE_6:
CJNE A,#6,WEEK_DIS
MOV DPTR,#WE_TAB6
WEEK_DIS:
MOV A,#0
MOVC A,@A+DPTR
LCALL WEEK_SHOW
MOV DS1302_ADDR,#85H ;读出小时数据
LCALL READ
MOV HOUR,DS1302_DATA
MOV A,#94H
LCALL SEND_I
MOV R0,HOUR
LCALL DIVIDE
MOV A,R2
ADD A,#30H
LCALL SEND_D
MOV A,R1
ADD A,#30H
LCALL SEND_D
MOV A,#":"
LCALL SEND_D
MOV DS1302_ADDR,#83H ;读出分钟数据
LCALL READ
MOV MINTUE,DS1302_DATA
MOV R0,MINTUE
LCALL DIVIDE
MOV A,R2
ADD A,#30H
LCALL SEND_D
MOV A,R1
ADD A,#30H
LCALL SEND_D
MOV A,#":"
LCALL SEND_D
MOV DS1302_ADDR,#81H ;读出秒钟数据
LCALL READ
MOV SECOND,DS1302_DATA
MOV R0,SECOND
LCALL DIVIDE
MOV A,R2
ADD A,#30H
LCALL SEND_D
MOV A,R1
ADD A,#30H
LCALL SEND_D
NEXT_F0:
JNB YEARBIT,NEXT_F1
MOV A,#81H ;年闪
LCALL SEND_I
AJMP NEXT_OUT
NEXT_F1:
JNB MONTHBIT,NEXT_F2
MOV A,#83H ;月闪
LCALL SEND_I
AJMP NEXT_OUT
NEXT_F2:
JNB DATEBIT,NEXT_F3
MOV A,#85H ;日闪
LCALL SEND_I
AJMP NEXT_OUT
NEXT_F3:
JNB HOURBIT,NEXT_F4
MOV A,#94H ;时闪
LCALL SEND_I
AJMP NEXT_OUT
NEXT_F4:
JNB MINBIT,NEXT_OUT
MOV A,#96H ;分闪
LCALL SEND_I
NEXT_OUT:
RET
WE_TAB0:
DB "日",0
WE_TAB1:
DB "一",0
WE_TAB2:
DB "二",0
WE_TAB3:
DB "三",0
WE_TAB4:
DB "四",0
WE_TAB5:
DB "五",0
WE_TAB6:
DB "六",0
;===================================================
; 温度显示子程序
;===================================================
TEMPDIS:
MOV A,#0CH
LCALL SEND_I
MOV A,#8DH ;当前温度:
LCALL SEND_I
LCALL GET_TEMPER
JNB TEMPBIT,TEMPDIS1
MOV A,#"-"
LCALL SEND_D
AJMP TEMPDIS2
TEMPDIS1:
MOV A,TEMP_TEN
ADD A,#30H
LCALL SEND_D
TEMPDIS2:
MOV A,TEMP_UNIT
ADD A,#30H
LCALL SEND_D
MOV A,#"."
LCALL SEND_D
MOV A,TEMP_DEC
ADD A,#30H
LCALL SEND_D
MOV A,#8FH
LCALL SEND_I
MOV A,#0A1H ;显示温度的符号
LCALL SEND_D
MOV A,#0E6H
LCALL SEND_D
MOV A,#0FH
LCALL SEND_I
MOV A,#9AH
LCALL SEND_I
RET
;***********数字按键输入并且存放到缓冲区内等待比较***********
KEY_DIG:
NOP
NOP ;设一标志,辨别输入是否满
JB F_7,KEY_OUT
JB IRIN_1,KEY_OUT
INC TIMERS ;输入数字的位数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -