在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OLED顯示屏的驅動設計與實現

CHANBAEK ? 來源:木南創智 ? 作者:尹家軍 ? 2022-12-08 11:22 ? 次閱讀

現在OLED顯示屏在嵌入式系統中應用的越來越多。對于一些顯示信息不太復雜,以顯示信息為主的需求,我們一般會選擇OLED顯示屏。在這一篇中,我們將討論OLED顯示屏驅動的設計與實現。

1、功能概述

??從使用的情況來說,較為常用的是0.96英寸的OLED128x64的顯示屏。這種OLED屏多采用象SSD1306這類驅動芯片,所以我們對OLED屏的操作實際就是對控制芯片的操作。

??對于0.96英寸的OLED128x64的顯示屏,其像素點為128x64個,對應在顯示RAM中的128x64個位。在顯存中,這些區域被劃分為8個Page,這些頁的劃分具體如下圖所示:

??在每一頁中包括128x8個位對應相應的像素點,對顯示像素的操作就是對鄉村中對應的位的操作,每頁中像素點的排布如下:

??對于操作0.96英寸的OLED128x64顯示屏的接口有多種,如6800并行接口、8080并行接口、SPI串行接口以及I2C串行接口等。對于并行接口應用較少,現在應用較多的是SPI和I2C這兩種串行總線接口。在SPI接口方式下,有3個控制引腳是需要操作的,分別是復位、數據命令選擇和片選信號。而在I2C接口方式下,僅有復位引腳是可控的,但在發送命令或數據時會多一個字節的控制字。

2、驅動設計與實現

??我們已經了解了0.96英寸的OLED128x64顯示屏的基本情況,在這里我們來考慮如何實現0.96英寸的OLED128x64顯示屏的驅動設計。

2.1、對象定義

??在使用一個對象之前我們需要獲得一個對象。同樣的我們想要OLED顯示屏就需要先定義OLED顯示屏的對象。

2.1.1、對象的抽象

??我們要得到OLED顯示屏對象,需要先分析其基本特性。一般來說,一個對象至少包含兩方面的特性:屬性與操作。接下來我們就來從這兩個方面思考一下OLED顯示屏的對象。

??先來考慮屬性,作為屬性肯定是用于標識或記錄對象特征的東西。我們來考慮0.96英寸的OLED128x64顯示屏對象屬性。我們考慮SPI和I2C兩種接口的情形,所以我們要分辨當前使用的接口形式以確定采取適當的操作方式,所以我們將端口類型設置為其屬性以保存當前的操作接口類型。在I2C接口時,每一臺I2C從設備都需要有一個設備地址,我們要記錄當前從設備的地址,所以將其設置為屬性。

??接著我們還需要考慮OLED顯示屏對象的操作問題。在SPI接口模式下,我們需要控制復位、數據命令選擇以及片選控制引腳,而在I2C接口模式下,我們需要控制復位引腳。這些控制引腳的操作都依賴于具體的硬件平臺,所以我們將其作為對象的操作。我們要想OLED發送命令和數據,但不論是何種接口類型這一操作都依賴于具體的軟硬件平臺,所以我們將其作為對象的操作。為了控制操作時序,我們需要延時操作函數,而延時操作也依賴于具體的軟硬件平臺,所以我們將其作為對象的操作。

??根據上述我們對OLED顯示屏的分析,我們可以定義OLED顯示屏的對象類型如下:

/*定義OLED對象類型*/
typedef struct OledObject {
 uint8_t devAddress;
 OledPortType port;
 void (*Write)(struct OledObject *oled,uint8_t *wData,uint16_t wSize);
 void (*ChipSelcet)(OledCSType en);
 void (*DCSelcet)(OledDCType dc);
 void (*ChipReset)(OledRSTType rst);
 void (*Delayms)(volatile uint32_t nTime);
}OledObjectType;

2.1.2、對象初始化

??我們知道,一個對象僅作聲明是不能使用的,我們需要先對其進行初始化,所以這里我們來考慮OLED顯示屏對象的初始化函數。一般來說,初始化函數需要處理幾個方面的問題。一是檢查輸入參數是否合理;二是為對象的屬性賦初值;三是對對象作必要的初始化配置。

??而且0.96英寸的OLED128x64顯示屏在實現復位引腳的操作后將實現其初始化配置。據此我們設計OLED顯示屏對象的初始化函數如下:

/*OLED顯示屏對象初始化*/
void OledInitialization(OledObjectType *oled,      //OLED對象
        OledPortType port,       //通訊端口
        uint8_t address,        //I2C設備地址
        OledWrite write,        //寫數據函數
        OledChipReset rst,       //復位信號操作函數指針
        OledDCSelcet dc,        //DC信號控制函數指針
        OledChipSelcet cs,       //SPI片選信號函數指針
        OledDelayms delayms       //毫秒延時函數指針
        )
{
 if((oled==NULL)||(write==NULL)||(rst==NULL) ||(delayms==NULL))
 {
  return;
 }
 oled->Write=write;
 oled->ChipReset=rst;
 oled->Delayms=delayms;
 
 oled->port=port;
 
 if(port==OLED_I2C)
 {
  if((address==0x3C)||(address==0x3D))
  {
   oled->devAddress=(address<<1);
  }
  else if((address==0x78)||(address==0x7A))
  {
   oled->devAddress=address;
  }
  else
  {
   oled->devAddress=0x00;
  }
 
 if(dc==NULL)
 {
  return;
 }
  oled->DCSelcet=dc;
  oled->ChipSelcet=cs;
 }
 else
 {
  oled->devAddress=0xFF;
  
  if(cs==NULL)
  {
   oled->ChipSelcet=OledChipSelect;
  }
  else
  {
   oled->ChipSelcet=cs;
  }
  oled->DCSelcet=dc;
 }
 
 oled->ChipReset(OLED_WORK);
 oled->Delayms(100);
 oled->ChipReset(OLED_RESET);
 oled->Delayms(100);
 oled->ChipReset(OLED_WORK);
 
 SendToOled(oled,0xAE,OLEDDC_Command); //關閉顯示
 SendToOled(oled,0x20,OLEDDC_Command); //Set Memory Addressing Mode    
 SendToOled(oled,0x10,OLEDDC_Command); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
 SendToOled(oled,0xB0,OLEDDC_Command); //Set Page Start Address for Page Addressing Mode,0-7
 SendToOled(oled,0xA1,OLEDDC_Command); //0xa0,X軸正常顯示;0xa1,X軸鏡像顯示
 SendToOled(oled,0xC8,OLEDDC_Command); //0xc0,Y軸正常顯示;0xc8,Y軸鏡像顯示
 SendToOled(oled,0x00,OLEDDC_Command); //設置列地址低4位
 SendToOled(oled,0x10,OLEDDC_Command); //設置列地址高4位
 SendToOled(oled,0x40,OLEDDC_Command); //設置起始線地址
 
 SendToOled(oled,0x81,OLEDDC_Command); //設置對比度值
 SendToOled(oled,0x7F,OLEDDC_Command); //------
 
 SendToOled(oled,0xA6,OLEDDC_Command); //0xa6,正常顯示模式;0xa7,
 
 SendToOled(oled,0xA8,OLEDDC_Command); //--set multiplex ratio(1 to 64)
 SendToOled(oled,0x3F,OLEDDC_Command); //------
 
 SendToOled(oled,0xA4,OLEDDC_Command); //0xa4,顯示跟隨RAM的改變而改變;0xa5,顯示內容忽略RAM的內容
 
 SendToOled(oled,0xD3,OLEDDC_Command); //設置顯示偏移
 SendToOled(oled,0x00,OLEDDC_Command); //------
 
 SendToOled(oled,0xD5,OLEDDC_Command); //設置內部顯示時鐘頻率
 SendToOled(oled,0xF0,OLEDDC_Command); //------
 
 SendToOled(oled,0xD9,OLEDDC_Command); //--set pre-charge period
 SendToOled(oled,0x22,OLEDDC_Command); //------
 
 SendToOled(oled,0xDA,OLEDDC_Command); //--set com pins hardware configuration
 SendToOled(oled,0x12,OLEDDC_Command); //------
 
 SendToOled(oled,0xDB,OLEDDC_Command); //--set vcomh
 SendToOled(oled,0x20,OLEDDC_Command); //------
 
 SendToOled(oled,0x8D,OLEDDC_Command); //--set DC-DC enable
 SendToOled(oled,0x14,OLEDDC_Command); //------
 
 SendToOled(oled,0xAF,OLEDDC_Command); //打開顯示
 
 OledClearScreen(oled);
}

2.2、對象操作

??我們已經完成了OLED顯示屏對象類型的定義和對象初始化函數的設計。但我們的主要目標是獲取對象的信息,接下來我們還要實現面向OLED顯示屏的各類操作。

??對于0.96英寸的OLED128x64顯示屏來說,不論是采用何種接口方式,也不論是需要顯示什么內容。對于我們來說,雖然在不同的接口模式下操作會有些許差別,但本質上都是向OLED寫數據。

??在SPI接口模式下,我們在向OLED發送數據和命令時,需要同時操作片選信號和數據命令選擇信號,以表明需要操作的對象和發送的是數據還是命令。具體的操作時序如下:

??在I2C接口模式下,我們在向OLED發送數據和命令時,沒有片選和數據命令選擇信號,所以我們需要發送從站地址以區分要操作的對象,需要發送控制字節以區分是數據還是命令。具體的操作時序如下:

??根據前述對0.96英寸的OLED128x64顯示屏的描述以及上述時序圖,我們可以編寫向OLED發送數據的函數如下:

/*向OLED發送數據*/
static void SendToOled(OledObjectType *oled,uint8_t sData,OledDCType type)
{
 uint8_t wData[2];
 
 if(oled->port==OLED_SPI)
 {
  oled->ChipSelcet(OLEDCS_Enable);
  
  if(type==OLEDDC_Command)
  {
   oled->DCSelcet(OLEDDC_Command);
  }
  else
  {
   oled->DCSelcet(OLEDDC_Data);
  }
  
  oled->Write(oled,&sData,1);
  
  oled->ChipSelcet(OLEDCS_Disable);
 }
 else
 {
  if(type==OLEDDC_Command)
  {
   wData[0]=0x00;
  }
  else
  {
   wData[0]=0x40;
  }
  
  wData[1]=sData;
  
  oled->Write(oled,wData,2);
 }
}

3、驅動的使用

??我們已經實現了0.96英寸的OLED128x64顯示屏驅動設計及實現,現在我們需要對這一驅動進行驗證,基于此我們需要設計一個簡單的驗證應用。

3.1、聲明并初始化對象

??使用基于對象的操作我們需要先得到這個對象,所以我們先要使用前面定義的OLED顯示屏對象類型聲明一個OLED顯示屏對象變量,具體操作格式如下:

??OledObjectType oled;

??聲明了這個對象變量并不能立即使用,我們還需要使用驅動中定義的初始化函數對這個變量進行初始化。這個初始化函數所需要的輸入參數如下:

??OledObjectType *oled, //OLED對象

??OledPortType port, //通訊端口

?? uint8_t address, //I2C設備地址

??OledWrite write, //寫數據函數

??OledChipReset rst, //復位信號操作函數指針

??OledDCSelcet dc, //DC信號控制函數指針

??OledChipSelcet cs, //SPI片選信號函數指針

??OledDelayms delayms //毫秒延時函數指針

??對于這些參數,對象變量我們已經定義了。所使用的通訊接口方式為枚舉,根據實際情況選擇就好了。而從站地址對于OLED來說,有幾種選擇,根據實際情況輸入就可。主要的是我們需要定義幾個函數,并將函數指針作為參數。這幾個函數的類型如下:

/*向OLED下發指令,指令格式均為1個字節*/
typedef void (*OledWrite)(OledObjectType *oled,uint8_t *wData,uint16_t wSize);

/*復位信號操作函數指針*/
typedef void (*OledChipReset)(OledRSTType rst);

/*數據命令,用于SPI接口*/
typedef void (*OledDCSelcet)(OledDCType dc);

/*片選信號,用于SPI接口*/
typedef void (*OledChipSelcet)(OledCSType en);   

/*毫秒秒延時函數*/
typedef void (*OledDelayms)(volatile uint32_t nTime);

??對于這幾個函數我們根據樣式定義就可以了,具體的操作可能與使用的硬件平臺有關系。片選操作函數用于多設備需要軟件操作時,如采用硬件片選可以傳入NULL即可。具體函數定義如下:

void WriteDataToLED(struct OledObject *oled,uint8_t *wData,uint16_t wSize)
{
 HAL_I2C_Master_Transmit(&oledhi2c,oled->devAddress,wData,wSize,1000);
}

void OLedChipResetf(OledRSTType rst)
{
 HAL_GPIO_WritePin(GPIOD,GPIO_PIN_8,(GPIO_PinState)rst);
}

??對于延時函數我們可以采用各種方法實現。我們采用的STM32平臺和HAL庫則可以直接使用HAL_Delay()函數。于是我們可以調用初始化函數如下:

/*OLED顯示屏對象初始化*/
OledInitialization(&oled,     //OLED對象
         OLED_I2C,    //通訊端口
         0x78,      //I2C設備地址
         WriteDataToLED, //寫數據函數
         OLedChipResetf, //復位信號操作函數指針
         NULL,      //DC信號控制函數指針
         NULL,      //SPI片選信號函數指針
         HAL_Delay    //毫秒延時函數指針
         );

??因在I2C接口模式下,片選信號和數據命令選擇信號并不需要控制所以以NULL輸入即可。

3.2、基于對象進行操作

??我們定義了對象變量并使用初始化函數給其作了初始化。接著我們就來考慮操作這一對象獲取我們想要的數據。我們在驅動中已經針對不同的字體大小設置了不同的操作函數,接下來我們使用這一驅動開發我們的應用實例。

/*OLED顯示信息*/
void OledDisplayMessage(void)
{
 /* 世(0) 界(1) 你(2) 好(3)*/
 uint8_t chinChar[4][32]={
  {0x20,0x20,0x20,0xFE,0x20,0x20,0xFF,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x00,
  0x00,0x00,0x00,0x7F,0x40,0x40,0x47,0x44,0x44,0x44,0x47,0x40,0x40,0x40,0x00,0x00},//"世",0
  {0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00,
  0x08,0x08,0x04,0x84,0x62,0x1E,0x01,0x00,0x01,0xFE,0x02,0x04,0x04,0x08,0x08,0x00},//"界",1
  {0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,
  0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00},//"你",2
  {0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,
  0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00}//"好",3
 };
 
 char pStr[]="Hello, World!";
 
 float x=1.1;
 float y=2.2;
 float z=3.3;
 
 //顯示16x16的漢字
 OledShow16x16Char(&oled,0,32,chinChar[0]);
 OledShow16x16Char(&oled,0,48,chinChar[1]);
 OledShow16x16Char(&oled,0,64,chinChar[2]);
 OledShow16x16Char(&oled,0,80,chinChar[3]);
 
 //顯示8x16的ASCII字符
 OledShowString(&oled,OLED_FONT_8x16,2,32,pStr);
 //顯示8x16的ASCII字符
 OledShowString(&oled,OLED_FONT_8x16,4,20,"X%0.1f,Y%0.1f,Z%0.1f",x,y,z);
 
}

4、應用總結

??在本篇中,我們設計并實現了0.96英寸的OLED128x64顯示屏的驅動,并設計了一個簡單的驗證應用來驗證這一驅動程序。在我們的驗證應用中使用OLED顯示了16下6點陣的中文字符,以及8x16點陣的ASCII字符,其顯示效果與我們預期一致。

??在使用驅動時需注意,0.96英寸的OLED128x64顯示屏支持SPI和I2C兩種接口,而且SPI也支持3線和4線模式,但我們在測試應用中只使用了I2C接口,在I2C接口時,不需要控制片選信號和數據命令選擇信號,所以在初始化時傳遞NULL值就可以了。

??在使用驅動時需注意,采用SPI接口的器件需要考慮片選操作的問題。如果片選信號是通過硬件電路來實現的,我們在初始化時給其傳遞NULL值。如果是軟件操作片選則傳遞我們編寫的片選操作函數。在使用SPI接口時,支持SPI模式0(CPOL=CPHA=0)和模式3(CPOL=CPHA=1)。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • OLED
    +關注

    關注

    119

    文章

    6213

    瀏覽量

    224475
  • 顯示屏
    +關注

    關注

    28

    文章

    4502

    瀏覽量

    74490
  • 驅動設計
    +關注

    關注

    1

    文章

    111

    瀏覽量

    15294
