簡(jiǎn)介
OLED(Organic Light-Emitting Diode),又稱為有機(jī)電激光顯示、有機(jī)發(fā)光半導(dǎo)體(Organic Electroluminescence display,OLED)。OLED屬于一種電流型的有機(jī)發(fā)光器件,是通過(guò)載流子的注入和復(fù)合而致發(fā)光的現(xiàn)象,發(fā)光強(qiáng)度與注入的電流成正比。OLED在電場(chǎng)的作用下,陽(yáng)極產(chǎn)生的空穴和陰極產(chǎn)生的電子就會(huì)發(fā)生移動(dòng),分別向空穴傳輸層和電子傳輸層注入,遷移到發(fā)光層。當(dāng)二者在發(fā)光層相遇時(shí),產(chǎn)生能量激子,從而激發(fā)發(fā)光分子最終產(chǎn)生可見(jiàn)光。
OLED顯示技術(shù)與傳統(tǒng)的LCD顯示方式不同,無(wú)需背光燈,采用非常薄的有機(jī)材料涂層和玻璃基板(或柔性有機(jī)基板),當(dāng)有電流通過(guò)時(shí),這些有機(jī)材料就會(huì)發(fā)光。而且OLED顯示屏幕可以做得更輕更薄,可視角度更大,并且能夠顯著的節(jié)省耗電量。
因此,在商業(yè)領(lǐng)域當(dāng)中,POS機(jī)、復(fù)印機(jī)、ATM機(jī)中都可以安裝小尺寸的oled屏幕,由于OLED屏幕可彎曲、輕薄、抗衰性能強(qiáng)等特性,既美觀又實(shí)用。大屏幕可以用作商務(wù)宣傳屏,也可以用作車(chē)站、機(jī)場(chǎng)等廣告投放屏幕,這是因?yàn)镺LED屏幕廣視角、亮度高、色彩鮮艷,視覺(jué)效果比LCD屏好很多。
本文基于瑞芯微RK2206芯片 + 鴻蒙LiteOS操作系統(tǒng),通過(guò)i2c總線控制OLED,實(shí)現(xiàn)控制OLED顯示功能。
模塊整體硬件電路如下圖所示:

圖1硬件電路圖
由上圖可以看出引腳連接情況:

OLED和小凌派-RK2206開(kāi)發(fā)板硬件連接如下所示:

圖2OLED和小凌派-RK2206開(kāi)發(fā)板實(shí)物連接圖
OLED簡(jiǎn)介
我們選擇的OLED為0.96寸OLED顯示屏,型號(hào)為ssd1306,像素為128 * 64。
OLED液晶屏采用i2c通信方式,根據(jù)芯片手冊(cè)說(shuō)明,從設(shè)備地址為 `0x3C`。如下圖所示:

程序設(shè)計(jì)
1、初始化I2C
以下源代碼為i2c初始化的代碼。首先用 I2cIoInit()`函數(shù)將GPIO0_PC1復(fù)用為I2C1_SDA_M1,GPIO0_pc2復(fù)用為I2C1_SCL_M1。最后調(diào)用 `LzI2cInit()`函數(shù)初始化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命令函數(shù)實(shí)現(xiàn)
OLED液晶屏通過(guò)i2c與RK2206芯片進(jìn)行通信。其中,通信數(shù)據(jù)部分第1字節(jié)為0x00,表示該數(shù)據(jù)下一個(gè)字節(jié)是命令(注意:在i2c通信中,該通信部分之前還有一個(gè)字節(jié),即從設(shè)備地址+R/W)。
{unsigned char buffer[2];unsigned int ret;/* 填充數(shù)據(jù),第一個(gè)字節(jié)是通知OLED芯片,下一個(gè)字節(jié)是命令 */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數(shù)據(jù)函數(shù)實(shí)現(xiàn)
OLED液晶屏通過(guò)i2c與RK2206芯片進(jìn)行通信。其中,通信數(shù)據(jù)部分第1字節(jié)為0x40,表示該數(shù)據(jù)下一個(gè)字節(jié)是數(shù)據(jù)(注意:在i2c通信中,該通信部分之前還有一個(gè)字節(jié),即從設(shè)備地址+R/W)。
{unsigned char buffer[2];unsigned int ret;/* 填充數(shù)據(jù),第一個(gè)字節(jié)是通知OLED芯片,下一個(gè)字節(jié)是數(shù)據(jù) */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配置實(shí)現(xiàn)
OELD液晶屏需要配置才能正常工作,具體配置內(nèi)容如下所示:
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顯示英文字符的本質(zhì)是:首先將OLED英文顯示的點(diǎn)陣數(shù)據(jù)存放到一個(gè)變量中(即const unsigned char F6x8[][6],為68點(diǎn)陣大小的英文字符);其次在oled_show_char函數(shù)中,根據(jù)字符字體大?。壳爸挥?8,有興趣的讀者可以自己去研究),選擇合適的字符點(diǎn)陣。最后將對(duì)應(yīng)的點(diǎn)陣數(shù)據(jù)通過(guò)命令+數(shù)據(jù)函數(shù)實(shí)現(xiàn)OLED液晶屏顯示。
(1)英文字符顯示函數(shù)
* 函數(shù)名稱: oled_show_char* 說(shuō) 明: oled顯示字符參 數(shù):* @x:字符的X軸坐標(biāo)* @y:字符的Y軸坐標(biāo)* @chr:字符* @chr_size:字符的字體,包括12/16兩種字體* 返 回 值: 無(wú)***************************************************************/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);}}}
(左右移動(dòng)查看全部?jī)?nèi)容)
(2)英文字符點(diǎn)陣
//偏移量32//ASCII字符集//偏移量32//大小:12*6/************************************6*8的點(diǎn)陣************************************/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
編譯過(guò)程
1、搭建和下載源代碼
我已將OpenHarmony源代碼上傳到Gitee社區(qū)中,大家可以根據(jù)以下網(wǎng)址下載。
https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts
注意:編譯環(huán)境可根據(jù)以下網(wǎng)址來(lái)操作:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/vendor/lockzhiner/rk2206/README_zh.md
2、打開(kāi)sdk下面路徑的文件
/vendor/lockzhiner/rk2206/samples/b5_oled/oled_example.c
注意:Gitee上的OLED控制案例為通用案例,請(qǐng)大家根據(jù)上述的需求修改相關(guān)源代碼。
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、燒寫(xiě)固件
請(qǐng)參考Gitee網(wǎng)址的說(shuō)明手冊(cè)(“燒錄打印”章節(jié)):https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/device/rockchip/README_zh.md
實(shí)驗(yàn)結(jié)果
程序編譯燒寫(xiě)到開(kāi)發(fā)板后,按下開(kāi)發(fā)板的RESET按鍵,實(shí)驗(yàn)結(jié)果如下所示:

審核編輯 :李倩
-
OLED
+關(guān)注
關(guān)注
121文章
6333瀏覽量
232570 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
6139瀏覽量
113581 -
RK2206
+關(guān)注
關(guān)注
0文章
38瀏覽量
2483
原文標(biāo)題:RK2206 鴻蒙開(kāi)發(fā)板:OLED 控制案例
文章出處:【微信號(hào):HarmonyOS_Community,微信公眾號(hào):電子發(fā)燒友開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于小凌派RK2206開(kāi)發(fā)板:OpenHarmony如何使用IoT接口控制FLASH外設(shè)
基于小凌派RK2206開(kāi)發(fā)板:OpenHarmony如何使用IoT接口控制FLASH外設(shè)
基于小凌派RK2206開(kāi)發(fā)板:OpenHarmony如何使用IoT接口控制UART外設(shè)
基于小凌派RK2206開(kāi)發(fā)板:OpenHarmony如何使用IoT接口控制UART外設(shè)
基于小凌派RK2206開(kāi)發(fā)板:OpenHarmony如何使用IoT接口控制GPIO中斷
基于小凌派RK2206開(kāi)發(fā)板:OpenHarmony如何使用IoT接口控制GPIO中斷
基于小凌派RK2206開(kāi)發(fā)板:OpenHarmony如何使用IoT接口控制GPIO外設(shè)
基于小凌派RK2206開(kāi)發(fā)板:OpenHarmony如何使用IoT接口控制GPIO外設(shè)
基于小凌派RK2206開(kāi)發(fā)板:OpenHarmony如何使用IoT接口控制ADC外設(shè)
基于小凌派RK2206開(kāi)發(fā)板:OpenHarmony如何使用IoT接口控制ADC外設(shè)
基于小凌派RK2206開(kāi)發(fā)板:OpenHarmony如何使用IoT接口控制PWM外設(shè)
基于小凌派RK2206開(kāi)發(fā)板:OpenHarmony如何使用IoT接口控制PWM外設(shè)
RK2206高性能微控制器特性概覽
OpenHarmony源碼編譯后燒錄鏡像教程,RK3566鴻蒙開(kāi)發(fā)板演示
OpenHarmony怎么修改DPI密度值?觸覺(jué)智能RK3566鴻蒙開(kāi)發(fā)板演示

RK2206鴻蒙開(kāi)發(fā)板:OLED控制案例
評(píng)論