📄 zixi3.c.c
字号:
#include<io8515.h>
#define I2C_TIMER 100
#define SDA PD4
#define SCL PD5
#define SET_SDA PORTD|=(1<<SDA)
#define CLS_SDA PORTD&=~(1<<SDA)
#define SET_SCL PORTD|=(1<<SCL)
#define CLS_SCL PORTD&=~(1<<SCL)
#define ACK_FALL PIND&(1<<SDA)
#define SDA_HIGH PIND&(1<<SDA)
void delay(unsigned int dt)
{
while(dt)
{
asm("nop");
dt--;
asm("nop");
};
}
void clock_high(void)
{
delay(I2C_TIMER/2);
SET_SCL;
delay(I2C_TIMER/2);
}
void clock_low(void)
{
delay(I2C_TIMER/2);
CLS_SCL;
delay(I2C_TIMER/2);
}
void I2C_start(void)
{
clock_low();
SET_SDA;
delay(I2C_TIMER*2);
clock_high();
delay(I2C_TIMER*2);
CLS_SDA;
delay(I2C_TIMER*4);
clock_low();
delay(I2C_TIMER*4);
}
void i2c_stop(void)
{
clock_low();
CLS_SDA;
delay(I2C_TIMER*2);
clock_high();
delay(I2C_TIMER*4);
SET_SDA;
delay(I2C_TIMER*2);
}
unsigned char I2C_Rite(unsigned char wb)
{
unsigned char i;
for(i=0; i<8; i++)
{
clock_low();
if(wb&0x80) SET_SDA;
else CLS_SDA;
clock_high();
wb=wb<<1;
}
clock_low();
delay(I2C_TIMER*4);
clock_high();
while(i>1)
{
delay(I2C_TIMER);
if(ACK_FALL) i--;
else i=0;
}
clock_low();
return i;
}
void I2C_Ack(void)
{
clock_low();
CLS_SDA;
delay(I2C_TIMER);
clock_high();
delay(I2C_TIMER*4);
clock_low();
SET_SDA;
}
unsigned char I2C_Read(void)
{
unsigned char i;
unsigned char rByte=0;
for(i=0;i<8;i++)
{
clock_low();
clock_high();
if(SDA_HIGH) rByte|=1<<(7-i);
clock_low();
}
return rByte;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -