0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RK2206鸿蒙开发板:OLED控制案例

电子发烧友开源社区 来源:HarmonyOS官方合作社区 作者:HarmonyOS官方合作社 2022-05-06 10:01 次阅读

简介

OLEDOrganic Light-Emitting Diode),又称为有机电激光显示、有机发光半导体(Organic Electroluminescence display,OLED)。OLED属于一种电流型的有机发光器件,是通过载流子的注入和复合而致发光的现象,发光强度与注入的电流成正比。OLED在电场的作用下,阳极产生的空穴和阴极产生的电子就会发生移动,分别向空穴传输层和电子传输层注入,迁移到发光层。当二者在发光层相遇时,产生能量激子,从而激发发光分子最终产生可见光。

OLED显示技术与传统的LCD显示方式不同,无需背光灯,采用非常薄的有机材料涂层和玻璃基板(或柔性有机基板),当有电流通过时,这些有机材料就会发光。而且OLED显示屏幕可以做得更轻更薄,可视角度更大,并且能够显著的节省耗电量。

因此,在商业领域当中,POS机、复印机、ATM机中都可以安装小尺寸的oled屏幕,由于OLED屏幕可弯曲、轻薄、抗衰性能强等特性,既美观又实用。大屏幕可以用作商务宣传屏,也可以用作车站、机场等广告投放屏幕,这是因为OLED屏幕广视角、亮度高、色彩鲜艳,视觉效果比LCD屏好很多。

本文基于瑞芯微RK2206芯片 + 鸿蒙LiteOS操作系统,通过i2c总线控制OLED,实现控制OLED显示功能。

硬件电路设计

模块整体硬件电路如下图所示:

c712de3e-ccd5-11ec-bce3-dac502259ad0.png

图1硬件电路图

由上图可以看出引脚连接情况:

c72f636a-ccd5-11ec-bce3-dac502259ad0.png

OLED和小凌派-RK2206开发板硬件连接如下所示:

c74cf7a4-ccd5-11ec-bce3-dac502259ad0.png

图2OLED和小凌派-RK2206开发板实物连接图

OLED简介

我们选择的OLED为0.96寸OLED显示屏,型号为ssd1306,像素为128 * 64。

OLED液晶屏采用i2c通信方式,根据芯片手册说明,从设备地址为 `0x3C`。如下图所示:

c78b2024-ccd5-11ec-bce3-dac502259ad0.png

程序设计

1、初始化I2C

以下源代码为i2c初始化的代码。首先用 I2cIoInit()`函数将GPIO0_PC1复用为I2C1_SDA_M1,GPIO0_pc2复用为I2C1_SCL_M1。最后调用 `LzI2cInit()`函数初始化I2C1端口

{  printf("%s, %d: I2cIoInit failed!
", __FILE__, __LINE__);  return __FILE__;}if (LzI2cInit(OLED_I2C_BUS, m_i2c_freq) != LZ_HARDWARE_SUCCESS){  printf("%s, %d: I2cIoInit failed!
", __FILE__, __LINE__);  return __FILE__;}

2、OLED命令函数实现

OLED液晶屏通过i2c与RK2206芯片进行通信。其中,通信数据部分第1字节为0x00,表示该数据下一个字节是命令(注意:在i2c通信中,该通信部分之前还有一个字节,即从设备地址+R/W)。

{  unsigned char buffer[2];  unsigned int ret;  /* 填充数据,第一个字节是通知OLED芯片,下一个字节是命令 */  buffer[0] = 0x00;  buffer[1] = IIC_Command;  ret = LzI2cWrite(OLED_I2C_BUS, OLED_I2C_ADDRESS, buffer, 2);  if (ret != 0)  {    printf("%s, %s, %d: LzI2cWrite failed(%d)!
", __FILE__, __func__, __LINE__, ret);  }}

3、OLED数据函数实现

OLED液晶屏通过i2c与RK2206芯片进行通信。其中,通信数据部分第1字节为0x40,表示该数据下一个字节是数据(注意:在i2c通信中,该通信部分之前还有一个字节,即从设备地址+R/W)。

{  unsigned char buffer[2];  unsigned int ret;  /* 填充数据,第一个字节是通知OLED芯片,下一个字节是数据 */  buffer[0] = 0x40;  buffer[1] = IIC_Data;  ret = LzI2cWrite(OLED_I2C_BUS, OLED_I2C_ADDRESS, buffer, 2);  if (ret != 0)  {    printf("%s, %s, %d: LzI2cWrite failed(%d)!
", __FILE__, __func__, __LINE__, ret);  }}

4、OLED配置实现
OELD液晶屏需要配置才能正常工作,具体配置内容如下所示:

Oled_WR_Byte(0xAE, OLED_CMD); //--display offOled_WR_Byte(0x00, OLED_CMD); //---set low column addressOled_WR_Byte(0x10, OLED_CMD); //---set high column addressOled_WR_Byte(0x40, OLED_CMD); //--set start line addressOled_WR_Byte(0xB0, OLED_CMD); //--set page addressOled_WR_Byte(0x81, OLED_CMD); // contract controlOled_WR_Byte(0xFF, OLED_CMD); //--128Oled_WR_Byte(0xA1, OLED_CMD); //set segment remapOled_WR_Byte(0xA6, OLED_CMD); //--normal / reverseOled_WR_Byte(0xA8, OLED_CMD); //--set multiplex ratio(1 to 64)Oled_WR_Byte(0x3F, OLED_CMD); //--1/32 dutyOled_WR_Byte(0xC8, OLED_CMD); //Com scan directionOled_WR_Byte(0xD3, OLED_CMD); //-set display offsetOled_WR_Byte(0x00, OLED_CMD); //
Oled_WR_Byte(0xD5, OLED_CMD); //set osc divisionOled_WR_Byte(0x80, OLED_CMD); //
Oled_WR_Byte(0xD8, OLED_CMD); //set area color mode offOled_WR_Byte(0x05, OLED_CMD); //
Oled_WR_Byte(0xD9, OLED_CMD); //Set Pre-Charge PeriodOled_WR_Byte(0xF1, OLED_CMD); //
Oled_WR_Byte(0xDA, OLED_CMD); //set com pin configuartionOled_WR_Byte(0x12, OLED_CMD); //
Oled_WR_Byte(0xDB, OLED_CMD); //set VcomhOled_WR_Byte(0x30, OLED_CMD); //
Oled_WR_Byte(0x8D, OLED_CMD); //set charge pump enableOled_WR_Byte(0x14, OLED_CMD); //
Oled_WR_Byte(0xAF, OLED_CMD); //--turn on oled panel

5、OLED英文字符显示

OLED显示英文字符的本质是:首先将OLED英文显示的点阵数据存放到一个变量中(即const unsigned char F6x8[][6],为68点阵大小的英文字符);其次在oled_show_char函数中,根据字符字体大小(目前只有68,有兴趣的读者可以自己去研究),选择合适的字符点阵。最后将对应的点阵数据通过命令+数据函数实现OLED液晶屏显示。

(1)英文字符显示函数

* 函数名称: oled_show_char* 说  明: oled显示字符参  数: *   @x:字符的X轴坐标*   @y:字符的Y轴坐标*   @chr:字符*   @chr_size:字符的字体,包括12/16两种字体* 返 回 值: 无***************************************************************/void oled_show_char(uint8_t x, uint8_t y, uint8_t chr, uint8_t chr_size){  unsigned char c = 0, i = 0;
   c = chr - ' '; //得到偏移后的值
   if (x > (OLED_COLUMN_MAX - 1))  {    x = 0;    y = y + 2;  }
    if (chr_size == 16)  {    oled_set_pos(x, y);    for (i = 0; i < 8; i++)    {      oled_wr_byte(F8X16[c * 16 + i], OLED_DATA);    }    oled_set_pos(x, y + 1);    for (i = 0; i < 8; i++)    {      oled_wr_byte(F8X16[c * 16 + i + 8], OLED_DATA);    }  }  else  {    oled_set_pos(x, y);    for (i = 0; i < 6; i++)    {      oled_wr_byte(F6x8[c][i], OLED_DATA);    }  }}

(左右移动查看全部内容)

(2)英文字符点阵

//偏移量32//ASCII字符集//偏移量32//大小:12*6/************************************6*8的点阵************************************/const unsigned char F6x8[][6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 00x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 10x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 20x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 30x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 40x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 50x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 60x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 70x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 80x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 90x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 550x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines};

本案例中还有其他英文、中文和图片显示案例,有兴趣的读者可以到:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts

编译过程

1、搭建和下载源代码
我已将OpenHarmony源代码上传到Gitee社区中,大家可以根据以下网址下载。
https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts


注意:编译环境可根据以下网址来操作:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/vendor/lockzhiner/rk2206/README_zh.md

2、打开sdk下面路径的文件

/vendor/lockzhiner/rk2206/samples/b5_oled/oled_example.c


注意:Gitee上的OLED控制案例为通用案例,请大家根据上述的需求修改相关源代码。

3、修改编译脚本
修改 vendor/lockzhiner/rk2206/sample 路径下 BUILD.gn 文件,指定 oled_example 参与编译。
“./b5_oled:oled_example”

修改 device/lockzhiner/rk2206/sdk_liteos 路径下 Makefile 文件,添加 -loled_example 参与编译。
hardware_LIBS = -lhal_iothardware -lhardware -loled_example

5、编译固件

hb set -root .hb sethb build -f

6、烧写固件
请参考Gitee网址的说明手册(“烧录打印”章节):https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/device/rockchip/README_zh.md

实验结果

程序编译烧写到开发板后,按下开发板的RESET按键,实验结果如下所示:

c7a66b9a-ccd5-11ec-bce3-dac502259ad0.png

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OLED
    +关注

    关注

    119

    文章

    6179

    浏览量

    223800
  • 开发板
    +关注

    关注

    25

    文章

    4933

    浏览量

    97157
  • RK2206
    +关注

    关注

    0

    文章

    34

    浏览量

    1763

原文标题:RK2206 鸿蒙开发板:OLED 控制案例

文章出处:【微信号:HarmonyOS_Community,微信公众号:电子发烧友开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何在开源鸿蒙OpenHarmony开启SELinux模式?RK3566鸿蒙开发板演示

    本文介绍开源鸿蒙OpenHarmony系统下,开启/关闭SELinux权限的方法,触觉智能Purple Pi OH鸿蒙开发板演示,已适配全新OpenHarmony5.0 Release系统!
    的头像 发表于 11-18 19:03 136次阅读
    如何在开源<b class='flag-5'>鸿蒙</b>OpenHarmony开启SELinux模式?<b class='flag-5'>RK</b>3566<b class='flag-5'>鸿蒙</b><b class='flag-5'>开发板</b>演示

    【迅为】瑞芯微RK3588开发板RK3568开发板区别及优势

    RK3568开发板
    的头像 发表于 11-18 14:19 139次阅读
    【迅为】瑞芯微<b class='flag-5'>RK</b>3588<b class='flag-5'>开发板</b><b class='flag-5'>RK</b>3568<b class='flag-5'>开发板</b>区别及优势

    瑞芯微RK3566鸿蒙开发板Android11修改第三方输入法为默认输入法

    本文适用于触觉智能所有支持Android11系统的开发板修改第三方输入法为默认输入法。本次使用的是触觉智能的Purple Pi OH鸿蒙开源主板,搭载了瑞芯微RK3566芯片,类树莓派设计,是Laval官方社区主荐的一款
    的头像 发表于 09-24 09:43 340次阅读
    瑞芯微<b class='flag-5'>RK</b>3566<b class='flag-5'>鸿蒙</b><b class='flag-5'>开发板</b>Android11修改第三方输入法为默认输入法

    瑞芯微RK3588开发板Linux系统添加自启动命令的方法,深圳触觉智能Arm嵌入式鸿蒙硬件方案商

    本文适用所有Linux系统的开发板、主板添加自启动命令的方法,本次使用了触觉智能的EVB3588开发板演示,搭载了瑞芯微RK3588旗舰芯片,深圳触觉智能Arm嵌入式硬件方案商,专注工控、国产化、
    的头像 发表于 09-19 09:32 564次阅读
    瑞芯微<b class='flag-5'>RK</b>3588<b class='flag-5'>开发板</b>Linux系统添加自启动命令的方法,深圳触觉智能Arm嵌入式<b class='flag-5'>鸿蒙</b>硬件方案商

    【「OpenHarmony开发与实践 | 基于红莓RK2206开发板」阅读体验】+初体验1

    爱好者没有bug,「OpenHarmony开发与实践 | 基于红莓RK2206开发板」大卖吧!哦对了 你们的开发板是怎么准备的呢?【小凌派RK220
    发表于 09-18 18:30

    【「OpenHarmony开发与实践 | 基于红莓RK2206开发板」阅读体验】+初体验2连发发

    啥也不说先上图 对于《OpenHarmony开发与实践 | 基于红莓RK2206开发板》这本书的热爱,简直就像夏日里的一股清泉,让人忍不住想要一探究竟! 这本书的排布,简直就是一场视觉盛宴,章节
    发表于 09-18 18:01

    瑞芯微RK3568鸿蒙开发板OpenHarmony系统修改cfg文件权限方法

    本文适用于OpenHarmony开源鸿蒙系统修改cfg文件权限方法,深圳触觉智能研发的RK3566、RK3568、RK3588等开发板、主板
    的头像 发表于 09-11 13:26 763次阅读
    瑞芯微<b class='flag-5'>RK</b>3568<b class='flag-5'>鸿蒙</b><b class='flag-5'>开发板</b>OpenHarmony系统修改cfg文件权限方法

    瑞芯微RK3566鸿蒙开发板OpenHarmony标准系统应用兼容性测试指导

    本文OpenHarmony标准系统应用兼容性测试指导,适用鸿蒙系统软件开发测试的新手入门学习课程,设备为触觉智能的瑞芯微RK3566开发板,型号Purple Pi OH。是Laval官
    的头像 发表于 09-10 11:56 315次阅读
    瑞芯微<b class='flag-5'>RK</b>3566<b class='flag-5'>鸿蒙</b><b class='flag-5'>开发板</b>OpenHarmony标准系统应用兼容性测试指导

    RK3588!黑神话悟空,启动?-迅为电子RK3588开发板

    RK3588!黑神话悟空,启动?-迅为电子RK3588开发板
    的头像 发表于 08-30 14:13 501次阅读
    <b class='flag-5'>RK</b>3588!黑神话悟空,启动?-迅为电子<b class='flag-5'>RK</b>3588<b class='flag-5'>开发板</b>

    HZ-CORE-RK3576开发板

    HZ-CORE-RK3576开发板
    的头像 发表于 08-29 13:58 308次阅读
    HZ-CORE-<b class='flag-5'>RK</b>3576<b class='flag-5'>开发板</b>

    基于OpenHarmony轻量级操作系统实现RK2206 WiFi-AP模式通信开发案例

    实验内容本示例将演示如何在小凌派-RK2206开发板上使用WiFi-AP模式(即将RK2206作为WiFi路由器),实现与PC端进行TCP通信。程序设计API设计FlashInit()头文件
    的头像 发表于 08-08 08:23 350次阅读
    基于OpenHarmony轻量级操作系统实现<b class='flag-5'>RK2206</b> WiFi-AP模式通信<b class='flag-5'>开发</b>案例

    基于OpenHarmony轻量级操作系统实现RK2206 WiFi-AP模式通信开发案例

    实验内容 本示例将演示如何在小凌派-RK2206开发板上使用WiFi-AP模式(即将RK2206作为WiFi路由器),实现与PC端进行TCP通信。 程序设计 API设计 FlashInit
    发表于 08-07 15:50

    鸿蒙OpenHarmony南向/北向快速开发教程-迅为RK3568开发板

    大家期待已久的迅为RK3568开发板终于迎来了鸿蒙4.1系统的强势支持!想知道如何实现快速开发学习吗?跟着我们一起来探索吧! 迅为RK356
    发表于 07-23 10:44

    RK3568开发板支持AMP双系统

    RK3568开发板支持AMP双系统
    的头像 发表于 06-04 15:33 626次阅读
    <b class='flag-5'>RK</b>3568<b class='flag-5'>开发板</b>支持AMP双系统

    迅为RK3568开发板驱动开发指南-输入子系统

    迅为RK3568开发板驱动开发指南-输入子系统
    的头像 发表于 02-23 15:11 780次阅读
    迅为<b class='flag-5'>RK</b>3568<b class='flag-5'>开发板</b>驱动<b class='flag-5'>开发</b>指南-输入子系统