[PIC®/AVR®/dsPIC®产品] 如何在OLED显示屏上实现绘制点的函数

[复制链接]
2233|14
 楼主| 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. 代码实现

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

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

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

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

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

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

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

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

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

幸福小强 发表于 2025-2-21 12:14 | 显示全部楼层
这需要对芯片有基本的了解
huahuagg 发表于 2025-2-21 18:00 | 显示全部楼层
看明白了这个了,原来是这么显示的,知道了这个,可以实现任意字形显示。
huahuagg 发表于 2025-2-21 18:00 | 显示全部楼层
如果想要实现任意点绘制,且不影响其他点,那么需要一个显存空间存储,然后刷新显示区域。
yangxiaor520 发表于 2025-2-21 20:01 来自手机 | 显示全部楼层
绘制点是最基本的写操作,其他图形和汉字的显示都是基于描点来实现的。
xinxianshi 发表于 2025-2-22 21:09 来自手机 | 显示全部楼层
如果在每一列绘制一个函数点就很容易,否则需要定义缓冲区
heisexingqisi 发表于 2025-2-24 09:11 | 显示全部楼层
这个方法只能一列里面有一个点,如果需要多个点处于同一个页,那需要定义缓存。通过逻辑运算更新缓存,然后再定时更新缓存到显示器。
734774645 发表于 2025-2-24 11:42 | 显示全部楼层
支持像素读取吗,如果能读取出来,那就不需要外部的显存。
突然下起雨 发表于 2025-2-25 15:25 | 显示全部楼层
在 SSD1306 驱动的 128x64 OLED 屏幕上,显存的结构是基于页和列的。
xinxianshi 发表于 2025-2-25 21:01 | 显示全部楼层
这个比较简单,节约内存,所以很多单片机都可以驱动
jiekou001 发表于 2025-2-26 16:14 | 显示全部楼层
计算对应的页(Page)和列(Column),这个很关键。
jiekou001 发表于 2025-2-26 16:15 | 显示全部楼层
数据并非是以点为单位存储的,而是以字节为单位,每个字节代表显示器上的8个点组成的列。
拿走一光年 发表于 2025-7-5 20:19 | 显示全部楼层
在 OLED 上实现绘制点函数需:

确定坐标范围(如 128×64),
计算页地址(Y/8)和位掩码(Y%8),
更新显存(或直接操作寄存器),
刷新显示(调用驱动更新函数)。
伪代码:
void drawPixel(int x, int y) {  
  if(x<0||x>=WIDTH||y<0||y>=HEIGHT) return;  
  oled_buffer[x + (y/8)*WIDTH] |= (1 << (y%8));  
}  
绒兔星球 发表于 2025-8-27 13:02 | 显示全部楼层
实现 OLED 绘制点函数:先确定点坐标 (x,y);计算所在页和列,页地址 y/8,列地址 x;发送页和列命令定位;读取该页数据,按 y%8 设置对应位;再写回数据,完成点的绘制,亮 / 暗通过置 1/0 控制。
野玫瑰 发表于 2025-9-16 16:14 | 显示全部楼层
要在 OLED 上实现画点函数,需先确定点的坐标 (x,y)。根据 OLED 显存映射关系,计算该点所在页和列。通过 I2C/SPI 发送指令定位到对应页和列,再读取当前字节数据,用位运算将该点对应位设为 1(点亮),最后写回更新后的字节,完成点的绘制。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

225

主题

3848

帖子

18

粉丝
快速回复 在线客服 返回列表 返回顶部