我的思路是初始化DS12887,小时为09,然后读取小时存储器,把值付给P1口,看看P1口电压的变化。却显示全是低电平或高电平。
这是程序:仿真后A中的值是09
ORG 0000H
JMP START
ORG 0030H
START: ;CLR P2.0
;SETB P1.3
MOV SP,#60H
LCALL RTCINIT
MAIN:LCALL RTCREAD
MOV A,32H
;小时的地址
MOV P1,A
MOV R1,#10
LCALL DELAY
JMP MAIN
;--------DS12887初始化子程序--------------
RTCINIT:
MOV
DPTR,#800AH
MOV
A,#70H
MOVX @DPTR,A
INC
DPTR
MOV
A,#8AH
;BCD计数
MOVX @DPTR,A
MOV
DPL,#00H
CLR
A
MOVX @DPTR,A
MOV
DPL,#02H
CLR
A
MOVX
@DPTR,A
MOV
DPL,#04H
MOV
A,#09H ;HONOUR
MOVX @DPTR,A
MOV
DPL,#07H
MOV
A,#06H
;DATE
MOVX @DPTR,A
INC
DPTR
MOV
A,#03H
;MONTH
MOVX @DPTR,A
INC
DPTR
MOV
A,#10H ;YEAR ,2006
MOVX @DPTR,A
INC
DPTR
MOV
A,#26H ;DV2~DV0
MOVX @DPTR,A
INC
DPTR
MOV
A,#1AH
;B寄存器
MOVX @DPTR,A
;时钟开始运行
RET
;--------------------- 查询法读取时间和日历子程序
;---------DS12887读取时间子程序------------------------
RTCREAD:
MOV DPTR,#800AH
WAIT: MOVX A,@DPTR
JB ACC.7,WAIT
;UIP=1,则等待更新完毕
MOV DPL,#00H
MOV R0,#30H
MOV R2,#03H
LOOP1: MOVXA,@DPTR
;读秒、分、时
MOV @R0,A
; 秒、分、时送30H、31H、32H
INC DPTR
INC DPTR
INC R0
DJNZR2,LOOP1
MOV R2,#04H
LOOP2:MOVXA,@DPTR
;读星期、日、月、年
MOV @R0,A
;星期、日、月、年送33H、34H、35H、36H
INC DPTR
;DPTR中为日地址
INC R0
DJNZR2,LOOP2
RET
DELAY:
MOV R7,#100
D2:
MOV R6,#250
DJNZR6,$
DJNZR7,D2
DJNZR1,DELAY
RET
END
|