U8g2从入门到使用,显示OLED

介绍

U8g2是一个功能强大的C++图形库,专为嵌入式系统而设计,是一个开源的图形库, 主要用来驱动小屏幕, 内部继承了I2C/SPI, 支持常用的小屏幕支持很多型号, 特别是在Arduino和其他低功耗平台上。以下是关于U8g2的详细介绍:

  1. 主要特点

    • 支持多种屏幕:U8g2支持近200种单色屏,包括LCD、OLED等,这使得开发者能够轻松地在不同的显示屏上实现图形界面。
    • 跨平台支持:除了Arduino平台外,U8g2还可以在其他嵌入式平台上使用,增强了其灵活性和可移植性。
    • 多种字体支持:U8g2支持多种字体,包括中文、韩文、日文、梵文等,满足了不同项目的需求。
    • 高效的内存管理:采用页缓冲策略,减少了对内存的需求,这在资源有限的嵌入式平台上尤为重要。
    • 丰富的图形功能:提供了绘制文本、线条、形状等基本图形操作,以及自动滚动、页面缓冲区管理等高级特性。
  2. 技术细节

    • 硬件兼容性:U8g2支持多种显示屏型号和接口类型,如SPI、I2C、4Wire、3Wire、1Wire、8080等,这为用户提供了广泛的选择。
    • C++编程模型:采用面向对象的API设计,使得代码更易于理解和维护。开发者可以通过类和对象创建多个独立的显示实例,并根据需要进行初始化和更新。
    • 自定义字体支持:除了内置的一系列字体外,U8g2还支持加载和使用自定义的点阵字体,这为用户提供了更大的灵活性。
  3. 应用场景

    • 物联网仪表盘:用于实时数据可视化的简易面板。
    • 游戏界面:创建简单的游戏图形界面和得分显示。
    • 智能家居控制面板:设计直观的控制界面。
    • 实验原型:快速构建带图形界面的原型机。
    • 显示传感器数据、制作时钟、显示菜单、显示动画等。
  4. 使用示例

    • U8g2提供了丰富的API函数,用于实现各种图形操作。例如,可以使用u8g2_DrawBox函数绘制实心矩形,u8g2_DrawStr函数绘制字符串等。
    • 通过简单的函数调用,开发者可以轻松地创建出各种复杂的图形界面。

综上所述,U8g2是一个功能强大、易于使用且高度灵活的图形库,适用于各种嵌入式系统项目。

使用

1. 打开图形库的官方地址

Github官网地址:
GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2U8glib library for monochrome displays, version 2 - GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2icon-default.png?t=N7T8https://github.com/olikraus/u8g2/

如果上面地址打不开则使用码云官方地址:

u8g2: U8g2: Library for monochrome displays, version 2 U8g2 is a monochrome graphics library for embedded devices. U8g2 supports controller based (for example SSD1306) monochrome OLEDs and LCDs (See the U8g2/U8x8 setup guide for a complete list of supported display controller). The Arduino library U8g2 can be installed from the library manager of the Arduino IDE. U8g2 also includes U8x8 library: U8g2 Includes all graphics procedures (line/box/circle draw). Supports many fonts. (Almost) no restrictio (gitee.com)icon-default.png?t=N7T8https://gitee.com/penjun71/u8g2

2. 下载源代码

下载成功后, 保存下来

3. 进入设置指南与参考手册

选择 移植到新的MCR平台

点击进入移植到新的MCR平台后,选择STM32, 如果是GD32,也可以选择这个文档

我们可以在第二个链接中, 寻找自己需要的代码, 其他链接也可参考

4. 编写代码

经过上面一系列查找文档之后, 我们可以开始着手代码部分了

我们习惯使用C语言的src, 所以选择csrc

1. 删除不需要的屏幕驱动

删掉csrc文件夹中其它的屏幕驱动,只保留自己的屏幕驱动,例如我使用的屏幕驱动是ssd1306, 128x64的屏幕

以下是删除后,剩余文件,可供参考

2. 精简u8g2_d_setup.c

打开u8g2_d_setup.c文件, 找到需要的屏幕驱动, 删除其他代码, 比如我们需要128 × 64, 只保留u8g2_Setup_ssd1306_i2c_128x64_noname_f函数(370行)

4. 参考main.c文件

