目錄
- 一、LCD1602簡介
-
- 1.1 顯示原理
- 1.2 引腳及應用電路
- 1.3 技術參數
- 1.4 引腳功能
- 1.5 指令集
- 1.6 連接配接方式
- 二、時序圖
-
- 2.1 寫時序
- 2.2 讀時序
- 三、代碼示範
-
- 3.1 LCD1602.c
- 3.2 示例
- 注意:一定要看
一、LCD1602簡介
LCD1602(Liquid Crystal Display)液晶顯示屏是一種字元型液晶顯示子產品,可以顯示ASCII碼的标準字元和其它的一些内置特殊字元,還可以有8個自定義字元
顯示容量:16×2個字元,每個字元為5*7點陣
1.1 顯示原理
點陣圖形式液晶由M×N個顯示單元組成,假設LCD顯示屏有64行,每行有128列,每8列對應1位元組的8位,即每行由16位元組,共16×8=128個點組成。顯示屏上64×16個顯示單元與顯示RAM區的1024位元組相對應,每一位元組的内容與顯示屏上相應位置的亮暗對應。例如顯示屏第一行的亮暗由RAM區的000H~00FH的16位元組的内容決定,當(000H)=FFH時,螢幕左上角顯示一條短亮線,長度為8個點;當(3FFH)=FFH時,螢幕右下角顯示一條短亮線;當(000H)=FFH,(001H)=00H,(002H)=00H…,(00EH)=00H,(00FH)=00H時,在螢幕的頂部顯示一條由8條亮線和8條暗線組成的虛線。
字元型液晶顯示子產品是一種專門用于顯示字母、數字和符号等的點陣式LCD,常用16×1,16×2,20×2和40×2等的子產品。一般的LCD1602字元型液晶顯示器的内部控制器大部分為HD44780,能夠顯示英文字母、阿拉伯數字、日文片假名和一般性符号。
1.2 引腳及應用電路
1.3 技術參數
(1)顯示容量:16×2個字元。
(2)晶片工作電壓:4.5~5.5V。
(3)工作電流:2.0mA(5.0V)。
(4)子產品最佳的工作電壓:5.0V。
(5)字元尺寸:2.95mm×4.35mm(寬×高)。
1.4 引腳功能
LCD1602采用标準的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明見下表
各引腳的功能介紹如下:
·引腳1:VSS為地電源。
·引腳2:VDD接5V正電源。
·引腳3:VL為液晶顯示器對比度調整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會産生“鬼影”現象,使用時可以通過一個10kQ的電位器調整其對比度。
·引腳4:RS為寄存器選擇腳,高電平時選擇資料寄存器、低電平時選擇指令寄存器。
·引腳5:R/W為讀/寫信号線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或顯示位址;當RS為低電平,R/W為高電平時,可以讀忙信号;當RS為高電平,R/W為低電平時,可以寫入資料。
·引腳6:E端為使能端,當E端由高電平跳變為低電平時,液晶子產品執行指令。
·引腳7~ 14:D0~D7為8位雙向資料線。
·引腳15:背光源正極。
·引腳16:背光源負極。
1.5 指令集
LCD1602液晶子產品内部的控制器共有11條控制指令
LCD1602液晶子產品的讀/寫操作、顯示屏和光标的操作都是通過指令程式設計來實作的(其中,1為高電平,0為低電平),分别介紹如下:
(1)指令1:清屏。指令碼01H,光标複位到位址00H。
(2)指令2:光标複位。光标複位到位址00H。
(3)指令3:輸入方式設定。其中,I/D表示光标的移動方向,高電平右移,低電平左移;S表示顯示屏上所有文字是否左移或右移,高電平表示有效,低電平表示無效。
(4)指令4:顯示開關控制。其中,D用于控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示;C用于控制光标的開與關,高電平表示有光标,低電平表示無光标;B用于控制光标是否閃爍,高電平閃爍,低電平不閃爍。
(5)指令5:光标或字元移位控制。其中,S/C表示在高電平時移動顯示的文字,低電平時移動光标。
(6)指令6:功能設定指令。其中,DL表示在高電平時為8位總線,低電平時為4位總線;N表示在低電平時為單行顯示,高電平時雙行顯示;F表示在低電平時顯示5×7的點陣字元,高電平時顯示5×10的點陣字元。
(7)指令7:字元發生器RAM位址設定。
(8)指令8:DDRAM位址設定。
(9)指令9:讀忙信号和光标位址。其中,BF為忙标志位,高電平表示忙,此時子產品不能接收指令或資料,如果為低電平則表示不忙。
(10)指令10:寫資料。
(11)指令11:讀資料。
1.6 連接配接方式
LCD1602與單片機的連接配接有兩種方式,一種是直接控制方式,另一種是所謂的間接控制方式。它們的差別隻是所用的資料線的數量不同,其他都一樣。
1.直接控制方式
LCD1602的8根資料線和3根控制線E,RS和R/W與單片機相連後即可正常工作。一般應用中隻須往LCD1602中寫入指令和資料,是以,可将LCD1602的R/W讀/寫選擇控制端直接接地,這樣可節省1根資料線。VO引腳是液晶對比度調試端,通常連接配接一個10kΩ的電位器即可實作對比度的調整;也可采用将一個适當大小的電阻從該引腳接地的方法進行調整,不過電阻的大小應通過調試決定。
2.間接控制方式
間接控制方式也稱為四線制工作方式,是利用HD44780所具有的4位資料總線的功能,将電路接口簡化的一種方式。為了減少接線數量,隻采用引腳DB4~DB7與單片機進行通信,先傳資料或指令的高4位,再傳低4位。采用四線并口通信,可以減少對微控制器I/O的需求,當設計産品過程中單片機的I/O資源緊張時,可以考慮使用此方法。
二、時序圖
2.1 寫時序
2.2 讀時序
三、代碼示範
3.1 LCD1602.c
#include <REGX52.H>
//引腳定義
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DataPort P0
/**
* @brief LCD1602延時函數,12MHz調用可延時1ms
* @param 無
* @retval 無
*/
void LCD_Delay() //@12.000MHz 1ms
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
/**
* @brief LCD1602寫指令
* @param Command 要寫入的指令
* @retval 無
*/
void LCD_WriteCommand(unsigned char Command)
{
LCD_RS=0;
LCD_RW=0;
LCD_DataPort=Command;
LCD_E=1;
LCD_Delay();
LCD_E=0;
LCD_Delay();
}
/**
* @brief LCD1602寫資料
* @param Data 要寫入的資料
* @retval 無
*/
void LCD_WriteData(unsigned char Data)
{
LCD_RS=1;
LCD_RW=0;
LCD_DataPort=Data;
LCD_E=1;
LCD_Delay();
LCD_E=0;
LCD_Delay();
}
/**
* @brief LCD1602初始化函數
* @param 無
* @retval 無
*/
void LCD_Init(void)
{
LCD_WriteCommand(0x38);
LCD_WriteCommand(0x0C);
LCD_WriteCommand(0x06);
LCD_WriteCommand(0x01);
}
/**
* @brief LCD1602設定光标位置
* @param Line 行位置,範圍:1~2
* @param Column 列位置,範圍:1~16
* @retval 無
*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
if(Line==1)
{
LCD_WriteCommand(0x80|(Column-1));
}
else
{
LCD_WriteCommand(0x80|(Column-1)+0x40);
}
}
/**
* @brief 在LCD1602指定位置上顯示一個字元
* @param Line 行位置,範圍:1~2
* @param Column 列位置,範圍:1~16
* @param Char 要顯示的字元
* @retval 無
*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{
LCD_SetCursor(Line,Column);
LCD_WriteData(Char);
}
/**
* @brief 在LCD1602指定位置開始顯示所給字元串
* @param Line 起始行位置,範圍:1~2
* @param Column 起始列位置,範圍:1~16
* @param String 要顯示的字元串
* @retval 無
*/
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=0;String[i]!='\0';i++)
{
LCD_WriteData(String[i]);
}
}
/**
* @brief 傳回值=X的Y次方
*/
int LCD_Pow(int X,int Y)
{
unsigned char i;
int Result=1;
for(i=0;i<Y;i++)
{
Result*=X;
}
return Result;
}
/**
* @brief 在LCD1602指定位置開始顯示所給數字
* @param Line 起始行位置,範圍:1~2
* @param Column 起始列位置,範圍:1~16
* @param Number 要顯示的數字,範圍:0~65535
* @param Length 要顯示數字的長度,範圍:1~5
* @retval 無
*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);
}
}
/**
* @brief 在LCD1602指定位置開始以有符号十進制顯示所給數字
* @param Line 起始行位置,範圍:1~2
* @param Column 起始列位置,範圍:1~16
* @param Number 要顯示的數字,範圍:-32768~32767
* @param Length 要顯示數字的長度,範圍:1~5
* @retval 無
*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{
unsigned char i;
unsigned int Number1;
LCD_SetCursor(Line,Column);
if(Number>=0)
{
LCD_WriteData('+');
Number1=Number;
}
else
{
LCD_WriteData('-');
Number1=-Number;
}
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);
}
}
/**
* @brief 在LCD1602指定位置開始以十六進制顯示所給數字
* @param Line 起始行位置,範圍:1~2
* @param Column 起始列位置,範圍:1~16
* @param Number 要顯示的數字,範圍:0~0xFFFF
* @param Length 要顯示數字的長度,範圍:1~4
* @retval 無
*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
unsigned char i;
unsigned char SingleNumber;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
SingleNumber=Number/LCD_Pow(16,i-1)%16;
if(SingleNumber<10)
{
LCD_WriteData('0'+SingleNumber);
}
else
{
LCD_WriteData('A'+SingleNumber-10);
}
}
}
/**
* @brief 在LCD1602指定位置開始以二進制顯示所給數字
* @param Line 起始行位置,範圍:1~2
* @param Column 起始列位置,範圍:1~16
* @param Number 要顯示的數字,範圍:0~1111 1111 1111 1111
* @param Length 要顯示數字的長度,範圍:1~16
* @retval 無
*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
unsigned char i;
LCD_SetCursor(Line,Column);
for(i=Length;i>0;i--)
{
LCD_WriteData('0'+Number/LCD_Pow(2,i-1)%2);
}
}
3.2 示例
#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
void main()
{
LCD_Init(); //LCD初始化
LCD_ShowChar(1,1,'A'); //在1行1列顯示字元A
LCD_ShowString(1,3,"Hello"); //在1行3列顯示字元串Hello
LCD_ShowNum(1,9,66,2); //在1行9列顯示數字66,長度為2
LCD_ShowSignedNum(1,12,-88,2); //在1行12列顯示有符号數字-88,長度為2
LCD_ShowHexNum(2,1,0xA5,2); //在2行1列顯示十六進制數字0xA5,長度為2
LCD_ShowBinNum(2,4,0xA5,8); //在2行4列顯示二進制數字0xA5,長度為8
LCD_ShowChar(2,13,0xDF); //在2行13列顯示編碼為0xDF的字元
LCD_ShowChar(2,14,'C'); //在2行14列顯示字元C
while(1)
{
}
}
注意:一定要看
千萬不要直接複制代碼,因為是子產品化編寫,子產品的代碼沒有往上複制(子產品的代碼在以往的文章中可以找到),大家一定要自己動手,跟着視訊學!!!!!