赞助论坛
  • 4229阅读
  • 0回复

学习单片机之---24c02的读写程序 [复制链接]

楼层直达
jswr  
发帖
339
精华
1
金币
264
威望
8
贡献
7
好评
15
注册
2008-06-30
楼主    jswr 发表于: 2008-08-20 15:43:43 
;=============================
;24c02的读写程序
;AUTHOR:LIXIN
;CREATE DATE:2004-5-23
;MODIFY DATE :2004-5-23
;电协资料001.DOC
;用于2号板
; ===================
BITCNT EQU 41H
SUBADR EQU 40H
SDA   BIT   P0.5
SCL   BIT   P0.4
ORG 00H
JMP MAIN
ORG 0100H
MAIN:
  MOV R7,#01010101B
  ACALL WRITE_24C02
  ACALL DELAY
  ACALL READ_24C02
  ;MOV P2,A
  MOV P3,A
  ACALL DELAY
  ;MOV P2,#0FFH
  MOV P3,#0FFH
  ACALL DELAY
  JMP MAIN
;===================================
DELAY: MOV   R0,#0FFH
DELAY0: MOV   R1,#0FFH
DELAY1: NOP
    NOP
    NOP
    DJNZ   R1,DELAY1
    DJNZ   R0,DELAY0
    RET
;============================
WRITE_24C02:
        ACALL START   ;发送IC总线起始条件
        MOV A,#0A0H     ;24C02总线地址
        ACALL SENTBYTE   ;发送24C02器件总线地址
        JB F0,SENDRETURN ;出错返回
        MOV A,SUBADR     ;取存储地址
        ACALL SENTBYTE
        JB F0,SENDRETURN
        MOV A,R7
        ACALL SENTBYTE   ;发送一次数据
        JB F0,SENDRETURN   ;出错返回
        ACALL STOP         ;发送IC总线停止条件
DELAY10:                 ;延时10MS等待数据写完
    MOV 44H,30H
D1: MOV 45H,#34H
  DJNZ 45H,$
  DJNZ 44H,D1
SENDRETURN:
RET
;=======================================
READ_24C02:                   ;读24C02
      ACALL START           ;发送IC总线起始条件
      MOV A,#0A0H
      ACALL SENTBYTE           ;24C02总线地址
      JB F0,RCVRETURN           ;出错返回
      MOV A,SUBADR           ;取存储地址
        ACALL SENTBYTE         ;发送24C02器件总线地址
        JB F0,SENDRETURN         ;出错返回
      ACALL START               ;发送IC总线重复起始条件
      MOV A,#0A0H               ;24C02总线地址
      SETB ACC.0                     ;取总线读操作数
      ACALL SENTBYTE                 ;发送被控制总线地址
      JB F0,RCVRETURN               ;出错返回
      ACALL RCVBYTE           ;接受数据
RCVRETURN:
RET
;=========================================
START:
  SETB SDA           ;发送起始条件的数据信号
  NOP
  NOP
  NOP
  SETB SCL         ;发送起始条件的时钟信号
  NOP             ;起始条件建立时间大于4.7s
  NOP
  NOP
  CLR SDA             ;发送起始信号
  NOP                 ;起始条件锁定时间大于4s
  NOP
  NOP
  CLR SCL           ; 钳住IC总线准备发送或接受数据
  RET
;==================================
STOP:
  CLR SDA             ;发送停止条件的数据信号
  NOP
  NOP
  NOP
  SETB SCL               ;发送停止条件的时钟信号
  NOP                     ;起始条件建立时间大于4s
  NOP
  NOP
  SETB SDA               ;发送IC总线停止信号
  NOP
  NOP
  NOP
  NOP
  RET
;===============================
SENTBYTE:                     ;送数8位
      MOV BITCNT,#08H
SENTB:
    RLC A                 ;要发送的数据左移,发送入位C
    MOV SDA,C
    NOP
NOP
    NOP
    SETB SCL             ;置时钟线为高,通知被控制开始接受数据位
    NOP                 ;保证时钟高周期大于4s
    NOP
    NOP
    CLR SCL               ;钳住总线准备接受下一个数据位
    DJNZ BITCNT,SENTB       ;8位没发送完继续发送
    NOP
  NOP
  SETB SDA                 ;8位发送完后释放数据线准备收应答位
  NOP
  NOP
  SETB SCL                 ;开始接受应答信号
  NOP
  NOP
  CLR F0                 ;预先清发送数据出错标志
  JNB SDA,ACKEND           ;判断是否接受应答信号正常转ACKEND
  SETB F0                 ;未受到应答置位错误标志
ACKEND:
    NOP
    CLR SCL             ;发送结束钳住总线准备下一步发送或接受数据或进行其他处理
    RET
;=================================
RCVBYTE:
    SETB SDA           ;置数据线为输入方式
    MOV BITCNT,#08H     ;要传送的数据长度为8位
RCV:
  NOP
  CLR SCL             ;置时钟线为低,准备接受数据
  NOP             ;时钟低周期大于4.7s
  NOP
  NOP
  NOP
  NOP
  SETB SCL           ;置时钟线为高使数据线上数据有效
  NOP
  NOP
  MOV C,SDA
  RLC A               ;接受的数据位放入ACC
  NOP
  NOP
  DJNZ BITCNT,RCV           ;8位没收完继续接受
  CLR SCL                 ;8位接受完置时钟线和数据线
  NOP
  NOP
  CLR SDA
  SETB SDA               ;接受非应答信号
    NOP
  NOP
  SETB SCL               ;置时钟线为高使应答位有效
  NOP                     ;时钟高周期大于4.7s
  NOP
  SETB SDA
  NOP
  NOP
  NOP
  CLR SCL         ;清时钟线钳住IC总线以便发送停止条件
  RET


  END