📄 jrdmdysz.asm
字号:
ANL A,#0FH
MOV OXL,#24
MOV OY,#0
MOV SeleTab,#Tsk
MOV CCCODE,A ; x
LCALL CCTW
MOV OXL,#26
MOV OY,#0
MOV SeleTab,#Tsk
MOV CCCODE,#45 ; 时
LCALL CCTW
MOV A,Min
ANL A,#0F0H
SWAP A
MOV OXL,#28
MOV OY,#0
MOV SeleTab,#Tsk
MOV CCCODE,A ; x
LCALL CCTW
MOV A,Min
ANL A,#0FH
MOV OXL,#30
MOV OY,#0
MOV SeleTab,#Tsk
MOV CCCODE,A ; x
LCALL CCTW
MOV OXL,#32
MOV OY,#0
MOV SeleTab,#Tsk
MOV CCCODE,#46 ; 分
LCALL CCTW
MOV A,Sec
ANL A,#0F0H
SWAP A
MOV OXL,#34
MOV OY,#0
MOV SeleTab,#Tsk
MOV CCCODE,A ; x
LCALL CCTW
MOV A,Sec
ANL A,#0FH
MOV OXL,#36
MOV OY,#0
MOV SeleTab,#Tsk
MOV CCCODE,A ; x
LCALL CCTW
MOV OXL,#38
MOV OY,#0
MOV SeleTab,#Tsk
MOV CCCODE,#47 ; 秒
LCALL CCTW
RET
;
;
; ****** 发送数据(TimeByteCnt)个子节给HT1380 ******
;
HtSendByte: CLR TimeRst ; 复位引脚为低电平,所有数据传送终止
NOP
NOP
CLR TimeClk ; 清时钟总线
NOP
SETB TimeRst ; 复位引脚为高电平,逻辑控制有效
NOP
NOP
MOV A,TimeCommand ; 准备发送命令字节
NOP
MOV TimeBitCnt,#08H ; 传送位数为 8
NOP
NOP
HtSendByte1: RRC A ; 将最低位传送给进位位 C
NOP
NOP
MOV TimeDat,C ; 位传送至数据总线
NOP
NOP
SETB TimeClk ; 时钟上升沿,发送数据有效
NOP
NOP
CLR TimeClk ; 清时钟总线
NOP
NOP
DJNZ TimeBitCnt,HtSendByte1 ; 位传送未完毕则继续
NOP
HtSendByte2: NOP ; 准备发送数据
MOV A,@R0 ; 传送数据,过程与传送命令相同
MOV TimeBitCnt,#08H
HtSendByte3: RRC A
MOV TimeDat,C
NOP
NOP
SETB TimeClk
NOP
NOP
CLR TimeClk
DJNZ TimeBitCnt,HtSendByte3
INC R0 ; 发送数据的内存地址加 1
DJNZ TimeByteCnt,HtSendByte2 ; 字节传送未完毕则继续
NOP
NOP
CLR TimeRst ; 逻辑操作完毕,清 RST
RET
;
; ****** 从HT1380接收数据(TimeByteCnt)个字节 ******
;
ReceiveByte: CLR TimeRst ; 复位引脚为低电平,所有数据传送终止
NOP
NOP
CLR TimeClk ; 清时钟总线
NOP
NOP
SETB TimeRst ; 复位引脚为高电平,逻辑控制有效
NOP
NOP
MOV A,TimeCommand ; 准备发送命令字节
NOP
NOP
MOV TimeBitCnt,#08H ; 传送位数为 8
NOP
NOP
ReceiveByte1: RRC A ; 将最低位传送给进位位 C
NOP
NOP
MOV TimeDat,C ; 位传送至数据总线
NOP
NOP
SETB TimeClk ; 时钟上升沿,发送数据有效
NOP
NOP
CLR TimeClk ; 清时钟总线
NOP
NOP
DJNZ TimeBitCnt,ReceiveByte1 ; 位传送未完毕则继续
NOP
NOP
ReceiveByte2: NOP ; 准备接收数据
CLR A ; 清类加器
CLR C ; 清进位位 C
MOV TimeBitCnt,#08H ; 传送位数为 8
ReceiveByte3: NOP
NOP
MOV C,TimeDat ; 数据总线上的数据传送给 C
RRC A ; 从最低位接收数据
NOP
NOP
SETB TimeClk ; 时钟总线置高
NOP
NOP
CLR TimeClk ; 时钟下降沿接收数据有效
DJNZ TimeBitCnt,ReceiveByte3 ; 位接收完毕则继续
MOV @R0,A
INC R0
DJNZ TimeByteCnt,ReceiveByte2; 字节传送未完毕则继续
NOP
NOP
CLR TimeRst ; 逻辑操作完毕,清 RST
RET
;
; ****** 写保护寄存器操作 ******
;
WriteEnable: MOV TimeCommand,#8EH ; 命令字节为 8EH
MOV TimeByteCnt,#1 ; 单字节传送模式
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV @R0,#00H ; 数据内容为00H (写入允许)
LCALL HtSendByte ; 调用写入子程序
RET
WriteDisable: MOV TimeCommand,#8EH ; 命令字节为 8EH
MOV TimeByteCnt,#1 ; 单字节传送模式
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV @R0,#80H ; 数据内容为80H (禁止写入)
LCALL HtSendByte ; 调用写入子程序
RET
;
; ****** 时钟允许位操作 ******
;
OscEnable: MOV TimeCommand,#80H ; 命令字节为 80H
MOV TimeByteCnt,#1 ; 单字节传送模式
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV @R0,#00H ; 数据内容为00H (振荡器工作允许)
LCALL HtSendByte ; 调用写入子程序
RET
;
; ****** 时钟停止位操作 ******
;
OscDisable: MOV TimeCommand,#80H ; 命令字节为 80H
MOV TimeByteCnt,#1 ; 单字节传送模式
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV @R0,#80H ; 数据内容为80H (振荡器工作停止)
LCALL HtSendByte ; 调用写入子程序
RET
;
; ****** 写 HT1380 时钟 ********
;
HtWriteClock: MOV TimeCommand,#8EH ;
MOV TimeByteCnt,#1 ;
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV @R0,#00H ; 数据内容为00H (写入允许)
LCALL HtSendByte ; 调用写入数据子程序
MOV TimeCommand,#80H ;
MOV TimeByteCnt,#1 ;
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV A,Sec
MOV @R0,A ; 送秒单元内容
LCALL HtSendByte ; 调用写入数据子程序
MOV TimeCommand,#82H ;
MOV TimeByteCnt,#1 ;
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV A,Min
MOV @R0,A ; 送分单元内容
LCALL HtSendByte ; 调用写入数据子程序
MOV TimeCommand,#84H ;
MOV TimeByteCnt,#1 ;
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV A,Hour
MOV @R0,A ; 送时单元内容
LCALL HtSendByte ; 调用写入数据子程序
MOV TimeCommand,#8EH ;
MOV TimeByteCnt,#1 ;
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV @R0,#80H ; 数据内容为80H (禁止写入)
LCALL HtSendByte ; 调用写入数据子程序
RET
;
; ****** 写 HT1380 日期 ********
;
HtWriteDate: MOV TimeCommand,#8EH ;
MOV TimeByteCnt,#1 ;
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV @R0,#00H ; 数据内容为00H (写入允许)
LCALL HtSendByte ; 调用写入数据子程序
MOV TimeCommand,#86H ;
MOV TimeByteCnt,#1 ;
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV A,Day
MOV @R0,A ; 送日单元内容
LCALL HtSendByte ; 调用写入数据子程序
MOV TimeCommand,#88H ;
MOV TimeByteCnt,#1 ;
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV A,Month
MOV @R0,A ; 送月单元内容
LCALL HtSendByte ; 调用写入数据子程序
MOV TimeCommand,#8AH ;
MOV TimeByteCnt,#1 ;
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV A,Week
MOV @R0,A ; 送周单元内容
LCALL HtSendByte ; 调用写入数据子程序
MOV TimeCommand,#8CH ;
MOV TimeByteCnt,#1 ;
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV A,Year
MOV @R0,A ; 送年单元内容
LCALL HtSendByte ; 调用写入数据子程序
MOV TimeCommand,#8EH ;
MOV TimeByteCnt,#1 ;
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV @R0,#80H ; 数据内容为80H (禁止写入)
LCALL HtSendByte ; 调用写入数据子程序
RET
;
; ****** 写 HT1380 多字节时钟 ********
;
WriteMulClock: MOV TimeCommand,#0BEH ; 命令字节为 BEH
MOV TimeByteCnt,#8 ; 多字节写入模式
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV A,Sec
MOV @R0,A ; 送秒单元内容
INC R0
MOV A,Min
MOV @R0,A ; 送分单元内容
INC R0
MOV A,Hour
MOV @R0,A ; 送时单元内容
INC R0
MOV A,Day
MOV @R0,A ; 送日单元内容
INC R0
MOV A,Month
MOV @R0,A ; 送月单元内容
INC R0
MOV A,Week
MOV @R0,A ; 送周单元内容
INC R0
MOV A,Year
MOV @R0,A ; 送年单元内容
INC R0
MOV A,#00H
MOV @R0,A ; 写保护单元内容为 00H
LCALL HtSendByte ; 调用写入数据子程序
RET
;
; ****** 读 HT1380 多字节时钟 ********
;
ReadMulClock: MOV TimeCommand,#0BFH ; 命令字节为 BFH
MOV TimeByteCnt,#8 ; 多字节读出模式
MOV R0,#TimeBuf ; 数据地址赋给 R0
LCALL ReceiveByte ; 调用读出数据子程序
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV A,@R0
INC R0
MOV Sec,A
MOV A,@R0
INC R0
MOV Min,A
MOV A,@R0
INC R0
MOV Hour,A
MOV A,@R0
INC R0
MOV Day,A
MOV A,@R0
INC R0
MOV Month,A
MOV A,@R0
INC R0
MOV Week,A
MOV A,@R0
INC R0
MOV Year,A
RET
;
; ****** 单子节传送方式 ******
;
WriteSingleByte:MOV TimeCommand,#84H ; 命令字节为 84H
MOV TimeByteCnt,#1 ; 多字节写入模式
MOV R0,#TimeBuf ; 数据地址赋给 R0
MOV @R0,#88H ; 写小时内容8时(12小时模式)
LCALL HtSendByte ; 调用写入数据子程序
RET
ReadSingleByte: MOV TimeCommand,#85H ; 命令字节为 85H
MOV TimeByteCnt,#1 ; 多字节读出模式
MOV R0,#TimeBuf ; 读小时内容给 R0
LCALL ReceiveByte ; 调用读出数据子程序
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -