联盛德 HLK-W806 (八): 4线SPI驱动SSD1306/SSD1315 128x64 OLED液晶屏

发布者:会哭的蓝精灵最新更新时间:2022-06-20 来源: eefocus关键字:联盛德  驱动  SSD1306  128x64  OLED液晶屏 手机看文章 扫描二维码
随时随地手机看文章

SSD1306/SSD1315 OLED

0.96的128x64 OLED液晶屏是嵌入式应用中最常见的一种屏幕, 这种屏幕常见的pin脚类型有两种: I2C和SPI, 驱动通常是SSD1306, 最近会有一些是SSD1315


I2C类型的OLED只有4个pin脚, 不可修改连接模式, 比较好辨认

SPI类型的OLED有6/7/8pin几种类型, 最常见的是7pin, 带协议选项的模块, 这种模块的背面PCB会有三种模式的选择说明, 后面列出的Rx代表那些位置需要焊接电阻, 通常这些电阻阻值都是5KR, 默认出厂都是4线SPI的模式

在SPI模式下, SSD1306和SSD1315的驱动方式是一样的. 因为W806可以使用硬件SPI, 刷新速度比I2C方式要快将近10倍, 下面介绍的是4线SPI模式的驱动


连接

虽然是4线SPI, 也需要连全部7根线, 4线没算上VCC, GND和Reset, 对应本演示的连接方式为


PB14 -> CS

PB15 -> SCK/CLK/D0

PB17 -> MOSI/SDA/D1

PB10 -> RES(Reset)

PB11 -> DC

GND -> GND

3.3V -> VCC

库文件

本示例由I2C的示例改进得到, 增加了SPI传输方法, 顺带更新了一下演示功能, 这个库文件支持


画点

画线

画圆

输出文字(需要软字库)

画图

使用

驱动SSD1306/SSD1315时, 需要引入的文件为


ssd1306.c

ssd1306.h

ssd1306_fonts.c

ssd1306_fonts.h

在main.c中加入头文件并初始化 SPI_HandleTypeDef


#include "ssd1306.h"


SPI_HandleTypeDef hspi;


static void SPI_Init(void)

{

    hspi.Instance = SPI;

    hspi.Init.Mode = SPI_MODE_MASTER;

    hspi.Init.CLKPolarity = SPI_POLARITY_LOW;

    hspi.Init.CLKPhase = SPI_PHASE_1EDGE;

    hspi.Init.NSS = SPI_NSS_SOFT;

    hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_40;

    hspi.Init.FirstByte = SPI_LITTLEENDIAN;


    if (HAL_SPI_Init(&hspi) != HAL_OK)

    {

        Error_Handler();

    }

}


static void GPIO_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIO_CLK_ENABLE();

    GPIO_InitStruct.Pin = SSD1306_RES_PIN;

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(SSD1306_RES_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = SSD1306_DC_PIN;

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(SSD1306_DC_PORT, &GPIO_InitStruct);

}


在ssd1306.h中, 确认设置的模式为SPI


/**

 * Mode switch: 0 - SPI, 1 - I2C

 */

#define SSD1306_MODE_I2C          0


修改当前屏幕对应的参数: 宽度, 高度


/* SSD1306 settings */

/* SSD1306 width in pixels */

#ifndef SSD1306_WIDTH

#define SSD1306_WIDTH            128

#endif

/* SSD1306 LCD height in pixels */

#ifndef SSD1306_HEIGHT

#define SSD1306_HEIGHT           64

#endif


然后就可以在代码中使用了


# 初始化

GPIO_Init();

SPI_Init();

uint8_t res = SSD1306_Init();

printf("OLED init: %dn", res);

# 定位绘画起点

SSD1306_GotoXY(5, 5);

# 输出字符

SSD1306_Puts("OLED:11x18", &Font_11x18, 1);

# 更新显示

SSD1306_UpdateScreen(); // display


清屏


SSD1306_Fill(0); // clear oled


画线


int y1 = 64, y2 = 0;

while (y1 > 0)

{

    SSD1306_DrawLine(0, y1, 128, y2, 1);

    SSD1306_UpdateScreen();

    y1 -= 2;

    y2 += 2;

}


填充反色, 画圆


