📄 clock-mine.asm
字号:
SETB E ;E=1 ;显示完成,程序停车
MOV DPTR,#NUM_TAB
MOV A,C_HOU0
MOVC A,@A+DPTR
MOV P0,A ;写入时个位
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#0C9H ;写入显示起始地址(第2行第10个位置)
LCALL ENABLE_LCD ;调用写入命令子程序
MOV A,C_WEK
CJNE A,#0,C_WEK1
MOV P0,#01010011B ;写入字母S
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01010101B ;写入字母U
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01001110B ;写入字母N
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
LJMP OUT
C_WEK1:
CJNE A,#1,C_WEK2
MOV P0,#01001101B ;写入字母M
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01001111B ;写入字母O
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01001110B ;写入字母N
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
LJMP OUT
C_WEK2:
CJNE A,#2,C_WEK3
MOV P0,#01010100B ;写入字母T
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01010101B ;写入字母U
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01000101B ;写入字母E
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
LJMP OUT
C_WEK3:
CJNE A,#3,C_WEK4
MOV P0,#01010111B ;写入字母W
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01000101B ;写入字母E
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01000100B ;写入字母D
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
LJMP OUT
C_WEK4:
CJNE A,#4,C_WEK5
MOV P0,#01010100B ;写入字母T
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01001000B ;写入字母H
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01010101B ;写入字母U
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
LJMP OUT
C_WEK5:
CJNE A,#5,C_WEK6
MOV P0,#01000110B ;写入字母F
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01010010B ;写入字母R
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01001001B ;写入字母I
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
LJMP OUT
C_WEK6:
CJNE A,#6,C_WEK7
MOV P0,#01010011B ;写入字母S
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01000001B ;写入字母A
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01010100B ;写入字母T
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
LJMP OUT
C_WEK7:
MOV P0,#01000001B ;写入字母A
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01001100B ;写入字母L
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01001100B ;写入字母L
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
OUT:
MOV P0,#8CH ;写入显示起始地址(第1行第12个位置)
LCALL ENABLE_LCD ;调用写入命令子程序
JNB ALARM,DIS_OFF ;闹钟标志有效显示ON,否则显示OFF
MOV P0,#01001110B ;写入N
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#00100000B ;写入空值
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
LJMP OUT2
DIS_OFF:
MOV P0,#01000110B ;写入F
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
MOV P0,#01000110B ;写入F
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL DELAY_LCD ;判断液晶模块是否忙?
SETB E
OUT2:
RET
;日历初始化
LOAD8563:
MOV R0, #XmtDat ;发送缓冲区首地址送R0
MOV @R0, #00H ;秒初值
INC R0
MOV @R0, #30H ;分初值
INC R0
MOV @R0, #12H ;时初值
INC R0
MOV @R0, #09H ;日初值
INC R0
MOV @R0, #05H ;星期初值
INC R0
MOV @R0, #05H ;世纪及月初值(21世纪)
INC R0
MOV @R0, #08H ;年初值
MOV ByteCnt, #07H ;传送7字节
MOV SlvAdr, #0A2H ;PCF8563日历时钟器件地址为A2H
MOV SubAdr, #02H ;从日历时钟的02H单元开始
LCALL SendData ;调用写EEPROM多字节写入过程,将发送缓冲区内的信息写入
;PCF8563日历芯片内日历时间单元
RET
;闹钟初始化(闹钟无效)
LOADCLOCK:
MOV R0,#XmtDat ;发送缓冲区首地址送R0
MOV @R0,#80H ;闹钟分初值
INC R0
MOV @R0,#80H ;闹钟时初值
INC R0
MOV @R0,#80H ;闹钟时初值
INC R0
MOV @R0,#80H ;闹钟星期初值
INC R0
MOV ByteCnt,#04H ;传送4字节
MOV SlvAdr,#0A2H ;PCF8563日历时钟器件地址为A2H
MOV SubAdr,#09H ;从日历时钟的09H单元开始
LCALL SendData ;调用写EEPROM多字节写入过程,将发送缓冲区内的信息写入
;PCF8563日历芯片内日历时间单元
MOV R0,#XmtDat ;发送缓冲区首地址送R0
MOV @R0,#00000000B ;初始化状态控制寄存器2
MOV ByteCnt,#01H ;传送1字节
MOV SlvAdr,#0A2H ;PCF8563日历时钟器件地址为A2H
MOV SubAdr,#01H ;从日历时钟的09H单元开始
LCALL SendData ;调用写EEPROM多字节写入过程,将发送缓冲区内的信息写入
;PCF8563日历芯片内日历时间单元
RET
;压缩式BCD转非压缩式BCD,且把接收缓冲区的内容放入显示缓冲区
LCDBUF:
MOV A,RcvDat
ANL A,#7FH ;屏蔽数据无关位
ANL A,#0FH
MOV SEC0,A ;秒低四位送显示缓冲区
MOV A,Rcvdat
ANL A,#7FH ;屏蔽数据无关位
SWAP A
ANL A,#0FH
MOV SEC1,A ;秒高四位送显示缓冲区
MOV A,RcvDat+1
ANL A,#7FH ;屏蔽数据无关位
ANL A,#0FH
MOV MIN0,A ;分低四位送显示缓冲区
MOV A,Rcvdat+1
ANL A,#7FH ;屏蔽数据无关位
SWAP A
ANL A,#0FH
MOV MIN1,A ;分高四位送显示缓冲区
MOV A,RcvDat+2
ANL A,#3FH ;屏蔽数据无关位
ANL A,#0FH
MOV HOU0,A ;时低四位送显示缓冲区
MOV A,Rcvdat+2
ANL A,#3FH ;屏蔽数据无关位
SWAP A
ANL A,#0FH
MOV HOU1,A ;时高四位送显示缓冲区
MOV A,RcvDat+3
ANL A,#3FH ;屏蔽数据无关位
ANL A,#0FH
MOV DAY0,A ;日低四位送显示缓冲区
MOV A,Rcvdat+3
ANL A,#3FH ;屏蔽数据无关位
SWAP A
ANL A,#0FH
MOV DAY1,A ;日高四位送显示缓冲区
MOV A,RcvDat+4
ANL A,#07H ;屏蔽数据无关位
MOV WEK,A ;星期送显示缓冲区
MOV A,RcvDat+5
ANL A,#1FH ;屏蔽数据无关位
ANL A,#0FH
MOV MON0,A ;月低四位送显示缓冲区
MOV A,Rcvdat+5
ANL A,#1FH ;屏蔽数据无关位
SWAP A
ANL A,#0FH
MOV MON1,A ;月高四位送显示缓冲区
MOV A,RcvDat+6
ANL A,#0FH
MOV YER0,A ;年低四位送显示缓冲区
MOV A,Rcvdat+6
SWAP A
ANL A,#0FH
MOV YER1,A ;年高四位送显示缓冲区
RET
;把时钟的压缩式BCD转非压缩式BCD,且把接收缓冲区的内容放入闹钟显示缓冲区
C_LCDBUF:
MOV A,RcvDat
ANL A,#7FH ;屏蔽数据无关位
ANL A,#0FH
MOV C_MIN0,A ;分低四位送显示缓冲区
MOV A,Rcvdat
ANL A,#7FH ;屏蔽数据无关位
SWAP A
ANL A,#0FH
MOV C_MIN1,A ;分高四位送显示缓冲区
MOV A,RcvDat+1
ANL A,#3FH ;屏蔽数据无关位
ANL A,#0FH
MOV C_HOU0,A ;时低四位送显示缓冲区
MOV A,Rcvdat+1
ANL A,#3FH ;屏蔽数据无关位
SWAP A
ANL A,#0FH
MOV C_HOU1,A ;时高四位送显示缓冲区
MOV A,RcvDat+3
ANL A,#07H ;屏蔽数据无关位
MOV C_WEK,A ;星期送显示缓冲区
RET
;LCD写入控制命令的子程序
ENABLE_LCD:
CLR RS
CLR RW
CLR E ;执行指令
LCALL DELAY_LCD
SETB E
RET
;判断液晶显示器是否忙的子程序
DELAY_LCD:
MOV P0,#0FFH
CLR RS
SETB RW
CLR E ;执行指令
NOP
SETB E
JB P0.7,DELAY_LCD ;如果P0.7为高电平表示忙就循环等待
RET
;------------------------串行EEPROM、日历时钟读写子程序------------
; 发送数据子程序
;名称:SendData
;描述:发送ByteCnt 个字
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -