[文章]【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】oled操作之hello world

阅读量0
1
0
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显示。再说的简单点就是通过定位到屏幕某个点,开始画点,字符对应的点的信息就是字库。
定位到某个点的函数如下
  1. void OledSetPosition(uint8_t x, uint8_t y)
  2. {
  3.     WriteCmd(0xb0 + y);
  4.     WriteCmd(((x & 0xf0) >> 4) | 0x10);
  5.     WriteCmd(x & 0x0f);
  6. }
复制代码

显示一个字符的函数如下
  1. void OledShowChar(uint8_t x, uint8_t y, uint8_t ch, Font font)
  2. {             
  3.         uint8_t c = 0;
  4.     uint8_t i = 0;

  5.     c = ch - ' ';       
  6.     if (x > OLED_WIDTH - 1) {
  7.         x = 0;
  8.         y = y + 2;
  9.     }

  10.     if (font == FONT8x16) {
  11.         OledSetPosition(x, y);       
  12.         for (i = 0; i < 8; i++){
  13.             WriteData(F8X16[c*16 + i]);
  14.         }

  15.         OledSetPosition(x, y+1);
  16.         for (i = 0; i < 8; i++) {
  17.             WriteData(F8X16[c*16 + i + 8]);
  18.         }
  19.     } else {
  20.         OledSetPosition(x, y);
  21.         for (i = 0; i < 6; i++) {
  22.             WriteData(F6x8[c][i]);
  23.         }
  24.     }
  25. }
复制代码
程序主逻辑如下
  1. static void OledmentTask(void *arg)
  2. {
  3.     (void)arg;

  4.     OledInit();
  5.     OledFillScreen(0);
  6.     IoTI2cInit(AHT20_I2C_IDX, AHT20_BAUDRATE);

  7.     OledShowString(20, 3, "Hello world", 1);
  8. }

  9. static void OledDemo(void)
  10. {
  11.     osThreadAttr_t attr;
  12.     attr.name = "OledmentTask";
  13.     attr.attr_bits = 0U;
  14.     attr.cb_mem = NULL;
  15.     attr.cb_size = 0U;
  16.     attr.stack_mem = NULL;
  17.     attr.stack_size = 4096;
  18.     attr.priority = osPriorityNormal;

  19.     if (osThreadNew(OledmentTask, NULL, &attr) == NULL) {
  20.         printf("[OledDemo] Falied to create OledmentTask!n");
  21.     }
  22. }
复制代码
5. 实物演示
20220622205301.jpg
6. 畅像未来

这块屏是可以调节亮度的,以亮度为灰度值,那么可以显示黑白图片了,再大胆一点,刷新率足够的话,按照指定频率显示不同的黑白图片,就可以看黑白电影了。

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友