SSD1306_Fill(1); // clear oled

SSD1306_UpdateScreen();

SSD1306_DrawCircle(64, 32, 25, 0);

SSD1306_UpdateScreen();

SSD1306_DrawCircle(128, 32, 25, 0);

SSD1306_UpdateScreen();

SSD1306_DrawCircle(0, 32, 25, 0);

SSD1306_UpdateScreen();

SSD1306_DrawCircle(32, 32, 25, 0);

SSD1306_UpdateScreen();

SSD1306_DrawCircle(96, 32, 25, 0);

SSD1306_UpdateScreen();


相关代码

代码已经更新到SDK的I2C示例(同时支持I2C和SPI)


Github: wm-sdk-w806/tree/main/demo/i2c/ssd1306_oled

Gitee: wm-sdk-w806/tree/main/demo/i2c/ssd1306_oled


参考

OLED displays (SSD1306 and SSD1315) http://cholla.mmto.org/electronics/displays/oled/


关键字:联盛德  驱动  SSD1306  128x64  OLED液晶屏 引用地址:联盛德 HLK-W806 (八): 4线SPI驱动SSD1306/SSD1315 128x64 OLED液晶屏

上一篇:联盛德 HLK-W806 (九): 软件SPI和硬件SPI驱动ST7789V液晶LCD
下一篇:联盛德 HLK-W806 (七): 兼容开发板 LuatOS Air103

推荐阅读最新更新时间:2024-11-12 12:06

