天天看點

MCU-51:單片機LCD1602詳解一、LCD1602簡介二、時序圖三、代碼示範注意:一定要看

目錄

  • 一、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點陣

MCU-51:單片機LCD1602詳解一、LCD1602簡介二、時序圖三、代碼示範注意:一定要看

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 引腳及應用電路

MCU-51:單片機LCD1602詳解一、LCD1602簡介二、時序圖三、代碼示範注意:一定要看
MCU-51:單片機LCD1602詳解一、LCD1602簡介二、時序圖三、代碼示範注意:一定要看

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腳(帶背光)接口,各引腳接口說明見下表

MCU-51:單片機LCD1602詳解一、LCD1602簡介二、時序圖三、代碼示範注意:一定要看

各引腳的功能介紹如下:

·引腳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條控制指令

MCU-51:單片機LCD1602詳解一、LCD1602簡介二、時序圖三、代碼示範注意:一定要看

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 寫時序

MCU-51:單片機LCD1602詳解一、LCD1602簡介二、時序圖三、代碼示範注意:一定要看

2.2 讀時序

MCU-51:單片機LCD1602詳解一、LCD1602簡介二、時序圖三、代碼示範注意:一定要看
MCU-51:單片機LCD1602詳解一、LCD1602簡介二、時序圖三、代碼示範注意:一定要看

三、代碼示範

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)
	{
	}
}
           

注意:一定要看

千萬不要直接複制代碼,因為是子產品化編寫,子產品的代碼沒有往上複制(子產品的代碼在以往的文章中可以找到),大家一定要自己動手,跟着視訊學!!!!!

繼續閱讀