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 LCD引脚功能表
编号
符号
引脚说明
标号
符号
引脚说明
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。
表2 LCD1602控制指令
序号
指令
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;
posted @ 2021-04-04 11:00  老李闲  阅读(687)  评论(0)    收藏  举报