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

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

3天內不再提示

LCD1602液晶顯示屏的驅動設計與實現

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

LCD1602是一種工業字符型液晶,能夠同時顯示16x02即32個字符。LCD1602液晶顯示的原理是利用液晶的物理特性,通過電壓對其顯示區域進行控制,即可以顯示出圖形。在這一章我們就來討論LCD1602液晶顯示屏驅動的設計與實現。

1、功能概述

??LCD1602液晶又被稱作1602字符型液晶,這是一種只用來顯示字母、數字、符號等的點陣型液晶模塊。LCD1602里面存儲器一般有三種:CGROM、CGRAM、DDRAM。其中DDRAM(Display Data RAM)就是顯示數據RAM,用來寄存待顯示的字符代碼。共80個字節,其地址和屏幕的對應關系如下如圖所示:

??LCD1602使用三條控制線:EN、RW、RS。 其中EN的作用其實就是中線的功能,RW和RS指示了讀、它寫的是寫的方向和內容。在讀數據(或者Busy標志)期間,EN線必須保持高電平;而在寫指令(或者數據)過程中,EN線上必須送出一個正脈沖。RW、RS的組合一共有四種情況,分別對應四種操作:

??(1)、RS=0、RW=0——表示向LCD寫入指令。

??(2)、RS=0、RW=1——表示讀取Busy標志。

??(3)、RS=1、RW=0——表示向LCD寫入數據。

??(4)、RS=1、RW=1——表示從LCD讀取數據。

??LCD1602利用指令碼來區分不同的操作,主要的有兩類:一是用于初始化配置的指令碼;二是用于數據控制的指令碼。第一類用于LCD初始化配置的指令碼基本上都是在系統啟動時,用于對LCD1602的一次性配置。而第二類數據操作的指令碼主要用于設置數據指針的位置,現實信息的實現與清楚等。這兩類指令碼從使用上并無太大區別,后續我們將詳細說明。

2、驅動設計與實現

??我們已經了解了LCD1602的基本情況,接下來我們將給予對LCD1602的基本了解設計LCD602的驅動程序。

2.1、對象定義

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

2.1.1、對象的抽象

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

??先來考慮屬性,作為屬性肯定是用于標識或記錄對象特征的東西。我們來考慮LCD1602液晶顯示屏對象屬性。對于LCD1602顯示屏,它主要的功能就是顯示信息,為了標識當前的狀態,我們將狀態寄存器的值作為對象的屬性。

??接著我們還需要考慮LCD1602液晶顯示屏對象的操作問題。首先我們需要控制LCD1602的3個控制引腳以實現對LCD1602的控制,但這些控制引腳的操作都與具體的操作平臺相關,所以我們將其作為對象的操作來實現。同樣的我們還需要向LCD1602發送命令和數據以及從LCD1602獲取消息,而讀取和發送都是依賴于具體的操作平臺的所以我們將其作為LCD1602的兩個操作。我們對LCD1602進行操作,免不了要進行時序控制,所以我們需要有延時操作,但我們都明白演示操作依賴于具體的軟硬件平臺,所以我們將延時處理函數也作為對象的操作。

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

/* 定義LCD1602的對象類型 */
typedef struct LCD1602Object {
  uint8_t status;
  LCD1602PinSetType *PinHandle;
  void(*SendByte)(uint8_t data);
  uint8_t(*GetByte)(void);
  void (*Delayus)(volatile uint32_t period);    //微秒延時函數
  void (*Delayms)(volatile uint32_t nTime);     //毫秒秒延時函數
}LCD1602ObjectType;

2.1.2、對象初始化

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

/*對顯示屏作初始化配置*/
void LCD1602Initialization(LCD1602ObjectType *lcd,              //LCD1602對象指針
                           LCD1602PinSetType *PinHandle,         //控制引腳操作函數指針數組
                           LCD1602SendByteType sendByte,        //發送一個字節函數指針
                           LCD1602GetByteType getByte,          //讀取一個字節函數指針
                           LCD1602DelayType delayus,            //微秒延時函數指針
                           LCD1602DelayType delayms             //毫秒延時函數指針
                             )
{
  if((lcd==NULL)||(PinHandle==NULL)||(sendByte==NULL)||(getByte==NULL)||(delayus==NULL)||(delayms==NULL))
  {
    return;
  }
  
  lcd->PinHandle=PinHandle;
  lcd->SendByte=sendByte;
  lcd->GetByte=getByte;
  lcd->Delayus=delayus;
  lcd->Delayms=delayms;
  
  lcd->Delayus(15);
  WriteCommandToLCD1602(lcd,0x38);
  lcd->Delayms(5);
  WriteCommandToLCD1602(lcd,0x38);
  lcd->Delayms(5);
  WriteCommandToLCD1602(lcd,0x38);
  
  /*后續需要檢測BUSY,等待10Mms*/
  lcd->Delayms(10);
  WriteCommandToLCD1602(lcd,0x38);//顯示模式設置
  lcd->Delayms(10);
  WriteCommandToLCD1602(lcd,0x08);//顯示關閉
  lcd->Delayms(10);
  WriteCommandToLCD1602(lcd,0x01);//顯示清屏
  lcd->Delayms(10);
  WriteCommandToLCD1602(lcd,0x06);//顯示光標移動位置
  lcd->Delayms(10);
  WriteCommandToLCD1602(lcd,0x0C);//顯示開及光標設置

  lcd->PinHandle[LCD1602_EN](Low);
  
  lcd->status=ReadStatusFromLCD1602(lcd);
}

2.2、對象操作

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

2.2.1、讀數據操作

??我們需要從LCD1602液晶顯示屏獲取一定的數據,包括讀取狀態信息和數據信息,唯一的區別只是RS控制引腳的電平,其他的操作都一樣,讀取數據的時序圖如下所示:

??根據我們前面的描述及上面的時序圖,我們可以實現獲取狀態信息及數據的操作函數如下:

/*從LCD1602讀狀態*/
static uint8_t ReadStatusFromLCD1602(LCD1602ObjectType *lcd)
{
  uint8_t status;
  lcd->PinHandle[LCD1602_RS](Low);
  lcd->PinHandle[LCD1602_RW](High);
  lcd->PinHandle[LCD1602_EN](High);
  
  lcd->Delayus(20);
  status=lcd->GetByte();
  lcd->PinHandle[LCD1602_EN](Low);
  lcd->Delayus(5);
  return status;
}
/*從LCD1602讀數據*/
static uint8_t ReadDataFromLCD1602(LCD1602ObjectType *lcd)
{
  uint8_t data;
  lcd->PinHandle[LCD1602_RS](High);
  lcd->PinHandle[LCD1602_RW](High);
  lcd->PinHandle[LCD1602_EN](High);
  
  lcd->Delayus(20);
  data=lcd->GetByte();
  lcd->PinHandle[LCD1602_EN](Low);
  lcd->Delayus(5);
  return data;
}

2.2.2、寫數據操作

??我們想要在LCD1602顯示屏上顯示我們想要的消息就需要向LCD1602顯示屏發送命令和數據。發送數據和發送命令的區別僅是RS控制引腳的操作電平不同,具體的操作時序如下所示:

/*向LCD1602寫指令*/
static void WriteCommandToLCD1602(LCD1602ObjectType *lcd,uint8_t command)
{
  lcd->PinHandle[LCD1602_RS](Low);
  lcd->PinHandle[LCD1602_RW](Low);

  lcd->SendByte(command);

  lcd->PinHandle[LCD1602_EN](High);
  lcd->Delayus(20);
  lcd->PinHandle[LCD1602_EN](Low);
  lcd->Delayus(5);
}
/*向LCD1602寫數據*/
static void WriteDatatoLCD1602(LCD1602ObjectType *lcd,uint8_t data)
{
  lcd->PinHandle[LCD1602_RS](High);
  lcd->PinHandle[LCD1602_RW](Low);

  lcd->SendByte(data);

  lcd->PinHandle[LCD1602_EN](High);
  lcd->Delayus(20);
  lcd->PinHandle[LCD1602_EN](Low);
  lcd->Delayus(5);
}

3、驅動的使用

??我們已經實現了LCD1602液晶顯示屏驅動程序,在接下來我們還需要設計一個簡單的應用驗證這一驅動設計是否正確。

3.1、聲明并初始化對象

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

??LCD1602ObjectType lcd;

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

