东芝开发板驱动OLED模块显示LOGO图片

简介: 东芝开发板驱动OLED模块显示LOGO图片

640.jpg

前言

在之前的两篇评测文章:


介绍了系统SysTick实现精确延时,GPIO的输入输出使用,并实现了位带方式操作GPIO,大大简化了GPIO的输入输出控制。有了精确延时函数+GPIO控制,那么就可以使用通用GPIO模拟的方式,来驱动各种接口的显示器件传感器等。本文以通用GPIO模拟IIC协议,来驱动0.96寸OLED模块为例,来实现OLED显示字符、LOGO图片等等。


OLED屏简介

对于显示屏,我想大家首先想到的是LCD液晶,而OLED显示屏属于新型显示器件,被称为“梦幻显示器”,相比于AMOLED具有反应速度较快、对比度更高、视角较广等特点。


优点

  • 无需背光灯,可以做的更薄,厚度可以控制在1mm以内,而LCD屏幕厚度通常在3mm左右
  • 面板自主发光,显示黑色几乎不耗电,可以自由弯曲,功耗低,视角广。
  • 反应速度是LCD屏幕的千分之一,显示色彩更丰富,更亮,在白天户外也可以清晰的看到屏幕。
  • 耐低温,可以在-40℃环境下正常显示内容。


缺点

  • 相比LCD屏幕,OLED制造技术还不够成熟,量产率低、成本高
  • 早期存在烧屏、红线等寿命较短的问题,但是经过不断改良和研发,现在的OLED屏幕已经相当成熟、稳定。
  • 价格还是偏贵,以国产中景园的0.96寸单色OLED,价格在15RMB左右,而全彩的同尺寸OLED模块,价格在40RMB。


这次我使用的是这种0.96寸的OLED模块,驱动芯片是SSD1306,支持SPI、IIC、8080并口3种通信协议,显示颜色上有蓝色、白色、黄蓝黄色两种,其中黄蓝双色是指上面1/4是黄色,下面3/4是蓝色,并不是真正意义上的双色显示。我手上的这款是0.96寸IIC接口蓝色的OLED模块,只需要两根数据线和两根电源线就可以直接驱动,非常方便。

640.jpg


OLED的初始化

由于IIC协议的两根线,必须加上拉电阻才能之后使用,而模块本身已经添加了10K的上拉电阻,所以连接开发板时,只要选择任意两个GPIO即可,这里我使用的是SDA - PN2、SCL - PN4两个引脚,对应原理图中的CN7的3脚和1脚。由于我的这款OLED模块做工比较简单,没有带5v转3.3v的的转换芯片,所以只能使用3.3v来供电,不能直接使用5v供电,否则可以会烧坏模块,当然,如果你的模块已经带了5-3.3的芯片,那么可以直接使用5v供电。其中SCL引脚使用过程中始终为输出模式,而SDA引脚在写数据时配置为输出模式,在读数据时需要配置为输入模式。数据的输出和读取输入,这里使用了上一篇文章中介绍的位带操作方式实现的。


SCL和SDA的宏定义配置

#ifndef __OLED_IIC_H__
#define __OLED_IIC_H__
#include "bsp.h" 
//SDA - PN2
//SCL - PN4
#define OLED_IIC_SDA_PORT       GPIO_PORT_N
#define OLED_IIC_SCL_PORT       GPIO_PORT_N
#define OLED_IIC_SDA_PIN    GPIO_PORT_2
#define OLED_IIC_SCL_PIN    GPIO_PORT_4
#define OLED_IIC_SCL_OUTPUT_FUN     GPIO_PN4_OUTPUT
#define OLED_IIC_SDA_INPUT_FUN     GPIO_PN2_INPUT
#define OLED_IIC_SDA_OUTPUT_FUN    GPIO_PN2_OUTPUT
//配置输入输出模式
#define OLED_SDA_IN()   gpio_func(&port, OLED_IIC_SDA_PORT, OLED_IIC_SDA_PIN, OLED_IIC_SDA_INPUT_FUN, GPIO_PIN_INPUT)   //输入模式
#define OLED_SDA_OUT()  gpio_func(&port, OLED_IIC_SDA_PORT, OLED_IIC_SDA_PIN, OLED_IIC_SDA_OUTPUT_FUN, GPIO_PIN_OUTPUT)
//位带方式操作IO
#define OLED_IIC_SCL    PNout(4) //SCL
#define OLED_IIC_SDA    PNout(2) //SDA
#define OLED_READ_SDA   PNin(2)  //输入SDA
#endif


IIC协议初始化

//初始化IIC
void OLED_IIC_Init(void)
{
    port.p_pn_instance = TSB_PN;        //PN时钟使能
    gpio_init(&port, OLED_IIC_SDA_PORT);  
    gpio_init(&port, OLED_IIC_SCL_PORT);  
    gpio_func(&port, OLED_IIC_SDA_PORT, OLED_IIC_SDA_PIN, OLED_IIC_SDA_OUTPUT_FUN, GPIO_PIN_OUTPUT);   
    gpio_func(&port, OLED_IIC_SCL_PORT, OLED_IIC_SCL_PIN, OLED_IIC_SCL_OUTPUT_FUN, GPIO_PIN_OUTPUT);  
    OLED_IIC_SCL = 1;
    OLED_IIC_SDA = 1;
}


限于文章篇幅,这里不贴出完整的底层驱动代码,可以到文末下载示例工程代码

显示BMP图片的函数:

//显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~8
void OLED_DrawBMP(u8 x0, u8 y0, u8 x1, u8 y1,const u8 BMPx[])
{
    u16 j = 0;
    u8 x, y;
    if(y1 % 8 == 0) y = y1 / 8;
    else y = y1 / 8 + 1;
    for(y = y0; y < y1; y++)
    {
        OLED_Set_Pos(x0, y);
        for(x = x0; x < x1; x++)
        {
            OLED_WriteData(BMPx[j++]);
        }
    }
}


开机LOGO的显示

void Display_LOGO(void)
{
    u8 n;
    OLED_DrawBMP(0, 0, 128, 8, TOSHIBA);    //东芝LOGO全屏显示
    OLED_DisString_F8X16(0, 3, "Starting...");  
    for( n = 5; n > 0; n--)
    {
        OLED_DisNumber_F8X16(12, 3, n);     //启动倒计时
        delay_ms(800);
    }
    OLED_Clear();//清屏
    OLED_DrawBMP(0, 0, 128, 8, TT_M3HQ);    //TT_M3HQ全屏显示
    delay_ms(200);
    OLED_Clear();//清屏
    OLED_DrawBMP(0, 0, 128, 8, THUNDER);    //中科创达LOGO全屏显示
    delay_ms(200);
    OLED_Clear();//清屏
    OLED_DrawBMP(0, 0, 128, 8, MBB);        //面包板社区LOGO全屏显示
    delay_ms(800);
    OLED_Clear();//清屏
    OLED_DrawBMP(0, 0, 128, 2, BAR);        //上1/4仿手机状态栏显示
}


BMP单色位图图片数据的取模

1.准备1张小于128*64像素的单色位图图片

即在图片详细信息中如下信息,颜色位深度为1,大小一般在1KB左右。

640.jpg


2.取模方式的配置

图片取模说明:阴码,列行式,逆向,点阵16*16,其中阴码、列行式、逆向,这几个配置要根据你的OLED驱动函数中的来修改,如果显示不正确,需要对应修改。

640.jpg


3.生成图片字模数据

点击生成字模数据,即可生成图片对应的C语言格式的字模数据。


几个BMP格式的LOGO图片

东芝半导体LOGO

640.jpg


中科创达LOGO

640.jpg


面包板社区LOGO

640.jpg


实际显示效果

显示东芝半导体LOGO

640.jpg


显示中科创达LOGO

640.jpg


显示面包板社区LOGO

640.jpg


仿手机状态栏

640.jpg


目录
相关文章
|
1月前
|
Android开发 芯片
ESP8266-mini-d1+点灯科技——制作手机远程MP3播放器
ESP8266-mini-d1+点灯科技——制作手机远程MP3播放器
98 0
ESP8266-mini-d1+点灯科技——制作手机远程MP3播放器
|
1月前
STM32F103驱动oled显示屏
STM32F103驱动oled显示屏
34 0
|
1月前
|
内存技术
基于Micropython利用ESP32-C3驱动墨水屏显示图片
基于Micropython利用ESP32-C3驱动墨水屏显示图片
137 0
|
6月前
|
芯片
一款LED段码显示屏驱动芯片方案
一、基本概述 TM1620是一种LED(发光二极管显示器)驱动控制专用IC,内部集成有MCU数字接口、数据锁存器、LED驱动等电路。本产品质量可靠、稳定性好、抗干扰能力强。 二、基本特性 采用CMOS工艺 显示模式(8段×6位~10段×4位) 辉度调节电路(8 级占空比可调) 串行接口(CLK,STB,DIN) 振荡方式:内置RC振荡 内置上电复位电路 内置数据锁存电路 内置针对LED反偏漏电导致暗亮问题优化电路 抗干扰能力强 封装形式:SOP20 三、主要应用 主要适用于家电设备(智能热水器、微波炉、洗衣机、空调、电磁炉)、机顶盒、电子称、智能电表等数码管或LED
62 0
|
6月前
|
芯片
LED面板显示屏驱动芯片
一、基本概述 TM1638是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用IC,内部集成有MCU数字接口、数据锁存器、LED驱动、键盘扫描等电路。本产品质量可靠、稳定性好、抗干扰能力强。 二、主要应用场合 主要适用于家电设备(智能热水器、微波炉、洗衣机、空调、电磁炉)、机顶盒、电子称、智能电表等数码管或LED显示设备。 三、管脚说明 DIO口输出数据时为N管开漏输出,在读键的时候需要外接1K-10K的上拉电阻。推荐10K的上拉 电阻。DIO在时钟的下降沿控制N管的动作,此时读数时不稳定,在时钟的上升沿读数才时稳定。 四、串行数据传输 读取和接收1个BIT都在时钟的上
54 1
|
6月前
|
存储 芯片
LED Driver数码屏应用解决方案
今天给大家介绍的产品是LED Driver,这属于电源管理类芯片,一般分为恒流驱动与恒压驱动,但是常见的就是恒流驱动,能够保持产品在驱动中提供恒定且稳定的电流。 基本概述 TM1629是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用IC,内部集成有MCU数字接口、数据锁存器、LED驱动、键盘扫描等电路。本产品质量可靠、稳定性好、抗干扰能力强。主要适用于家电设备(智能热水器、微波炉、洗衣机、空调、电磁炉)、机顶盒、电子称、智能电表等数码管或LED显示设备。 特性解析 采用CMOS工艺 显示模式16 段×8 位 最大支持矩阵按键8×4 辉度调节电路(占空比8级可调) 串
56 1
|
8月前
|
编译器 Linux
嵌入式 QT usb camera库驱动摄像头
嵌入式 QT usb camera库驱动摄像头
|
9月前
|
芯片
MicroPython 玩转硬件系列7:OLED显示
MicroPython 玩转硬件系列7:OLED显示
|
9月前
|
传感器 数据采集 物联网
基于小熊派光强传感器BH1750状态机驱动项目升级(带LCD屏显示)
基于小熊派光强传感器BH1750状态机驱动项目升级(带LCD屏显示)
70 0