打开下面这个网站,看看如何将它移植到stm32平台中

Porting to new MCU platform · olikraus/u8g2 Wiki · GitHub

3. 讲精简完的u8g2文件夹, 拖进需要用到的文件中

这里需要注意, 在使用时别忘记, 加入

4. 下载stm32平台的main.c

https://github.com/nikola-v/u8g2_template_stm32f103c8t6/blob/master/Src/main.c

5. 参考文档, 在u8g2.c 文件中编写代码


/*
是一个开源的图形库, 主要用来驱动小屏幕
内部继承了I2C/SPI
支持常用的小屏幕
*/
#include "u8g2.h"
#include "gd32f4xx.h"
#include <stdio.h>
#include <string.h>
#include "systick.h"

uint8_t u8g2_gpio_and_delay_gd32(U8X8_UNUSED u8x8_t *u8x8, U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, U8X8_UNUSED void *arg_ptr)
{
	switch(msg){
		//Initialize SPI peripheral
		case U8X8_MSG_GPIO_AND_DELAY_INIT:
			/* HAL initialization contains all what we need so we can skip this part. */

		break;

		//Function which implements a delay, arg_int contains the amount of ms
		case U8X8_MSG_DELAY_MILLI:
      delay_1ms(arg_int);

		break;
		//Function which delays 10us
		case U8X8_MSG_DELAY_10MICRO:
      delay_1us(10);
		break;
		//Function which delays 100ns
		case U8X8_MSG_DELAY_100NANO:
      __NOP();

		break;
		//Function to define the logic level of the clockline
		case U8X8_MSG_GPIO_I2C_CLOCK:
			if (arg_int) gpio_bit_write(GPIOB, GPIO_PIN_6, SET);
			else gpio_bit_write(GPIOB, GPIO_PIN_6, RESET);

      break;
		//Function to define the logic level of the data line to the display
		case U8X8_MSG_GPIO_I2C_DATA:
			if (arg_int) gpio_bit_write(GPIOB, GPIO_PIN_7, SET);
			else gpio_bit_write(GPIOB, GPIO_PIN_7, RESET);

      break;
	
		default:
			return 0; //A message was received which is not implemented, return 0 to indicate an error
	}

	return 1; // command processed successfully.
}
/*
  开源的图形库,主要是用来驱动小型屏幕
  内部已经集成I2C/SPI
  支持常用的小屏幕
*/
void u8g2_test(){
  // 对GPIO进行初始化
  rcu_periph_clock_enable(RCU_GPIOB);
  // PB6 SCL
  gpio_mode_set(GPIOB,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_PIN_6);
  gpio_output_options_set(GPIOB,GPIO_OTYPE_OD,GPIO_OSPEED_MAX,GPIO_PIN_6);
  
  // PB7 SDA
  gpio_mode_set(GPIOB,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_PIN_7);
  gpio_output_options_set(GPIOB,GPIO_OTYPE_OD,GPIO_OSPEED_MAX,GPIO_PIN_7);
  
  
  /* USER CODE BEGIN 1 */
	u8g2_t u8g2;
  /* USER CODE END 1 */
  
  u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8g2_gpio_and_delay_gd32);
  u8g2_InitDisplay(&u8g2); // send init sequence to the display, display is in sleep mode after this,
  u8g2_SetPowerSave(&u8g2, 0); // wake up display

  delay_1ms(1000);
  
  printf("example16_u8g2_test\r\n");
  
  u8g2_DrawLine(&u8g2, 50,50, 100, 100);
  
  
  u8g2_SetFontMode(&u8g2, 1); 
  u8g2_SetFontDirection(&u8g2, 0); 
  u8g2_SetFont(&u8g2, u8g2_font_fub20_tf);
  u8g2_DrawStr(&u8g2, 0, 28, "ICHEIMA");
  
  // 将数据发送到屏幕上显示
  u8g2_SendBuffer(&u8g2);
  
  while(1){
   
  }
}

6. 在main中使用, 并在OLED板上显示

#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
/*********************
任务目标:
模板工程
**********************/

int main(void) {

    // 系统滴答定时器初始化
    systick_config();

    // 移植U8G2开源库
    extern void u8g2_test();
    u8g2_test();

    while(1) {

    }

}

最终效果

稍后更新...

  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值