22.1 實驗內容
通過本實驗主要學習以下內容:
? OLED驅動原理
? IIC驅動OLED顯示操作
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初始化,之后循環(huán)顯示圖片/字符串以及數字。
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.2 OLED初始化函數
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調節(jié)器輸出 */
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.3 OLED顯示圖片函數
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<y_num;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<x_res;n++){
if(i*x_res+n<pixel)
{
bsp_oled_write_byte(pbuff[i*x_res+n],OLED_DATA);
}else{
break;
}
}
}
}
在圖片顯示的應用中需要對圖片進行取模,開發(fā)板配套資料中有取模軟件以及使用說明,本文檔中簡要介紹取模方法:
? 調整圖片為合適分辨率和格式
將圖片調整到合適分辨率,如果分辨率比較大的話,可以使用PS等工具,調整到128*64分辨率以內,格式的話建議調整為bmp格式文件。
? 使用取模工具進行取模
取??墒褂觅Y料中帶的以下工具。
選擇圖片模式。
點擊文件,打開要取模的圖片,點擊選項,進行設置。
最后點擊生成字模。
將生成的字模復制到代碼的數組中。
另外也可以對漢字和英文進行取模,使用方法類似,可以參考資料中的說明。
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 實驗結果
將本例程下載到紅楓派開發(fā)板中,并將H10跳線帽加上,上電運行后將會看到OLED屏上循環(huán)顯示聚沃科技logo、GD Logo、字符串以及數字。
紅楓派開發(fā)板使用手冊:??????????????????????????????????????????????????GD32F303紅楓派使用手冊 - 飛書云文檔 (feishu.cn)