打印
[PIC®/AVR®/dsPIC®产品]

如何在OLED显示屏上实现绘制点的函数

[复制链接]
762|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dongnanxibei|  楼主 | 2025-2-19 09:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实现一个画点函数的关键在于操作 OLED 显示屏的显存(GRAM),将指定的像素点设置为亮或灭。对于 SSD1306 驱动的 128×64 OLED 屏幕,显存是按页(Page)和列(Column)组织的,每个页包含 8 行像素,每个字节表示一列的 8 个像素点。
以下是实现画点函数的具体步骤和代码示例:

1. 理解 SSD1306 的显存结构

SSD1306 的显存是一个 128×64 的位图,分为 8 页(Page 0~7),每页有 128 列,每列 8 行。
每个字节表示一列的 8 个像素点,最低位(LSB)对应页的最上方像素,最高位(MSB)对应页的最下方像素。
例如,Page 0 的 Column 0 的字节表示屏幕左上角的 8 个垂直像素。

2. 画点函数的实现思路

根据输入的 (x, y) 坐标,计算对应的页(Page)和列(Column)。
根据 y 坐标,确定在字节中的具体位(Bit)。
修改显存中对应字节的位,设置像素点的状态(亮或灭)。
将修改后的显存数据写入 OLED 屏幕。

3. 代码实现

以下是画点函数的代码实现:
#include <stdint.h>

// 假设以下函数已经实现:
// - OLED_WriteCommand: 向 OLED 发送命令
// - OLED_WriteData: 向 OLED 发送数据
// - Set_Dot_Addr: 设置显存地址(页和列)

// 画点函数
void DrawPixel(uint8_t x, uint8_t y, uint8_t color) {
    uint8_t page, column, bit_mask;

    // 检查坐标是否超出屏幕范围
    if (x >= 128 || y >= 64) return;

    // 计算页和列
    page = y / 8;          // 每页 8 行,计算页号
    column = x;            // 列号等于 x 坐标
    bit_mask = 1 << (y % 8); // 计算字节中的位掩码

    // 设置显存地址
    Set_Dot_Addr(column, page);

    // 读取当前显存数据
    uint8_t data = OLED_ReadData(); // 假设实现了读取显存数据的函数

    // 修改显存数据
    if (color) {
        data |= bit_mask;  // 设置像素点为亮
    } else {
        data &= ~bit_mask; // 设置像素点为灭
    }

    // 写回显存
    OLED_WriteData(data);
}
很巧妙,通过除法取余运算,确定点的坐标应该在哪个列的哪个位。

使用特权

评论回复
沙发
幸福小强| | 2025-2-21 12:14 | 只看该作者
这需要对芯片有基本的了解

使用特权

评论回复
板凳
huahuagg| | 2025-2-21 18:00 | 只看该作者
看明白了这个了,原来是这么显示的,知道了这个,可以实现任意字形显示。

使用特权

评论回复
地板
huahuagg| | 2025-2-21 18:00 | 只看该作者
如果想要实现任意点绘制,且不影响其他点,那么需要一个显存空间存储,然后刷新显示区域。

使用特权

评论回复
5
yangxiaor520| | 2025-2-21 20:01 | 只看该作者
绘制点是最基本的写操作,其他图形和汉字的显示都是基于描点来实现的。

使用特权

评论回复
6
xinxianshi| | 2025-2-22 21:09 | 只看该作者
如果在每一列绘制一个函数点就很容易,否则需要定义缓冲区

使用特权

评论回复
7
heisexingqisi| | 2025-2-24 09:11 | 只看该作者
这个方法只能一列里面有一个点,如果需要多个点处于同一个页,那需要定义缓存。通过逻辑运算更新缓存,然后再定时更新缓存到显示器。

使用特权

评论回复
8
734774645| | 2025-2-24 11:42 | 只看该作者
支持像素读取吗,如果能读取出来,那就不需要外部的显存。

使用特权

评论回复
9
突然下起雨| | 2025-2-25 15:25 | 只看该作者
在 SSD1306 驱动的 128x64 OLED 屏幕上,显存的结构是基于页和列的。

使用特权

评论回复
10
xinxianshi| | 2025-2-25 21:01 | 只看该作者
这个比较简单,节约内存,所以很多单片机都可以驱动

使用特权

评论回复
11
jiekou001| | 2025-2-26 16:14 | 只看该作者
计算对应的页(Page)和列(Column),这个很关键。

使用特权

评论回复
12
jiekou001| | 2025-2-26 16:15 | 只看该作者
数据并非是以点为单位存储的,而是以字节为单位,每个字节代表显示器上的8个点组成的列。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

3714

帖子

16

粉丝