pcf8563的一个小问题,希望能得到答案,谢谢
我现在用PCF8563,
程序有点问题
程序如下
MINU DATA 30H ;秒寄存器
SECO DATA 31H ;分寄存器
HOU DATA 32H ;时寄存器
DAY DATA 33H ;日寄存器
WEEK DATA 34H ;周寄存器
MONTH DATA 35H ;月寄存器
YEAR DATA 36H ;年寄存器
SLA DATA 37H ;37H为被控器的地址
NUMBYT DATA 38H ;38H为数据字节计数器
MRT DATA 40H ;接收数据缓冲区首地址
MTD DATA 50H ;发送数据缓冲区首地址
BITCNT DATA 39h ; bit counter for I2C routines
SLAVEADD DATA 3Ah ; slave address for I2C routines
INPUT DATA 3Bh ; data recieved from the slave
OUTPUT DATA 3Ch ; data to be transmitted to slave
NOACK BIT 00h ; I2C no acknowledge flag
;①PCF8563定时器工作模式
PCFINT: MOV 51H,#81H ;设置PCF8563的0EH为81H,启动定时器,定时器频率64Hz
MOV 52H,#64 ;设置PCF8563的0FH为64,定时器倒计数值为64
MOV MTD,#0EH ;定时器控制寄存器字节首地址
MOV NUMBYT,#3 ;写字节
MOV SLA,#0A2H ;取写器件地址
LCALL WRNBYT ;写8563
;以上配置完成后,PCF8563的INT脚产生周期为1s,脉冲宽度(低电平)约为15ms的脉冲中断信号。
;②PCF8563当前时间设定子程序如下:
PCFWR: MOV 51H,#00H ;启动时钟
MOV 52H,#11H ;定时器为中断模式,脉冲形式
MOV 53H,MINU ;将秒至年的时间写入发送缓冲区
MOV 54H,SECO
MOV 55H,HOU
MOV 56H,DAY
MOV 57H,WEEK
MOV 58H,MONTH
MOV 59H,YEAR
MOV SLA,#0A2H ;取写器件地址
MOV NUMBYT,#10 ;写字节数
MOV MTD,#00H ;写入8563寄存器首地址为00H
LCALL WRNBYT ;写入8563
RET
;③读出时钟芯片当前值子程序设计
PCFRD: MOV MTD,#02H ;读时钟寄存器首字节地址02H
MOV SLA,#0A2H ;取写器件地址
MOV NUMBYT,#1 ;写字节数
LCALL WRNBYT ;写8563
MOV SLA,#0A3H ;取读器件地址
MOV NUMBYT,#7 ;读七个时钟信息
LCALL RDNBYT ;读取时间并放入缓冲区
MOV A,40H ;取滗字节
ANL A,#7FH ;屏蔽无效位
MOV MINU,A ;送秒寄存器
MOV A,41H ;取分字节
ANL A,#7EH ;屏蔽无效位
MOV MINU,A ;送分寄存器
MOV A,42H ;取小时字节
ANL A,#3FH ;屏蔽无效位
MOV HOU,A ;送时寄存器
MOV A,43H ;取天字节
ANL A,#3FH ;屏蔽无效位
MOV DAY,A ;送天寄存器
MOV A,44H ;取星期字节
ANL A,#07H ;屏蔽无效位
MOV WEEK,A ;送星期寄存器
MOV A,45H ;取月字节
ANL A,#1FH ;屏蔽无效位
MOV MONTH,A ;送月寄存器
RET
;系统程序流程如图4所示,中断服务程序如5所示。
; Send 8-bits in ACC to the slave
WRNBYT:
MOV BITCNT,#8 ; 8 bits in a byte
SETB MDE ; to enable SDATA pin as an output
CLR MCO ; make sure that the clock line is low
SENDBIT:
RLC A ; put data bit to be sent into carry
MOV MDO,C ; put data bit on SDATA line
SETB MCO ; clock to send bit
CLR MCO ; clear clock
DJNZ BITCNT,SENDBIT ; jump back and send all eight bits
CLR MDE ; release data line for acknowledge
SETB MCO ; send clock for acknowledge
JNB MDI,NEXT ; this is a check for acknowledge
SETB NOACK ; no acknowledge, set flag
NEXT: CLR MCO ; clear clock
RET
;____________________________________________________________________
; RCVBYTE
; receives one byte of data from an I2C slave device. Returns it in A
RDNBYT:
MOV BITCNT,#8 ; Set bit count.
CLR MDE ; to enable SDATA pin as an input
CLR MCO ; make sure the clock line is low
RCVBIT:
SETB MCO ; clock to recieve bit
CLR MCO ; clear clock
MOV C,MDI ; read data bit into carry.
RLC A ; Rotate bit into result byte.
DJNZ BITCNT,RCVBIT ; Repeat until all bits received.
; recieved byte is in the accumulator
SETB MDE ; Data pin =Output for NACK
SETB MDO ; Send NACK (always send NACK for
; last byte in transmission)
SETB MCO ; Send NACK clock.
CLR MCO
RET
发表时间:2004年7月14日16:58:24