发新帖本帖赏金 5.00元(功能说明)我要提问
返回列表
打印
[PIC®/AVR®/dsPIC®产品]

IO模拟I2C用于SSD1306的OLED驱动的底层函数详解

[复制链接]
1975|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaoyang9992006|  楼主 | 2023-5-25 20:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/**********************************************
//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传递的顺序。

使用特权

评论回复

打赏榜单

zhuomuniao110 打赏了 5.00 元 2023-07-28
理由:底层函数决定上层操作

沙发
chenci2013| | 2023-6-6 12:27 | 只看该作者
ssd1305和ssd1306驱动有什么不同?

使用特权

评论回复
板凳
jonas222| | 2023-6-6 13:07 | 只看该作者
ssd1306spi改i2c程序怎么改

使用特权

评论回复
地板
sheflynn| | 2023-6-6 13:36 | 只看该作者
ssd1306和sh1106的区别是什么

使用特权

评论回复
5
abotomson| | 2023-6-6 13:44 | 只看该作者
SSD1306库驱动OLED?              

使用特权

评论回复
6
gaoyang9992006|  楼主 | 2023-6-6 14:45 | 只看该作者
jonas222 发表于 2023-6-6 13:07
ssd1306spi改i2c程序怎么改

直接换接口程序。

使用特权

评论回复
7
gaoyang9992006|  楼主 | 2023-6-6 14:45 | 只看该作者
sheflynn 发表于 2023-6-6 13:36
ssd1306和sh1106的区别是什么

应该区别不大。

使用特权

评论回复
8
gaoyang9992006|  楼主 | 2023-6-6 14:45 | 只看该作者
abotomson 发表于 2023-6-6 13:44
SSD1306库驱动OLED?

是的,就是这个。

使用特权

评论回复
9
xiaoyaodz| | 2023-6-6 15:10 | 只看该作者
0.96 oled的 spi i2c 哪个好

使用特权

评论回复
10
pixhw| | 2023-6-6 15:24 | 只看该作者
如何才能在液晶屏上让数字左右移动

使用特权

评论回复
11
loutin| | 2023-6-6 17:48 | 只看该作者
OLED屏SSD1306驱动要怎么修改以驱动SSD1322

使用特权

评论回复
12
gaoyang9992006|  楼主 | 2023-6-6 20:59 | 只看该作者
loutin 发表于 2023-6-6 17:48
OLED屏SSD1306驱动要怎么修改以驱动SSD1322

那个是1315吧?

使用特权

评论回复
13
pl202| | 2023-6-10 11:33 | 只看该作者
oled画线怎么改变线宽              

使用特权

评论回复
14
gaoyang9992006|  楼主 | 2023-6-10 13:24 | 只看该作者
pl202 发表于 2023-6-10 11:33
oled画线怎么改变线宽

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

使用特权

评论回复
15
earlmax| | 2023-6-10 16:05 | 只看该作者
如何将0.96寸oled 改为i2c接线 ?

使用特权

评论回复
16
maudlu| | 2023-6-10 16:42 | 只看该作者
驱动oled如何实现反色显示表示选中功能

使用特权

评论回复
17
elsaflower| | 2023-6-10 17:35 | 只看该作者
i2c接口的oled怎么驱动               

使用特权

评论回复
发新帖 本帖赏金 5.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

1972

主题

15992

帖子

210

粉丝