;程序阐明:将MPU内部的55h~~~58h中的内容由外部中止0经I2C总线写到24c02中,然后由外部中止1将所写的内容读到
;MPU内部数据存储器60H~~63H
SCL EQU P1.1
SDA EQU P1.0
org 0000h
jmp begin
org 0003H
ljmp write
org 0013H
ljmp read
;主程序
begin:
mov 55H,#41H
mov 56h,#42h
MOV 57h,#43H
MOV 58H,#44H
mov tcon,#0
setb ex0
setb ex1
setb ea
main:
nop
jmp main
;**********************************************************
;读24C02的数据的程序
read:
ACALL START ;开端信号
MOV A,#0A0H ;发从机的地址
ACALL SEND ;发送操控字
ACALL ACKI;接纳应对
JC OUTEND ;不响应,转完毕
MOV A,#00H;设置要读取从器材的片内地址
ACALL SEND
ACALL ACKI
JC OUTEND
ACALL START ;开端信号
ORL A,#0A1H;设置操控字,预备接纳
ACALL SEND ;发送操控字
ACALL ACKI
JC OUTEND
MOV R2,#4 ;预备接纳数据的字节数
MOV R1,#60H ;接纳字节存放在主器材中的地址60H
IN0:
ACALL REV ;接纳一个字节
ACALL ACKO;主机向24C02发送应对信号
MOV @R1,A ;把接纳到数据存放到存储单元中
INC R1
DEC R2
CJNE R2,#1,IN0 ;判别是否为最终一个接纳字节
ACALL REV ;接纳最终一个字节
ACALL ACKN;
MOV @R1,A ;把接纳到数据存放到存储单元中
OUTEND:
ACALL STOP ;中止信号
jnb p3.3,$
reti
;**********************************************************
;写24C02的数据的程序
write:
LCALL START ;开端信号
MOV A,#0A0H ;定操控字,预备发送
ACALL SEND ;发送操控字
ACALL ACKI ;接纳应对
JC WRITEEND ;从器材不响应,转完毕
MOV A,#00H ;设置从器材片内地址
ACALL SEND ;发送片内地址
ACALL ACKI
JC WRITEEND
MOV R2,#4;设置发送字节数
MOV R1,#55H ;主器材中要发送数据的头地址
OUT1:
MOV A,@R1
ACALL SEND;发送数据
ACALL ACKI;
JC WRITEEND
INC R1
DJNZ R2,OUT1 ;发送未完毕,持续发送
WRITEEND:
ACALL STOP ;中止信号
jnb p3.2,$;避免再次中止
reti
;********************************************************
;********************
;I2C模拟程序
;开端信号
START:
CLR SCL
SETB SDA
ACALL DELAY
SETB SCL
ACALL DELAY
CLR SDA
ACALL DELAY
CLR SCL
RET
; 中止信号:
; 接纳一个字节
;发送一个字节
SEND:
MOV R0,#08H
CLR SCL
SEND0:
RLC A
MOV SDA,C
SETB SCL
ACALL DELAY
CLR SCL
DJNZ R0,SEND0
SETB SDA
RET
;接纳一个应对位:
ACKI:
SETB SCL
ACALL DELAY
MOV C,SDA
CLR SCL
RET
; 发送一个接纳应对位
DELAY:
NOP
NOP
NOP
RET
END