hellow world我的一小步,是人类的一大步,我的目标是星辰大海。 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. 畅像未来
这块屏是可以调节亮度的,以亮度为灰度值,那么可以显示黑白图片了,再大胆一点,刷新率足够的话,按照指定频率显示不同的黑白图片,就可以看黑白电影了。
|