1.OLED簡介
OLED,即有機發光二極管(Organic Light-Emitting Diode),又稱為有機電激光顯示(Organic Electroluminesence Display, OELD)。OLED由于同時具備自發光,不需背光源、對比度高、厚度薄、視角廣、反應速度快、可用于撓曲性面板、使用溫度范圍廣、構造及制程較簡單等優異之特性,被認為是下一代的平面顯示器新興應用技術。
OLED顯示技術具有自發光的特性,采用非常薄的有機材料涂層和玻璃基板,當有電流通過時,這些有機材料就會發光,而且OLED顯示屏幕可視角度大,并且能夠節省電能。
2.OLED模塊簡介
本文采用中景園的 0.96 寸的OLED顯示模塊。原理圖如下:
2.1模塊特點:
1)0.96 寸 OLED 有黃藍,白,藍三種顏色可選;其中黃藍是屏上 1/4 部分為黃光,下 3/4 為藍;而且是固定區域顯示固定顏色,顏色和顯示區域均不能修改;白光則為純白,也就是黑底白字;藍色則為純藍,也就是黑底藍字。
2)分辨率為 128*64;
3)多種接口方式;OLED 裸屏總共種接口包括:6800、8080 兩種并行接口方式、3 線或 4 線的串行 SPI 接口方式、 IIC 接口方式(只需要 2 根線就可以控制 OLED 了),這五種接口是通過屏上的 BS0~BS2 來配置的。
2.2模塊接口:
接口 功能
GND 電源地
VCC 電源正(3~5.5V)
D0 OLED 的 D0 腳,在 SPI 和 IIC 通信中為時鐘管腳
D1 OLED 的 D1 腳,在 SPI 和 IIC 通信中為數據管腳
RES OLED 的 RES#腳,用來復位(低電平復位)
DC OLED 的 D/C#E 腳,數據和命令控制管腳
CS OLED 的 CS#腳,片選管腳
2.3 OLED 驅動 IC:
本屏所用的驅動 IC 為 SSD1306;其具有內部升壓功能;所以在設計的時候不需要再專一設計升壓電路;屏也可以選用外部升壓,。SSD1306 的每頁包含了128 個字節,總共 8 頁,這樣剛好是128*64 的點陣大小。
2.4 OLED 驅動方式:
此模塊支持四線 SPI、三線 SPI、IIC 接口和 6800、8080 并口方式,模塊的通信接口是通過 BS0,BS1,BS2 三個管腳來配置。
2.5 SSD1306的命令
0X81:設置對比度。包含兩個字節,第一個0X81為命令,隨后發送的一個字節為要設置的對比度的值。這個值設置得越大屏幕就越亮。
0XAE,0XAF: 0XAE為關閉顯示命令;0XAF為開啟顯示命令。
0X8D:包含2個字節,第一個為命令字,第二個為設置值,第二個字節的BIT2表示電荷泵的開關狀態,該位為1,則開啟電荷泵,為0則關閉。在模塊初始化的時候,這個必須要開啟,否則是看不到屏幕顯示的。
命令0XB0~B7:用于設置頁地址,其低三位的值對應著GRAM的頁地址。
0X00~0X0F:用于設置顯示時的起始列地址低四位。
0X10~0X1F:用于設置顯示時的起始列地址高四位。
3.實現程序
3.1 模擬SPI
時序:
對應時序圖實現程序:
程序:
sbit OLED_SCL=P3^0;//時鐘 D0(SCLK)
sbit OLED_SDIN=P3^1;//D1(MOSI) 數據
sbit OLED_RST =P3^2;//復位
sbit OLED_DC =P3^3;//數據/命令控制
sbit OLED_CS=P3^4; //片選
//Function:向OLED設備寫入一個字節
//Input:dat:寫入的數據/命令;cmd:寫入的是數據或命令判斷
//cmd=0:寫入命令;cmd=1:寫入數據(DC為高:數據;DC為低:命令)
//Output:無
//Return:無
//Others:無
void Spi_Write_Byte(uchar dat,uchar cmd)
{
uchar len;
if(cmd)
OLED_DC = 1;
else
OLED_DC = 0;
OLED_CS = 0;
for(len=0;len<8;len++)
{
OLED_SCL = 0;//低電平開始采樣數據
if(dat&0x80)
OLED_SDIN = 1;
else
OLED_SDIN = 0;
OLED_SCL = 1;
dat = dat<<1;
}
OLED_CS = 1;
OLED_DC = 1;
}
顯示部分實現:
#include "oled_display.h"
#include "oled_font.h"
//Function:設置顯示坐標
//Input:x:橫坐標;y:縱坐標
//Output:無
//Return:無
//Others:無
void OLED_Set_Pos(uchar x,uchar y)
{
Spi_Write_Byte(0xb0+y,OLED_CMD);//列偏移
Spi_Write_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);//行高四位地址
Spi_Write_Byte((x&0x0f)|0X01,OLED_CMD);//行低四位地址
}
//Function:開啟OLED顯示
//Input:無
//Output:無
//Return:無
//Others:無
void OLED_Display_On(void)
{
Spi_Write_Byte(0X8D,OLED_CMD);//設置DCDC
Spi_Write_Byte(0X14,OLED_CMD);//打開DCDC
Spi_Write_Byte(0XAF,OLED_CMD);//打開OLED
}
//Function:關閉OLED顯示
//Input:無
//Output:無
//Return:無
//Others:無
void OLED_Display_Off(void)
{
Spi_Write_Byte(0X8D,OLED_CMD);//設置DCDC
Spi_Write_Byte(0X10,OLED_CMD);//關閉DCDC
Spi_Write_Byte(0XAE,OLED_CMD);//關閉OLED
}
//Function:清屏
//Input:無
//Output:無
//Return:無
//Others:無
void OLED_Display_Clear(void)
{
uchar page,len;
for(page=0;page<8;page++)
{
Spi_Write_Byte(0xB0+page,OLED_CMD);//設置頁地址(0--7)
Spi_Write_Byte(0X00,OLED_CMD);//設置顯示位置—列低地址
Spi_Write_Byte(0X10,OLED_CMD); //設置顯示位置—列高地址
for(len=0;len<128;len++)
Spi_Write_Byte(0,OLED_DATA);//寫入0;屏熄滅
}
}
//Function:在指定位置顯示一個字符,包括部分字符
//x:0~127;y:0~63;size:選擇字體 16/12
//Input:x:橫坐標;y:縱坐標;str:顯示的字符
//Output:無
//Return:無
//Others:無
void OLED_Display_Onechar(uchar x,uchar y,uchar str)
{
uchar i=0,ret=0;
//ret = str -32;
ret = str - ' ';//得到偏移后的值,對ASCLL碼進行一個減法.即在二維數組里找它的位置
if(x>Max_Column-1)
{
x = 0;
y = y + 2;//針對16號的字符
}
if(SIZE == 16 )
{
OLED_Set_Pos(x,y);
//16的字體分成兩部分寫入
for(i=0;i<8;i++)
Spi_Write_Byte(F8X16[ret*16+i],OLED_DATA);
OLED_Set_Pos(x,y+1);
for(i=0;i<8;i++)
Spi_Write_Byte(F8X16[ret*16+i+8],OLED_DATA);
}
else{
OLED_Set_Pos(x,y+1);
for(i=0;i<6;i++)
Spi_Write_Byte(F6x8[ret][i],OLED_DATA);
}
}
//Function:顯示字符串
//Input:x:橫坐標;y:縱坐標;str:顯示的字符串
//Output:無
//Return:無
//Others:無
void OLED_Display_String(uchar x,uchar y,uchar *str)
{
uchar i=0;
while(str[i]!='\0')
{
OLED_Display_Onechar(x,y,str[i]);
x += 8;
if(x>120)
{
x = 0;
y += 2;
}
i++;
}
}
//Function:顯示中文
//Input:x:橫坐標;y:縱坐標;no:顯示的字的序號
//Output:無
//Return:無
//Others:無
void OLED_Display_Chinese(uchar x,uchar y,uchar no)
{
uchar ch,addr=0;
OLED_Set_Pos(x,y);
for(ch=0;ch<16;ch++)//數組行列尋址
{
Spi_Write_Byte(TEST[2*no][ch],OLED_DATA);
addr += 1;
}
OLED_Set_Pos(x,y+1);
for(ch=0;ch<16;ch++)
{
Spi_Write_Byte(TEST[2*no+1][ch],OLED_DATA);
addr += 1;
}
}
//Function:顯示圖片
//Input:x0,x1:橫坐標;y0,y1:縱坐標;BMP:顯示的圖片
//注意:y1<8,頁尋址模式
//Output:無
//Return:無
//Others:無
void OLED_Display_Picture(uchar x0,uchar y0,uchar x1,uchar y1,uchar BMP[])
{
uchar x,y;
uint i=0;
if(y1%8==0)
y = y1 / 8;
else
y = y1 /8 + 1;
for(y=y0;y { OLED_Set_Pos(x0,y); for(x=x0;x { Spi_Write_Byte(BMP[i++],OLED_DATA); } } } //計算m的n次方 uint OLED_Pow(uchar m,uchar n) { uint ret = 1; while(n--) ret *= m; return ret; } //Function:顯示數字 //Input:x:橫坐標;1:縱坐標;num:顯示的數字:len:數字長度;size_num:數字字體 //Output:無 //Return:無 //Others:無 void OLED_Display_Num(uchar x,uchar y,uint num,uchar len,uchar size_num) { uchar t,temp; uchar enshow = 0; for(t=0;t { temp = (num/OLED_Pow(10,len-t-1))%10;//把顯示的數字一位一位取出來 if(enshow==0&&t<(len-1)) { if(temp==0) { OLED_Display_Onechar(x+(size_num/2)*t,y,' '); continue; } else enshow = 1; } OLED_Display_Onechar(x+(size_num/2)*t,y,temp+'0'); } } //初始化SSD1306 void OLED_Init(void) { OLED_RST = 1; delay_ms(200); OLED_RST = 0; delay_ms(200); OLED_RST = 1; Spi_Write_Byte(0xAE,OLED_CMD);//關閉OLED Spi_Write_Byte(0x00,OLED_CMD);//設置列低位地址 Spi_Write_Byte(0x10,OLED_CMD);//設置列高位地址 Spi_Write_Byte(0x40,OLED_CMD);//設置起始行地址及映射RAM顯示起始行 (0x00~0x3F) Spi_Write_Byte(0x81,OLED_CMD);//對比度設置 Spi_Write_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness Spi_Write_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 Spi_Write_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 Spi_Write_Byte(0xA6,OLED_CMD);//設置顯示方式;bit0:1,反相顯示;0,正常顯示 Spi_Write_Byte(0xA8,OLED_CMD);//設置驅動路數(1 to 64) Spi_Write_Byte(0x3f,OLED_CMD);//--1/64 duty Spi_Write_Byte(0xD3,OLED_CMD);//-設置顯示偏移(0x00~0x3F) Spi_Write_Byte(0x00,OLED_CMD);//-not offset Spi_Write_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency Spi_Write_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec Spi_Write_Byte(0xD9,OLED_CMD);//--set pre-charge period Spi_Write_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock Spi_Write_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration Spi_Write_Byte(0x12,OLED_CMD); Spi_Write_Byte(0xDB,OLED_CMD);//--set vcomh Spi_Write_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level Spi_Write_Byte(0x20,OLED_CMD);//設置頁地址模式(0x00/0x01/0x02) Spi_Write_Byte(0x02,OLED_CMD);// Spi_Write_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable Spi_Write_Byte(0x14,OLED_CMD);//--set(0x10) disable Spi_Write_Byte(0xA4,OLED_CMD);//禁用顯示開啟;bit0:1,開啟;0,關閉;(白屏/黑屏)(0xa4/0xa5) Spi_Write_Byte(0xA6,OLED_CMD);// 不使用反向顯示 (0xa6/a7) Spi_Write_Byte(0xAF,OLED_CMD);//打開顯示 Spi_Write_Byte(0xAF,OLED_CMD); /*display ON*/ OLED_Display_Clear(); OLED_Set_Pos(0,0); } 斷斷續續總算寫完了,歡迎大家積極討論,互相學習。
上一篇:C51 GPIO口模擬IIC讀寫24CXX
下一篇:51通過IO口模擬IIC實現AT24C02的讀寫
推薦閱讀
史海拾趣
Electronic-Bauteile Goerlitz GmbH公司自創立之初,就以其獨特的技術創新為核心競爭力。公司不斷投入研發資源,開發出了一系列具有競爭力的電子產品部件。這些部件以其高性能、低功耗和可靠性,贏得了市場的廣泛認可。公司通過與高校和研究機構的合作,不斷引進新技術,推動產品升級換代,確保了其在行業中的領先地位。
在快速發展的過程中,Electronic-Bauteile Goerlitz GmbH公司非常重視企業文化和團隊建設。公司倡導以人為本的管理理念,注重員工的培養和發展。公司定期組織各種培訓和學習活動,提高員工的專業素質和工作能力;同時,公司還建立了完善的激勵機制和福利待遇體系,確保員工能夠全身心地投入到工作中。這些努力使得公司形成了一支高效、團結、富有創新精神的團隊,為公司的發展提供了堅實的保障。
請注意,以上故事均為模擬構建,旨在展示一個電子公司可能的發展過程和相關故事。如有需要,您可以根據具體情況進行調整和補充。
隨著技術的不斷進步,順芯公司意識到只有不斷創新才能在激烈的市場競爭中立于不敗之地。因此,公司加大了在研發方面的投入,積極引進高端人才,并與國內外知名高校和研究機構建立了合作關系。在XXXX年,順芯公司成功研發出了一款具有自主知識產權的高性能數模混合芯片,填補了國內市場的空白,并獲得了多項專利。
2003年,AMOTECH的壓敏電阻產品被產業資源部評為“世界一流產品”,這是對公司技術實力的再次肯定。同年,公司還在韓國安全商協會進行了自動報價首次公開募股,為公司的發展籌集了更多資金。隨著實力的增強,AMOTECH開始將目光投向海外市場。2004年,公司在山東建立了首家海外工廠,專注于全球定位系統天線的生產,這標志著公司國際化戰略的正式啟動。
1957年,麻省理工學院的工程師肯尼斯·奧爾森(Kenneth Olsen)和哈伯特·安德森(Harlan Anderson)共同創立了Digital Equipment Corporation(DEC)。他們最初的目標是開發和生產創新的數字計算設備。憑借他們在數字技術領域的專業知識和獨特視角,DEC推出了首批數字實驗室和數字系統組件,這些產品在市場上取得了初步的成功,為DEC的發展奠定了堅實的基礎。
DEC始終致力于技術創新和產品研發。在20世紀70年代和80年代,DEC推出了一系列具有劃時代意義的計算機產品,如PDP系列計算機和VAX系列計算機。這些產品在技術上處于領先地位,受到了市場和客戶的廣泛認可。此外,DEC還通過國際擴張策略,將其業務拓展到了全球范圍內,進一步鞏固了其市場地位。
中國3G前景撲朔迷離 2006-7-14 中國的3G進程總是撲朔迷離,今年牌照可能再次難產的消息再一次讓中外廠商頗為擔心和憂慮。日前在杭州舉行的TD-SCDMA終端及應用研討會上,國內外致力于TD-SCDMA發展的專家對中國3G當前面臨的困難 ...… 查看全部問答∨ |
Atmel Corporation日前宣布推出高度整合的ATA6026汽車驅動IC,這是即將推出的汽車驅動器家族的首個成員。ATA6026的設計基于Atmel高壓BCDMOS制程,采用了優化的通信接口,適合大容量直流電汽車應用產品,如擋風玻璃刮水器系統、門鎖或座位調節 ...… 查看全部問答∨ |
如此迥異的生活環境、社會環境所孕育的理論如果運用在人才的選、用上竟如此驚人的相似。還記得小時候,我們周圍有使用左手習慣的人吧,那時他們被稱為左撇子(其實這是一個帶有社會偏見的稱呼,因為社會上所有的設施、書寫及閱讀習慣都是為右手習慣 ...… 查看全部問答∨ |
LED照明,被譽為“第三次照明革命”,其節能環保等優點受到政府的高度重視、行業的追捧。但是在一片叫好聲中,LED仍然面臨核心技術缺失、行業標準缺失、價格居高不下、大面積推廣困難等種種問題。 技術上仍不完善 “還不是很成熟。”6月9 ...… 查看全部問答∨ |
急尋代筆,高報酬 vs2005里C++或C#,智能設備下,選pocket pc 2003 里寫系統 我有個畢業設計,想找人代寫 希望會的聯系我 QQ460580652 15929443577 要求是這樣的。要求是在 2009年6月10號前寫好 只要能按照要求運行就可以了。會的速度聯系我 藥品庫存管理信息系統 現本課題要求 ...… 查看全部問答∨ |
要求簡單描述如下 1.自己編寫代碼,實現PLB總線(IBM的CoreConnect總線的一部分)的功能 2.再添加一個master,一個slave,實現功能 一直沒有頭緒,到這里來看看哈,望各位高手不吝賜教啊 問題如下: 1.有沒有什么IP核的集成,設計規范? 2.有 ...… 查看全部問答∨ |
由于對軟件測試的需要,在網上google到MS出的Application Verifier,可是我只找到的PC版的。 哪位能提供Application Verifier for Windows CE版,不想要for mobile版的。 無限期待中......… 查看全部問答∨ |
轉接板PCB早就弄好了,現在終于有時間驅動了一下,效果還不錯。為《MP3+數碼相框+收音機+電子書》和《智能家居系統》的顯示提供方便了。 [ 本帖最后由 zhaojun_xf ...… 查看全部問答∨ |