收藏 人收藏

    評論

    相關推薦

    #單片機 OLED顯示屏 兌換的顯示屏到了!#單片機

    OLED顯示屏
    efans
    發布于 :2023年04月24日 16:51:22

    OLED顯示屏_

    `OLED顯示屏_OLED顯示屏_OLED顯示屏_`
    發表于 07-23 11:50

    轉: GD32驅動12832OLED顯示屏

    一直沒玩過OLED,前段時間買了個oled顯示屏,不過不是常見的12864,而是12832,可惜店家沒有提供資料。。。還好12832的驅動IC和12864是相同的,都是ssd1306,
    發表于 07-18 11:28

    怎么實現OLED矩陣顯示屏控制電路的設計?

    本文從實用的角度出發,首先論述了穩定的綠色有機薄膜電致發光器件的研制,闡述了96×64點陣的PM-OLED顯示屏的制作,重點論述了利用Solomon公司的新產品,集控制器、行驅動器和列驅動
    發表于 06-07 06:11

    用51單片機驅動oled顯示屏

    文章目錄51單片機一.前言二.代碼三.總結51單片機一.前言說起51,可以說是老古董了,剛開始接觸單片機就是從51開始,今天就來用51單片機驅動oled顯示屏oled
    發表于 07-15 07:11

    ESP8266驅動OLED顯示屏的方法

    ??ESP8266驅動OLED顯示屏。使用SPI協議將單色7引腳SSD1306 0.96 OLED顯示屏與NodeMCU連接,學習其基本的使
    發表于 11-03 08:53

    0.96_OLED顯示屏_原理圖

    0.96OLED顯示屏_原理圖0.96OLED顯示屏_原理圖
    發表于 07-11 18:43 ?344次下載

    有機電致發光顯示OLED)及基于AT89C51的OLED顯示屏驅動電路的設計

    了穩定的綠色有機薄膜電致發光器件的研制,闡述了 9664點陣的 PM-OLED 顯示屏的制作,重點論述了利用 Solomon 公司的新產品,集控制器、行驅動器和列驅動器于一體的專用于
    發表于 12-01 10:37 ?21次下載
    有機電致發光<b class='flag-5'>顯示</b>(<b class='flag-5'>OLED</b>)及基于AT89C51的<b class='flag-5'>OLED</b><b class='flag-5'>顯示屏</b><b class='flag-5'>驅動</b>電路的設計

    蘋果iPhone明年將會完全放棄LCD顯示屏轉而采用OLED顯示屏

    知情人士表示,蘋果可能會在2020年度iPhone產品陣容中完全放棄LCD顯示屏,轉而采用OLED 顯示屏,從而實現更靈活的手機設計。
    發表于 01-23 11:31 ?1250次閱讀

    Linux驅動開發-編寫OLED顯示屏驅動

    OLED顯示屏在是智能手環,智能手表上用的非常的多,功耗低,不刺眼,優點特別多。本篇文章就介紹,在Linux系統里如何使用OLED顯示屏,要使用OL
    的頭像 發表于 09-17 15:19 ?4319次閱讀
    Linux<b class='flag-5'>驅動</b>開發-編寫<b class='flag-5'>OLED</b><b class='flag-5'>顯示屏</b><b class='flag-5'>驅動</b>

    商場透明oled顯示屏怎么樣

    和廣告宣傳的新寵。OLED透明以其獨特的透明度和高亮度,為商場提供了全新的展示方式。那么,商場透明OLED顯示屏到底怎么樣呢?本文將從技術、商業等多個角度進行分析。 首先,從技術角度
    的頭像 發表于 08-16 15:55 ?759次閱讀

    商業透明oled顯示屏怎么用

    尼伽OLED透明技術研發部整理發布,轉載須注明來源 商業透明OLED顯示屏怎么用 隨著科技的不斷進步,OLED透明
    的頭像 發表于 08-16 16:23 ?745次閱讀

    展廳透明oled顯示屏怎么樣

    顯示技術,逐漸在各個領域得到應用。展廳作為企業展示形象和產品的重要場所,透明OLED顯示屏的應用也越來越受到關注。本文將從技術、商業等角度探討展廳透明OLED
    的頭像 發表于 08-16 16:46 ?992次閱讀

    全息透明oled顯示屏怎么用

    的應用前景。 全息透明OLED顯示屏的基本原理是利用有機發光二極管(OLED)的特性,通過控制電流的大小和方向來實現顯示效果。
    的頭像 發表于 08-16 17:08 ?1245次閱讀

    LCD顯示屏、LED顯示屏OLED顯示屏有什么區別?

    LCD顯示屏、LED顯示屏OLED顯示屏有什么區別? LCD顯示屏、LED顯示屏
    的頭像 發表于 12-11 14:29 ?2.2w次閱讀
    主站蜘蛛池模板: 成人欧美一区二区三区视频| 丁香花小说| 日本在线一级| 免费视频在线视频观看1| 天天摸天天爽天天澡视频| 天天夜天天干| 欧美成人全部费免网站| 国产亚洲精品久久久久久牛牛| 2022天天干| 日本aaaaa特黄毛片| 亚洲五月婷| 特级毛片aaaa级毛片免费| 起碰成人免费公开网视频| 久久大伊人| 夜夜操com| 国产三片高清在线观看| 日韩操穴| 东北老女人啪啪对白| 黄色欧美| 成人免费aaaaa毛片| 久久久久国产成人精品亚洲午夜| jzzjlzz亚洲乱熟在线播放| 午夜嘿嘿| 午夜精品福利在线| 男女免费网站| 97久久精品国产精品青草| 天天干天天天天| 永久免费人成网ww555kkk手机| 午夜精品久久久久久久第一页 | 国产精品久久久久影院色老大| 美女被免费视频网站九色| 高清人人天天夜夜曰狠狠狠狠| 天天操操操操| 欧美极品另类| 亚洲欧美在线播放| 欧美一级特黄乱妇高清视频| 广东毛片| 好吊色视频988gao在线观看| 色偷偷亚洲综合网亚洲| 日韩系列| 综合网激情|