gaoyang9992006 发表于 2023-5-25 20:52

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传递的顺序。

chenci2013 发表于 2023-6-6 12:27

ssd1305和ssd1306驱动有什么不同?

jonas222 发表于 2023-6-6 13:07

ssd1306spi改i2c程序怎么改

sheflynn 发表于 2023-6-6 13:36

ssd1306和sh1106的区别是什么

abotomson 发表于 2023-6-6 13:44

SSD1306库驱动OLED?            

gaoyang9992006 发表于 2023-6-6 14:45

jonas222 发表于 2023-6-6 13:07
ssd1306spi改i2c程序怎么改

直接换接口程序。

gaoyang9992006 发表于 2023-6-6 14:45

sheflynn 发表于 2023-6-6 13:36
ssd1306和sh1106的区别是什么

应该区别不大。

gaoyang9992006 发表于 2023-6-6 14:45

abotomson 发表于 2023-6-6 13:44
SSD1306库驱动OLED?

是的,就是这个。

xiaoyaodz 发表于 2023-6-6 15:10

0.96 oled的 spi i2c 哪个好

pixhw 发表于 2023-6-6 15:24

如何才能在液晶屏上让数字左右移动

loutin 发表于 2023-6-6 17:48

OLED屏SSD1306驱动要怎么修改以驱动SSD1322

gaoyang9992006 发表于 2023-6-6 20:59

loutin 发表于 2023-6-6 17:48
OLED屏SSD1306驱动要怎么修改以驱动SSD1322

那个是1315吧?

pl202 发表于 2023-6-10 11:33

oled画线怎么改变线宽            

gaoyang9992006 发表于 2023-6-10 13:24

pl202 发表于 2023-6-10 11:33
oled画线怎么改变线宽

你只需要把1个像素点改成2*2个像素点来绘制曲线就可以改变线宽了,同理,你可以改成3*3作为一个像素操作点。

earlmax 发表于 2023-6-10 16:05

如何将0.96寸oled 改为i2c接线 ?

maudlu 发表于 2023-6-10 16:42

驱动oled如何实现反色显示表示选中功能

elsaflower 发表于 2023-6-10 17:35

i2c接口的oled怎么驱动               
页: [1]
查看完整版本: IO模拟I2C用于SSD1306的OLED驱动的底层函数详解