arduino使用oled代码_实用!Arduino平台最强大的“显卡”驱动:Adafruit GFX 图形库8000字详细使用指南...

这篇博客深入介绍了Adafruit GFX库,它为Arduino的各种LCD和OLED显示屏提供通用的图形功能。文章详细阐述了库的安装、坐标系统、基本图形操作如绘制点、线、矩形、圆形、三角形,以及文本输出和字体使用。此外,还讨论了如何加载和显示BMP图像,包括从SD卡读取和在RAM中加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8bc26ad8f40e83a152ec117b6902263b.png

概述

e3ba8b1bca93d9a48f6399d196e9b4b6.png

Arduino的Adafruit_GFX库为我们所有的LCD和OLED显示屏提供了通用语法和图形功能集。这使得Arduino示例程序可以很容易地在不同类型的显示屏之间进行调整,并且任何新特性、性能改进和错误修复都将立即应用于我们提供的完整的彩色显示。

Adafruit_GFX库可以使用Arduino库管理器安装……这是首选的方式。在Arduino IDE“工具”菜单中,选择“管理库…”

52a65b5e89a31595070fddb26cc21625.png

在搜索栏中输入“gfx”可以快速找到它:

70c5e13604c5b34759201b6d3e9f3b9d.png

在这里,也要搜索并安装Adafruit_BusIO库(或者…新的Arduino IDE版本自动安装这个依赖项)。

Adafruit_GFX库总是与每个特定显示驱动类型的附加库一起工作——例如,ST7735 1.8英寸的彩色LCD需要安装Adafruit_GFX、Adafruit_BusIO和Adafruit_ST7735库。目前支持下面这些库:

  • RGBmatrixPanel, for our 16x32 and 32x32 RGB LED 矩阵面板。
  • Adafruit_TFTLCD, for our 2.8" Arduino的触屏盾板和TFT触摸屏。
  • Adafruit_HX8340B, for our 2.2" TFT 带microSD存储卡的显示屏。
  • Adafruit_ST7735, for our 2.2" TFT 带microSD存储卡的显示屏。
  • Adafruit_PCD8544, for the Nokia 5110/3310 单色LCD
  • Adafruit-Graphic-VFD-Display-库, for our 128x64 图形VFD(真空荧光显示器)。

Adafruit-SSD1331-OLED-Driver-Library 兼容arduino的0.96" 16位彩色OLED w/带microSD卡槽。

  • Adafruit_SSD1306,用于单色128x64 和128x32 OLED显示屏。

这些库是为Arduino用c++编写的,但是可以通过重写底层pin访问功能轻松地移植到任何微控制器。

坐标系和单位

像素—图像元素,组成数字图像的块——通过它们的水平(X)和垂直(Y)坐标进行定位。坐标系将原点(0,0)放在左上角,正X向右递增,正Y向下递增。这与数学中的标准笛卡尔坐标系统是颠倒的,但在许多计算机图形系统中已经建立了实践(追溯到光栅扫描CRT图形的时代,它自上而下地工作)。要使用高大的“纵向”布局而不是宽的“横向”格式,或者如果物理安装方向限制了附件中显示的方向,也可以应用四个旋转设置中的一个,即显示的哪个角代表左上角。

同样与数学笛卡尔坐标系不同的是,这里的点有维数——它们的宽和高总是一个完整的整数像素。

883a517059e30852c9b2b1613b57cf2d.png

坐标总是用像素单位表示;没有像毫米或英寸这样的现实测量的隐含比例,显示图形的大小将是特定显示的点间距或像素密度的函数。如果你的目标是真实的维度,你需要缩放你的坐标来适应。点间距通常可以在显示屏的数据手册中找到,或者通过测量屏幕宽度并将像素数除以这个测量值。

对于彩色显示器,颜色表示为无符号的16位值。 某些显示器实际上可能比这更多或更少,但是该库以16位值运行……这些对于Arduino来说很容易使用,同时还为所有不同的显示器提供一致的数据类型。 红色,绿色和蓝色等原色分量全部“打包”成单个16位变量,其中最高有效5位传达红色,中间6位传达绿色,最低5位传达蓝色。 多余的部分分配给绿色,因为我们的眼睛对绿光最敏感。 科学!

0c68b7def9f2917a3b4d250304b8694c.png

对于最常见的主色和副色,我们有这个有用的列表,可以包含在自己的代码中。当然,你可以从65,536种不同的颜色中选择任意一种,但下面的基本列表开始可能是最简单的:

// Color definitions
#define BLACK    0x0000
#define BLUE     0x001F
#define RED      0xF800
#define GREEN    0x07E0
#define CYAN     0x07FF
#define MAGENTA  0xF81F
#define YELLOW   0xFFE0 
#define WHITE    0xFFFF

对于单色显示,颜色总是简单地指定为1 (set)或0 (clear)。set/clear的语义是特定于显示类型的:像发光的OLED显示,“set”像素是发光的,而反光的LCD显示,“set”像素通常是暗的。可能会有例外,但通常您可以期望0 (clear)表示新初始化的显示的默认背景状态,无论结果如何。

基本图形

每个用于特定显示屏的显示库都有自己的构造函数和初始化函数。这些在每个显示屏类型的单独教程中都有记录,或者通常在特定的库头文件中有说明。本教程的其余部分将介绍与显示类型无关的通用图形函数。

下面的函数描述只是原型—假设显示对象是由特定于设备的库根据需要声明和初始化的。查看每个库的示例代码,了解它的实际使用情况。例如,在我们显示print(1234.56)的地方,你的实际代码会把对象名称放在这之前,例如,它可能会读做screen.print(1234.56)(如果你已经声明了显示对象的名称为:screen)。

  • 绘制像素(点)

首先是最基本的像素推送器。你可以调用它,并指定参数:X Y坐标和一种颜色,它会在屏幕上生成一个点:

void drawPixel(uint16_t x, uint16_t y, uint16_t color);

fe7c993327ff6d63aeb044c32a61b6ca.png
  • 绘制线

你也可以画一条线,指定起点和终点和颜色:

void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color);

07cc7be438b53980ba0b63f5a0ad4afe.png

81d03258d78b8619c4307e671532c969.png

对于水平或垂直

### STM32 驱动 OLED 屏幕显示中文库 为了使 STM32 单片机能驱动 OLED 屏幕并显示中文符,通常会采用特定的体库来处理汉编码到点阵图案的转换。以下是具体实现过程: #### 1. 准备工作 确保已经安装好必要的开发环境,并配置好了 STM32CubeMX 或其他 IDE 工具链。 #### 2. 创建库文件 `oledfont.h` 创建一个新的头文件用于定义所需的 ASCII 和 GBK 编码表以及相应的图数组。此部分代码应放置于项目中的适当置以便后续调用[^2]。 ```c #ifndef __OLEDFONT_H__ #define __OLEDFONT_H__ #include "stdint.h" extern const uint8_t Font_16x16[]; // ... 更多体大小... #endif /* __OLEDFONT_H__ */ ``` 实际的体数据可以通过第三方工具生成或手动编写。对于每个符,都需要提供其宽度、高度及其像素矩阵表示形式。 #### 3. 修改测试函数以支持中文显示 编辑现有的测试程序,在其中加入对新添加功能的支持。这里展示了一个简单的例子,展示了如何混合使用英文母、数和中文: ```c void TEST_MainPage(void) { GUI_ShowString(28, 0, "stars", 16, 1); // 显示英文符串 GUI_ShowChinese(28, 20, 16, "小小星", 1); // 显示中文汉 GUI_ShowString(4, 48, "631907030123", 16, 1); // 显示数 delay_ms(1500); } ``` 上述代码片段实现了在指定坐标处绘制不同类型的文本内容的功能。`GUI_ShowChinese()` 是专门用来渲染中文符的方法;它接收四个参数——X 坐标、Y 坐标、号大小及待打印的文串指针。 #### 4. 实现核心逻辑 下面是一个简化版的核心算法框架,负责将输入的 Unicode/GBK 编码映射至预存好的图像资源上,并终传输给显示器控制器进行刷新操作[^1]。 ```c void GUI_ShowChinese(uint8_t x, uint8_t y, uint8_t size, char *str, uint8_t mode){ while(*str != '\0'){ unsigned int code = (unsigned int)(*str++); if(code >= 0x81 && code <= 0xFE){ // 判断是否为双符(即可能是CJK统一汉) code <<= 8; code |= (*str++); DrawBitmap(x,y,size,(uint8_t*)GetFontData(code)); // 获取对应模并绘图 x += GetCharWidth(size)*mode; // 更新下一个符起始置 } else{ // 处理ASCII范围内的简单情况 DrawAsciiCharacter(x,y,*(--str),size,mode); str++; x+=GetCharWidth(size)*mode; } } } static void DrawBitmap(uint8_t posX,uint8_t posY,uint8_t fontSize,uint8_t* bitmapPtr){ // 绘制图的具体实现... } static uint8_t* GetFontData(unsigned int unicodeCodePoint){ // 返回指向所需形数据的指针... } static uint8_t GetCharWidth(uint8_t fontSize){ switch(fontSize){ case 16: return 16; default: return 8; } } ``` 这段伪代码描述了从接收到的 UTF-8 序列解析出完整的 UCS-2 符号的过程,接着定到匹配项所在的内存偏移量,后按照设定的比例缩放后输出至目标设备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值