解压的是IIC协议的代码所以对它的通信协议进行修改(包括start,stop,ack,和发送。因为OLED只是显示所以只需要32给它发数据,32不接收)
/*
OLED_SCL,OLED_SDA是自己定义的引脚宏
//OLED屏幕 IIC端口定义 SCL--PB7 SDA---PA4
在oled.h文件中定义宏
#define OLED_SCL PBout(7)
#define OLED_SDA PAout(4)
*/
void IIC_Start()
{
/*
OLED_SCLK_Set() ;
OLED_SDIN_Set();
OLED_SDIN_Clr();
OLED_SCLK_Clr();
*/
OLED_SCL=1;
OLED_SDA=1;
delay_us(5);
//数据线下降沿
OLED_SDA = 0;
delay_us(5);
//时钟线拉低----方便数据线修改电平
OLED_SCL = 0;
delay_us(5);
}
/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
/*
OLED_SCLK_Set() ;
// OLED_SCLK_Clr();
OLED_SDIN_Clr();
OLED_SDIN_Set();
*/
OLED_SCL=0;
OLED_SDA=0;
delay_us(5);
//数据线下降沿
OLED_SDA = 1;
delay_us(5);
//时钟线拉低----方便数据线修改电平
OLED_SCL = 1;
delay_us(5);
}
void IIC_Wait_Ack()
{
//GPIOB->CRH &= 0XFFF0FFFF; //设置PB12为上拉输入模式
//GPIOB->CRH |= 0x00080000;
// OLED_SDA = 1;
// delay_us(1);
//OLED_SCL = 1;
//delay_us(50000);
/* while(1)
{
if(!OLED_SDA) //判断是否接收到OLED 应答信号
{
//GPIOB->CRH &= 0XFFF0FFFF; //设置PB12为通用推免输出模式
//GPIOB->CRH |= 0x00030000;
return;
}
}
*/
// OLED_SCLK_Set() ;
// OLED_SCLK_Clr();
OLED_SCL = 1;
delay_us(5);
OLED_SCL = 0;
delay_us(5);
}
/**********************************************
// IIC Write byte
**********************************************/
void Write_IIC_Byte(unsigned char IIC_Byte)
{
/*
unsigned char i;
unsigned char m,da;
da=IIC_Byte;
OLED_SCLK_Clr();
for(i=0;i<8;i++)
{
m=da;
// OLED_SCLK_Clr();
m=m&0x80;
if(m==0x80)
{OLED_SDIN_Set();}
else OLED_SDIN_Clr();
da=da<<1;
OLED_SCLK_Set();
OLED_SCLK_Clr();
}
*/
uint8_t i;
//拉低时钟线
OLED_SCL = 0;
delay_us(5);
for(i=0; i<8; i++)
{
if( (IIC_Byte>>(7-i)) &0x01 == 1) //高位先出
{
OLED_SDA = 1;
}
else
{
OLED_SDA = 0;
}
delay_us(5);
//拉高时钟线发送数据
OLED_SCL = 1;
delay_us(5);
//拉低时钟线准备下一次修改SDA的值
OLED_SCL = 0;
delay_us(5);
}
}
|