"); //-->
;========功能提要=========
;DS1302显示时间程序
;本课重点为DS1302的时序
;=========================
SCLK BIT P2.3 ;时钟线(当SCLK为1时,数据被写入,为0数据被输出)
IO_K BIT P2.4 ;数据线
RST BIT P2.5 ;所有数据传送在RST为1进行,为0停止任何数据的传送。
YS1 DATA 30H
YS2 DATA 31H
IR DATA 32H ;送指令寄存器
BUF DATA 40H
WSJQ DATA 50H ;写时间寄存区
RSJQ DATA 58H ;读时间寄存区
ORG 0000H
MAIN: MOV SP,#80H
LCALL CS1302
LOOP: LCALL DU1302
LCALL BCD
LCALL YHDTSM
SJMP LOOP
;初始化1302
CS1302: MOV R4,#8
MOV IR,#0BEH
MOV R1,#WSJQ
MOV WSJQ,#12H ;给秒参数(这个参数值必须要16进制)
MOV WSJQ+1,#30H ;定义30分
MOV WSJQ+2,#09H ;09时
MOV WSJQ+3,#11H ;11日
MOV WSJQ+4,#01H ;01月
MOV WSJQ+5,#01H ;星期1
MOV WSJQ+6,#10H ;2010年
MOV WSJQ+7,#00H ;打开写允许寄存器(0为允许,1禁止)
ACALL WRSX
RET
;读出1302
DU1302: MOV R4,#7
MOV IR,#0BFH
MOV R1,#RSJQ
ACALL RDSX
RET
;对读出的数据进行显示程序
;============================
BCD: MOV A,RSJQ
MOV B,#16
DIV AB
MOV BUF,B
MOV BUF+1,A
MOV A,RSJQ+1
MOV B,#16
DIV AB
MOV BUF+2,B
MOV BUF+3,A
MOV A,RSJQ+2
MOV B,#16
DIV AB
MOV BUF+4,B
MOV BUF+5,A
RET
YHDTSM: MOV R5,#0
MOV R0,#BUF
LYH1: MOV P2,R5
LCALL CB
INC R5
CJNE R0,#BUF+6,LYH1
RET
CB: MOV DPTR,#TABLE
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
LCALL D5MS
INC R0
RET
;============================
;DS1302协议
WRSX: ACALL ZBCL
LWR2: MOV R3,#8 ;传送位寄存器(8位共1字节)
MOV A,@R1
LWR1: RRC A
MOV IO_K,C
SETB SCLK
NOP
CLR SCLK
DJNZ R3,LWR1
INC R1
DJNZ R4,LWR2 ;传送字节个数控制寄存器
CLR RST
RET
RDSX: ACALL ZBCL
LRD2: MOV R3,#8
LRD1: MOV C,IO_K
SETB SCLK
NOP
CLR SCLK
RRC A
DJNZ R3,LRD1
MOV @R1,A
INC R1
DJNZ R4,LRD2
CLR RST
RET
ZBCL: CLR RST ;要通信的准备1:先告诉单片机准备通信
NOP
CLR SCLK ;准备2:把RST置1(开通信)前须先将SCLK(时钟电平)拉低
NOP
SETB RST ;拉高RST做通信传送(开始通信)
MOV R3,#8
MOV A,IR ;这条告诉DS1302任务(任务命令下达为IR控制)
LZB1: RRC A
MOV IO_K,C
SETB SCLK
NOP
CLR SCLK
DJNZ R3,LZB1
RET
;======================================
;延时子程序
D5MS: MOV YS1,#5
D1: MOV YS2,#250
DJNZ YS2,$
DJNZ YS1,D1
RET
TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。