;=============================
;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