高级会员
主题
帖子
积分135
阅读权限30
注册时间2008-12-3
最后登录1970-1-1
在线时间 小时
|
在进行24C64读写过程中,我碰到一个怪事,现拿到这儿来,希望兄弟们能给我点建议,先谢谢大家.
问题:在存储一个两位数据时,如果存储的数据中只要第一位数是偶数,则读出的数据显示在LCD12864上显示的是汉字(比如:存储数据为"02,21,43,66,89"则读出显示分别为"安,氨,俺,岸,肮"),但是存入的数据第一位是奇数时,显示的数据与存入的数据一致.不知道有碰到与我一样问题的朋友们没有,希望大家给我指正是哪儿错了??12864显示应该没问题.
下面是24C64存储与读入程序:
写12个字节 SDADR写入单元地址 ZX_RAM写入的数据存储地址
------------------------------------------------------*/
I2C_WRITE:
WRITE_AT24C64:
ACALL START_2464 ;发送起始条件
MOV A, #0A0H ;AT24C64总线地址
ACALL SENTBYTE ;发送AT24C64器件总线地址
JB ERR_2464, SENDRETURN ;出错返回
MOV R0, #SDADR ;取存储地址
MOV A, @R0
ACALL SENTBYTE
JB F0, SENDRETURN
INC R0
MOV A, @R0
ACALL SENTBYTE
JB ERR_2464, SENDRETURN
WRITE_AT24C64_1:
MOV A, @R1
ACALL SENTBYTE ;发送一次数据
JB ERR_2464, SENDRETURN ;出错返回
DJNZ R2,WRITE_AT24C64_1
ACALL STOP ;发送停止条件
DELAY10:
MOV R4, #30H ;延时10mS等待数据写完
DELAY11:
MOV R3, #34H
DJNZ R3, $
DJNZ R4, DELAY11
SENDRETURN:
RET
;=============================
;写14个字节 SDADR存入单元地址 ZX_RAM存入的数据存储地址
I2C_READ: ;_AT24C64: ;读AT24C64
ACALL START_2464 ;发送IC总线起始条件
MOV A, #0A0H
ACALL SENTBYTE ;AT24C64总线地址
JB ERR_2464, RCV_TR ;出错返回
MOV R0,#SDADR ;取存储地址
MOV A,@R0
ACALL SENTBYTE ;发送AT24C64器件总线地址
JB ERR_2464, RCV_TR ;出错返回
INC R0
MOV A,@R0
ACALL SENTBYTE ;发送AT24C64器件总线地址
JB ERR_2464,SENDRETURN
ACALL START_2464 ;发送IC总线重复起始条件
MOV A,#0A0H ;AT24C64总线地址
SETB ACC.0 ;取总线读操作数
ACALL SENTBYTE ;发送被控制总线地址
JB ERR_2464, RCV_TR ;出错返回
ACALL RCVBYTE ;接收数据
RCV_TR:
RET
;===============================
START_2464:
SETB SDA ;发送起始条件的数据信号
NOP
SETB SCL ;发送起始条件的时钟信号
NOP
CLR SDA ;发送起始信号
NOP
CLR SCL ;准备发送或接收数据
RET
;===============================
STOP:
CLR SDA ;发送停止条件的数据信号
NOP
SETB SCL ;发送停止条件的时钟信号
NOP
SETB SDA ;发送总线停止信号
NOP
RET
;==============================
SENTBYTE: ;送数8位
MOV BITCNT,#08H
SENTB:
RLC A ;要发送的数据左移,发送入位C
MOV SDA, C
SETB SCL ;置时钟线为高,通知被控制开始接收数据位
CLR SCL ;准备接收下一个数据位
DJNZ BITCNT,SENTB ;8位没发送完继续发送
ACK_WAIT:
SETB SDA ;8位发送完后释放数据线准备收应答位
SETB SCL ;开始接收应答信号
CLR ERR_2464 ;预先清发送数据出错标志
JNB SDA, ACKEND ;判断是否接收应答信号正常转ACKEND
SETB ERR_2464 ;未收到应答置位错误标志
ACKEND:
CLR SCL ;发送结束准备下次发送或接收数据
RET
;==============================
RCVBYTE:
MOV R1,#ZX_RAM
MOV R2,#0EH ;0eh
RCVBYTE_NEXT:
SETB SDA ;置数据线为输入方式
MOV BITCNT,#08H ;传送的数据长度为8位
RCV:
CLR SCL ;置时钟线为低,准备接收数据
SETB SCL ;置时钟线为高使数据线上数据有效
MOV C, SDA
RLC A ;接收的数据位放入ACC
DJNZ BITCNT,RCV ;8位没收完继续接收
MOV @R1,A
CALL ACK_WAIT
JB ERR_2464,RCV_END
DJNZ R2,RCVBYTE_NEXT
RCV_END:
CLR SCL ;8位接收完置时钟线和数据线
CLR SDA
SETB SDA ;接收非应答信号
SETB SCL ;置时钟线为高使应答位有效
SETB SDA
CLR SCL ;清时钟线以便发送停止条件
RET
|
|