51单片机学习笔记8 -- OLED显示(SPI)
0.96寸OLED顯示
- 1.OLED簡介
- 1.2 OLED結構
- 1.2 OLED特點
- 1.3 發光原理
- 1.4 模塊參數
- 2.OLED顯示編程
- 2.1 OLED顯示庫
- 2.2 漢字取模
- 2.3 OLED顯示
1.OLED簡介
有機發光二極管(Organic Light-Emitting Diode, OLED)又稱為有機電激光顯示、有機發光半導體。由美籍華裔教授鄧青云(Ching W. Tang)于1979年在實驗室中發現。OLED顯示技術具有自發光、廣視角、幾乎無窮高的對比度、較低耗電、極高反應速度等優點。
1.2 OLED結構
由基板、陰極、陽極、空穴注入層(HIL)、電子注入層(EIL)、空穴傳輸層(HTL)、電子傳輸層(ETL)、電子阻擋層(EBL)、空穴阻擋層(HBL)、發光層(EML)等部分構成。其中,基板是整個器件的基礎,所有功能層都需要蒸鍍到器件的基板上;通常采用玻璃作為器件的基板,但是如果需要制作可彎曲的柔性OLED器件,則需要使用其它材料如塑料等作為器件的基板。陽極與器件外加驅動電壓的正極相連,陽極中的空穴會在外加驅動電壓的驅動下向器件中的發光層移動,陽極需要在器件工作時具有一定的透光性,使得器件內部發出的光能夠被外界觀察到;陽極最常使用的材料是ITO。空穴注入層能夠對器件的陽極進行修飾,并可以使來自陽極的空穴順利的注入到空穴傳輸層;空穴傳輸層負責將空穴運輸到發光層;電子阻擋層會把來自陰極的電子阻擋在器件的發光層界面處,增大器件發光層界面處電子的濃度;發光層為器件電子和空穴再結合形成激子然后激子退激發光的地方;空穴阻擋層會將來自陽極的空穴阻擋在器件發光層的界面處,進而提高器件發光層界面處電子和空穴再結合的概率,增大器件的發光效率;電子傳輸層負責將來自陰極的電子傳輸到器件的發光層中;電子注入層起對陰極修飾及將電子傳輸到電子傳輸層的作用;陰極中的電子會在器件外加驅動電壓的驅動下向器件的發光層移動,然后在發光層與來自陽極的空穴進行再結合。
1.2 OLED特點
(1)功耗低——與LCD相比,OLED不需要背光源,而背光源在LCD中是比較耗能的一部分,所以OLED是比較節能的。例如,24in的AMOLED模塊功耗僅僅為440mw,而24in的多晶硅LCD模塊達到了605mw。
(2)響應速度快——OLED技術與其他技術相比,其響應速度快,響應時間可以達到微秒級別。較高的響應速度更好的實現了運動的圖像。根據有關的數據分析,其響應速度達到了液晶顯示器響應速度的1000倍左右。
(3)較寬的視角——與其他顯示相比,由于OLED是主動發光的,所以在很大視角范圍內畫面是不會顯示失真的。其上下,左右的視角寬度超過170度。
(4)能實現高分辨率顯示——大多高分辨率的OLED顯示采用的是有源矩陣也就是AMOLED,它的發光層可以是吸納26萬真彩色的高分辨率,并且隨著科學技術的發展,其分辨率在以后會得到更高的提升。
(5)寬溫度特性——與LCD相比,OLED可以在很大的溫度范圍內進行工作,根據有關的技術分析,溫度在-40攝氏度到80攝氏度都是可以正常運行的。這樣就可以降低地域限制,在極寒地帶也可以正常使用。
(6)OLED能夠實現軟屏——OLED可以在塑料、樹脂等不同的柔性襯底材料上進行生產,將有機層蒸鍍或涂布在塑料基襯上,就可以實現軟屏。
(7)OLED成品的質量比較輕——與其他產品相比,OLED的質量比較小,厚度與LCD相比是比較小的,其抗震系數較高,能夠適應較大的加速度,振動等比較惡劣的環境。
1.3 發光原理
OLED器件的發光過程可分為:電子和空穴的注入、電子和空穴的傳輸、電子和空穴的再結合、激子的退激發光。具體為:
(1)電子和空穴的注入。處于陰極中的電子和陽極中的空穴在外加驅動電壓的驅動下會向器件的發光層移動,在向器件發光層移動的過程中,若器件包含有電子注入層和空穴注入層,則電子和空穴首先需要克服陰極與電子注入層及陽極與空穴注入層之間的能級勢壘,然后經由電子注入層和空穴注入層向器件的電子傳輸層和空穴傳輸層移動;電子注入層和空穴注入層可增大器件的效率和壽命。關于OLED器件電子注入的機制還在不斷的研究當中,目前最常被使用的機制是穿隧效應和界面偶極機制。
(2)電子和空穴的傳輸。在外加驅動電壓的驅動下,來自陰極的電子和陽極的空穴會分別移動到器件的電子傳輸層和空穴傳輸層,電子傳輸層和空穴傳輸層會分別將電子和空穴移動到器件發光層的界面處;與此同時,電子傳輸層和空穴傳輸層分別會將來自陽極的空穴和來自陰極的電子阻擋在器件發光層的界面處,使得器件發光層界面處的電子和空穴得以累積。
(3)電子和空穴的再結合。當器件發光層界面處的電子和空穴達到一定數目時,電子和空穴會進行再結合并在發光層產生激子。
(4)激子的退激發光。在發光層處產生的激子會使得器件發光層中的有機分子被活化,進而使得有機分子最外層的電子從基態躍遷到激發態,由于處于激發態的電子極其不穩定,其會向基態躍遷,在躍遷的過程中會有能量以光的形式被釋放出來,進而實現了器件的發光。
1.4 模塊參數
0.96寸OLED模塊
電壓:3V~5V DC
工作溫度:-30℃~70℃
高分辨率:128 * 64
面板尺寸:26.70 * 19.26 * 1.85mm / 1.03 * 0.76 * 0.07英寸(約)
有效面積:21.74 * 11.2mm /0.86*0.44英寸(約)
驅動IC:SSD1306
128 * 64 LED顯示模塊,支持多種控制芯片。
完全兼容51系列,MSP430系列,STM32 / 2,CSR IC等
超低功耗:全屏點亮0.08W
超高亮度和對比度可調
帶嵌入式驅動/控制器
接口類型為SPI
2.OLED顯示編程
2.1 OLED顯示庫
OLED屏顯示需要編寫顯示驅動代碼,一般都可以在網上搜到OLED的顯示demo程序,主要顯示代碼如下
#include "oled.h" #include "oledfont.h" //OLED的顯存 //存放格式如下. //[0]0 1 2 3 ... 127 //[1]0 1 2 3 ... 127 //[2]0 1 2 3 ... 127 //[3]0 1 2 3 ... 127 //[4]0 1 2 3 ... 127 //[5]0 1 2 3 ... 127 //[6]0 1 2 3 ... 127 //[7]0 1 2 3 ... 127 void delay_ms(unsigned int ms) { unsigned int a;while(ms){a=1800;while(a--);ms--;}return; } #if OLED_MODE==1 //向SSD1106寫入一個字節。 //dat:要寫入的數據/命令 //cmd:數據/命令標志 0,表示命令;1,表示數據; void OLED_WR_Byte(u8 dat,u8 cmd) {DATAOUT(dat); if(cmd)OLED_DC_Set();else OLED_DC_Clr(); OLED_CS_Clr();OLED_WR_Clr(); OLED_WR_Set();OLED_CS_Set(); OLED_DC_Set(); } #else //向SSD1306寫入一個字節。 //dat:要寫入的數據/命令 //cmd:數據/命令標志 0,表示命令;1,表示數據; void OLED_WR_Byte(u8 dat,u8 cmd) { u8 i; if(cmd)OLED_DC_Set();else OLED_DC_Clr(); OLED_CS_Clr();for(i=0;i<8;i++){ OLED_SCLK_Clr();if(dat&0x80){OLED_SDIN_Set();} elseOLED_SDIN_Clr();OLED_SCLK_Set();dat<<=1; } OLED_CS_Set();OLED_DC_Set(); } #endifvoid OLED_Set_Pos(unsigned char x, unsigned char y) { OLED_WR_Byte(0xb0+y,OLED_CMD);OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD); } //開啟OLED顯示 void OLED_Display_On(void) {OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令OLED_WR_Byte(0X14,OLED_CMD); //DCDC ONOLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON }//關閉OLED顯示 void OLED_Display_Off(void) {OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFFOLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF } //清屏函數,清完屏,整個屏幕是黑色的!和沒點亮一樣!!! void OLED_Clear(void) { u8 i,n; for(i=0;i<8;i++) { OLED_WR_Byte (0xb0+i,OLED_CMD); //設置頁地址(0~7)OLED_WR_Byte (0x00,OLED_CMD); //設置顯示位置—列低地址OLED_WR_Byte (0x10,OLED_CMD); //設置顯示位置—列高地址 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); } //更新顯示 }//在指定位置顯示一個字符,包括部分字符 //x:0~127 //y:0~63 //mode:0,反白顯示;1,正常顯示 //size:選擇字體 16/12 void OLED_ShowChar(u8 x,u8 y,u8 chr) { unsigned char c=0,i=0; c=chr-' ';//得到偏移后的值 if(x>Max_Column-1){x=0;y=y+2;}if(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+1);for(i=0;i<6;i++)OLED_WR_Byte(F6x8[c][i],OLED_DATA);} }//m^n函數 u32 oled_pow(u8 m,u8 n) {u32 result=1; while(n--)result*=m; return result; } //顯示2個數字 //x,y :起點坐標 //len :數字的位數 //size:字體大小 //mode:模式 0,填充模式;1,疊加模式 //num:數值(0~4294967295); void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2) { u8 t,temp;u8 enshow=0; for(t=0;t<len;t++){temp=(num/oled_pow(10,len-t-1))%10;if(enshow==0&&t<(len-1)){if(temp==0){OLED_ShowChar(x+(size2/2)*t,y,' ');continue;}else enshow=1; }OLED_ShowChar(x+(size2/2)*t,y,temp+'0'); } } //顯示一個字符號串 void OLED_ShowString(u8 x,u8 y,u8 *chr) {unsigned char j=0;while (chr[j]!='\0'){ OLED_ShowChar(x,y,chr[j]);x+=8;if(x>120){x=0;y+=2;}j++;} }//顯示漢字 void OLED_ShowCHinese(u8 x,u8 y,u8 no) { u8 t,adder=0;OLED_Set_Pos(x,y); for(t=0;t<16;t++){OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);adder+=1;} OLED_Set_Pos(x,y+1); for(t=0;t<16;t++){ OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);adder+=1;} }//初始化SSD1306 void OLED_Init(void) {OLED_RST_Set();delay_ms(100);OLED_RST_Clr();delay_ms(100);OLED_RST_Set(); OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panelOLED_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 address Set Mapping RAM Display Start Line (0x00~0x3F)OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control registerOLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current BrightnessOLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常OLED_WR_Byte(0xA6,OLED_CMD);//--set normal displayOLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 dutyOLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)OLED_WR_Byte(0x00,OLED_CMD);//-not offsetOLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequencyOLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/SecOLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge periodOLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 ClockOLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configurationOLED_WR_Byte(0x12,OLED_CMD);OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomhOLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect LevelOLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)OLED_WR_Byte(0x02,OLED_CMD);//OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disableOLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disableOLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panelOLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ OLED_Clear();OLED_Set_Pos(0,0); }2.2 漢字取模
OLED顯示屏除了可以顯示字符串之外,還可以顯示漢字,圖片等;字符串顯示直接在代碼里寫,漢字和圖片都需要用取模軟件生成字庫,下面是常用的取模軟件
選擇字符模式
點擊選項或者點擊小齒輪,進行驅魔配置
將配置中的A51格式改為C51格式,其他保持默認
輸入OLED顯示屏上要顯示的漢字,點擊生成字模,可看到下方出現了一串十六進制數,每一個漢字取模都會轉換成32個十六進制數,可以連續幾個漢字一起取模
將生成的字模代碼拷貝至工程中,放在字模頭文件的數組中,除了注釋的文字,數組中不要出現其他文字,否則會編譯出錯,如下
字模數組在上面OLED顯示庫中的漢字顯示函數中被調用
2.3 OLED顯示
燒寫程序前,按程序中OLED控制引腳(SPI)定義連接引腳,SPI接口需要用到5個引腳,另外是5V供電和GND
sbit OLED_CS = P2^0; //片選 sbit OLED_DC = P2^1;//數據/命令控制 sbit OLED_RST = P2^2;//復位RES sbit OLED_SDIN = P2^3;//D1(MOSI) 數據 sbit OLED_SCL = P2^4;//時鐘 D0(SCLK?在main函數中,調用函數OLED_ShowString可以顯示字符串,調用函數OLED_ShowCHinese可以顯示漢字
void main(void) { OLED_Init(); //oled屏幕初始化OLED_Clear(); //oled清屏 //OLED_ShowString(0,0,"OLED test"); //顯示字符串//顯示漢字 OLED_ShowCHinese 參數1 X坐標,參數2 Y坐標 OLED_ShowCHinese(0,0,0);OLED_ShowCHinese(18,0,1);OLED_ShowCHinese(36,0,2);OLED_ShowCHinese(54,0,3);OLED_ShowCHinese(72,0,4);while(1); }顯示效果如下圖
總結
以上是生活随笔為你收集整理的51单片机学习笔记8 -- OLED显示(SPI)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sh变量特性(3)默认特性
- 下一篇: 僵尸进程处理方式