描述
1. 今日目标
今天来用这块板子在oled屏上输出helloworld,mcu用I2C控制OLED显示。
2.OLED屏介绍
SSD1306内置对比度控制、显示RAM和振荡器,减少了外部组件和功耗。它有256级亮度控制。数据/命令是从通用单片机通过硬件可选的6800/8000系列兼容并行接口发送,I2C接口或串行外围接口。它适用于许多紧凑型便携式应用程序,例如手机副显示屏、MP3播放器、计算器等。
模块特点:
· 尺寸小:0.96寸,分辨率高:128*64
· 提供多种通信接口:6800、8080、3线/4线SPI、IIC
· 供电3.3V
数据手册见:SSD1780 (adafruit.com)
3.I2C协议介绍
I2C (Inter-Integrated Circuit,内置集成电路),同步(SCL控制) 串行(按位传输)接口。
两线协议-----时钟线和双向数据线,SCL (Serialclock,串行时钟)和SDA (Serial Data,串行数据)。
主从协议-----通信双方为主机适配器( 主控制器)和客户设备(从设备)
特点:
交换数据总量少;
数据传输率低;
4.程序逻辑
主程序如下,首先初始化OLED,然后给屏幕填充黑色,相当于清空屏幕。再设置I2C通信的波特率,mcu用I2C控制OLED显示。再说的简单点就是通过定位到屏幕某个点,开始画点,字符对应的点的信息就是字库。
定位到某个点的函数如下
-
void OledSetPosition(uint8_t x, uint8_t y)
-
{
-
WriteCmd(0xb0 + y);
-
WriteCmd(((x & 0xf0) >> 4) | 0x10);
-
WriteCmd(x & 0x0f);
-
}
-
复制代码
显示一个字符的函数如下
-
void OledShowChar(uint8_t x, uint8_t y, uint8_t ch, Font font)
-
{
-
uint8_t c = 0;
-
uint8_t i = 0;
-
-
c = ch - ' ';
-
if (x > OLED_WIDTH - 1) {
-
x = 0;
-
y = y + 2;
-
}
-
-
if (font == FONT8x16) {
-
OledSetPosition(x, y);
-
for (i = 0; i < 8; i++){
-
WriteData(F8X16[c*16 + i]);
-
}
-
-
OledSetPosition(x, y+1);
-
for (i = 0; i < 8; i++) {
-
WriteData(F8X16[c*16 + i + 8]);
-
}
-
} else {
-
OledSetPosition(x, y);
-
for (i = 0; i < 6; i++) {
-
WriteData(F6x8[c][i]);
-
}
-
}
-
}
-
复制代码
程序主逻辑如下
-
static void OledmentTask(void *arg)
-
{
-
(void)arg;
-
-
OledInit();
-
OledFillScreen(0);
-
IoTI2cInit(AHT20_I2C_IDX, AHT20_BAUDRATE);
-
-
OledShowString(20, 3, "Hello world", 1);
-
}
-
-
static void OledDemo(void)
-
{
-
osThreadAttr_t attr;
-
attr.name = "OledmentTask";
-
attr.attr_bits = 0U;
-
attr.cb_mem = NULL;
-
attr.cb_size = 0U;
-
attr.stack_mem = NULL;
-
attr.stack_size = 4096;
-
attr.priority = osPriorityNormal;
-
-
if (osThreadNew(OledmentTask, NULL, &attr) == NULL) {
-
printf("[OledDemo] Falied to create OledmentTask!n");
-
}
-
}
-
复制代码
5. 实物演示
6. 畅像未来
这块屏是可以调节亮度的,以亮度为灰度值,那么可以显示黑白图片了,再大胆一点,刷新率足够的话,按照指定频率显示不同的黑白图片,就可以看黑白电影了。
打开APP阅读更多精彩内容