lcd1602 HDL
LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。为了降低成本,绝大多数制造商都直接将裸片做到板子上。
字符型液晶显示原理
点阵图形式液晶由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显示的基本原理。
字符型液晶显示模块是一种专门用于显示字母、数字和符号等的点阵式LCD,常用16×1,16×2,20×2和40×2等的模块。一般的LCD1602字符型液晶显示器的内部控制器大部分为HD44780,能够显示英文字母、阿拉伯数字、日文片假名和一般性符号。
外形尺寸
LCD1602字符型液晶显示器实物外形如图1所示。
图1
LCD1602分为带背光和不带背光两种,其控制器大部分为HD44780。带背光的比不带背光的厚,是否带背光在实际应用中并无差别,具体的鉴别办法可参考图2所示的器件尺寸示意图
图2
技术参数
(1)显示容量:16×2个字符。
(2)芯片工作电压:4.5~5.5V。
(3)工作电流:2.0mA(5.0V)。
(4)模块最佳的工作电压:5.0V。
(5)字符尺寸:2.95mm×4.35mm(宽×高)
引脚功能
LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明见表1。
|
编号
|
符号
|
引脚说明
|
标号
|
符号
|
引脚说明
|
|
1
|
VSS
|
电源地
|
9
|
D2|
|
数据
|
|
2
|
VDD
|
电源正极
|
10
|
D3
|
数据
|
|
3
|
VL
|
液晶显示偏压
|
11
|
D4
|
数据
|
|
4
|
RS
|
数据/命令选择
|
12
|
D5
|
数据
|
|
5
|
R/W
|
读/写选择
|
13
|
D6
|
数据
|
|
6
|
E
|
使能信号
|
14
|
D7
|
数据
|
|
7
|
D0
|
数据
|
15
|
BLA
|
背光源正极
|
|
8
|
D1
|
数据
|
16
|
BLK
|
背光源负极
|
各引脚的功能介绍如下。
·引脚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:背光源负极。
LCD1602液晶模块内部的控制器共有11条控制指令,见表2。
|
序号
|
指令
|
RS
|
R/W
|
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
|
1
|
清屏
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
|
2
|
光标复位
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
x
|
|
3
|
输入方式设置
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
I/D
|
S
|
|
4
|
显示开关控制
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
D
|
C
|
B
|
|
5
|
光标或字符移位控制
|
0
|
0
|
0
|
0
|
0
|
1
|
S/C
|
R/L
|
x
|
x
|
|
6
|
功能设置
|
0
|
0
|
0
|
0
|
1
|
DL
|
N
|
F
|
x
|
x
|
|
7
|
字符发生存储器地址设置
|
0
|
0
|
0
|
1
|
字符发生存储器地址
|
|||||
|
8
|
数据存储器地址设置
|
0
|
0
|
1
|
显示数据存储器地址
|
||||||
|
9
|
读忙标志或地址
|
0
|
1
|
BF
|
计数器地址
|
||||||
|
10
|
写入数据至CGRAM或DDRAM
|
1
|
0
|
要写入的数据内容
|
|||||||
|
11
|
从CGRAM或DDRAM中读取数据
|
1
|
1
|
读取的数据内容
|
|||||||
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:读数据。
连接方式
LCD1602的8根数据线和3根控制线E,RS和R/W与单片机相连后即可正常工作。一般应用中只须往LCD1602中写入命令和数据,因此,可将LCD1602的R/W读/写选择控制端直接接地,这样可节省1根数据线。VO引脚是液晶对比度调试端,通常连接一个10kΩ的电位器即可实现对比度的调整;也可采用将一个适当大小的电阻从该引脚接地的方法进行调整,不过电阻的大小应通过调试决定。
VHDL操控LCD1602示例代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity LCD1602 is
Port (
CLK : in std_logic;
RESET : in std_logic;
RS : out std_logic;
RW : out std_logic;
EN : out std_logic;
DATA : out std_logic_vector( 7 downto 0));
end LCD1602;
ARCHITECTURE BHV OF LCD1602 IS
TYPE STATEs IS (set_function,open_display,clear_display,set_cuRSor,set_display,
set_ddram1,write_DATA1,set_ddram2,write_DATA2,set_ddram3,write_DATA3,set_ddram4,write_DATA4);
SIGNAL STATE : STATES;
TYPE ram IS ARRAY (0 TO 15)OF STD_LOGIC_VECTOR(7 DOWNTO 0);
CONSTANT ram1:ram:=(X"d6",X"d0",X"b0",X"ec",X"b5",X"e7",X"d7",X"d3",X"bf",X"c6",X"bc",X"bc",X"d1",X"a7",X"d4",X"ba"); --显示库1,字库自带的,“中”为D6D0
CONSTANT ram2:ram:=(X"d0",X"a0",X"d0",X"c5",X"cf",X"a2",X"b0",X"b2",X"c8",X"ab",X"b9",X"a4",X"b3",X"cc",X"d0",X"a0"); --显示库2
CONSTANT ram3:ram:=(X"d0",X"a0",X"d0",X"a0",X"ca",X"b5",X"d1",X"e9",X"c6",X"bd",X"cc",X"a8",X"d0",X"a0",X"d0",X"a0"); --显示库3
CONSTANT ram4:ram:=(X"a1",X"ef",X"a1",X"ef",X"a2",X"f5",X"a3",X"b1",X"a1",X"a4",X"a3",X"b0",X"a1",X"ef",X"a1",X"ef"); --显示库4
BEGIN
EN<=CLK;
PROCESS(CLK,STATE)
VARIABLE cnt : INTEGER RANGE 0 TO 16;
BEGIN
IF RESET = '0' THEN
STATE<= set_function;
cnt := 0;
ELSIF CLK'EVENT AND CLK='1' THEN
CASE STATE IS
WHEN set_function => DATA <= "00110000";RS<='0';STATE<= set_display; --设置功能:8位,基本指令集,RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器
WHEN set_display => DATA <= "00001000";RS<='0';STATE<= set_cuRSor; --显示控制:显示开,光标关,光标不闪烁
WHEN set_cuRSor => DATA <= "00010100";RS<='0';STATE<= open_display; --显示模式:光标右移
WHEN open_display => DATA <= "00001100";RS<='0';STATE<= clear_display; --显示控制,显示开.
WHEN clear_display=> DATA <= "00000001";RS<='0';STATE<= set_ddram1; --清屏
WHEN set_ddram1 => DATA <= "10000000";RS<='0';STATE<=write_DATA1; --设置ADDRAM地址,第一行第一列,0x80
WHEN write_DATA1 => RS <='1'; DATA<=ram1(cnt); cnt := cnt + 1; --将ram1的15个byte写入ADDRAM
if cnt = 16 then STATE<=set_ddram2; cnt := 0;
end if;
WHEN set_ddram2 => RS<='0';DATA<="10010000";STATE<=write_DATA2; --设置ADDRAM地址,第二行第一列,0x90
WHEN write_DATA2 => RS<='1';DATA<=ram2(cnt); cnt := cnt + 1; --将ram2的15个byte写入ADDRAM
if cnt = 16 then STATE<=set_ddram3; cnt := 0;
end if;
WHEN set_ddram3 => RS<='0';DATA<="10001000";STATE<=write_DATA3; --设置ADDRAM地址,第三行第一列,0x88
WHEN write_DATA3 => RS<='1';DATA<=ram3(cnt); cnt := cnt + 1; --将ram3的15个byte写入ADDRAM
if cnt = 16 then STATE<=set_ddram4; cnt := 0;
end if;
WHEN set_ddram4 => RS<='0';DATA<="10011000";STATE<=write_DATA4; --设置ADDRAM地址,第四行第一列,0x98
WHEN write_DATA4 => RS<='1';DATA<=ram4(cnt); cnt := cnt + 1; --将ram4的15个byte写入ADDRAM
if cnt = 16 then STATE<=set_ddram1; cnt := 0;
end if;
WHEN OTHERS => NULL;
END CASE;
END IF;
END PROCESS;
END BHV;

浙公网安备 33010602011771号