一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 11656|回复: 5
收起左侧

[其他综合] 不理解的24C64问题,希望探讨

[复制链接]
发表于 2009-1-8 06:37 | 显示全部楼层 |阅读模式
        在进行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
发表于 2009-2-20 19:36 | 显示全部楼层
好像不是针对我的提问,呵呵
发表于 2009-3-24 21:34 | 显示全部楼层
我的汇编也给学校了,呵呵
发表于 2012-7-17 00:08 | 显示全部楼层
刚考完单片机,因为汇编程序,我们班挂了2/3  不过幸运的是我得了85分。  但是还是不会用汇编写这些程序  都是用C语言写的。

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-3-29 20:53 , Processed in 0.058626 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表