DS1302为什么老是读出00H?是写没写进去?还是读没读出来?哈哈,如果写不进去会读出一串FFH,如果读出问题的话,也不会是00H,昨夜编好实验,无果,甚怒!关机宽衣,忽觉大事不好,莫非我的循环太大了?那会导致一直在写00H,一直在读00H正好与实验结果吻合,无奈舍友下寝,时间太晚,不好开机打扰,意觉明日复战,遂罢!早至工地,连工示之至东门待人!吾遂往,无事!思昨夜程序,应如是!至响归,开机,改小循环,波特率9600写入,果如是!大喜!遂作此篇!曰:事实胜于雄辩!
;美国达拉斯的实时时钟DS1302
ORG 0000H
CE EQU P3.5
IO EQU P3.3
SCLK EQU P3.4
AJMP MAIN
ORG 0030H
MAIN:
LCALL WRITE1302
ppp: LCALL READ1302 ;注意,这里是第一遍写入,循环不能调到main,否则,一直在写你永远读不出时钟哈哈哈,终于成功了!
MOV P0,A
SJMP ppp
WRITE1302:MOV R1,#8
CLR CE
CLR SCLK
SETB CE
NOP
NOP
NOP
NOP ;复位1302
MOV A,#80H ;写控制指令
LCALL WRITE
MOV A,#00H
MOV R1,#8
LCALL WRITE
RET
WRITE: RRC A
MOV IO,C
NOP
NOP
SETB SCLK
NOP
NOP
NOP
CLR SCLK
NOP
NOP
DJNZ R1,WRITE
RET
READ1302:MOV R1,#8
CLR CE
CLR SCLK
SETB CE
NOP
NOP
NOP
NOP
MOV A,#81H
LCALL WRITE
LCALL READ
RET
READ: MOV R1,#8
SETB SCLK
NOP
NOP
NOP
RED: CLR SCLK
NOP
MOV C,IO
RRC A
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R1,RED
RET
END
|