hellow world我的一小步,是人类的一大步,我的目标是星辰大海。
1. 今日目标
今天来用这块板子在OLED屏上输出helloworld,mcu用I2C控制OLED显示。
2.OLED屏介绍
SSD1306是一款单片CMOSOLED/PLED驱动器,具有有机/聚合物发光控制器二极管点阵图形显示系统。它由128个段和64个公共部分组成。这个IC是为普通阴极型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,串行数据)。
主从协议-----通信双方为主机适配器( 主控制器)和客户设备(从设备)
特点:
交换数据总量少;
数据传输率低;
标准传输频率为100KHZ、400KHZ;
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. 畅像未来
这块屏是可以调节亮度的,以亮度为灰度值,那么可以显示黑白图片了,再大胆一点,刷新率足够的话,按照指定频率显示不同的黑白图片,就可以看黑白电影了。