📄 ds1302.asm
字号:
;**********************************
;文件名:DS1302.asm
;功能 :在LJD-SY2A实验板完成设置DS1302时间为08年8月8日19点59分59秒,
; 显示时、分、秒。
;
;**********************************
LOAD BIT P1.2
DIN BIT P1.0
DCLK BIT P1.1
DOUT BIT P3.2
BUZZER BIT P2.6
;**********************************
IO_DATA BIT P1.0
SCLK BIT P1.1
RST BIT P1.3
;**********************************
BitCnt DATA 30H ; 数据位计数器
ByteCnt DATA 31H ; 数据字节计数器
Command DATA 32H ; 命令字节地址
RcvDat DATA 40H ; 接收数据缓冲区
XmtDat DATA 50H ; 发送数据缓冲区
;*****************************
USERFLAG EQU 20H
BCD4A EQU 22H
BCD4B EQU 23H
;**********************************
ORG 0000H
JMP START
ORG 0030H
START: mov p1,#60h
MOV SP,#7FH
; CLR BUZZER
;***********************************
CLR DIN ;初始化CH451
SETB DCLK
SETB DIN
SETB LOAD
SETB DOUT
NOP
MOV B,#04H ;设置CH451
MOV A,#03H ;关看门狗开显示键盘
LCALL WRITE
NOP
;*********************设置时钟****************************
Write_Enable:
MOV Command,#8Eh ;命令字节为8E
MOV ByteCnt,#1 ;单字节传送模式
MOV R0,#XmtDat ;数据地址覆给R0
MOV XmtDat,#00h ;数据内容为0 写入允许
LCALL Send_Byte ;调用写入数据子程序
;*******************************当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始
MOV Command,#80h ; 命令字节为80
MOV ByteCnt,#1 ; 单字节传送模式
MOV R0,#XmtDat ;数据地址覆给R0
MOV XmtDat,#00h ;数据内容为0 振荡器工作允许
LCALL Send_Byte ;调用写入数据子程序
;******************************************
Write_Multiplebyte:
MOV Command,#0BEh ;命令字节为BEh
MOV ByteCnt,#8 ;多字节写入模式此模块为8 个
MOV R0,#XmtDat ;数据地址覆给R0
MOV XmtDat, #59h ;秒单元内容为59h
MOV XmtDat+1,#59h ;分单元内容为59h
MOV XmtDat+2,#19h ;时单元内容为13h
MOV XmtDat+3,#08h ;日期单元内容为21h
MOV XmtDat+4,#08h ;月单元内容为06h
MOV XmtDat+5,#05h ;星期单元内容为03h
MOV XmtDat+6,#08h ;年单元内容为00h
MOV XmtDat+7,#0 ;写保护单元内容为00h
LCALL Send_Byte ;调用写入数据子程序
;**********************************************
Read_A1:
MOV B,#05H ;设置为译码
MOV A,#08AH
LCALL WRITE
;*************************************************
TIME:
MOV Command,#85h ; 命令字节为85h
MOV ByteCnt,#1 ; 单字节传送模式
MOV R1,#RcvDat ;数据地址覆给R1
LCALL Receive_Byte ;调用读出数据子程序
LCALL BCD8_1
MOV B,#0aH
MOV A,BCD4A
LCALL WRITE
ORL BCD4B,#80H
MOV B,#0bH
MOV A,BCD4B
LCALL WRITE
;**********************************************
MOV Command,#83h
MOV ByteCnt,#1
MOV R1,#RcvDat
LCALL Receive_Byte
LCALL BCD8_1
MOV B,#0cH
MOV A,BCD4A
LCALL WRITE
ORL BCD4B,#80H
MOV B,#0dH
MOV A,BCD4B
LCALL WRITE
;**********************************************
MOV Command,#81h
MOV ByteCnt,#1
MOV R1,#RcvDat
LCALL Receive_Byte
LCALL BCD8_1
MOV B,#0eH
MOV A,BCD4A
LCALL WRITE
MOV B,#0fH
MOV A,BCD4B
LCALL WRITE
NOP
LJMP TIME
;**********************************
;写CH451程序
;文件名:WRITE
;入参:B、ACC待写的12位数据,低8位在ACC中,高4位在B的低四位中。
;***********************************
WRITE:
; PUSH DPH
; PUSH DPL
; PUSH ACC
CLR EX0
CLR LOAD
MOV R7,#08H
WRITE_1:
RRC A
CLR DCLK
MOV DIN,C
SETB DCLK
DJNZ R7,WRITE_1
MOV A,B
MOV R7,#004H
WRITE_2:
RRC A
CLR DCLK
MOV DIN,C
SETB DCLK
DJNZ R7,WRITE_2
SETB LOAD
SETB EX0
; POP ACC
; POP DPH
; POP DPL
RET
;*********************************
BCD8_1:
MOV R7,#04H
MOV A,RcvDat
RR1:
CLR C
RRC A
DJNZ R7,RR1
MOV BCD4A,A
NOP
MOV R7,#04H
MOV A,RcvDat
RL1:
CLR C
RLC A
DJNZ R7,RL1
SWAP A
MOV BCD4B,A
RET
;*************************************
Send_Byte:
CLR RST
NOP
CLR SCLK
NOP
SETB RST
NOP
MOV A,Command
MOV BitCnt,#08h
S_Byte0:
RRC A
MOV IO_DATA,C
NOP
SETB SCLK
NOP
CLR SCLK
DJNZ BitCnt,S_Byte0
NOP
S_Byte1:
MOV A,@R0
MOV BitCnt,#08h
S_Byte2:
RRC A
MOV IO_DATA,C
NOP
SETB SCLK
NOP
CLR SCLK
DJNZ BitCnt,S_Byte2
INC R0
DJNZ ByteCnt,S_Byte1
NOP
CLR RST
RET
;***************************************************************************************
;接收数据程序;
;名称:Receive_Byte
;描述:从被控器DS1302 接收ByteCnt 个字节数据
;命令字节地址在Command 中
;所接收数据的字节数在ByteCnt 中接收的数据在RcvDat 缓冲区中
;***********************************************************************************
Receive_Byte:
CLR RST ;
NOP
CLR SCLK
NOP
SETB RST
MOV A,Command
MOV BitCnt,#08h
R_Byte0:
RRC A
MOV IO_DATA,C
NOP
SETB SCLK
NOP
CLR SCLK
DJNZ BitCnt,R_Byte0
NOP
R_Byte1:
CLR A
CLR C
MOV BitCnt,#08h
R_Byte2:
NOP
MOV C,IO_DATA
RRC A
SETB SCLK
NOP
CLR SCLK
DJNZ BitCnt,R_Byte2
MOV @R1,A
INC R1
DJNZ ByteCnt,R_Byte1
NOP
CLR RST
RET
;*************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -