📄 24c16.c
字号:
#include <iom88v.h>
#include <macros.h>
//24c01-24c16读写驱动程序,
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
#define i2c_data (1<<0)
#define i2c_clk (1<<7)
#define eeprom_wp (1<<6)
void delay1(uchar ms);
void delay(uint us);
void i2cwait(void){
delay(100);
}
void i2cstart(void){ //开始
PORTB|=i2c_data; //1
PORTD|=i2c_clk; //1
//i2cwait();
PORTB&=~i2c_data;//0
//i2cwait();
PORTD&=~i2c_clk; //0
}
void i2cstop(void){//停止
PORTB&=~i2c_data; //0
//i2cwait();
PORTD|=i2c_clk; //1
//i2cwait();
PORTB|=i2c_data; //1
}
void ack(void)//应答
{
PORTD|=i2c_clk; //1
PORTD&=~i2c_clk; //0
}
void i2csentbyte(temp12){//8位输出
unsigned char i=8;
while (i--){
if (temp12&0x80)
{PORTB|=i2c_data;}
else
{PORTB&=~i2c_data;}
PORTD|=i2c_clk; //1
PORTD&=~i2c_clk;//0
temp12<<=1;
}
// DDRB|=i2c_data; //设置data为输出
}
void i2cbytewrite(uint addr,uchar value){//字节写入
unsigned char i;
DDRB|=i2c_data;
DDRD|=i2c_clk;
DDRD|=eeprom_wp;
i=((addr&0x7ff)/256)<<1;//页选 择
PORTD&=~eeprom_wp; //0
PORTB|=i2c_data;
PORTD&=~i2c_clk;
i2cstart();
i2csentbyte(0xA0|i);
ack();
i2csentbyte(addr);
ack();
i2csentbyte(value);
ack();
i2cstop();
WDR();
PORTD|=eeprom_wp;
}
uchar i2cbyteread(uint addr){//字节读出
uchar i,value;
DDRB|=i2c_data;
DDRD|=i2c_clk;
DDRD|=eeprom_wp; //数据方向,输出
value=((addr&0x7ff)/256)<<1;
PORTB|=i2c_data;//1
PORTD&=~i2c_clk;//0
i2cstart();
i2csentbyte(0xa0|value);
ack();
i2csentbyte(addr);
ack();
i2cstart();
i2csentbyte(0xa1|value);
ack();
DDRB&=~i2c_data;//数据方向,输入
PORTB|=i2c_data;
PORTD|=i2c_clk;
value=0;
for(i=0;i<8;i++)
{
value<<=1;
PORTD|=i2c_clk;
if(PINB&i2c_data)
value++;
PORTD&=~i2c_clk;
}
DDRB|=i2c_data;//数据方向,切换回输出
i2cstop();
return value;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -