1. 0.96寸OLED显示屏图形化界面开发基础
第一次拿到0.96寸OLED屏时,我也只会显示几个字符。直到某次项目需要做个简易菜单界面,才发现这小屏幕藏着大能量。这种OLED分辨率通常是128x64,虽然比不上手机屏幕,但对于嵌入式设备来说完全够用。
显存(GRAM)是OLED显示的核心。你可以把它想象成一块画布,每个像素对应一个比特位。我们常用的SSD1306驱动芯片内置了1KB显存,正好对应128x64的分辨率。实际操作中,我习惯定义一个二维数组来映射显存:
c复制u8 OLED_GRAM[128][8]; // 128列x8页(每页8行)
这里有个坑要注意:OLED的寻址方式是按页(page)组织的,每页包含8行像素。比如要设置(10,20)位置的像素,需要这样计算:
c复制u8 page = 20 / 8; // 第2页
u8 bit_mask = 1 << (20 % 8); // 第4位
OLED_GRAM[10][page] |= bit_mask;
硬件连接上,我推荐使用4线SPI模式,接线简单速度快。实测在STM32F103上能达到8MHz时钟频率。如果引脚紧张,I2C也可以,但刷新率会低不少。记得初始化时配置好通信接口:
c复制void OLED_Init() {
// SPI初始化代码
OLED_WR_Byte(0xAE, OLED_CMD); // 关闭显示
// 后续初始化命令...
}
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 图形绘制算法实战
画直线最经典的算法当属Bresenham,我在项目里是这么实现的:
c复制void OLED_DrawLine(u8 x1, u8 y1, u8 x2, u8 y2) {
int dx = abs(x2 - x1);
int dy = -abs(y2 - y1);
int sx = x1 < x2 ? 1 : -1;
int sy = y1 < y2 ? 1 : -1;
int err = dx + dy;
while(1) {
OLED_DrawPoint(x1, y1, 1);
if(x1 == x2 && y1 == y2) br
