#define CPU_F ((double)1000000)
#define delayus(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) //延时x微秒
#define delayms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) //延时x毫秒
#define uchar unsigned char
#define uint unsigned int
#define SDA_OUT P1DIR|=BIT3
#define SDA_IN P1DIR&=~BIT3
#define SDA_H P1OUT|=BIT3
#define SDA_L P1OUT&=~BIT3
#define SCL_OUT P1DIR|=BIT4
#define SCL_IN P1DIR&=~BIT4
#define SCL_H P1OUT|=BIT4
#define SCL_L P1OUT&=~BIT4
uint RXdata[1] = { 0x00 };
uint RXdata1[1] = { 0x00 };
/****************************
*初始化管脚
***************************/
void Port_Init() {
P1DIR |= BIT3 + BIT4;
SDA_OUT;
SCL_OUT;
SCL_H;
SDA_H;
SCL_L;
SDA_L;
}
/******************************
*
* 开始IIC
*
*****************************/
void IIC_Start(void) {
SCL_H; //拉高
SDA_H; //拉高
delayus(5);
//建立起始条件4.7us
SDA_L; //产生下降沿发送起始信号
delayus(5);
//锁定起始信号
SCL_L; //等待数据
delayus(5);
}
/**************************
*产生一个发送应答信号
*************************/
void IIC_WriteAck() {
SDA_IN;
SCL_OUT;
delayus(1);
SDA_L;
delayus(5);
SCL_H;
delayus(5);
SCL_L;
delayus(5);
delayus(10);
}
/*************************
* 产生一个接受应答信号
************************/
void IIC_SendNAck() {
SDA_OUT;
SCL_OUT;
delayus(1);
SDA_H;
SCL_H;
delayus(5);
SCL_L;
SDA_L;
delayus(5);
delayus(10);
}
/*****************************
*
* 停止IIC
*
*****************************/
void IIC_Stop() {
SDA_OUT;
SCL_OUT;
delayus(1);
SDA_L;
delayus(5);
SCL_H;
delayus(5);
SDA_H;
delayus(5);
}
/*****************************
* 发送一个字节
*****************************/
void IIC_Write_One_Byte(uint TxData) {
uint i = 0;
for (i = 0; i < 8; i++) {
if (TxData & 0x80)
SDA_H;
else
SDA_L;
TxData <<= 1;
SCL_H; //时钟上升沿发送数据有效
delayus(5);
SCL_L;
delayus(5);
}
SDA_OUT;
}
/**************************
*
* 读取一个字节
*
***************************/
void IIC_Read_One_Byte(uint *Data) {
uint i = 0, data = 0;
SDA_IN;
for (i = 0; i < 8; i++) {
data <<= 1;
SCL_H;
delayus(3);
if (P1IN & BIT3) {
data |= 0x01;
} else {
data &= 0xFE;
}
delayus(1);
SCL_L;
delayus(5);
}
SDA_OUT; //接收结束的时候还要吧SDA的方向切换过来
Data[0] = data;
}
此帖出自
小平头技术问答
终于改好了
一周热门 更多>