写一个不许额外库的stm32 I2C 0.96寸oled屏幕局部清零程序
时间: 2023-08-11 14:05:48 浏览: 308
基于Proteus无实物零基础STM32入门自学教程(十一)--0.96“OLED屏显示I2C接口
5星 · 资源好评率100%
以下是一个使用 I2C 总线控制 0.96 寸 OLED 屏幕进行局部清零的程序示例,基于 STM32 平台:
```
#include <Wire.h>
#define OLED_ADDR 0x3C // OLED屏幕I2C地址
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
void OLED_Init();
void OLED_Clear();
void OLED_PartialClear(int x, int y, int w, int h);
void setup() {
Wire.begin();
OLED_Init();
}
void loop() {
// 指定需要清空的区域坐标
int x = 0;
int y = 0;
int w = 64;
int h = 32;
// 清空指定区域的像素点
OLED_PartialClear(x, y, w, h);
delay(1000); // 等待一段时间后再进行下一次局部清空
}
void OLED_Init() {
Wire.beginTransmission(OLED_ADDR);
Wire.write(0x00);
Wire.write(0xAE);
Wire.write(0xD5);
Wire.write(0x80);
Wire.write(0xA8);
Wire.write(0x3F);
Wire.write(0xD3);
Wire.write(0x00);
Wire.write(0x40);
Wire.write(0x8D);
Wire.write(0x14);
Wire.write(0x20);
Wire.write(0x00);
Wire.write(0xA1);
Wire.write(0xC8);
Wire.write(0xDA);
Wire.write(0x12);
Wire.write(0x81);
Wire.write(0xCF);
Wire.write(0xD9);
Wire.write(0xF1);
Wire.write(0xDB);
Wire.write(0x40);
Wire.write(0xA4);
Wire.write(0xA6);
Wire.write(0xAF);
Wire.endTransmission();
}
void OLED_Clear() {
for (int i = 0; i < SCREEN_HEIGHT / 8; i++) {
Wire.beginTransmission(OLED_ADDR);
Wire.write(0x40);
Wire.write(0xB0 + i);
Wire.write(0x00);
Wire.endTransmission();
}
}
void OLED_PartialClear(int x, int y, int w, int h) {
int x_end = x + w;
int y_end = y + h;
for (int i = x; i < x_end; i++) {
for (int j = y; j < y_end; j++) {
int page = j / 8;
int bit = j % 8;
int data = ~(1 << bit);
Wire.beginTransmission(OLED_ADDR);
Wire.write(0x40);
Wire.write(0xB0 + page);
Wire.write(i & 0x0F);
Wire.write(0x10 | (i >> 4));
Wire.write(data);
Wire.endTransmission();
}
}
}
```
在该程序中,首先使用 `Wire` 库初始化 I2C 总线,然后在 `OLED_Init()` 函数中初始化 OLED 显示屏的参数。在 `OLED_Clear()` 函数中实现了全局清屏的方法,而在 `OLED_PartialClear()` 函数中实现了局部清屏的方法。
在 `OLED_PartialClear()` 函数中,首先根据传入的坐标和大小计算出需要清空的区域,然后使用 `Wire.write()` 函数将每个像素点的数据写入 OLED 显示屏,从而实现局部清空的效果。
需要注意的是,在使用 `Wire.write()` 函数时,需要确保写入的数据格式正确,否则会导致程序出错或程序崩溃。同时,在进行局部清空时,也需要确保指定的区域不超出 OLED 显示屏的有效范围。
阅读全文