导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[sxtb4119]能否帮我改正II2C的程序24C32汇编



No.26806
作者:sxtb4119
邮件:lljitb@126.com
ID:107044
登陆:1次
文章数:1篇
最后登陆IP:
最后登陆:2008/4/27 8:08:27
注册:2008/4/27 8:08:27
财富:100
发帖时间:2008/4/27 8:24:37
发贴者IP:221.218.43.224
标题:sxtb4119:能否帮我改正II2C的程序24C32汇编源码没问题关键是C51的程序[求助]
摘要:No.26806能否帮我改正II2C的程序24C32汇编源码没问题关键是C51的程序[求助] 能否帮我改正II2C的程序24C32汇编源码没问题关键是C51的程序
sbit SDA = P3^5;        
sbit SCL = P3^4;
汇编源码没问题,关键是C51的程序。


汇编源码是:

;WRS是写入程序
;将(R1)指示的(R7)个片内字节写入EEPROM中写入首址由(R0)指示
;(R7)  <=8时比较保险
WR_SPROM:       LCALL   STAT_SPROM              ;发出起始信号
              MOV       A, #0A0H    ;发出写命令(10100000)
                LCALL   OUTB_SPROM
              JC        WBE         ;无回答,结束操作
              MOV       A, R2       ;发出EEPROM首址
                LCALL   OUTB_SPROM
              JC        WBE         ;无回答,结束操作
              MOV       A, R1       ;发出EEPROM首址
                LCALL   OUTB_SPROM
              JC        WBE         ;无回答,结束操作
        WR1:  MOV       A, @R0      ;取一字节内容
                LCALL   OUTB_SPROM              ;写入EEPROM中
              JC        WBE         ;无回答,结束操作
              INC       R0          ;指向下一字节
                DJNZ    R7, WR1                 ;写完全部字节
WBE:            LJMP    STOP_SPROM              ;发出结束信号
;

CLR_AT24CXX:    LCALL   STAT_SPROM              ;发出起始信号
              MOV       A, #0A0H    ;发出写命令
                LCALL   OUTB_SPROM
              JC        CLR_WBE     ;无回答,结束操作
              MOV       A, R2       ;发出EEPROM首址
                LCALL   OUTB_SPROM
              JC        CLR_WBE     ;无回答,结束操作
              MOV       A, R1       ;发出EEPROM首址
                LCALL   OUTB_SPROM
              JC        CLR_WBE     ;无回答,结束操作
              MOV       R7, #16
    CLR_WR1:  MOV       A, #0FFH    ;取一字节内容
                LCALL   OUTB_SPROM              ;写入EEPROM中
              JC        CLR_WBE     ;无回答,结束操作
                DJNZ    R7, CLR_WR1             ;写完全部字节
CLR_WBE:        LJMP    STOP_SPROM              ;发出结束信号

;
;RDS是读出程序
;将(R1)指示的(R7)个EEPROM字节读入片内RAM中首址由(R0)指示
;(R7)  <=20时比较保险
RD_SPROM:       LCALL   STAT_SPROM              ;发出起始信号
              MOV       A, #0A0H    ;发出写命令
                LCALL   OUTB_SPROM
              JC        RDE         ;无回答,结束操作
              MOV       A, R2       ;发出EEPROM首址(high_byte)
                LCALL   OUTB_SPROM
              JC        RDE         ;无回答,结束操作
              MOV       A, R1       ;发出EEPROM首址(low_byte)
                LCALL   OUTB_SPROM
              JC        RDE         ;无回答,结束操作
                LCALL   STOP_SPROM              ;发出结束信号
              DB        0,0
                LCALL   STAT_SPROM              ;再次发出起始信号
              MOV       A, #0A1H    ;发出读命令
                LCALL   OUTB_SPROM
              JC        RDE         ;无回答,结束操作
        RD1:  MOV       B, #8       ;每移出8位组成一字节
RD2:            CLR     SCL                     ;输出一个时钟脉冲
                CLR     SCL
              DB        0,0
;DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
              DB        0,0,0,0,0,0,0,0,0

              SETB      SCL
              SETB      SCL
              DB        0,0
