STM32外设使用之OLED(ssd1306),基于cubemx

这篇具有很好参考价值的文章主要介绍了STM32外设使用之OLED(ssd1306),基于cubemx。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在学习的过程中,发现许多代码都是在套用模板,但是修改模板的过程对新手是很不友好的

准备工作

外设连接

GND-----GND
VCC–3.3V
SCL----SCL
SDA----SDA

这个基本不会出错,就是一条时钟线,一条数据线,

cubemx的配置

这个挺简单的,动动手就好了(可以调为快速模式)

iic的传输原理

iic原理也很好懂我们只需要明白一个就是在传输中:SCL低电平时,SDA变化;SCL高电平时,从机读取SDA的电平(高为1,低为0),以及每发送一个ack的应答信号。具体如何编写,若简单的我们可以读参考手册(其实就是一些首发指令),难的还是建议从模板去修改

!!!记得看一下自己设备的地址,一般是是七位地址,但是因为一字节是八位bit,故习惯向左移一位,第0位的数据用于区分读指令or写指令

当然HAL库已经给我们写好了收发的函数,我们只需要懂得如何用就好

oled的显示原理

如图
stm32 软件模拟 i2c oled ssd1306,stm32,嵌入式硬件,单片机
我们实际上是通过向驱动芯片发指令来控制oled屏的亮灭
划分页的目的就是让我们通过一字节的数据去控制该页的那一列的显示

若向第0页的第三列写入0xC1(1100 0001),则
stm32 软件模拟 i2c oled ssd1306,stm32,嵌入式硬件,单片机

两种通讯,一种为指令另一种为数据
stm32 软件模拟 i2c oled ssd1306,stm32,嵌入式硬件,单片机

指令 : 0x7A(地址) 0x00 0xXX
页地址:高四位为B不变第四位则为我们要设置的页数,
既发送0x7A 0x00 0xB0;

列地址:若要设置为第90列(0x5A),则发送0x0A为低四位地址,0x15为高四位地址;
既发送 0x7A 0x00 0x0A 0x15
数据: 0x7A 0x40 0x01…
并且设置完一个字节后,列地址会自动加一,加到128列后页地址也会自动加一
列地址的第零列低四位地址为0x02

代码的设计

编写oled.c函数

根据上面的内容,我们写下发起通讯的函数(地址的话HAL库会帮我们发送的)

#define OLED_ADDRESSS 0x78

void OLED_TransmitByte(uint8_t data, OLED_TransmitMode mode) {
	uint8_t send_buf[2] = { 0 };
	if (mode)
		send_buf[0] = 0x40;
	else
		send_buf[0] = 0x00;
	send_buf[1] = data;
	HAL_I2C_Master_Transmit(&hi2c1, OLED_ADDRESS, send_buf, 2, 1);
}

以及初始化函数(这个就是根据别的模板稍作修改)

/**
 * @brief 初始化OLED屏幕
*/
void OLED_Init(void) {
	OLED_TransmitByte(0xAE, OLED_TRANSMIT_CMD); /*display off*/
	OLED_TransmitByte(0x02, OLED_TRANSMIT_CMD); /*set lower column address*/
	OLED_TransmitByte(0x10, OLED_TRANSMIT_CMD); /*set higher column address*/
	OLED_TransmitByte(0x40, OLED_TRANSMIT_CMD); /*set display start line*/
	OLED_TransmitByte(0xB0, OLED_TRANSMIT_CMD); /*set page address*/

	OLED_TransmitByte(0x81, OLED_TRANSMIT_CMD); /*contract control*/
	OLED_TransmitByte(0xcf, OLED_TRANSMIT_CMD); /*128*/

	OLED_TransmitByte(0xA1, OLED_TRANSMIT_CMD); /*set segment remap*/
	OLED_TransmitByte(0xA6, OLED_TRANSMIT_CMD); /*normal / reverse*/
	OLED_TransmitByte(0xA8, OLED_TRANSMIT_CMD); /*multiplex ratio*/
	OLED_TransmitByte(0x3F, OLED_TRANSMIT_CMD); /*duty = 1/64*/
	OLED_TransmitByte(0xad, OLED_TRANSMIT_CMD); /*set charge pump enable*/
	OLED_TransmitByte(0x8b, OLED_TRANSMIT_CMD); /* 0x8B 内供 VCC */
	OLED_TransmitByte(0x33, OLED_TRANSMIT_CMD); /*0X30---0X33 set VPP 9V */
	OLED_TransmitByte(0xC8, OLED_TRANSMIT_CMD); /*Com scan direction*/
	OLED_TransmitByte(0xD3, OLED_TRANSMIT_CMD); /*set display offset*/
	OLED_TransmitByte(0x00, OLED_TRANSMIT_CMD); /* 0x20 */

	OLED_TransmitByte(0xD5, OLED_TRANSMIT_CMD); /*set osc division*/
	OLED_TransmitByte(0x80, OLED_TRANSMIT_CMD);

	OLED_TransmitByte(0xD9, OLED_TRANSMIT_CMD); /*set pre-charge period*/
	OLED_TransmitByte(0x1f, OLED_TRANSMIT_CMD); /*0x22*/

	OLED_TransmitByte(0xDA, OLED_TRANSMIT_CMD); /*set COM pins*/
	OLED_TransmitByte(0x12, OLED_TRANSMIT_CMD);
	
	OLED_TransmitByte(0xdb, OLED_TRANSMIT_CMD); /*set vcomh*/
	OLED_TransmitByte(0x40, OLED_TRANSMIT_CMD);

	OLED_ClearBuffer();
	OLED_Refresh();
	OLED_TransmitByte(0xAF, OLED_TRANSMIT_CMD); /*display ON*/
}

其中修改模板最重要的便是这个宏定义的地址,以及这个发送通讯的参数是否于我们所使用的的相同,如果不同更改即可。

修改模板首先我们要检查一下,函数参数是否与头文件的函数声明一致,接下来再看变量的声明,一个好的代码必须具备很高的可移植性,所以在c文件中我们一定会用到枚举结构体等知识,所以务必学好这方面的内容再来学习stm32

完整的资源我放在下面了,读者只需要下载,然后做完更改之后,将c文件放入Core/Src文件及 H文件放入CoreInc文件夹里就好
链接: 模板代码

模板如何使用

这份模板里面对使用做了详细的介绍,只提几句:
1.更改完设备地址的宏定义,以及HAL_I2C_Master_Transmit()的句柄后即可直接使用
2.若要使用取模则可以使用这个地址:链接: 取模地址
3.取模完之后记得去font.h里面重新声明一下(extern xxxx)
在font.h文件中
stm32 软件模拟 i2c oled ssd1306,stm32,嵌入式硬件,单片机
在font.c文件中,复制取模的代码
stm32 软件模拟 i2c oled ssd1306,stm32,嵌入式硬件,单片机
4.这个字符串是可以直接写字进去的例如:
stm32 软件模拟 i2c oled ssd1306,stm32,嵌入式硬件,单片机
第一个是x坐标,第二个是y坐标,第三个是显示的字符串(也可以写“狐狸小豆,Hello”),第四个是颜色。
但是我们取模只需要取汉字的就ok,这个是汉字(UTF-8)与ACSII码共用的,至于原理的话小伙伴们只需要看一下这个结构体的声明便懂了

结尾

这套模板是我在看视频的时候发现的,作为小白,我们要多看看别人的视频和代码的设计思路,只看一个是远远不够的。例如上篇文章的超声波,我视频看了至少五六个,以及参考了很多代码,其中状态机这个设计思路是我认为最适合我们理解于吸收的(还有关于溢出的判断以及再加一个定时器用于定时触发超声波,再或者取平均值的判断就交给我们自己来探索了)文章来源地址https://www.toymoban.com/news/detail-828758.html

