22.1 實(shí)驗(yàn)內(nèi)容
通過(guò)本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容:
? OLED驅(qū)動(dòng)原理
? IIC驅(qū)動(dòng)OLED顯示操作
22.2 實(shí)驗(yàn)原理
OLED模塊的驅(qū)動(dòng)芯片為SSD1306,其顯存大小總共為 128*64bit 大小,SSD1306 將這些顯存分為了 8 頁(yè),其對(duì)應(yīng)關(guān)系如下所示:
SSD1306 的命令比較多,這里我們僅介紹幾個(gè)比較常用的命令,這些命令如下所示:
我們?cè)賮?lái)介紹一下 OLED 模塊的初始化過(guò)程,SSD1306 的典型初始化框圖如下圖:
22.3 硬件設(shè)計(jì)
OLED電路如下所示,該OLED驅(qū)動(dòng)使用PB10和PB11引腳,本例程采用IIC的驅(qū)動(dòng)方式。
22.4 代碼解析
22.4.1 主函數(shù)
主函數(shù)代碼如下所示,調(diào)用bsp_oled_init進(jìn)行OLED初始化,之后循環(huán)顯示圖片/字符串以及數(shù)字。
C
int main(void)
{
delay_init(); ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????/* 延遲函數(shù)初始化 */
BOARD_UART.uart_mode_tx=MODE_DMA; ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????/* 配置串口為DMA模式 */
bsp_uart_init(&BOARD_UART); ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????/* 初始化串口 */
printf("Start OLED display demo! \r\n"); ???????????????????????????????????????????????????????????????????????????????????????????????????????/* 顯示啟動(dòng)OLED顯示實(shí)驗(yàn) */
bsp_oled_init(); ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????/* OLED初始化 */
while (1)
{
bsp_oled_clear(0); ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????/* 清除顯示 */
bsp_oled_logo(0,0,128,32,gImage_juwo2); ???????????????????????????????????????????????????????????????????????????????????????????????/* 顯示聚沃logo*/
delay_ms(1000); ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????/* 延遲1000ms間隔 */
bsp_oled_clear(0); ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????/* 清除顯示 */
bsp_oled_logo(20,0,86,64,gImage_gd_logo); ???????????????????????????????????????????????????????????????????????????????????????/* 顯示GD logo*/
delay_ms(1000); ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????/* 延遲1000ms間隔 */
bsp_oled_clear(0); ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????/* 清除顯示 */
bsp_oled_showstring(20,0,(uint8_t *)"ju wo ke ji",FONT_8_16); /* 顯示聚沃科技字符串 */
bsp_oled_shownum(30,3, 1234,4,FONT_8_16); ???????????????????????????????????????????????????????????????????????????????????????/* 顯示數(shù)字 */
delay_ms(1000); ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????/* 延遲1000ms間隔 */
bsp_oled_clear(0); ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????/* 清除顯示 */
}
}
22.4.2 OLED初始化函數(shù)
OLED初始化函數(shù)如下,通過(guò)該函數(shù)可完成對(duì)外部OLED模塊初始化。
C
void bsp_oled_init(void)
{
bsp_i2c_config(); ??????????????????????????????????/* IIC接口初始化 */
bsp_oled_write_byte(0xAE,OLED_CMD); ????????????????/* 關(guān)閉oled 顯示 */
bsp_oled_write_byte(0x81,OLED_CMD); ????????????????/* 設(shè)置對(duì)比度控制寄存器 */
bsp_oled_write_byte(BRIGHTNESS,OLED_CMD); ??????????/* 設(shè)置對(duì)比度, 0x00-0xff */
bsp_oled_write_byte(0xA0,OLED_CMD); ????????????????/* 設(shè)置seg/row映射,row地址127映射到seg0 */
bsp_oled_write_byte(0xC0,OLED_CMD); ????????????????/* 設(shè)置com/row掃描方向,從com[n-1]掃描到com0 */
bsp_oled_write_byte(0xD5,OLED_CMD); ????????????????/* 設(shè)置顯示時(shí)鐘分頻比/振蕩器頻率 */
bsp_oled_write_byte(0x80,OLED_CMD); ????????????????/* 分頻比為1,使用默認(rèn)的內(nèi)部時(shí)鐘*/
bsp_oled_write_byte(0xA8,OLED_CMD); ????????????????/* 設(shè)置多路復(fù)用比率, 0x0f-0x3f */
bsp_oled_write_byte(0x3F,OLED_CMD); ????????????????/* 1/64 占空比 */
bsp_oled_write_byte(0xD3,OLED_CMD); ????????????????/* 通過(guò)com設(shè)置0d~63d的垂直偏移 */
bsp_oled_write_byte(0x00,OLED_CMD); ????????????????/* 不偏移 */
bsp_oled_write_byte(0xD9,OLED_CMD); ????????????????/* 設(shè)置預(yù)充電時(shí)間 */
bsp_oled_write_byte(0xF1,OLED_CMD); ????????????????/* 將預(yù)充電設(shè)置為15個(gè)時(shí)鐘,將放電設(shè)置為1個(gè)時(shí)鐘 */
bsp_oled_write_byte(0xDA,OLED_CMD); ????????????????/* 設(shè)置com引腳硬件配置 */
bsp_oled_write_byte(0x12,OLED_CMD); ????????????????/* 順序com引腳配置和禁用com左/右重映射 */
bsp_oled_write_byte(0xDB,OLED_CMD); ????????????????/* 調(diào)整Vcom調(diào)節(jié)器輸出 */
bsp_oled_write_byte(0x30,OLED_CMD); ????????????????/* 設(shè)置 Vcom 為 0.83Vcc */
bsp_oled_write_byte(0x20,OLED_CMD); ????????????????/* 設(shè)置存儲(chǔ)器尋址模式, 0x00-0x02 */
bsp_oled_write_byte(0x02,OLED_CMD); ????????????????/* 頁(yè)面尋址模式 */
bsp_oled_write_byte(0x8D,OLED_CMD); ????????????????/* 電荷泵設(shè)置 */
bsp_oled_write_byte(0x14,OLED_CMD); ????????????????/* 使能電荷泵*/
bsp_oled_write_byte(0xA4,OLED_CMD); ????????????????/* 禁用整個(gè)顯示, 0xA4 or 0xA5 */
bsp_oled_write_byte(0xA6,OLED_CMD); ????????????????/* 設(shè)置正常顯示,0為OFF顯示,1為ON顯示*/
bsp_oled_write_byte(0xAF,OLED_CMD); ????????????????/* 正常模式或睡眠模式, 0xAF or 0xAE */
bsp_oled_clear(0);
}
22.4.3 OLED顯示圖片函數(shù)
OLED顯示圖片函數(shù)如下,其中形參說(shuō)明如下:x為圖片起始地址的x坐標(biāo),y為圖片起始位置的y坐標(biāo),x_res為圖片分辨率的x軸分辨率,y_res為分辨率的y軸分辨率,比如圖片為128*32顯示,則x_res為128,y_res為32,pbuff為圖片數(shù)組的指針。
C
void bsp_oled_logo(uint8_t x, uint8_t y, uint8_t x_res, uint8_t y_res, uint8_t *pbuff)
{
uint8_t i,n;
uint8_t y_num;
uint16_t pixel;
pixel = x_res*y_res;
if(y_res%8>0)
{
y_num = y_res/8 +1;
}else{
y_num = y_res/8;
}
/* 顯示log */
for(i=0;i<y_num;i++){
/* 設(shè)置頁(yè)面尋址模式的頁(yè)面起始地址(B0h~B7h) */
bsp_oled_write_byte (0xB0+i,OLED_CMD);
/* 為頁(yè)面尋址模式設(shè)置低四位列起始地址(00h~0Fh) */
bsp_oled_write_byte (0x00,OLED_CMD);
/* 為頁(yè)面尋址模式設(shè)置高四位列起始地址(10h~1Fh) */
bsp_oled_write_byte (0x10,OLED_CMD);
/* 設(shè)置坐標(biāo) */
bsp_oled_set_pos(x,y+i);
/* l傳輸圖片數(shù)據(jù) */
for(n=0;n<x_res;n++){
if(i*x_res+n<pixel)
{
bsp_oled_write_byte(pbuff[i*x_res+n],OLED_DATA);
}else{
break;
}
}
}
}
在圖片顯示的應(yīng)用中需要對(duì)圖片進(jìn)行取模,開(kāi)發(fā)板配套資料中有取模軟件以及使用說(shuō)明,本文檔中簡(jiǎn)要介紹取模方法:
? 調(diào)整圖片為合適分辨率和格式
將圖片調(diào)整到合適分辨率,如果分辨率比較大的話,可以使用PS等工具,調(diào)整到128*64分辨率以內(nèi),格式的話建議調(diào)整為bmp格式文件。
? 使用取模工具進(jìn)行取模
取模可使用資料中帶的以下工具。
選擇圖片模式。
點(diǎn)擊文件,打開(kāi)要取模的圖片,點(diǎn)擊選項(xiàng),進(jìn)行設(shè)置。
最后點(diǎn)擊生成字模。
將生成的字模復(fù)制到代碼的數(shù)組中。
另外也可以對(duì)漢字和英文進(jìn)行取模,使用方法類(lèi)似,可以參考資料中的說(shuō)明。
22.4.4 字符串顯示函數(shù)
字符串顯示函數(shù)如下所示,通過(guò)該函數(shù)可在任意起始地址顯示字符串。
C
void bsp_oled_showstring(uint8_t x, uint8_t y, uint8_t *ch, oled_font size)
{
uint8_t j=0;
while(ch[j]!='\0'){
bsp_oled_showchar(x,y,ch[j],size);
x += 8;
if(x>120){
x = 0;
y += 2;
}
j++;
}
}
22.5 實(shí)驗(yàn)結(jié)果
將本例程下載到紅楓派開(kāi)發(fā)板中,并將H10跳線帽加上,上電運(yùn)行后將會(huì)看到OLED屏上循環(huán)顯示聚沃科技logo、GD Logo、字符串以及數(shù)字。
紅楓派開(kāi)發(fā)板使用手冊(cè):??????????????????????????????????????????????????GD32F303紅楓派使用手冊(cè) - 飛書(shū)云文檔 (feishu.cn)