高级会员 
 
主题
回帖0
积分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 
 |   
 
 
 
 |