;DB 0,0,0,0;,0,0,0,0,0;,0,0,0,0,0,0,0
              MOV       C, SDA      ;读入一位
                RLC     A                       ;拼装到累加器中
              DB        0,0
                DJNZ    B, RD2                  ;拼完一字节
              MOV       @R0, A      ;存入片内
              INC       R0          ;调整片内地址
                CLR     SCL                     ;时钟脉冲拉低
                CJNE    R7, #1, RD3             ;是最后一字节吗?
              SETB      SDA         ;最后一字节不给回答信号
              SETB      SDA
                SJMP    RD4
RD3:            CLR     SDA                     ;准备好回答信号
                CLR     SDA
        RD4:  DB        0,0
              SETB      SCL         ;时钟脉冲上升沿
              SETB      SCL
              DB        0,0,0       ;等待EEPROM读取回答信号
              DB        0,0,0
                CLR     SCL                     ;回答完毕
                CLR     SCL
              SETB      SDA         ;准备读入下一字节
              SETB      SDA
                DJNZ    R7, RD1                 ;直到读完全部字节
                CLR     C
RDE:            LJMP    STOP_SPROM              ;发出结束信号

;OUTB是向EEPROM发出一字节信息的子程序
 OUTB_SPROM:  MOV       B, #8       ;一字节包含8位
OUT1:           CLR     SCL                     ;将时钟线拉低
                CLR     SCL
                RLC     A                       ;移出一位
              MOV       SDA, C      ;放到数据线上
              SETB      SCL         ;将时钟线升高
              SETB      SCL
              DB        0,0         ;等到一位信息送入EEPROM中
              DB        0,0
                DJNZ    B, OUT1                 ;发送完8位
                CLR     SCL                     ;将时钟线拉低
                CLR     SCL
              SETB      SDA         ;准备接受回答信号
              SETB      SDA
              SETB      SCL         ;将时钟线升高
              SETB      SCL
              DB        0,0
              MOV       C, SDA      ;接受回答信号
                CLR     SCL                     ;将时钟线拉低
                CLR     SCL
              RET                   ;回答信号在进位标志中

;STAT是起始信号
 STAT_SPROM:  SETB      SDA         ;将数据线升高
              SETB      SDA
              SETB      SCL         ;将时钟线升高
              SETB      SCL
              DB        0,0         ;延时
              DB        0,0
                CLR     SDA                     ;将数据线拉低,发出起始信号
                CLR     SDA
              DB        0,0
              DB        0,0
                CLR     SCL                     ;将时钟线拉低
                CLR     SCL
              RET

;STOP是结束信号
STOP_SPROM:     CLR     SCL                     ;将时钟线拉低
                CLR     SCL
                CLR     SDA                     ;将数据线拉低
                CLR     SDA
              DB        0,0
              SETB      SCL         ;将数据线升高
              SETB      SCL
              DB        0,0
              DB        0,0
              SETB      SDA         ;将数据线升高,发出结束信号
              SETB      SDA
              RET


            SPROM_DELAY:  PUSH      03H
              PUSH      04H
              MOV       R3, #30     ;延时,等待写入操作结束
              MOV       R4, #0
TTT:            DJNZ    R4, TTT
                DJNZ    R3, TTT
              POP       04H
              POP       03H
              RET

  WR_10_PARA_SPROM:
              MOV       A, DOPROG
              MOV       B,#10H
              MUL       AB
              ADD       A,#10H
              PUSH      ACC
              MOV       A,B
              ADDC A,#00H
              PUSH      ACC
              MOV       R0, #PARA
              POP       ACC
              MOV       R2,A
              POP       ACC
              MOV       R1,A
              MOV       R7,#9
                LCALL   WR_SPROM
                LCALL   SPROM_DELAY             ;延时,等待写入操作结束
              MOV       R0, #DOPROG
              MOV       R1, #01H
              MOV       R2, #00H
              MOV       R7, #01H
                LCALL   WR_SPROM
                LCALL   SPROM_DELAY             ;延时,等待写入操作结束
              RET
 ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:94毫秒 最大:78531毫秒 查询6次