22.1實驗內容
通過本實驗主要學習以下內容:
22.2實驗原理
OLED模塊的驅動芯片為SSD1306,其顯存大小總共為128*64bit大小,SSD1306將這些顯存分為了8頁,其對應關系如下所示:
SSD1306 的命令比較多,這里我們僅介紹幾個比較常用的命令,這些命令如下所示:
我們再來介紹一下 OLED 模塊的初始化過程,SSD1306的典型初始化框圖如下圖:
22.3硬件設計
OLED電路如下所示,該OLED驅動使用PB10和PB11引腳,本例程采用IIC的驅動方式。
22.4代碼解析
22.4.1主函數
主函數代碼如下所示,調用bsp_oled_init進行OLED初始化,之后循環顯示圖片/字符串以及數字。
C int main(void) { delay_init(); /* 延遲函數初始化 */ BOARD_UART.uart_mode_tx=MODE_DMA; /* 配置串口為DMA模式 */ bsp_uart_init(&BOARD_UART); /* 初始化串口 */ printf("Start OLED display demo! \r\n"); /* 顯示啟動OLED顯示實驗 */ 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); /* 顯示數字 */ delay_ms(1000); /* 延遲1000ms間隔 */ bsp_oled_clear(0); /* 清除顯示 */ } } |
22.4.2OLED初始化函數
OLED初始化函數如下,通過該函數可完成對外部OLED模塊初始化。
C void bsp_oled_init(void) { bsp_i2c_config(); /* IIC接口初始化 */ bsp_oled_write_byte(0xAE,OLED_CMD); /* 關閉oled 顯示 */ bsp_oled_write_byte(0x81,OLED_CMD); /* 設置對比度控制寄存器 */ bsp_oled_write_byte(BRIGHTNESS,OLED_CMD); /* 設置對比度, 0x00-0xff */ bsp_oled_write_byte(0xA0,OLED_CMD); /* 設置seg/row映射,row地址127映射到seg0 */ bsp_oled_write_byte(0xC0,OLED_CMD); /* 設置com/row掃描方向,從com[n-1]掃描到com0 */ bsp_oled_write_byte(0xD5,OLED_CMD); /* 設置顯示時鐘分頻比/振蕩器頻率 */ bsp_oled_write_byte(0x80,OLED_CMD); /* 分頻比為1,使用默認的內部時鐘*/ bsp_oled_write_byte(0xA8,OLED_CMD); /* 設置多路復用比率, 0x0f-0x3f */ bsp_oled_write_byte(0x3F,OLED_CMD); /* 1/64 占空比 */ bsp_oled_write_byte(0xD3,OLED_CMD); /* 通過com設置0d~63d的垂直偏移 */ bsp_oled_write_byte(0x00,OLED_CMD); /* 不偏移 */ bsp_oled_write_byte(0xD9,OLED_CMD); /* 設置預充電時間 */ bsp_oled_write_byte(0xF1,OLED_CMD); /* 將預充電設置為15個時鐘,將放電設置為1個時鐘 */ bsp_oled_write_byte(0xDA,OLED_CMD); /* 設置com引腳硬件配置 */ bsp_oled_write_byte(0x12,OLED_CMD); /* 順序com引腳配置和禁用com左/右重映射 */ bsp_oled_write_byte(0xDB,OLED_CMD); /* 調整Vcom調節器輸出 */ bsp_oled_write_byte(0x30,OLED_CMD); /* 設置 Vcom 為 0.83Vcc */ bsp_oled_write_byte(0x20,OLED_CMD); /* 設置存儲器尋址模式, 0x00-0x02 */ bsp_oled_write_byte(0x02,OLED_CMD); /* 頁面尋址模式 */ bsp_oled_write_byte(0x8D,OLED_CMD); /* 電荷泵設置 */ bsp_oled_write_byte(0x14,OLED_CMD); /* 使能電荷泵*/ bsp_oled_write_byte(0xA4,OLED_CMD); /* 禁用整個顯示, 0xA4 or 0xA5 */ bsp_oled_write_byte(0xA6,OLED_CMD); /* 設置正常顯示,0為OFF顯示,1為ON顯示*/ bsp_oled_write_byte(0xAF,OLED_CMD); /* 正常模式或睡眠模式, 0xAF or 0xAE */ bsp_oled_clear(0); } |
22.4.3OLED顯示圖片函數
OLED顯示圖片函數如下,其中形參說明如下:x為圖片起始地址的x坐標,y為圖片起始位置的y坐標,x_res為圖片分辨率的x軸分辨率,y_res為分辨率的y軸分辨率,比如圖片為128*32顯示,則x_res為128,y_res為32,pbuff為圖片數組的指針。
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 /* 設置頁面尋址模式的頁面起始地址(B0h~B7h) */ bsp_oled_write_byte (0xB0+i,OLED_CMD); /* 為頁面尋址模式設置低四位列起始地址(00h~0Fh) */ bsp_oled_write_byte (0x00,OLED_CMD); /* 為頁面尋址模式設置高四位列起始地址(10h~1Fh) */ bsp_oled_write_byte (0x10,OLED_CMD); /* 設置坐標 */ bsp_oled_set_pos(x,y+i); /* l傳輸圖片數據 */ for(n=0;n if(i*x_res+n { bsp_oled_write_byte(pbuff[i*x_res+n],OLED_DATA); }else{ break; } } } } |
在圖片顯示的應用中需要對圖片進行取模,開發板配套資料中有取模軟件以及使用說明,本文檔中簡要介紹取模方法:
- 調整圖片為合適分辨率和格式
將圖片調整到合適分辨率,如果分辨率比較大的話,可以使用PS等工具,調整到128*64分辨率以內,格式的話建議調整為bmp格式文件。
- 使用取模工具進行取模
取模可使用資料中帶的以下工具。
選擇圖片模式。
點擊文件,打開要取模的圖片,點擊選項,進行設置。
最后點擊生成字模。
將生成的字模復制到代碼的數組中。
另外也可以對漢字和英文進行取模,使用方法類似,可以參考資料中的說明。
22.4.4字符串顯示函數
字符串顯示函數如下所示,通過該函數可在任意起始地址顯示字符串。
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實驗結果
將本例程下載到紅楓派開發板中,并將H10跳線帽加上,上電運行后將會看到OLED屏上循環顯示聚沃科技logo、GD Logo、字符串以及數字。
-
OLED
+關注
關注
119文章
6198瀏覽量
224097 -
顯示
+關注
關注
0文章
438瀏覽量
45132 -
IIC
+關注
關注
11文章
300瀏覽量
38311 -
開發板
+關注
關注
25文章
5032瀏覽量
97371 -
GD32
+關注
關注
7文章
403瀏覽量
24328
發布評論請先 登錄
相關推薦
評論