LCD1602ObjectType *lcd,              //LCD1602對象指針
LCD1602PinSetType *PinHandle,         //控制引腳操作函數指針數組
LCD1602SendByteType sendByte,        //發送一個字節函數指針
LCD1602GetByteType getByte,          //讀取一個字節函數指針
LCD1602DelayType delayus,            //微秒延時函數指針
LCD1602DelayType delayms             //毫秒延時函數指針

??對于這些參數,對象變量我們已經定義了。主要的是我們需要定義幾個函數,并將函數指針作為參數。這幾個函數的類型如下:

/*定義引腳操作函數指針類型*/
typedef void (*LCD1602PinSetType)(uint8_t value);
/*定義發送一個字節操作函數指針*/
typedef void(*LCD1602SendByteType)(uint8_t data);
/*定義讀取一個字節操作函數指針*/
typedef uint8_t(*LCD1602GetByteType)(void);
/*定義延時操作函數指針*/
typedef void (*LCD1602DelayType)(volatile uint32_t time);

??對于這幾個函數我們根據樣式定義就可以了,具體的操作可能與使用的硬件平臺有關系??刂埔_的操作函數實際是3個,組成一個函數指針數組,分別對應RS、RW、EN控制引腳。具體函數定義如下:

LCD1602PinSetType pinSets[3]={RsPinOperation,RwPinOperation,EnPinOperation};

/*RS控制引腳操作*/
static void RsPinOperation(uint8_t value)
{
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_7,(GPIO_PinState)value);
}

/*RW控制引腳操作*/
static void RwPinOperation(uint8_t value)
{
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_8,(GPIO_PinState)value);
}

/*EN控制引腳操作*/
static void EnPinOperation(uint8_t value)
{
  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_9,(GPIO_PinState)value);
}

/*從LCD1602讀一個字節*/
static uint8_t ReadByteFromLCD(void)
{
  uint8_t data=0;
  
  data=(uint8_t)(GPIOD->IDR);
  
  return data;
}
                               
/*向LCD1602寫一個字節*/
static void WriteByteToLCD(uint8_t data)
{
  uint16_t value=GPIOD->ODR;
  
  value=(value&&0xFF00)||data;
  
  GPIOD->ODR=value;
}

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

LCD1602Initialization(&lcd,              //LCD1602對象指針
                 pinSets,         //控制引腳操作函數指針數組
                 WriteByteToLCD,        //發送一個字節函數指針
                 ReadByteFromLCD,          //讀取一個字節函數指針
                 Delayus,            //微秒延時函數指針
                 HAL_Delay             //毫秒延時函數指針
               );

3.2、基于對象進行操作

??我們定義了對象變量并使用初始化函數給其作了初始化。接著我們就來考慮操作這一對象獲取我們想要的數據。我們在驅動中已經將獲取數據并轉換為轉換值的比例值,接下來我們使用這一驅動開發我們的應用實例。

/*在LCD1602中顯示數據*/
void LCD1602Display(void)
{
  float temp=20.5;
  float pres=101.35;
  float humi=34.6;
  
  LCD1602DisplayClear(&lcd,LCD1602_AllLine),
  
  Lcd1602ContentDisplay(&lcd,0x80, "T%0.1fC,P%0.1fKPa,H%0.1f%%", temp,pres, humi);
  Lcd1602ContentDisplay(&lcd,0xC0, "T%0.1fC,P%0.1fKPa,H%0.1f%%", temp,pres, humi);
}

??我們將顯示器清屏,然后再每一行都顯示溫度、壓力和濕度數據。

4、應用總結

??我們已經設計并實現了LCD1602的驅動程序,并在此基礎上設計了簡單的驗證應用。我們可以正常讀寫LCD1602顯示屏,并且在LCD1602顯示屏正確心事我們想要的信息,說明我們的驅動設計是沒有問題的。

??在使用驅動時,有一點需要注意。因為在初始化函數中,對控制引腳的操作采用的時函數指針數組,但這個數組元素的順序不是隨意的,而是必須與枚舉類型LCD1602PinType中定義的順序一致才能正確操作。

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

    關注

    28

    文章

    4299

    瀏覽量

    73037
  • 驅動設計
    +關注

    關注

    1

    文章

    108

    瀏覽量

    15206
  • LCD1602
    +關注

    關注

    14

    文章

    606

    瀏覽量

    52158
  • 液晶顯示屏
    +關注

    關注

    1

    文章

    200

    瀏覽量

    26413
