锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

LCD1602液晶显示

时间:2023-01-18 15:30:00 单数字控制电位器single

文章目录

  • 一、LCD1602简介
    • 1. 显示原理
    • 2. 外形尺寸
    • 3. 技术参数
    • 4. 引脚功能
    • 5. 指令集
    • 6. 连接方式
  • 二、时序图
    • 1. 写时序
    • 2.读时序
  • 三、程序设计
    • 1. 写数据、指令
    • 2. 初始化,设置光标
    • 3. 读数据(读忙信号)
    • 4. 显示函数
    • 5. 示例


一、LCD1602简介

LCD1602液晶显示广泛使用的字符型液晶显示模块。它是由字符型液晶显示屏制成的(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100和少量电阻、电容元件和结构件组装在一起PCB板上而成。不同厂家生产LCD1602芯片可能不同,但使用方法相同。为了降低成本,绝大多数制造商直接在板上制作裸片。

1. 显示原理

液晶由点阵图形式M×N假设由一个显示单元组成LCD显示屏有64行,每行128列,每8列对应8个字节,即每行16字节,共16行×8=128个点组成。显示屏上64×16个显示单元和显示单元RAM1024字节对应于区域,每个字节的内容对应于显示屏上相应位置的亮度。例如显示屏第一行的亮暗由RAM区的000H~00FH当(00000H)=FFH当(3)FFH)=FFH当(0000)H)=FFH,(001H)=00H,(002H)=00H…,(00EH)=00H,(00FH)=00H在屏幕顶部显示一条由8条亮线和8条暗线组成的虚线。

字符液晶显示模块是一种点阵式,专门用于显示字母、数字和符号LCD,常用16×1,16×2,20×2和40×二等模块LCD大多数1602字符液晶显示器的内部控制器都是HD44780能显示英文字母、阿拉伯数字、日文片假名和一般符号。

2. 外形尺寸

LCD1602字符液晶显示器的实物形状如图1所示。
在这里插入图片描述
LCD1602分为带背光和无背光两种,其控制器多为HD44780。带背光的厚度比没有背光的厚度在实际应用中没有区别。具体识别方法可参考图2所示的设备尺寸示意图。

原理图:

3. 技术参数

(1)显示容量:16×2个字符。
(2)芯片工作电压:4.5~5.5V。
(3)工作电流:2.0mA(5.0V)。
(4)模块最佳工作电压:5.0V。
(5)字符尺寸:2.95mm×4.35mm(宽×高)。

4. 引脚功能

LCD1602采用标准14脚(无背光)或16脚(带背光)接口,各引脚接口说明见表1。

各引脚的功能介绍如下:
·引脚1:VSS为地电源。
·引脚2:VDD接5V正电源。
·引脚3:VL对于液晶显示器的对比度调整端,连接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生鬼影现象kQ调整
电位器的对比度。
·引脚4:RS选择寄存器的脚,高电平时选择数据寄存器,低电平时选择指令寄存器。
·引脚5:R/W为读/写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W当共同为低电时,可以写入指令或显示地址;RS为低电平,R/W为了高电,可以读忙信号;当RS为高电平,R/W在低电平时,可以写入数据。
·引脚6:E当E端从高电平跳转到低电平时,液晶模块执行命令。
·引脚7~ 14:D0~D7是8位双向数据线。
·引脚15:背光源正极。
·引脚16:背光源负极。

5. 指令集

LCD液晶模块内的控制器有11个控制指令,见表2。

LCD通过指令编程实现1602液晶模块的读写操作、显示屏和光标操作(其中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:阅读数据。

6. 连接方式

LCD1602和单片机有两种连接方式,一种是直接控制,另一种是所谓的间接控制。它们之间的区别只是使用的数据线数量不同,其他数据都是一样的。

1.直接控制模式
LCD16028根数据线和3根控制线E,RS和R/W与单片机连接后即可正常工作。一般应用只需要往LCD命令和数据可以写入1602,因此LCD1602的R/W读写选择控制端直接接地,可节省1条数据线。VO引脚是液晶对比度调试端,通常连接10个kΩ电位器可以调整对比度;也可以通过引脚接地调整适当大小的电阻,但电阻的大小应通过调试确定。

2.间接控制模式
间接控制也被称为四线工作模式HD四位数据总线的功能是简化电路接口的一种方式。为减少接线数量,只使用引脚DB4~DB7与单片机通信,先传输数据或命令,再传输4位。四线并口通信可以减少
微控制器I/O产品设计过程中单片机的需求I/O当资源紧张时,可以考虑使用这种方法。

二、时序图

1. 写时序

2.读时序

综上:

三、程序设计

1. 写数据和指令

/** * @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 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();
}

2. 初始化、设光标

/** * @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);
	}
}

3. 读数据(读忙信号)

	read_busy_flag()
	{ 
        
		unsigned char flag; // flag为LCD状态标志
		                    //Px为LCD上8位数据总线所连接的单片机IO端口
		Px = 0xFF;          // 给8位数据总线赋值11111111 
		LCD_RS = 0;             // 选择指令寄存器,读取LCD状态字
		LCD_RW = 1;             // 读操作
		do
		{ 
        
			LCD_E = 1;   // 使能端拉高
			flag = Px; // 读取LCD状态
			LCD_E = 0; // 使能端拉低
		} while(flag & 0x80); // 如果DB7依然为1,表示忙,直到DB7为0时跳出
	}

4. 显示函数

/** * @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);
	}
}

5. 示例

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)
	{ 
        
	}
}
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章