到了这里,关于STM32外设使用之OLED(ssd1306),基于cubemx的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ESP8266基于Lua开发使用U8g2模块驱动 i2c ssd1306 OLED显示

    📍相关篇《ESP8266基于Lua开发点灯示例》 📖U8g2对应的API接口函数: https://nodemcu.readthedocs.io/en/release/modules/u8g2/ 📺驱动显示效果: 🔖官方U8g2驱动Demo : https://github.com/nodemcu/nodemcu-firmware/blob/release/lua_examples/u8g2/graphics_test.lua ✨在使用U8g2时,可能会出现上传过程中报错的问题:

    2024年02月06日
    浏览(34)
  • SSD1306-7针脚OLED的使用心得

            最近,想捣鼓捣鼓显示屏,本来想试着把TFT移植到32,试了好久不行,因为我太菜了。所以想着先从OLED开始,因为之前移植成功过。但是想深入了解一下,就细看了一下工程的底层代码。下面我写一下我的体会,如有不对的地方请批评指正。         首先,对于显示

    2023年04月26日
    浏览(33)
  • STM32F103基于标准库+I2C SSD1306仿数码管RTC时钟显示

    ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取。 🍁对于文中所提供的相关资源链接将作不定期更换。 📺显示效果: 🌿工程基于正点原子标准库3.5版本RTC例程作为模板。 🌿使用IIC SSD1306 OLED 双色屏幕软件IIC驱动显示。 ⛳时钟说明

    2023年04月22日
    浏览(35)
  • ARDUINO STM32 SSD1306

    STM32F103XX系列SPI接口位置 在ARUDINO 下,(不需要设置引脚功能,不需要开启时钟设置,ARDUINO已经帮我们处理了) stm32f103c6t6 flash不足,不足以运行U8G2,产生错误(STM32F103C8T6 FLASH ram足够,直接运行示列) 改用U8X8,后将字体改为u8x8_font_artosserif8_n ,可以简单程序 使用U8X8可以显示

    2024年02月10日
    浏览(26)
  • OLED12864(SSD1306)驱动代码

    我所使用的是 0.96 寸,I2C 接口的 OLED 屏幕。这款屏幕所使用的驱动芯片是 SSD1306 ,关于这款 OLED 驱动芯片的详细介绍可以参考下面这篇文章的介绍。 SSD1306(OLED驱动芯片介绍) 硬件平台测试平台我使用的是 STM32F407ZGT6 芯片的开发板。开发板和 OLED 屏幕的硬件连接引脚如下: 关

    2023年04月24日
    浏览(28)
  • STC单片机DS1307+ssd1306 oled时钟显示

    📌相关篇《STC单片机DS1302+ssd1306 oled时钟显示》 📍《STC单片机对DS1307读写操作》 ✨效果演示: 🌿实验对象:STC12C5A60S2 🌿屏幕型号:I2C ssd1306 0.96“ oled 🌿晶振频率:11.059MHz 🌿串口波特率:9600 📜串口打印读取信息: 🛠引脚说明 ✨由于屏幕接口ssd1306 0.96“ oled和DS1307的接

    2023年04月09日
    浏览(34)
  • HAL STM32 HW I2C DMA + SSD1306/SH1106驱动示例

    📍硬件I2C DMA驱动参考: https://blog.csdn.net/weixin_45065888/article/details/118225993 🔖本工程基于 STM32F103VCT6 ,驱动程序独立,可以移植到任意STM32型号上使用。 📑字体大小说明 🌿该驱动程序ASCII字符集类型大小包含:6X8、8X16,12X6 三种。其中6X8和8X16共用一个API函数调用,形参不同

    2024年02月22日
    浏览(34)
  • 0.96寸OLED(SSD1306)屏幕显示(二)——超长文字水平滚动

    (一)基础功能介绍 (二)超长文字水平滚动 (三)屏幕垂直水平滚动 文章目录 前言 一、内置水平滚动方法 二、自定义水平滚动方法 总结 最近,我突发奇想去翻阅了一些我本科期间所做的一些小项目,发现都挺有意思的!当年做这些项目的时候可走了很多弯路,所以想

    2023年04月08日
    浏览(31)
  • STM32外设系列—OLED

    🎀 文章作者:二土电子 🌸 关注文末公众号获取其他资料和工程文件! 🐸 期待大家一起学习交流! OLED是开发时常用的显示器件,这里介绍的是0.96寸的四针脚OLED,IIC控制。 供电电压在3V~5V,用3.3V即可。 I2C通信接口由从地址位DC、I2C总线数据信号SDA(输出SDAOUT/D2输出,SD

    2024年02月13日
    浏览(32)
  • 标准库 STM32+EC11编码器+I2C ssd1306多级菜单例程

    📌原创项目来源于: https://github.com/AdamLoong/Embedded_Menu_Simple 📍相关功能演示观看: https://space.bilibili.com/74495335 单片机多级菜单v1.2 👉本次采用的是原作者(Adam)《单片机多级菜单框架v1.8》基础上修改适配包含中键按键的EC11编码器。 📍原作者网盘项目共享资料: ✨原作者

    2024年02月19日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包