电机驱动发展趋势分析:高集成、高实时、低功耗、小型化
电机是将电能转化为机械能的设备,电机驱动电路的设计是确保电机正常运行的关键。电机驱动的基本原理是利用电流通过电机的线圈产生磁场,与永磁体或其他磁场互相作用,从而产生转矩和旋转运动,常见的电机驱动方式包括直流电机驱动和交流电机驱动等。 随着工业自动化、汽车、消费电子等终端升级迭代,这些终端对电机驱动的需求也在发生着改变。为了满足这些需求,相关厂商的电机驱动方案也在升级。在这里,我们为大家挑选几款,一起来看一看目前电机驱动芯片或方案的发展趋势。 高集成、小型化的MPQ6600L-AEC1 目前,电机驱动的小型化和高集成发展趋势明显。以MPS公司官网的新品MPQ6600L-AEC1为例,这是一款具有电流调节和内置转换器的步进电机
[嵌入式]
51单片机驱动能力(拉电流_灌电流)及上拉电阻
看来很多网友都搞不清灌电流和拉电流的概念,下面就此解释一下,希望看过本文后不再就此困扰。 一个重要的前提:灌电流和拉电流是针对端口而言的。 名词解释 灌:注入、填充,由外向内、由虚而实。渴了,来一大杯鲜榨橙汁,一饮而尽,饱了,这叫 灌 。 灌电流(sink current) ,对一个端口而言,如果电流方向是向其内部流动的则是 灌电流 ,比如一个IO通过一个电阻和一个LED连接至VCC,当该IO输出为逻辑0时能不能点亮LED,去查该器件手册中sink current参数。 名词解释 拉:流出、排空,由内向外,由实而虚。一大杯鲜橙汁喝了,过会儿,憋的慌,赶紧找卫生间,一阵 大雨 ,舒
[单片机]
使用51单片机驱动舵机程序分析
舵机,又称伺服马达,是一种具有闭环控制系统的机电结构。舵机主要是由外 壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由控制器发出PWM(脉冲宽度调制)信号给舵机,经电路板上的IC处理后计算出转动方向, 再驱动无核心马达转动,透过减速齿轮将动力传至摆臂,同时由位置检测器(电位器)返回位置信号,判断是否已经到达设定位置,一般舵机只能旋转180度。舵机有3根线,棕色为地,红色为电源正,橙色为信号线,但不同牌子的舵机,线的颜色可能不同,需要注意。 舵机的转动位置是靠控制PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms,占空比0.5~2.5ms 的正脉冲宽度和舵机的转角-90°~9
[单片机]
SAE J1850 汽车总线协议 VPW 物理层驱动程序在STM32芯片上的实现
VPW(Variable Pulse Width)是一种可变脉宽调制的汽车总线通讯方式,常用于美系的福特,通用,克莱斯勒等汽车上,主要用途为车用信息中心、仪表显示、故障检测诊断等。 VPW – 以数据位为基本单位进行传输,定义了一个起始位(SOF):200us 的高电平代表开始进行位传输,定义了一个结束位(EOF):280us 的低电平表示位传输正常结束,起始位之后的数据位表示方式可认为为:电平不断的翻转,每次产生一次翻转便产生一个新的数据位,这个数据位为“0”还是“1”由翻转时电平的持续时间来决定,数据位“0”用 64us 的低电平或 128us 的高电平表示,数据位“1” 用 64us 的高电平或 128us 的低电平表示。另
[单片机]
新日本无线最新推出内置升压型开关电源的双路H桥驱动
新日本无线最新推出内置升压型开关电源的双路H桥驱动器 NJW4814, 最适合驱动用于相机变焦和手抖动校正的压电元件。 新日本无线最近开发的双路H桥驱动IC NJW4814已经开始上市。该产品最适合驱动压电元件,如用于数码相机的变焦功能和手抖动校正功能等的压电元件是最佳匹配。 【概要】 通常,驱动压电元件需要20V~30V左右的电源电压和H桥驱动器。在用Li-ion电池或5V电源驱动时,一直以来都需要另外配备升压电路和H桥驱动电路。 当使用NJW4814驱动器时,只需要一颗单片IC就可以完全驱动压电元件了,升压开关电源和H桥驱动器都集成到单片里了,使用起来更加方便。 并且,NJW
[电源管理]
新日本无线最新推出内置升压型开关电源的双路H桥<font color='red'>驱动</font>器
使用STM32CubeMx驱动WS2812B实现幻彩灯
1.创建基于STM32F03C8T6工程 1.1配置时钟 选择外部高速时钟源HSE 1.2配置系统时钟树使其达到最大时钟72MHz(最大系统时钟) 由时钟树可以知道APB1上定时器时钟频率是72MHz,实验使用的硬件接的是PA2,用的定时器TIM2_CH3, 查阅数据手册可知 TIM2外设在APB1上所以TIM2的定时器频率是72MHz。 3.理论分析 之前写过一篇文章,文章链接在此:创客实验第一弹之驱动WS2812B彩灯;不了解的可以直接跳转,今天主要讲解如何使用STM32CubeMx驱动WS2812B实现幻彩,这里做部分内容截取,完整可以跳转文章阅读。 3.1WS2812B的逻辑“1”和逻辑“0”
[单片机]
使用STM32CubeMx<font color='red'>驱动</font>WS2812B实现幻彩灯
单片机驱动74hc595使用方法
单片机驱动74hc595的方法:http://www.51hei.com/chip/1799.html 单片机驱动74hc595 74hc595外形图 _______ QB--|1 16|--Vcc QC--|2 15|--QA QD--|3 14|--SI QE--|4 13|--/G QF--|5 12|--RCK QG--|6 11|--SCK QH--|7 10|--/SCLR GND-|8 9|--QH' |______| 74595的数据端: QA--QH: 八位并行输出端,可以直接控制数码管的8个段。 QH': 级联输出端。将它接下一个595的SI端。 SI: 串行数据输
[单片机]
基于HT1621B段式液晶模块的驱动应用
段式液晶由于其功耗低、价格便宜在很多家电中得到广泛的应用,其驱动其实并不复杂,大多是情况下都是用HT1621B进行驱动。 HT1621是128 点内存映象和多功能的LCD驱动器HT1621 的软件配置特性使它适用于多种LCD应用场合包括LCD模块和显示子系统用于连接主控制器和HT1621的管脚只有4 或5 条HT1621 还有一个节电命令用于降低系统功耗。 在使用HT1621进行驱动时,首先得根据订做的液晶进行原理设置。驱动液晶实际上就是往HT1621的内部寄存器中写数据,至于数据如何去驱动液晶我们可以不去理会它。下面也一款订做的液晶为例进行说明: 资源分配如下,3个数码管每个数码管由7段组成,还有
[单片机]
基于HT1621B段式液晶模块的<font color='red'>驱动</font>应用
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved