📄 读写程序.txt
字号:
汇编写的24C01 单字节读写程序
; =======================================================
; 24C01存储器I2C总线实验 汇编语言例子
; =======================================================
;
; ew51仿真编程器 配套实验板学习例程
;
; 中山单片机学习网 诚电科技 站长:逸风
;
; http://www.zsMCU.com
; E-mail:ew51@zsmcu.com
; =======================================================
SDA EQU P2.0
SCL EQU P2.1
Address EQU 08H
I2CData EQU 09H
ORG 0000H
START:
MOV SP,#60H
MOV Address,#00H
MOV I2CData,#55H
CALL I2C_WRITE ;写入数据
MOV I2CDATA,#0AAH ;
MOV Address,#00H
CALL I2C_READ
MOV I2CData,A ;读出数据
NOP
NOP
MAIN:
JMP MAIN
/*=======================================================
写一个字节 Address地址 I2CDatata写入的数据
=======================================================*/
I2C_WRITE:
I2C_WRITE_A:
LCALL I2C_START
MOV A,#10100000B
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_WRITE_A ;=1,表示无确认,再次发送
MOV A,Address
LCALL I2C_SEND8BIT
LCALL I2C_ACK
MOV A,I2CData
LCALL I2C_SEND8BIT
LCALL I2C_ACK
LCALL I2C_STOP
RET
/*=======================================================
读一个字节 Address地址 Data读出的数据
=======================================================*/
I2C_READ:
I2C_READ_A:
LCALL I2C_START
MOV A,#10100000B
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_READ_A ;=1,表示无确认,再次发送
MOV A,Address
LCALL I2C_SEND8BIT
LCALL I2C_ACK
I2C_READ_B:
LCALL I2C_START
MOV A,#10100001B
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_READ_B
LCALL I2C_RECEIVE8BIT
MOV I2CData,A
LCALL I2C_ACK
LCALL I2C_STOP
RET
;=======================================================
;发送开始信号
I2C_START:
SETB SCL
SETB SDA
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
RET
;=======================================================
;发送结束信号
I2C_STOP:
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
RET
;=======================================================
;发送接收确认信号
I2C_ACk:
SETB SDA
SETB SCL
NOP
NOP
JB SDA,I2C_ACK0
CLR C
SJMP I2C_ACK_END
I2C_ACK0:
SETB C
I2C_ACK_END:
CLR SCL
RET
;=======================================================
;送八位数据
I2C_SEND8BIT:
MOV B,#08H
I2C_SEND8BIT_A:
RLC A
MOV SDA,C
SETB SCL
NOP
NOP
CLR SCL
DJNZ B,I2C_SEND8BIT_A
RET
;=======================================================
;接收八位数据
I2C_RECEIVE8BIT:
MOV B,#08H
CLR A
SETB SDA
I2C_RECEIVE8IT_A:
SETB SCL
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
DJNZ B,I2C_RECEIVE8IT_A
RET
5 C语言写的24C01 单字节读写程序
/*=======================================================
24C01存储器I2C总线实验 C语言例子
=======================================================
ew51仿真编程器 配套实验板学习例程
中山单片机学习网 诚电科技 站长:逸风
http://www.zsmcu.com
E-mail:ew51@zsmcu.com
=======================================================*/
#include
#include
sbit SDA=0x90;
sbit SCL=0x91;
//函数声明
unsigned char i2c_read(unsigned char);
void i2c_write(unsigned char,unsigned char);
void i2c_send8bit(unsigned char);
unsigned char i2c_receive8bit(void);
void i2c_start(void);
void i2c_stop(void);
bit i2c_ack(void);
//=======================================================
void main(void)
{
unsigned char dd;
i2c_write(0x00,0x55);
_nop_();
dd=i2c_read(0x00);
for(;;)
{}
}
/*=======================================================
i2c_write(地址,数据),写一个字节
=======================================================*/
void i2c_write(unsigned char Address,unsigned char Data)
{
do{
i2c_start();
i2c_send8bit(0xA0);
}while(i2c_ack());
i2c_send8bit(Address);
i2c_ack();
i2c_send8bit(Data);
i2c_ack();
i2c_stop();
return;
}
/*=======================================================
i2c_read(地址,数据),写一个字节
=======================================================*/
unsigned char i2c_read(unsigned char Address)
{
unsigned char c;
do{
i2c_start();
i2c_send8bit(0xA0);
}while(i2c_ack()); //=1,表示无确认,再次发送
i2c_send8bit(Address);
i2c_ack();
do{
i2c_start();
i2c_send8bit(0xA1);
}while(i2c_ack());
c=i2c_receive8bit();
i2c_ack();
i2c_stop();
return(c);
}
//=======================================================
//发送开始信号
void i2c_start(void)
{
SDA = 1;
SCL = 1;
SDA = 0;
SCL = 0;
return;
}
//发送结束信号
void i2c_stop(void)
{
SDA = 0;
SCL = 1;
SDA = 1;
return;
}
//发送接收确认信号
bit i2c_ack(void)
{
bit ack;
SDA = 1;
SCL = 1;
if (SDA==1)
ack = 1;
else
ack = 0;
SCL = 0;
return (ack);
}
//送八位数据
void i2c_send8bit(unsigned char b)
{
unsigned char a;
for(a=0;a<8;a++)
{
if ((b<
SDA = 1;
else
SDA = 0;
SCL = 1;
SCL = 0;
}
return;
}
//接收八位数据
unsigned char i2c_receive8bit(void)
{
unsigned char a;
unsigned char b=0;
for(a=0;a<8;a++)
{
SCL = 1;
b=b<<1;
if (SDA==1)
b=b|0x01; //按位或
SCL = 0;
}
return (b);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -