【51單片機系列】LCD1602液晶模塊

本文是關(guān)于液晶顯示屏的相關(guān)介紹。相對于靜態(tài)數(shù)碼管、動態(tài)數(shù)碼管、LED點陣等,LCD1602液晶顯示器能夠顯示更多的字符數(shù)字信息,并且也是常用的一種顯示裝置。

一、LCD1602介紹

1.1、LCD1602簡介

1602液晶,也叫做1602字符型液晶,可以顯示2行字符信息,每行可以顯示16個字符,是一種專門用來顯示字母、數(shù)字、符號的點陣型液晶模塊。

LCD1602由若干個5x7或者5x10的點陣字符位組成,每個點陣字符位都可以顯示一個字符,每位之間有一個點距地間隔,每行之間也有間隔,起到了字符間距和行間距的作用。

LCD1602實物如下:

LCD1602實物圖

從實物圖中可以看到16個管腳孔,從左至右管腳編號順序是1-16,管腳功能定義如下表:

管腳編號 符號 管腳說明
1 VSS 電源地
2 VDD 電源正極
3 VL 液晶顯示偏壓信號
4 RS 數(shù)據(jù)/命令選擇端 H/L
5 R/W 讀/寫選擇端 H/L
6 E 使能信號
7~14 D0~D7 Data I/O
15 BLA 背光源正極
16 BLK 背光源負極

管腳詳細說明:

  • 3腳-VL:液晶顯示偏壓信號,該管腳用來調(diào)整LCD1602的顯示對比度,一般會外接電位器用以調(diào)整偏壓信號。需要注意的是,該管腳電壓為0時可以得到最強的對比度。
  • 4腳-RS:數(shù)據(jù)/命令選擇端,當該管腳為高電平時,可以對1602進行數(shù)據(jù)字節(jié)的傳輸操作;該管腳為低電平時,對1602進行命令字節(jié)的傳輸操作。所謂命令字節(jié),就是對LCD1602的一些工作方式設置的字節(jié);數(shù)據(jù)字節(jié),用來在1602上顯示的字節(jié)。LCD1602的數(shù)據(jù)是8位的。
  • 5腳-R/W:讀寫選擇端。當該管腳為高電平時可對LCD1602進行讀數(shù)據(jù)操作,該管腳為低電平時對LCD1602進行寫數(shù)據(jù)操作。
  • 6腳-E:使能信號,實際上是LCD1602的數(shù)據(jù)控制時鐘信號,使用該管腳的上升沿實現(xiàn)對LCD1602的數(shù)據(jù)傳輸。
  • 7~14腳-8位并行數(shù)據(jù)口:51單片機一組IO也是8位,方便了對LCD1602的數(shù)據(jù)讀寫。

LCD1602內(nèi)部含有80字節(jié)的DDRAM,是用來存儲顯示字符的。其地址和屏幕的對應關(guān)系如下:

顯示位置 1 2 3 4 5 6 7 ...... 40
DDRAM地址 第一行 00H 01H 02H 03H 04H 05H 06H ...... 27H
DDRAM地址 第二行 40H 41H 42H 43H 44H 45H 46H ...... 67H
LCD602地址和屏幕對應關(guān)系

從上圖可以看到,并不是所有的地址都能直接用來顯示字符。只有第一行中的00-0F,第二行中的40-4F才能顯示,其它地址只能用于存儲

要顯示字符時首先要輸入顯示字符地址,即明確在哪里顯示字符。比如第二行第一個字符地址是40H,不能夠直接寫入40H,因為寫入顯示地址時要求最高位D7為1,所以第二行第一個字符地址應該是40H|80H=C0H。

1.2、LCD1602常用指令

LCD1602有一些常用指令,這些指令對于初始化是必須的。

LCD1602常用指令

1.3、LCD1602使用

要使用LCD1602,首先需要對其初始化,即通過寫入一些特定的指令實現(xiàn);然后選擇要在LCD1602的哪個位置顯示并將所要顯示的數(shù)據(jù)發(fā)送到LCD的DDRAM。

使用LCD1602通常用于寫數(shù)據(jù)進去,比較少使用讀功能。

LCD1602操作步驟如下:

① 初始化

② 寫命令,RS=L,設置顯示坐標;

③ 寫數(shù)據(jù),RS=H;

這里不需要讀數(shù)據(jù),所以只需要兩個寫時序。

  • 第一個是寫指令字時序。設置LCD1602的工作方式時,需要把RS置為低電平,RW置為低電平,然后將指令字送到數(shù)據(jù)口D0~D7,最后E使能引腳一個高脈沖將數(shù)據(jù)寫入。
  • 第二個是寫數(shù)據(jù)字時序。LCD1602實現(xiàn)顯示時,需要把RS置為高電平,RW置為低電平,然后將數(shù)據(jù)字送到數(shù)據(jù)口D0~D7,最后E使能引腳一個高脈沖將數(shù)據(jù)寫入。

從上面兩個時序可以看出,寫指令和寫數(shù)據(jù)只是RS電平不一樣。

LCD1602時序圖如下:

LCD1602時序圖
LCD1602時序圖時間

從上圖中可以看到時序圖中的時間參數(shù)全部是ns級別的,51單片機的機器周期是1us,指令周期是2~4個機器周期,所以在程序中可以不加延時程序,也能適配LCD1602的時序要求。

當要寫命令字時,時間由左往右,RS變?yōu)榈碗娖?,R/W變?yōu)榈碗娖?,RS的狀態(tài)先變化完成;然后DB0~DB7上數(shù)據(jù)進入有效階段,接著E引腳有一個正脈沖的跳變,接著維持時間最小值為tpw=400ns的E脈沖寬度;然后引腳E負跳變,RS電平變化,R/W電平變化。這便是一個完整的LCD1602寫命令的時序。

二、LCD1602使用示例

本示例實現(xiàn)的功能:系統(tǒng)運行時,在LCD1602液晶上顯示字符信息。使用到的資源是LCD1602液晶顯示屏。

proteus中設計原理圖如下:

PROTEUS設計LCD1602液晶顯示模塊

從上面的原理圖可以看出該電路不是獨立的,LCD1602的8位數(shù)據(jù)口DB0-DB7與單片機的P0.0-P0.7管腳鏈接;LCD1602的RS、RW、E腳與單片機的P2.6、P2.5、P2.7管腳鏈接;RV1是一個電位器,用來調(diào)節(jié)LCD1602顯示亮度。

軟件設計:

LCD發(fā)送命令和數(shù)據(jù)代碼如下:

#include <reg52.h>
#include "lcd1602.h"

// 延時函數(shù),延時ims,12MHz晶振下,12分頻單片機的延時
void lcd1602_Delay1ms(uint i)
{
    uchar a,b;
    for(;i>0;i--)
    {
        for(b=199;b>0;b--)
        {
            for(a=1;a>0;a--);
        }
    }
}

#ifndef LCD1602_4PINS  // 8位數(shù)據(jù)線
// 向LCD寫入一個字節(jié)的命令
void lcd1602_WriteCom(uchar com)
{
    LCD_EN=0;  // 使能
    LCD_RS=0;  // 發(fā)送命令
    LCD_RW=0;  // 選擇寫命令
    
    LCD_DATA=com;  // 放入數(shù)據(jù)
    lcd1602_Delay1ms(1);  // 等待數(shù)據(jù)穩(wěn)定
    
    LCD_EN=1;  // 寫入時序
    lcd1602_Delay1ms(5);  // 保持穩(wěn)定
    LCD_EN=0;  
}

// 向LCD寫入一個字節(jié)的數(shù)據(jù)
void lcd1602_WriteData(uchar dat)
{
    LCD_EN=0;  // 使能
    LCD_RS=1;  // 發(fā)送數(shù)據(jù)
    LCD_RW=0;  // 選擇寫命令
    
    LCD_DATA=dat;  // 放入數(shù)據(jù)
    lcd1602_Delay1ms(1);  // 等待數(shù)據(jù)穩(wěn)定
    
    LCD_EN=1;  // 寫入時序
    lcd1602_Delay1ms(5);  // 保持穩(wěn)定
    LCD_EN=0;   
}

// LCD1602初始化
void lcd1602_Init()
{
    lcd1602_WriteCom(LCD_MODE_8_2_5X7);  // 8位數(shù)據(jù),顯示2行,5x7點陣/每字符 38H
    lcd1602_WriteCom(LCD_CURSOR_RIGHT);  // 寫入數(shù)據(jù)后光標右移 06H
    lcd1602_WriteCom(LCD_CLEAR);  // 清屏 01H
    lcd1602_WriteCom(LCD_OPENSHOW);  // 顯示開 0CH
    lcd1602_WriteCom(LCD_START_ADDR1);  // 設置數(shù)據(jù)指針地址起始點是第一行第一列,80H=00H|80H
}

#else  // 4位數(shù)據(jù)線
// 向LCD寫入一個字節(jié)的命令
void lcd1602_WriteCom(uchar com)
{
    LCD_EN=0;  // 使能
    LCD_RS=0;  // 發(fā)送命令
    LCD_RW=0;  // 選擇寫命令
    
    LCD_DATA=com;  // 放入數(shù)據(jù),4位數(shù)據(jù),接線到P0的高四位,傳送高四位不用改
    lcd1602_Delay1ms(1);  // 等待數(shù)據(jù)穩(wěn)定
    
    LCD_EN=1;  // 寫入時序
    lcd1602_Delay1ms(5);  // 保持穩(wěn)定
    LCD_EN=0;  
    
    LCD_DATA=com<<4;
    lcd1602_Delay1ms(1);  // 等待數(shù)據(jù)穩(wěn)定
    
    LCD_EN=1;  // 寫入時序
    lcd1602_Delay1ms(5);  // 保持穩(wěn)定
    LCD_EN=0;  
}

// 向LCD寫入一個字節(jié)的數(shù)據(jù)
void lcd1602_WriteData(uchar dat)
{
    LCD_EN=0;  // 使能
    LCD_RS=1;  // 發(fā)送數(shù)據(jù)
    LCD_RW=0;  // 選擇寫命令
    
    LCD_DATA=dat;  // 放入數(shù)據(jù),4位數(shù)據(jù),接線到P0的高四位,傳送高四位不用改
    lcd1602_Delay1ms(1);  // 等待數(shù)據(jù)穩(wěn)定
    
    LCD_EN=1;  // 寫入時序
    lcd1602_Delay1ms(5);  // 保持穩(wěn)定
    LCD_EN=0;  
    
    LCD_DATA=dat<<4;
    lcd1602_Delay1ms(1);  // 等待數(shù)據(jù)穩(wěn)定
    
    LCD_EN=1;  // 寫入時序
    lcd1602_Delay1ms(5);  // 保持穩(wěn)定
    LCD_EN=0;  
}

// LCD1602初始化
void lcd1602_Init()
{
    lcd1602_WriteCom(0x32);  // 將8位總線轉(zhuǎn)為4位總線
    lcd1602_WriteCom(LCD_MODE_8_2_5X7);  // 8位數(shù)據(jù),顯示2行,5x7點陣/每字符28H
    lcd1602_WriteCom(LCD_CURSOR_RIGHT);  // 寫入數(shù)據(jù)后光標右移 06H
    lcd1602_WriteCom(LCD_CLEAR);  // 清屏 01H
    lcd1602_WriteCom(LCD_OPENSHOW);  // 顯示開 0cH
    lcd1602_WriteCom(LCD_START_ADDR1);  // 設置數(shù)據(jù)指針地址起始點是第一行第一列,80H=00H|80H
}
#endif

主函數(shù)調(diào)用:

/*
    實現(xiàn)功能:系統(tǒng)運行后,LCD1602液晶顯示屏顯示字符
    [2024-01-03] zoya
*/

#include <reg52.h>
#include "lcd1602.h"

typedef unsigned char u8;
typedef unsigned int u16;

u8 Disp[]="Pechin Science:";

void delay(u16 i)
{
    while(i--);
}
void main()
{
    u8 i;
    lcd1602_Init();  // LCD初始化
    for(i=0;i<16;i++)
    {
        lcd1602_WriteData(Disp[i]);
        delay(5000);
    }
    while(1);
}

proteus仿真結(jié)果:

LCD1602液晶顯示屏仿真結(jié)果

三、LCD擴展實驗:使用LCD1602顯示時鐘

LCD擴展實驗實現(xiàn)的功能:系統(tǒng)運行時,LCD1602顯示時間,顯示格式:第一行顯示年-月-日 星期“xxxx-xx-xx xth”,第二行顯示時:分:秒"xx:xx:xx"。使用EEPROM記錄是否已經(jīng)初始化(讀取EEPROM中0x00地址的數(shù)據(jù),如果數(shù)據(jù)為0xff表示未進行初始化,如果為0x01表示已經(jīng)進行初始化)。用到的資源有DS1302時鐘芯片、AT24C02 EEPROM芯片、LCD1602液晶顯示器。

proteus原理圖設計如下:

proteus原理圖設計使用LCD1602顯示時間信息

設計思路,首先讀取eeprom中0x00地址的數(shù)據(jù),根據(jù)數(shù)據(jù)判斷DS1302是否進行初始化,然后初始化LCD1602,在循環(huán)中讀取時間并將其顯示到LCD中。主程序編寫如下:

void main()
{
    u8 i;
    u8 dat;
    dat=AT24C02Read(EN_INIT_ADDR);
    if(0xff==dat)
    {
        DS1302Init();
        AT24C02Write(EN_INIT_ADDR, 0x01);
    }
    
    lcd1602_Init();
    
    while(1)
    {
        DataPros();
        lcd1602_WriteCom(LCD_START_ADDR1);  // 年月日星期顯示在第一行
        for(i=0;i<14;i++)
        {
            lcd1602_WriteData(Disp1Row[i]);
        }
    
        lcd1602_WriteCom(LCD_START_ADDR2);  // 時分秒顯示在第二行
        for(i=0;i<8;i++)
        {
            lcd1602_WriteData(Disp2Row[i]);
        }
        delay(500);
    }
}

數(shù)據(jù)處理函數(shù):

uchar szTime[]="0123456789 -th:";
uchar Disp2Row[16];
uchar Disp1Row[16];
void DataPros()
{
    DS1302ReadTime();
    Disp1Row[0]=szTime[2];  // 2
    Disp1Row[1]=szTime[0];  // 0
    Disp1Row[2]=szTime[TIME[6]>>4];  // 年的十位
    Disp1Row[3]=szTime[TIME[6]&0x0f];  // 年的個位
    Disp1Row[4]=szTime[11];  // -
    Disp1Row[5]=szTime[TIME[4]>>4&0x01];  // 月的十位
    Disp1Row[6]=szTime[TIME[4]&0x0f];  // 月的個位
    Disp1Row[7]=szTime[11];  // -
    Disp1Row[8]=szTime[TIME[3]>>4&0x03];  // 日的十位
    Disp1Row[9]=szTime[TIME[3]&0x0f];  // 日的個位
    Disp1Row[10]=szTime[10];  // 空格
    Disp1Row[11]=szTime[(TIME[5]&0x0f) - 1];  // 星期幾
    Disp1Row[12]=szTime[12];  // t
    Disp1Row[13]=szTime[13];  // h
    
    
    Disp2Row[0]=szTime[TIME[2]/16];  // 時的十位
    Disp2Row[1]=szTime[TIME[2]&0x0f];  // 時的個位
    Disp2Row[2]=szTime[14];  // : 冒號
    Disp2Row[3]=szTime[TIME[1]/16];  // 分的十位
    Disp2Row[4]=szTime[TIME[1]&0x0f];  // 分的個位
    Disp2Row[5]=szTime[14];  // : 冒號
    Disp2Row[6]=szTime[TIME[0]>>4&0x07];  // 秒的十位
    Disp2Row[7]=szTime[TIME[0]&0x0f];  // 秒的個位
}

仿真結(jié)果:

LCD1602顯示時間信息仿真結(jié)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容