收藏 人收藏

    評論

    相關推薦

    怎樣使用單片機去控制LCD1602液晶顯示屏顯示時間等信息

    怎樣使用單片機去控制LCD1602液晶顯示屏顯示時間等信息?如何對基于單片機的LCD1602液晶顯示屏進行仿真?
    發表于 09-01 06:14

    基于Arduino實現測量距離并將結果顯示LCD1602液晶顯示屏

    Arduino實現超聲波測距+LCD液晶屏實時顯示1、描述利用HC-SR04超聲波測距模塊,基于Arduino實現測量距離,并將結果
    發表于 12-10 06:49

    STM32是怎樣去控制LCD1602液晶顯示屏

    LCD1602的常用指令有多少???STM32是怎樣去控制LCD1602液晶顯示屏的?
    發表于 12-15 06:30

    請問如何驅動LCD1602液晶顯示屏?

    LCD1602液晶顯示屏的原理是什么?如何驅動LCD1602液晶顯示屏?
    發表于 01-17 08:29

    LCD1602液晶顯示屏的操作流程是怎樣的呢

    什么是LCD1602液晶顯示屏呢?LCD1602液晶顯示屏的操作流程是怎樣的呢?
    發表于 01-26 06:32

    如何對LCD1602液晶顯示屏進行編程呢

    LCD1602液晶顯示屏的引腳功能有哪些呢?如何對LCD1602液晶顯示屏進行編程呢?
    發表于 01-26 08:26

    STM32是怎樣通過IIC去控制LCD1602液晶顯示屏的呢

    LCD1602常用指令有哪些呢?STM32是怎樣通過IIC去控制LCD1602液晶顯示屏的呢?
    發表于 01-26 07:44

    LCD1602液晶顯示器的相關資料推薦

    LCD1602液晶顯示器是廣泛使用的一種字符型液晶顯示模塊。它是由字符型液晶顯示屏LCD)、控制驅動
    發表于 02-07 08:52

    液晶顯示模塊LCD1602應用

    液晶顯示模塊LCD1602應用
    發表于 09-25 16:58 ?683次下載
    <b class='flag-5'>液晶顯示</b>模塊<b class='flag-5'>LCD1602</b>應用

    lcd1602顯示原理,LCD1602液晶顯示器的分類有哪些?

    LCD1602是一種工業字符型液晶,能夠同時顯示16x02即32個字符。LCD1602液晶顯示原理 LC
    發表于 10-20 10:32 ?3.6w次閱讀

    lcd1602與單片機連接圖,基于51單片機的lcd1602液晶顯示屏連接電路圖

     LCD1602是一種工業字符型液晶,能夠同時顯示16x02即32個字符。LCD1602液晶顯示原理 L
    發表于 10-20 11:33 ?13.9w次閱讀

    LCD1602液晶顯示屏的基礎驅動程序免費下載

    本文檔的主要內容詳細介紹的是LCD1602液晶顯示屏的基礎驅動程序免費下載。
    發表于 08-16 17:32 ?17次下載
    <b class='flag-5'>LCD1602</b><b class='flag-5'>液晶顯示屏</b>的基礎<b class='flag-5'>驅動</b>程序免費下載

    lcd1602液晶顯示屏介紹_lcd1602引腳功能

    本文首先闡述了lcd1602液晶顯示屏的概念,其次闡述了LCD1602外形尺寸,最后介紹了lcd1602引腳功能。
    發表于 04-23 08:53 ?6.9w次閱讀

    LCD1602液晶顯示器的使用要點

    LCD1602液晶顯示器是最為廣泛使用的一種字符型液晶顯示模塊。
    的頭像 發表于 07-11 16:56 ?1.5w次閱讀

    51單片機——LCD1602液晶顯示屏

    如下圖:紅框就是LCD1602液晶顯示屏,他是可插拔的,插上去后數碼管就會亂碼無效了,因為他兩共用了MCU的8個P0口LCD1602原理圖從上面兩幅圖可以看出來LCD1602
    發表于 11-23 16:51 ?11次下載
    51單片機——<b class='flag-5'>LCD1602</b><b class='flag-5'>液晶顯示屏</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>