OLED显示屏驱动:8080并口,IIC,SPI三种驱动方式

本文介绍了对OLED的几种驱动方式,8080并口,IIC,SPI三种驱动方式,采用的单片机是STM32F407.

文章目录
一.OLED驱动原理介绍
二.8080并口驱动方式
三.IIC驱动方式
四.SPI驱动方式
一.OLED驱动原理介绍
OLED模块的驱动芯片为SSD1306,其显存大小总共为 12864bit 大小,SSD1306 将
这些显存分为了 8 页.可以看出,SSD1306 的每页包含了 128 个字节,总共 8 页,这样刚好是 12864 的点阵大小。因为每次写入都是按字节写入的,这就存在一个问题,如果我们使用只写方式操作模块,那么,每次要写 8 个点,这样,我们在画点的时候,就必须把要设置的点所在的字节的每个位都搞清楚当前的状态(0/1?),否则写入的数据就会覆盖掉之前的状态,结果就是有些不需要显示的点,显示出来了,或者该显示的没有显示了。这个问题在能读的模式下,我们可以先读出来要写入的那个字节,得到当前状况,在修改了要改写的位之后再写进 GRAM,这样就不会影响到之前的状况了。但是这样需要能读 GRAM,对于 4 线 SPI 模式/IIC 模式,模块是不支持读的,而且读->改->写的方式速度也比较慢。
所以我们采用的办法是在 STM32F4 的内部建立一个 OLED 的 GRAM(共 128*8 个字节),在每次修改的时候,只是修改 STM32F4 上的 GRAM(实际上就是 SRAM),在修改完了之后,一次性把 STM32F4 上的 GRAM 写入到 OLED 的 GRAM。当然这个方法也有坏处,就是对于那些 SRAM 很小的单片机(比如 51 系列)就比较麻烦了。
SSD1306 的命令比较多.


二.8080并口驱动方式
介绍一下模块的 8080 并行接口,8080 并行接口的发明者是 INTEL,该总线也被广泛应用于各类液晶显示器,使得 MCU 可以快速的访问 OLED。ALIENTEK OLED 模块的 8080 接口方式需要如下一些信号线:
CS:OLED 片选信号。
WR:向 OLED 写入数据。
RD:从 OLED 读取数据。
D[7:0]:8 位双向数据线。
RST(RES):硬复位 OLED。
DC:命令/数据标志(0,读写命令;1,读写数据)。
模块的 8080 并口读/写的过程为:先根据要写入/读取的数据的类型,设置 DC 为高(数据)/低(命令),然后拉低片选,选中 SSD1306,接着我们根据是读数据,还是要写数据置 RD/WR为低,然后:
在 RD 的上升沿, 使数据锁存到数据线(D[7:0])上;
在 WR 的上升沿,使数据写入到 SSD1306 里面;
SSD1306 的 8080 并口写时序图如图 17.1.3 所示:



三.IIC驱动方式
一些驱动方式与显示代码均与上面一致,因此这里只介绍IIC写数据/命令驱动代码,也即重写OLED_WR_Byte(u8 dat,u8 cmd)函数,其他均不变!

//向SSD1306写入一个字节
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据
void WriteCmd(u8 command)    //写命令函数
{
    IIC_Start();
    IIC_Send_Byte(0x78);//OLED地址
    IIC_Wait_Ack(t);
    IIC_Send_Byte(0x00);//写命令寄存器地址
    IIC_Wait_Ack();
    IIC_Send_Byte(command);
    IIC_Wait_Ack();
    IIC_Stop();
}
void WriteData(u8 data)      //写数据函数
{
    IIC_Start();
    IIC_Send_Byte(0x78);//OLED地址
    IIC_Wait_Ack();
    IIC_Send_Byte(0x40);//写数据寄存器地址
    IIC_Wait_Ack();
    IIC_Send_Byte(data);
    IIC_Wait_Ack();
    IIC_Stop();
}
void OLED_WR_Byte(u8 dat,u8 cmd)  //为了直接替换上面,做一个封装函数
{     
    if(cmd)
      WriteData(dat);
    else
      WriteCmd(dat);

这里采用的是模拟IIC通信方式,在main函数中要先配置IIC初始化

四.SPI驱动方式
SPI模式使用的信号线有如下几条:
CS:OLED 片选信号。
RST(RES):硬复位 OLED。
DC:命令/数据标志(0,读写命令;1,读写数据)。
SCLK:串行时钟线。在 4 线串行模式下,D0 信号线作为串行时钟线 SCLK。
SDIN:串行数据线。在 4 线串行模式下,D1 信号线作为串行数据线 SDIN。
在 4 线串行模式下,只能往模块写数据而不能读数据。
在 4 线 SPI 模式下,每个数据长度均为 8 位,在 SCLK 的上升沿,数据从 SDIN 移入到
SSD1306,并且是高位在前的。DC 线还是用作命令/数据的标志线。在 4 线 SPI 模式下,写操作的时序如图 17.1.6 所示:

一些驱动方式与显示代码均与上面一致,因此这里只介绍SPI写数据/命令驱动代码,也即重写OLED_WR_Byte(u8 dat,u8 cmd)函数,其他均不变!

//向SSD1306写入一个字节
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据

//STM32F407采用硬件SPI发送数据(也可采用模拟SPI方式发送数据,在后续的博客中会有介绍)
void OLED_Write_Byte(uint8_t dat)
{  
    SPI1_ReadWriteByte(dat);      //调用硬件SPI写数据函数
}
//写数据
void OLED_Write_Data(uint8_t dat)
{
    CS=0;
    DC=1;
    OLED_Write_Byte(dat);
}
//写命令
void OLED_Write_Cmd(uint8_t cmd)

    CS=0;
    DC=0;
    OLED_Write_Byte(cmd);
}
//为了直接替换上面,做一个封装函数
void OLED_WR_Byte(u8 dat,u8 cmd)
{     
    if(cmd)
      OLED_Write_Data(dat);
    else
        OLED_Write_Cmd(dat);


小结:OLED的驱动方式非常简单,应用起来也非常的方便,分辨率也较高,作为平时辅助开发的小工具也是极好的。在上文中对于各种字符的显示均给出了驱动程序,可以非常方便的调用,另外对于字符取模也有很多可用的小软件,大家可自行应用。
————————————————
版权声明:本文为CSDN博主「tutu-hu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42700740/article/details/94380147

  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
I2C(Inter-Integrated Circuit)接口的LCD12864显示屏是一种常用的图形字符型液晶显示器,常用于各种嵌入式系统中。其原理图通常包括以下几个部分: 1. **I2C总线接口**:连接到微控制器的I2C端口,负责数据的双向传输。微控制器作为主设备,发送控制信号和设置参数,而LCD作为从设备,接收指令并显示内容。 2. **上拉/下拉电阻**:为了稳定I2C通信线路,防止信号反射,一般会在I2C的数据线上添加适当的上拉或下拉电阻。 3. **LCD驱动器**:包括8位数据线(D0~D7)和2条命令线(RS[Register Select]和RW[Read Write])。RS用来选择是数据传输还是读取命令,RW用于指示是写操作还是读操作。 4. **VCC和GND电源连接**:提供LCD所需的电压,通常为3.3V或5V,以及地线连接。 5. **背光驱动**:如果LCD有背光,可能还需要单独的背光驱动电路来控制LED。 6. **复位(RST)**和时钟(SCL/SDA)引脚:用于初始化 LCD 和同步通信。 7. **LCD模块内部结构**:包括偏置电压控制、行/列驱动电路、光源和液晶矩阵等组件。 具体原理是,通过I2C通信,微控制器向LCD发送控制字节,这些字节定义了要显示的内容的位置、颜色等信息。然后LCD根据接收到的命令更新自身的状态,驱动液晶单元改变像素的亮度,从而形成显示图像。 如果你对某个特定部分或者详细的电路设计有疑问,欢迎提问相关的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值