IO模拟I2C用于SSD1306的OLED驱动的底层函数详解
/**********************************************//IIC Start
时钟信号在高电平状态时候在数据线产生一个下降沿
**********************************************/
void IIC_Start()
{
OLED_SCLK_Set() ;
OLED_SDIN_Set();
OLED_SDIN_Clr();
}
/**********************************************
//IIC Stop
时钟信号在高电平状态时候在数据线产生一个上升沿
**********************************************/
void IIC_Stop()
{
OLED_SCLK_Set();
OLED_SDIN_Clr();
OLED_SDIN_Set();
}
//这里就是跳过这个时钟周期,没有去读数据位有没有回来应答信号。
void IIC_Wait_Ack()
{
OLED_SCLK_Set();
OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
在时钟线为低电平的时候在数据线发送数据位,高位在前
在完成数据发送后要保持数据线为低电平
**********************************************/
void Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
unsigned char m,da;
da=IIC_Byte;
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();
}
/**********************************************
// IIC Write Command
开始信号
前8位为:写7位地址,高位在前,并跟随1个读写位0,表示写入:0111 100 0
第9位应答,这里就是跳过一个时钟信号(拉高时钟,拉低时钟)
接下已一个字节发送0x00表示后面要写命令
接下来应答位,这里就是跳过一个时钟信号(拉高时钟,拉低时钟)
后面开始写入的数据作为命令,即将命令字节装载到这个发送字节的函数里发送出去
然后又是一个应答位,跳过一个时钟信号
之后发送停止指令。
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
IIC_Start();
Write_IIC_Byte(0x78); //Slave address,SA0=0
IIC_Wait_Ack();
Write_IIC_Byte(0x00); //write command
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Command);
IIC_Wait_Ack();
IIC_Stop();
}
/**********************************************
// IIC Write Data
开始信号
前八位为:写7位地址,高位在前,并跟随1个读写位0,表示写入:0111 100 0
第9位应答,这里就是跳过一个时钟信号(拉高时钟,拉低时钟)
接下已一个字节发送0x40表示后面要写的是数据
接下来应答位,这里就是跳过一个时钟信号(拉高时钟,拉低时钟)
后面开始写入的数据作为数据,即将数据字节装载到这个发送字节的函数里发送出去
然后又是一个应答位,跳过一个时钟信号
之后发送停止指令。
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78); //D/C#=0; R/W#=0
IIC_Wait_Ack();
Write_IIC_Byte(0x40); //write data
IIC_Wait_Ack();
Write_IIC_Byte(IIC_Data);
IIC_Wait_Ack();
IIC_Stop();
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
if(cmd)
{
Write_IIC_Data(dat);
}
else
{
Write_IIC_Command(dat);
}
}看过了微芯大学课程中I2C的部分,然后对之前用过的这个IO模拟I2C驱动OLED的底层函数进行了优化和注释,删除了多余的操作指令。
这个注释可以让你清楚的看明白,什么是起始信号,结束信号,应答信号,以及信息通过I2C传递的顺序。
ssd1305和ssd1306驱动有什么不同? ssd1306spi改i2c程序怎么改 ssd1306和sh1106的区别是什么 SSD1306库驱动OLED? jonas222 发表于 2023-6-6 13:07
ssd1306spi改i2c程序怎么改
直接换接口程序。 sheflynn 发表于 2023-6-6 13:36
ssd1306和sh1106的区别是什么
应该区别不大。 abotomson 发表于 2023-6-6 13:44
SSD1306库驱动OLED?
是的,就是这个。 0.96 oled的 spi i2c 哪个好 如何才能在液晶屏上让数字左右移动 OLED屏SSD1306驱动要怎么修改以驱动SSD1322 loutin 发表于 2023-6-6 17:48
OLED屏SSD1306驱动要怎么修改以驱动SSD1322
那个是1315吧? oled画线怎么改变线宽 pl202 发表于 2023-6-10 11:33
oled画线怎么改变线宽
你只需要把1个像素点改成2*2个像素点来绘制曲线就可以改变线宽了,同理,你可以改成3*3作为一个像素操作点。 如何将0.96寸oled 改为i2c接线 ? 驱动oled如何实现反色显示表示选中功能 i2c接口的oled怎么驱动
页:
[1]