实现一个画点函数的关键在于操作 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);
}
很巧妙,通过除法取余运算,确定点的坐标应该在哪个列的哪个位。
|