; =======================================================
; 24C01存儲(chǔ)器I2C總線實(shí)驗(yàn) 匯編語言例子
; =======================================================
SCL EQU P2.1
Address EQU 08H
I2CData EQU 09H
ORG 0000H
START:
MOV Address,#00H
MOV I2CData,#55H
CALL I2C_WRITE ;寫入數(shù)據(jù)
MOV I2CDATA,#0AAH ;
MOV Address,#00H
CALL I2C_READ
MOV I2CData,A ;讀出數(shù)據(jù)
NOP
NOP
MAIN:
JMP MAIN
/*=======================================================
寫一個(gè)字節(jié) Address地址 I2CDatata寫入的數(shù)據(jù)
=======================================================*/
I2C_WRITE:
I2C_WRITE_A:
LCALL I2C_START
MOV A,#10100000B
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_WRITE_A ;=1,表示無確認(rèn),再次發(fā)送
MOV A,Address
LCALL I2C_SEND8BIT
LCALL I2C_ACK
MOV A,I2CData
LCALL I2C_SEND8BIT
LCALL I2C_ACK
LCALL I2C_STOP
RET
/*=======================================================
讀一個(gè)字節(jié) Address地址 Data讀出的數(shù)據(jù)
=======================================================*/
I2C_READ:
I2C_READ_A:
LCALL I2C_START
MOV A,#10100000B
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_READ_A ;=1,表示無確認(rèn),再次發(fā)送
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
;=======================================================
;發(fā)送開始信號(hào)
I2C_START:
SETB SCL
SETB SDA
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
RET
;=======================================================
;發(fā)送結(jié)束信號(hào)
I2C_STOP:
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
RET
;=======================================================
;發(fā)送接收確認(rèn)信號(hào)
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
;=======================================================
;送八位數(shù)據(jù)
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
;=======================================================
;接收八位數(shù)據(jù)
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
C語言寫的24C01 單字節(jié)讀寫程序
/*=======================================================
24C01存儲(chǔ)器I2C總線實(shí)驗(yàn) C語言例子
=======================================================
中山單片機(jī)學(xué)習(xí)網(wǎng) 誠電科技 站長(zhǎng):逸風(fēng)
http://www.zsmcu.com
E-mail:ew51@zsmcu.com
=======================================================*/
#include
sbit SDA=0x90;
sbit SCL=0x91;
//函數(shù)聲明
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(地址,數(shù)據(jù)),寫一個(gè)字節(jié)
=======================================================*/
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(地址,數(shù)據(jù)),寫一個(gè)字節(jié)
=======================================================*/
unsigned char i2c_read(unsigned char Address)
{
unsigned char c;
do{
i2c_start();
i2c_send8bit(0xA0);
}while(i2c_ack()); //=1,表示無確認(rèn),再次發(fā)送
i2c_send8bit(Address);
i2c_ack();
do{
i2c_start();
i2c_send8bit(0xA1);
}while(i2c_ack());
c=i2c_receive8bit();
i2c_ack();
i2c_stop();
return(c);
}
//=======================================================
//發(fā)送開始信號(hào)
void i2c_start(void)
{
SDA = 1;
SCL = 1;
SDA = 0;
SCL = 0;
return;
}
//發(fā)送結(jié)束信號(hào)
void i2c_stop(void)
{
SDA = 0;
SCL = 1;
SDA = 1;
return;
}
//發(fā)送接收確認(rèn)信號(hào)
bit i2c_ack(void)
{
bit ack;
SDA = 1;
SCL = 1;
if (SDA==1)
ack = 1;
else
ack = 0;
SCL = 0;
return (ack);
}
//送八位數(shù)據(jù)
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;
}
//接收八位數(shù)據(jù)
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);
}