51单片机驱动I2C(24C02)汇编语言程序
;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
51单片机驱动I2C汇编语 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)