当前位置:文档之家› 201100514-基于VHDL的1602液晶显示器实现

201100514-基于VHDL的1602液晶显示器实现

201100514-基于VHDL的1602液晶显示器实现
201100514-基于VHDL的1602液晶显示器实现

基于FPGA的LCD1602液晶显示器控制

编写:樊伟敏2011年5月21日液晶显示器是现代智能家电、电子仪器和电子设备中最常见的信息显示方式,其具有良好的人机交互性、功耗低、质量轻、使用寿命长等特点。液晶显示器通常由专用集成电路控制与驱动液晶屏,使用时只要输入数据和指令就可实现所需的显示。常见的液晶显示器有段式显示和点阵显示两种。段式显示器所显示的内容一般具有固定模式,例如:空调遥控器、电子计算器、电子表、数字万用表、电子游戏机等显示的主要是数字、专用符号和固定图形;点阵显示器的通用性比段式显示器强,能根据需要灵活地显示各种信息和内容,例如:字母、数字、符号和图形等。

与通用微处理器的方式相比,FPGA更灵活,处理速度更快,控制更灵活。在外扩SRAM 或SDRAM后,容易移植在更多可变宽度像素点或者不同接口方式的液晶显示器的驱动上,具有广泛的应用前景。

一、LCD1602液晶显示模块简介

1. LCD1602液晶显示模块的基本参数及引脚功能

LCD1602液晶显示模块的主控制驱动电路为HD44780(HITACHI)及其他公司全兼容电路,如SED1278(SEIKO EPSON)、KS0066(SAMSUNG)、NJU6408(NER JAPAN RADIO)等。

液晶显示模块可分为带背光和不带背光两种,背光一般为黄绿色。LCD1602液晶显示模块外形尺寸如图1所示。

图1 LCD1602液晶显示模块外形尺寸

(1) LCD1602的基本参数:

显示容量:16×2个字符

芯片工作电压: 4.5~5.5V

工作电流: 2.0mA(5.0V)

模块最佳工作电压: 5.0V

(2) LCD1602的引脚及功能如表1所示:

(3) LCD 1602主控制器

LCD 1602主控制器内置DDRAM、CGROM和CGRAM,控制器与4Bit或8Bit微处理器相连能使点阵LCD显示2行16个点阵字符,字符包括大小英文字母、数字和符号等。

a. DDRAM(Display Data RAM):DDRAM显示数据RAM用以寄存待显示的字符代码。DDRAM寄存器为80×8bit,即:80个字节,每行40个,其中每行前16个地址为显示可见,每行后24个地址为显示不可见。LCD1602显示模块的DDRAM地址与屏幕显示位置的对应关系如表2所示。例如向DDRAM的00H地址写入“A”字的代码,就可在屏幕的第一行第一列显示字母“A”。

表2 DDRAM地址与屏幕显示位置的关系表.

ADDRAM”控制指令。

;指定第二行第一个字符的地址(40H)时,实际写入的数据应该是C0H(=80H+40H)。

b. CGROM(Character Generator ROM):CGROM字符发生ROM是控制器内部的只读存储器,该存储器存储了如表4所示的192个常用的点阵字符图形。

表4 CGROM地址所对应的字符关系表.

从表4可知,在字符发生存储器(CGROM)中存有:阿拉伯数字、大小写英文字母、常用的符号和日文假名等字符,字符产生存储器中的每一个字符都有一个固定的代码,例如,大写英文字母“A”的代码为”01000001”(41H),需要显示字母“A”时,只要指定字符发生存储器地址41H即可。具体操作需要根据控制器中的控制指令格式进行,可参见表6“将数据写入内部CGRAM或ADDRAM”中的内容。

c. CGRAM (Character Generator RAM):CGRAM是用户可通过程序自定义的字符图形RAM,在字符发生随机存取存储器中,可存放8组5×8或4组5×10点阵字符的字模。用户自定义的字符图形存放在表3的第一列CGRAM字符代码区域中,CGRAM在CGROM 中的地址为00000000B~00000111B(00H~07H),在CGROM中的00001000B~00001111B (08H~0FH)地址中存放着与00000000B~00000111B(00H~07H)地址的内容相同的8组5×8点阵字符的字模。8组5×8点阵字符字模的CGRAM地址,字符代码(DDRAM)和字符字模(CGRAM的数据)关系如表5所示。表左侧列为写入到DDRAM地址的字符代码,中间列为CGRAM的地址,右侧CGRAM为存放自定义字符的字模。自定义字符图形,先要将自定义字符用5×8点阵提取出“字模”,字符的字模可用软件提取,也可用手工直接提取,点阵字模数据中1表示该点显示,0表示该点不显示。然后逐行设定CGRAM数据内容,每一行对应一个CGRAM,由于5×8点阵字符是采用每行5点共8行表示的,因此需将8行的字模数据依次写入CGRAM中。

表5 自定义5×8点阵字符的CGRAM地址,字符代码(DDRAM)和字符字模(CGRAM的数据)关系

设定8组5×8点阵字符字模的CGRAM行数据内容的指令格式如表6所示。设定8组5×8点阵字符字模的CGRAM行地址指令格式如表7所示。当需要显示自定义字符时,将CGRAM中自定义的字符地址写入DDRAM中即可。

表7 设定CGRAM行地址指令格式

2. LCD1602

LCD 1602液晶模块内部的控制器共有如表8所示的11条控制指令。

3.

(1) 写操作时序

写操作时序如图2所示。

图2 写操作时序

(2) 读操作时序

读操作时序如图3所示。

图3 读操作时序

(3) 主要读写时序参数

主要读写时序参数如表10所示

表10 主要读写时序参数

4. 初始化过程指令(根据需要可调整)

(1)

(2)

(3) 清零。

(4)

(5)

(1) 用VHDL语言实现LCD1602显示“Welcom To ZJU E&E Lab Center”程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

--USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY lcd IS

PORT(clk:IN STD_LOGIC;

rs,rw,en:OUT STD_LOGIC;

data:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

END lcd;

ARCHITECTURE fwm OF lcd IS

TYPE states IS (set_function,clear_display,set_cursor,set_display,set_ddram1,write_data1,set_ddram2,write_data2);

SIGNAL state:states;

TYPE ram IS ARRAY (0 TO 15)OF STD_LOGIC_VECTOR(7 DOWNTO 0);

CONSTANT ram1:ram:=(X"20",X"57",X"65",X"6C",X"63",X"6F",X"6D",X"65",X"20",X"54",X"6F",X"20",X"5A",X"4A",X"55",X"20");

CONSTANT ram2:ram:=(X"20",X"45",X"26",X"45",X"20",X"4C",X"61",X"62",X"20",X"43",X"65",X"6E",X"74",X"65",X"72",X"20");

SIGNAL lcd_clk:STD_LOGIC;

BEGIN

rw<='0';en<=lcd_clk;

CLK_DIV:PROCESS(clk)

CONSTANT m : INTEGER:=500000; --50M分频到100Hz

V ARIABLE cout : INTEGER RANGE 0 TO 50000000:=0;

BEGIN

IF clk'EVENT AND clk='0' THEN cout:=cout+1;

IF cout<=m/2 THEN lcd_clk<='1';

ELSIF cout

ELSE cout:=0;

END IF;

END IF;

END PROCESS CLK_DIV;

PROCESS(lcd_clk,state)

V ARIABLE cnt : INTEGER RANGE 0 TO 16 ;

BEGIN

IF lcd_clk'EVENT AND lcd_clk='1' THEN

CASE state IS

WHEN set_function=>data<="00111000";rs<='0';state<= set_display; --设置功能:8位,两行,5×7/每字符

WHEN set_display=>data<="00001100";rs<='0';state<= clear_display; --显示控制:显示开,光标关,光标不闪烁

WHEN clear_display=>data<="00000001";rs<='0';state<=set_cursor; --清屏

WHEN set_cursor=>data<="00000110";rs<='0';state<= set_ddram1; --显示模式:光标右移

WHEN set_ddram1=>data<="10000000";rs<='0';state<=write_data1; --设置ADDRAM地址,第一行第一列

WHEN write_data1=>rs<='1';data<=ram1(cnt)(7 DOWNTO 0);cnt:=cnt+1; --将ram1的15个byte写入ADDRAM

IF cnt=16 THEN state<=set_ddram2; END IF;

WHEN set_ddram2=>rs<='0';data<="11000000";state<=write_data2; --设置ADDRAM地址,第二行第一列

WHEN write_data2=>rs<='1';data<=ram2(cnt)(7 DOWNTO 0);cnt:=cnt+1; --将ram2的15个byte写入ADDRAM

IF cnt=16 THEN state<=set_ddram1; END IF;

WHEN OTHERS=>NULL;

END CASE;

END IF;

END PROCESS;

END fwm;

(2)用VHDL语言实现LCD1602第一行显示“11年5月9日电压:3V”第二行显示“Voltage is:3.21V”程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY lcd1602b IS

PORT ( clk: IN STD_LOGIC;

rs,rw,en : OUT STD_LOGIC;

data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

END lcd1602b;

ARCHITECTURE fwm OF lcd1602b IS

TYPE states IS (clear_display,set_initial,set_cgram,write_cgram,set_addram1,diaplay_cgram,set_addram2,diaplay_cgrom);

--clear_display-清屏;--set_initial-初始化设置;--set_cgram-设置cgram地址;--write_cgram-字模写入cgram;

--set_addram1-设置显示cgram字符的addram地址;--diaplay_cgram-显示cgram字符;

--set_addram2-设置显示cgrom字符的addram地址;--diaplay_cgrom-显示cgrom字符

SIGNAL state:states;

TYPE ram_array0 IS ARRAY(0 TO 7) OF STD_LOGIC_VECTOR(7 DOWNTO 0);--定义ram_array0为二维数组

TYPE ram_array1 IS ARRAY(0 TO 7) OF ram_array0;--定义ram_array1为三维数组

SIGNAL lcd_clk : STD_LOGIC;

--定义data1,data2,data3为3个10进制数,用于在LCD中显示该值。

SIGNAL data1,data2,data3:INTEGER RANGE 0 TO 9;

BEGIN

en <=lcd_clk;rw<= '0' ;

--定义data1,data2,data3分别为10进制数1,2,3使其在LCD中显示该值。

data1<=1;data2<=2;data3<=3;

PROCESS(clk)

CONSTANT m : INTEGER:=50000;--50M分频到1kHz。

V ARIABLE cout : INTEGER RANGE 0 TO 50000000:=0;

BEGIN

IF clk'EVENT AND clk='0' THEN cout:=cout+1;

IF cout<=m/2 THEN lcd_clk<='1';

ELSIF cout

ELSE cout:=0;

END IF;

END IF;

END PROCESS;

PROCESS(lcd_clk)

CONSTANT cgram : ram_array1:=( --自定义8个5*8字符的字模(X"08",X"0F",X"12",X"0F",X"0A",X"1F",X"02",X"02"),--年字符数据存储器

(X"0F",X"09",X"0F",X"09",X"0F",X"09",X"11",X"00"),--月字符数据存储器

(X"1F",X"11",X"11",X"1F",X"11",X"11",X"1F",X"00"),--日字符数据存储器

(X"01",X"1F",X"11",X"1F",X"11",X"1F",X"01",X"01"),--左1/2电字符数据存储器

(X"00",X"1E",X"02",X"1E",X"02",X"1E",X"01",X"1F"),--右1/2电字符数据存储器

(X"0F",X"08",X"08",X"0B",X"08",X"08",X"10",X"17"),--左1/2压字符数据存储器

(X"1E",X"00",X"10",X"1C",X"12",X"12",X"10",X"1F"),--右1/2压字符数据存储器

(X"18",X"18",X"07",X"08",X"08",X"08",X"07",X"00")--℃字符数据存储器

);

V ARIABLE datacnt:INTEGER RANGE 0 TO 15;

V ARIABLE cnt: STD_LOGIC_VECTOR(7 DOWNTO 0);

V ARIABLE num:INTEGER RANGE 0 TO 7;

BEGIN

IF RISING_EDGE(lcd_clk) THEN

CASE state IS

WHEN clear_display=> rs<='0';data<="00000001";state<=set_Initial;--清屏

--清显示指令码:

--RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

--0 0 0 0 0 0 0 0 0 1

--清显示指令将空位字符码20H送入全部DDRAM地址中,使DDRAM中的内容全部清除,显示消失;

--地址计数器AC=0,自动增1模式;显示归位,光标或者闪烁回到原点(显示屏左上角);但并不改变移位设置模式;

WHEN set_initial=>

IF datacnt<3 THEN rs<='0';data<="00111000";datacnt:=datacnt+1;--设置功能:8位,两行,5×8/每字符,重复3次

--设置显示模式指令码:

--RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

--0 0 0 0 1 DL N F * *

--功能设置指令设置模块数据接口宽度和LCD 显示屏显示方式,即MPU与模块接口数据总线为4位或者是8位,

--LCD 显示行数和显示字符点阵规格;所以建议用户最好在执行其它指令设置(读忙标志指令除外)之前,在程序的开始,进行功能设置指令的执行;

--DL:数据接口宽度标志DL=1,8位数据总线DB7~DB0;DL=0,4位数据总线DB7~DB4,DB3~DB0不用,使用此方式传送数据,需分两次进行; --N:显示行数标志;F:显示字符点阵字体标志;

--N F 显示行数字符点阵字体驱动路数备注

--0 0 1 5X8 1/8

--0 1 1 5X10 1/11

--1 * 2 5X8 1/16 模块不能双行显示5X10点阵字符字体

ELSIF datacnt=3 THEN rs<='0';data<="00000110";datacnt:=datacnt+1;--显示模式:完成一个字符码传送后,AC自动加1;显示不发生移位;

--设置输入模式指令码:

--RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

--0 0 0 0 0 0 0 1 I/D S

--I/D:字符码写入或者读出DDRAM后DDRAM地址指针AC变化方向标志;

--I/D=1,完成一个字符码传送后,AC自动加1;I/D=0,完成一个字符码传送后,AC自动减1;

--S:显示移位标志S=1,将全部显示向右(I/D=0)或者向左(I/D=1)移位;S=0,显示不发生移位;

--S=1时,显示移位时,光标似乎并不移位;此外,读DDRAM操作以及对CGRAM的访问,不发生显示移位;

ELSIF datacnt=4 THEN rs<='0';data<="00001100";datacnt:=datacnt+1;--显示控制:显示开,光标关,光标不闪烁

--设置显示屏或光标移动方向指令码:

--RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

--0 0 0 0 0 0 1 D C B

--D:显示开/关控制标志D=1,开显示;D=0,关显示;关显示后,显示数据仍保持在DDRAM中,立即开显示可以再现;

--C:光标显示控制标志C=1,光标显示;C=0,光标不显示;不显示光标并不影响模块其它显示功能;

--显示5X8 点阵字符时,光标在第八行显示,显示5X10 点阵字符时,光标在第十一行显示;

--B:闪烁显示控制标志B=1,光标所指位置上,交替显示全黑点阵和显示字符,产生闪烁效果,

--Fosc=250kHz时,闪烁频率为0.4ms左右;通过设置光标可以与其所指位置的字符一起闪烁;

ELSE rs<='0';datacnt:=0;state <= set_cgram;

END IF;

WHEN set_cgram=>rs<='0'; --设置CGRAM字符地址data<="01000000"+cnt;state<=write_cgram; --设置CGRAM字符地址000

--CGRAM地址设置指令码:

--RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

--0 0 0 1 ACG5 ACG4 ACG3 ACG2 ACG1 ACG0

--CGRAM 地址设置指令设置CGRAM 地址指针,它将CGRAM存储用户自定义显示字符的字模数据的

--首地址ACG5~ACG0("01000000~01111000"8个5*8字符字模)送入AC中,

--自定义字符字模就可以写入CGRAM中或者从CGRAM中读出;

IF num <8 THEN cnt:=cnt+"00001000"; --设置CGRAM字符地址加1

END IF;

WHEN write_cgram=> rs<='1'; --在指定的CGRAM字符地址写入对应的8个5*8字符字模

data <= cgram(num)(datacnt);datacnt:=datacnt+1;state <= write_cgram; --写入CGRAM字符地址000的5*8字符字模

IF datacnt=8 THEN num:=num+1;datacnt:=0;state <= set_cgram; --写入下一个自定义的5*8字符字模

IF num =7 THEN num:=0;cnt:="00000000";state<=set_addram1; --8个5*8字符字模写入完成

END IF;

END IF;

WHEN set_addram1=>rs<='0'; --设置ADDRAM地址1 data<="10000000";state<=diaplay_cgram;

--DDRAM地址设置指令码:

--RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

--0 0 1 ADD6 ADD5 ADD4 ADD3 ADD2 ADD1 ADD0

--DDRAM地址设置指令设置DDRAM 地址指针,它将DDRAM存储显示字符的字符码的首地址ADD6~ADD0送入AC中,

--于是显示字符的字符码就可以写入DDRAM中或者从DDRAM 中读出;

--值得一提的是:在LCD显示屏一行显示方式下,DDRAM的地址范围为:00H~4FH;

--两行显示方式下,DDRAM的地址范围为:第一行00H~27H,第二行40H~67H;

WHEN diaplay_cgram=>rs<='1'; --显示ADDRAM地址对应的CGRAM字符IF datacnt=0 THEN data<=X"31";datacnt:=datacnt+1;--cgram字符"1"字模地址

ELSIF datacnt=1 THEN data<=X"31";datacnt:=datacnt+1;--cgram字符"1"字模地址

ELSIF datacnt=2 THEN data <= X"08";datacnt:=datacnt+1;--cgram字符X"00"字模地址

ELSIF datacnt=3 THEN data<=X"35";datacnt:=datacnt+1;--cgram字符"5"字模地址

ELSIF datacnt=4 THEN data<=X"09";datacnt:=datacnt+1;--cgram字符X"01"字模地址

ELSIF datacnt=5 THEN data<=X"39";datacnt:=datacnt+1;--cgram字符"9"字模地址

ELSIF datacnt=6 THEN data<=X"0A";datacnt:=datacnt+1;--cgram字符X"02"字模地址

ELSIF datacnt=7 THEN data<=X"20";datacnt:=datacnt+1;--cgrom字符" "字模地址

ELSIF datacnt=8 THEN data<=X"03";datacnt:=datacnt+1;--cgram字符X"03"字模地址

ELSIF datacnt=9 THEN data<=X"04";datacnt:=datacnt+1;--cgram字符X"04"字模地址

ELSIF datacnt=10 THEN data<=X"05";datacnt:=datacnt+1;--cgram字符X"05"字模地址

ELSIF datacnt=11 THEN data<=X"06";datacnt:=datacnt+1;--cgram字符X"06"字模地址

ELSIF datacnt=12 THEN data<=X"3A";datacnt:=datacnt+1;--cgram字符":"字模地址

ELSIF datacnt=13 THEN data<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt:=datacnt+1;--显示cgrom中指定的data3字符

ELSIF datacnt=14 THEN data<=X"56";datacnt:=datacnt+1;--cgram字符"V"字模地址

ELSE data<=X"20";datacnt:=0;state <= set_addram2;--cgram字符" "字模地址

END IF;

WHEN set_addram2=>rs<='0'; --设置ADDRAM地址2

data<="11000000";state<=diaplay_cgrom;

WHEN diaplay_cgrom=>rs<='1'; --显示ADDRAM地址对应的CGROM字符IF datacnt=0 THEN data<=X"56";datacnt:=datacnt+1;--rom字符"V"字模地址

ELSIF datacnt=1 THEN data<=X"6F";datacnt:=datacnt+1;--rom字符"o"字模地址

ELSIF datacnt=2 THEN data<=X"7C";datacnt:=datacnt+1;--rom字符"l"字模地址

ELSIF datacnt=3 THEN data<=X"74";datacnt:=datacnt+1;--rom字符"t"字模地址

ELSIF datacnt=4 THEN data<=X"61";datacnt:=datacnt+1;--rom字符"a"字模地址

ELSIF datacnt=5 THEN data<=X"67";datacnt:=datacnt+1;--rom字符"g"字模地址

ELSIF datacnt=6 THEN data<=X"65";datacnt:=datacnt+1;--rom字符"e "字模地址

ELSIF datacnt=7 THEN data<=X"20";datacnt:=datacnt+1;--rom字符" "字模地址

ELSIF datacnt=8 THEN data<=X"69";datacnt:=datacnt+1;--rom字符"i"字模地址

ELSIF datacnt=9 THEN data<=X"73";datacnt:=datacnt+1;--rom字符"s"字模地址

ELSIF datacnt=10 THEN data<=X"3A";datacnt:=datacnt+1;--rom字符":"字模地址

ELSIF datacnt=11 THEN data<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt:=datacnt+1;--显示cgrom中指定的data3字符

--显示为CONV_STD_LOGIC_VECTOR(data3+48,8)指定的10进制48对应ROM字模为00110000=X"30"=D"0"

ELSIF datacnt=12 THEN data<=X"2E";datacnt:=datacnt+1;--rom字符"."字模地址

ELSIF datacnt=13 THEN data<=CONV_STD_LOGIC_VECTOR(data2+48,8);datacnt:=datacnt+1;--显示cgrom中指定的data2字符

ELSIF datacnt=14 THEN data<=CONV_STD_LOGIC_VECTOR(data1+48,8);datacnt:=datacnt+1;--显示cgrom中指定的data1字符

ELSE data<=X"56";datacnt:=0;state <= set_addram1;--rom字符"V"字模地址

END IF;

END CASE;

END IF;

END PROCESS;

END fwm;

(3) 顶层主电路图

顶层主电路图如图4所示。

图4 顶层主电路图

(4) 引脚分配

引脚分配如表11所示。

a. 内部连接(电路板已完成的连接,用户不必二次连接):

LCD1602液晶显示器的引脚1和引脚16:接DE0开发板的电源0V;引脚2和引脚16:接DE0开发板的+5V电源;引脚3:V EE接10k电位器的动臂,获得0~5V液晶显示偏压值。

b. 外部信号连接(需要用户连接):

将LCD1602液晶显示器实验板的扩展引脚根据表11的要求用杜邦线连接到DE0开发板的扩展插槽。并将扩展插槽上的+5V和0V(扩展插槽11脚和12脚)连接到LCD1602液晶显示器实验板左上方的+5V和GND接线孔。注意:千万别将电源线短路,否则会损坏开发板。

(6) 5×8点阵参考字符字模

(X"1F",X"04",X"04",X"04",X"04",X"04",X"1F",X"00"), --“工”字符字模

(X"0A",X"0A",X"1B",X"1B",X"0A",X"0A",X"1F",X"00"), --“业“字符字模

(X"0E",X"00",X"1F",X"0A",X"0A",X"0A",X"13",X"00"), --“元”字符字模

(X"04",X"0E",X"15",X"04",X"04",X"04",X"04",X"00"), --“↑”字符字模

(X"18",X"18",X"07",X"08",X"08",X"08",X"07",X"00") --“℃”字符字模

(X"00",X"00",X"00",X"1F",X"00",X"00",X"00",X"00"), --“一”字符字模

(X"00",X"00",X"0E",X"00",X"00",X"1F",X"00",X"00"), --“二”字符字模

(X"00",X"0E",X"00",X"0E",X"00",X"1F",X"00",X"00"), --“三”字符字模

(X"00",X"1F",X"11",X"1B",X"1B",X"11",X"1F",X"00"), --“四”字符字模

(X"08",X"1F",X"12",X"0F",X"0A",X"1F",X"02",X"02"), --“年”字符字模

(X"0F",X"09",X"0F",X"09",X"0F",X"09",X"0B",X"11"), --“月”字符字模

(X"0F",X"09",X"09",X"0F",X"09",X"09",X"0F",X"00"), --“日”字符字模

(X"00",X"04",X"04",X"04",X"04",X"0A",X"0A",X"11"), --“人”字符字模

(X"00",X"1F",X"0A",X"0F",X"0D",X"0D",X"1A",X"0D"), --“顶”字符字模

(X"00",X"1F",X"06",X"05",X"05",X"04",X"04",X"04"), --“下”字符字模

(X"00",X"0A",X"1F",X"1F",X"1F",X"0E",X"04",X"00"), --“心型”字符字模

(X"18",X"18",X"07",X"08",X"08",X"08",X"08",X"07"), --“℃”字符字模

(7) 换页程序参考

PROCESS(lcd_clk)

V ARIABLE n2:INTEGER RANGE 0 TO 499; --1kHz to 1Hz

BEGIN

IF RISING_EDGE(lcd_clk) THEN

IF n2<499 THEN n2:=n2+1;ELSE n2:=0; clk_1Hz<=not clk_1Hz; END IF;

END IF;

END PROCESS;

PROCESS(clk_1Hz)

V ARIABLE n3:INTEGER RANGE 0 TO 14; --15s

BEGIN

IF RISING_EDGE(clk_1Hz) THEN n3:=n3+1;

IF n3<=4 THEN m<="00"; --5s

ELSIF n3<=9 AND n3>4 THEN m<="01"; --5s

ELSE m<="10"; --5s

END IF;

END IF;

END PROCESS;

PROCESS(lcd_clk,rst,state)

V ARIABLE datacnt: INTEGER RANGE 0 TO 30;

BEGIN

IF rst='0'THEN state<=s0; datacnt:=30; rs<='0';

ELSIF RISING_EDGE(lcd_clk)THEN state <= state ; rs <= '0';

CASE state IS

WHEN s0=> datacnt:=0;data<="00000001"; state<=s1; --清屏

WHEN s1=> data<="00111000"; state<=s2; --设置功能:8位,两行,5×7/每字符

WHEN s2=> data<="00001100"; state<=s3; --显示控制:显示开,光标关,光标不闪烁

WHEN s3=> data<="00000110"; state<=s4; --显示模式:光标右移

WHEN s4=> rs<='1';

IF m="00" THEN data<=cgram1(datacnt);

ELSIF m="01"THEN data<=cgram2(datacnt);

ELSE data<=cgram3(datacnt);

END IF;

state<=s5;

WHEN s5=>

IF datacnt<30 THEN datacnt:=datacnt+1; ELSE datacnt:=0; END IF;

IF datacnt<=15 THEN data<="10000000"+conv_std_logic_vector(datacnt,5);

ELSE data<="11000000"+conv_std_logic_vector(datacnt,5)-"10000";--80H

END IF;

state<=s1;

WHEN OTHERS => NULL;

END CASE;

END IF;

END PROCESS;

(8) LCD1602数字钟参考

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY clock IS

PORT(rst, clk: IN STD_LOGIC;

rs, en, rst_out, sec_out: OUT STD_LOGIC;

rw: OUT STD_LOGIC;

data_out: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

END clock;

ARCHITECTURE fwm OF clock IS

TYPE states IS (hold, func_set, dis_on,mode_set, write_char1,write_char2,write_char3,write_char4,write_char5, write_char6,

write_char7,write_char8,write_char9,write_char10,return_home,toggle_e,rst1,rst2,rst3,dis_off,dis_clr);

SIGNAL state, n_state: states;

-- SIGNAL data_out: STD_LOGIC_VECTOR(7 DOWNTO 0);

SIGNAL s0,s1,m0,m1,h0,h1,t : STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL clk_400Hz, clk_10Hz : STD_LOGIC;

BEGIN

rst_out <= NOT rst;

sec_out <= s0(0);

--data_out <= data_out WHEN rw = '0' ELSE "ZZZZZZZZ"; -- 设置LCD的数据线为三态数据线

PROCESS(clk,rst) --50MHz分频到400Hz V ARIABLE cnt1: INTEGER RANGE 0 TO 62500;

BEGIN

IF rst='0' THEN cnt1:=0; clk_400Hz<='0';

ELSIF clk'EVENT AND clk = '1' THEN

IF cnt1 < 62500 THEN cnt1 := cnt1 + 1;ELSE cnt1 := 0;clk_400Hz <= NOT clk_400Hz;END IF;

END IF;

END PROCESS;

PROCESS (clk_400Hz, rst)

V ARIABLE cnt2 :INTEGER RANGE 0 TO 199;

BEGIN

IF rst = '0' THEN state <= rst1;data_out <= X"38";n_state <= rst2;en <= '1';rs <= '0';rw <= '0';

ELSIF clk_400Hz'EVENT AND clk_400Hz = '1' THEN --产生秒脉冲1Hz信号,调试时采用10Hz

IF cnt2 < 19 THEN cnt2 := cnt2 + 1;ELSE cnt2 :=0;clk_10Hz <= NOT clk_10Hz;END IF;

CASE state IS --LCD控制

WHEN rst1 => en <= '1';rs <= '0';rw <= '0';data_out <= X"38";state <= toggle_e; n_state <= rst2;--设置功能:8位,两行,5×7

WHEN rst2 => en <= '1';rs <= '0';rw <= '0';data_out <= X"38";state <= toggle_e; n_state <= rst3;--设置功能:8位,两行,5×7

WHEN rst3 => en <= '1';rs <= '0';rw <= '0';data_out <= X"38";state <= toggle_e; n_state <= func_set;--设置功能:8位,两行,5×7,可靠复位

WHEN func_set => en <= '1';rs <= '0';rw <= '0';data_out <= X"38";state <= toggle_e;n_state <= dis_off;

WHEN dis_off => en <= '1';rs <= '0';rw <= '0';data_out <= X"08";state <= toggle_e;n_state <= dis_clr; --显示控制:显示关,光标关

WHEN dis_clr => en <= '1';rs <= '0';rw <= '0';data_out <= X"01";state <= toggle_e;n_state <= dis_on;--清屏

WHEN dis_on => en <= '1';rs <= '0';rw <= '0';data_out <= X"0C";state <= toggle_e;n_state <= mode_set;--显示控制:显示开,光标关

WHEN mode_set => en <= '1';rs <= '0';rw <= '0';data_out <= X"06";state <= toggle_e;n_state <= write_char1;--显示模式:自动增地址,光标右移

WHEN write_char1 => en <= '1';rs <= '1';rw <= '0';data_out <= X"3" & h1;state <= toggle_e;n_state <= write_char2; --LCD写入字符且定位第一个字符

WHEN write_char2 => en <= '1';rs <= '1';rw <= '0';data_out <= X"3" & h0;state <= toggle_e;n_state <= write_char3;--时低位

WHEN write_char3 => en <= '1';rs <= '1';rw <= '0'; data_out <= X"3A";state <= toggle_e;n_state <= write_char4;--写"冒号"

WHEN write_char4 => en <= '1';rs <= '1';rw <= '0';data_out <= X"3" & m1;state <= toggle_e; n_state <= write_char5;--分高位

WHEN write_char5 => en <= '1';rs <= '1';rw <= '0';data_out <= X"3" & m0;state <= toggle_e; n_state <= write_char6;--分低位

WHEN write_char6 => en <= '1';rs <= '1';rw <= '0';data_out <= X"3A";state <= toggle_e;n_state <= write_char7;--写"冒号"

WHEN write_char7 => en <= '1';rs <= '1';rw <= '0';data_out <= X"3" & s1;state <= toggle_e;n_state <= write_char8;--秒高位

WHEN write_char8 => en <= '1';rs <= '1';rw <= '0';data_out <= X"3" & s0;state <= toggle_e;n_state <= write_char9;--秒低位

WHEN write_char9 => en <= '1';rs <= '1';rw <= '0';data_out <= X"2E";state <= toggle_e;n_state <= write_char10;--写"小数点"

WHEN write_char10 =>en <= '1';rs <= '1';rw <= '0';data_out <= X"3" & t;state <= toggle_e;n_state <= return_home;--写"十分之一秒"

WHEN return_home => en <= '1';rs <= '0';rw <= '0';data_out <= X"80";state <= toggle_e;n_state <= write_char1;--返回写地址到第一行第一列位置

WHEN toggle_e => en <= '0';state <= hold;--en下降沿

WHEN hold => state <= n_state; --保持

END CASE;

END IF;

END PROCESS;

PROCESS (clk_10Hz, rst)

BEGIN

IF rst = '0' THEN h1 <= X"0";h0 <= X"0";m1 <= X"0";m0 <= X"0";s1 <= X"0";s0 <= X"0";t <= X"0";

ELSIF clk_10Hz'EVENT AND clk_10Hz = '1' THEN --产生十分之一秒信号

IF t < 9 THEN t <= t + 1;

ELSE t <= X"0"; --产生十分之一秒信号

IF s0 < 9 THEN s0 <= s0 + 1;

ELSE s0 <= "0000";

IF s1 < 5 THEN s1 <= s1 + 1;

ELSE s1 <= "0000";

IF m0 < 9 THEN m0 <= m0 + 1;

ELSE m0 <= "0000";

IF m1 < 5 THEN m1 <= m1 + 1;

ELSE m1 <= "0000";

IF h0 < 9 AND NOT((h1 = 2) AND (h0 = 3))THEN h0 <= h0 + 1;

ELSE

IF NOT((h1 = 2) AND (h0 = 3)) THEN h1 <= h1 + 1;h0 <= "0000";

ELSE h1 <= "0000";h0 <= "0000";

END IF;

END IF;

END IF;

END IF;

END IF;

END IF;

END IF;

END IF;

END PROCESS;

END fwm;

(9) LCD1602显示一位整数两位小数的电压值参考

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.all;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY lcd1602e IS

PORT(clk:IN STD_LOGIC; --设置时钟50MHZ及reset为fpga自带eoc为0809转化完毕信号量data_in:IN STD_LOGIC_VECTOR(7 DOWNTO 0); --0809输出给FPGA的8位数

data_out:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --八位输出给液晶显示器

rs,rw,en:OUT STD_LOGIC); --液晶显示控制端

END lcd1602e;

ARCHITECTURE fwm OF lcd1602e IS

TYPE datatype IS ARRAY (0 TO 12) OF STD_LOGIC_VECTOR(7 DOWNTO 0);

CONSTANT putc : datatype :=(

X"56",X"6F",X"7C",X"74",X"61",X"67",X"65",X"20",X"69",X"73",X"3A", --V oltage is:

X"2E", --.

X"56"); --V

TYPE istate IS(s0,s1,s2); --定义两个状态量完成液晶屏的写指令和写数据SIGNAL state:istate;

SIGNAL lcd_clk,clk500khz: STD_LOGIC; -- 定义lcd_clk来控制1602的E 脚

SIGNAL datacnt,cnt2,k:INTEGER RANGE 0 TO 15:=0; --cnt1计数完成八位数据转化cnt2完成1602的写指令和写数据SIGNAL data1,data2, data3:INTEGER RANGE 0 TO 9 ; --- 电压的百十个位

SIGNAL g:STD_LOGIC_VECTOR (8 DOWNTO 0);

SIGNAL gg,ggg,d1,d2,d3,d4,d5,d6,data_max,data_min:INTEGER RANGE 0 TO 511 ;

BEGIN

rw<='0';

en<=lcd_clk;

PROCESS(clk) --将50Mhz分频成500khz控制0809

V ARIABLE count:INTEGER RANGE 0 TO 49;

BEGIN

IF clk'EVENT AND clk='1' THEN

IF count=49 THEN clk500khz<=NOT clk500khz; count:=0;ELSE count:=count+1;END IF;

END IF;

END PROCESS;

PROCESS(clk500khz,cnt2,data_in) ---进程完成八位数据转换成BCD码即百十个位(data3,data2, data1)

BEGIN

IF clk500khz'EVENT AND clk500khz='1' THEN

CASE cnt2 IS

WHEN 0=>g<='0'&data_in;

WHEN 1=>gg<=CONV_INTEGER(g);

WHEN 2=>gg<=gg*2;

WHEN 3=>k<=k+1;

IF k=1 THEN d1<=gg;cnt2<=0;

ELSIF k=2 THEN d2<=gg;cnt2<=0;

ELSIF k=3 THEN d3<=gg;cnt2<=0;

ELSIF k=4 THEN d4<=gg;cnt2<=0;

ELSIF k=5 THEN d5<=gg;cnt2<=0;

ELSIF k=6 THEN d6<=gg;cnt2<=5;

END IF;

WHEN 4=>data_max<=d1;data_min<=d1;

IF data_min>=d2 THEN data_max<=data_min;data_min<=d2;

ELSIF data_min>=d3 THEN data_max<=data_min;data_min<=d3;

ELSIF data_min>=d4 THEN data_max<=data_min;data_min<=d4;

ELSIF data_min>=d5 THEN data_max<=data_min;data_min<=d5;

ELSIF data_min>=d6 THEN data_max<=data_min;data_min<=d6;

END IF;

ggg<=(d1+d2+d3+d4+d5+d6-data_max-data_min)/4;

WHEN 5=>

IF ggg>=500 THEN data3<=5;ggg<=ggg-500;

ELSIF 500>ggg AND ggg>=400 THEN data3<=4;ggg<=ggg-400;

ELSIF 400>ggg AND ggg>=300 THEN data3<=3;ggg<=ggg-300;

ELSIF 300>ggg AND ggg>=200 THEN data3<=2;ggg<=ggg-200;

ELSIF 200>ggg AND ggg>=100 THEN data3<=1;ggg<=ggg-100;

ELSE data3<=0;

END IF;

WHEN 6=>

IF ggg>=90 THEN data2<=9;ggg<=ggg-90;

ELSIF 90>ggg AND ggg>=80 THEN data2<=8;ggg<=ggg-80;

ELSIF 80>ggg AND ggg>=70 THEN data2<=7;ggg<=ggg-70;

ELSIF 70>ggg AND ggg>=60 THEN data2<=6;ggg<=ggg-60;

ELSIF 60>ggg AND ggg>=50 THEN data2<=5;ggg<=ggg-50;

ELSIF 50>ggg AND ggg>=40 THEN data2<=4;ggg<=ggg-40;

ELSIF 40>ggg AND ggg>=30 THEN data2<=3;ggg<=ggg-30;

ELSIF 30>ggg AND ggg>=20 THEN data2<=2;ggg<=ggg-20;

ELSIF 20>ggg AND ggg>=10 THEN data2<=1;ggg<=ggg-10;

ELSE data2<=0;

END IF;

WHEN 7=>data1<=ggg;

WHEN OTHERS=>cnt2<=0;

END CASE;

IF cnt2=7 THEN cnt2<=0;ELSE cnt2<=cnt2+1;END IF;

END IF;

END PROCESS;

PROCESS(clk) ----20000分频产生时钟(0.8ms)加到E端

V ARIABLE n1:INTEGER RANGE 0 TO 19999;

BEGIN

IF RISING_EDGE(clk) THEN

IF n1<19999 THEN n1:=n1+1; ELSE n1:=0; lcd_clk<=NOT lcd_clk;END IF;

END IF;

END PROCESS;

PROCESS(lcd_clk,state)

BEGIN

IF RISING_EDGE(lcd_clk) THEN

CASE state IS

WHEN s0=> rs<='0';data_out<="00000001";state<=s1;--清屏

WHEN s1=> rs<='0';

IF (datacnt=0) THEN data_out<="00111000";datacnt<=datacnt+1;--设置功能:8位,两行,5×7/每字符

ELSIF (datacnt=1) THEN data_out<="00001100";datacnt<=datacnt+1;--显示控制:显示开,光标关,光标不闪烁

ELSIF(datacnt=2)THEN data_out<="00000110";datacnt<=datacnt+1;--显示模式,光标右移

ELSE data_out<="10000000";datacnt<=0;state<=s2;

END IF;

WHEN s2=> rs<='1';

IF datacnt=0 THEN data_out<=putc(0);datacnt<=datacnt+1;

ELSIF datacnt=1 THEN data_out<=putc(1);datacnt<=datacnt+1;

ELSIF datacnt=2 THEN data_out<=putc(2);datacnt<=datacnt+1;

ELSIF datacnt=3 THEN data_out<=putc(3);datacnt<=datacnt+1;

ELSIF datacnt=4 THEN data_out<=putc(4);datacnt<=datacnt+1;

ELSIF datacnt=5 THEN data_out<=putc(5);datacnt<=datacnt+1;

ELSIF datacnt= 6 THEN data_out<=putc(6);datacnt<=datacnt+1;

ELSIF datacnt=7 THEN data_out<=putc(7);datacnt<=datacnt+1;

ELSIF datacnt=8 THEN data_out<=putc(8);datacnt<=datacnt+1;

ELSIF datacnt=9 THEN data_out<=putc(9);datacnt<=datacnt+1;

ELSIF datacnt=10 THEN data_out<=putc(10);datacnt<=datacnt+1;

ELSIF datacnt=11 THEN data_out<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt<=datacnt+1;

ELSIF datacnt=12 THEN data_out<=putc(11);datacnt<=datacnt+1;

ELSIF datacnt=13 THEN data_out<=CONV_STD_LOGIC_VECTOR(data2+48,8);datacnt<=datacnt+1;

ELSIF datacnt=14 THEN data_out<=CONV_STD_LOGIC_VECTOR(data1+48,8);datacnt<=datacnt+1;

ELSIF datacnt=15 THEN data_out<=putc(12);state <= s1;datacnt<=0;

ELSE state <= s1;datacnt<=0;

END IF;

WHEN OTHERS=>state<=s0;

END CASE;

END IF;

END PROCESS;

END fwm;

立体显示工作原理

立体显示技术介绍 一、.什么是立体显示? 立体显示或者称为3D显示,是指采用光学等多种技术手段来模拟实现人眼的立体视觉特性,将空间物体以3D信息再现出来,呈现出具有纵深感的立体图像的一种显示方式。相比于2D显示,3D显示提供给观看者更加强有力的沉浸感和震撼力。 人们之所以能够轻易地判断出物体在空间中的位置及不同物体间的相对位置,是因为人眼具有立体视觉。人们用以感知空间的主要生理机能有焦点调节、两眼集合、双目视差及单眼移动视差等。其中,双目视差担负着立体空间知觉的核心任务。焦点调节是为了把所注视的物体清晰地成像到视网膜上的眼球动作;两眼集合是当人在注视某个物体时左右眼视线往注视点上交汇而产生的眼球动作;双目视差是指由于人的左右眼从不同角度观看物体,从而成像于左右眼视网膜上的图像略有差异;单眼移动视差是指当观看者或被观看物体发生移动时人眼将看到物体的不同侧面。3D显示就是以人眼的立体视觉特性为基础的。 二、立体显示的实现方法 立体显示的实现方法可分为两大类,为助视3D显示和裸眼3D显示。 ?助视3D显示是靠眼睛佩戴助视设备来实现,如大家熟悉的偏光眼镜,这方面技术已成熟,但是也存在一定的缺陷,如亮度低,佩戴舒适度差等。 ?裸眼3D显示是通过光栅、集体成像、体3D和全息技术来实现3D立体成像,人眼无需佩戴任何设备,应用前景广泛,是目前显示研究的重点课题。 1.什么是光栅3D显示? 光栅3D显示器由光栅和2D显示器精密耦合而成。其中,光栅作为分光元件,对光线传播的路径进行一定方式的控制,使观看者的左右眼观看到不同的视差图像。可应用于手机、笔记本电脑显示和电视。如光栅3D显示手机就是采用双摄像头采集图像形成3D效果来实

LCD1602液晶显示器

实验11:1602液晶显示屏显示(字符型液晶显示器) 字符型液晶显示器用于数字、字母、符号并可显示少量自定义符号。这类液晶显示器通常 有16根接口线,下表是这16根线的定义。 字符型液晶接口说明 编号符号引脚说明编号符号引脚说明 1 Vss 电源地 9 D 2 数据线2 2 Vdd 电源正 10 D 3 数据线3 3 VL 液晶显示偏压信号 11 D 4 数据线4 4 RS 数据/命令选择端 12 D 5 数据线5 5 R/W 读/ 写选择端 13 D 6 数据线6 6 E 使能信号 14 D 7 数据线7 7 D0 数据线0 15 BLA 背光源正极 8 D1 数据线1 16 BLK 背光源负极(本学习板配的 内部已经接地) 下图是字符型液晶显示器与单片机的接线图。这用了P0口的8根线作为液晶显示器的数据 线,用P20、P21、P22做为3根控制线。

字符型液晶显示器与单片机的接线图 字符型液晶显示器的使用,字符型液晶显示器一般采用HD44780芯片做为控制器的。 1.字符型液晶显示器的驱动程序 这个驱动程序适用于1602型字符液晶显示器, 1) 初始化液晶显示器命令(RSTLCD) 设置控制器的工作模式,在程序开始时调用。 参数:无。 2) 清屏命令(CLRLCD) 清除屏幕显示的所有内容 参数:无 3) 光标控制命令(SETCUR) 用来控制光标是否显示及是否闪烁 参数:1个,用于设定显示器的开关、光标的开关及是否闪烁。 4) 写字符命令(WRITECHAR) 在指定位置(行和列)显示指定的字符。

参数:共有3个,即行值、列值及待显示字符,分别存放在XPOS、YPOS和A中。其中行值与列值均从0开始计数,A中可直接写入字符的符号,编译程序自动转化为该字符的ASCII 值。 5) 字符串命令(WRITESTRING) 在指定位置显示指定的一串字符。 参数:共有3个,即行值、列值和R0指向待显示字符串的内存首地址,字符串须以0结尾。如果字符串的长度超过了从该列开始可显示的最多字符数,则其后字符被截断,并不在下 行显示出来。 以下是驱动源程序 ;************************************************** ;连线图: ; DB0---DPROT.0 DB4---DPROT.4 RS-------------P2.0 ; DB1---DPROT.1 DB5---DPROT.5 RW-------------P2.1 ; DB2---DPROT.2 DB6---DPROT.6 E--------------P2.2 ; DB3---DPROT.3 DB7---DPROT.7 VLCD接1K电阻到GND* ;系统晶振为11.0592 ;************************************************** RS BIT P2.0 RW BIT P2.1 E BIT P2.2 DPORT EQU P0 XPOS EQU R1 ;列方向地址指针 YPOS EQU R2 ;行方向地址指针 CUR EQU R3 ;设定光标参数 NoDisp EQU 0 ;无显示 NoCur EQU 1 ;有显示无光标 CurNoFlash EQU 2 ;有光标但不闪烁 CurFlash EQU 3 ;有光标且闪烁

1602字符液晶显示原理+实例详解

1602详细资料和实例 1602字符液晶在实际的产品中运用的也比较多了,前几天留意了一下,发现宿舍门前的自动售水机就是采 用的1602液晶进行显示的。而且对于单片机的学习而言,掌握1602的用法是每一个学习者必然要经历的过程。在此,我将使用1602过程中遇到的问题以及感受记录下来,希望能够给初学者带来一点指导,少走一点弯路。 所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。目前市面上字符液晶绝大多 数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。 1602液晶的正面(绿色背光,黑色字体) 1602液晶背面(绿色背光,黑色字体)

另一种1602液晶模块,显示屏是蓝色背光白色字体 字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:

HD44780内置了DDRAM、CGROM和CGRAM。 DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表:

也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码(指A的字模代码,0x20~0x7F为标准的ASCII码,通过这个代码,在CGROM中查找到相应的字符显示)就行了。但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下:DDRAM地址与显示位置的对应关系。 (事实上我们往DDRAM里的00H地址处送一个数据,譬如0x31(数字1的代码,见字模关系对照表)并不能显示1出来。这是一个令初学者很容易出错的地方,原因就是如果你要想在DDRAM的00H 地址处显示数据,则必须将00H加上80H,即80H,若要在DDRAM的01H处显示数据,则必须将01H 加上80H即81H。依次类推。大家看一下控制指令的的8条:DDRAM地址的设定,即可以明白是怎么样的一回事了),1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形(无汉字),如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H)(其实是1个地址),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

1602字符型液晶显示器

1602字符型液晶显示器 在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。 1602字符型LCD简介: 字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。一般1602字符型液晶显示器实物如图10-53: 图10-53 1602字符型液晶显示器实物图 1602LCD的基本参数及引脚功能: 1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图10-54所示:

图10-55 读操作时序 图10-56 写操作时序 1602LCD的RAM地址映射及标准字库表: 液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图10-57是1602的内部显示地址。

图10-57 1602LCD内部显示地址 例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。 在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图10-58所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B (41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A” 图10-58 字符代码与图形对应图

液晶显示器的工作原理

液晶显示器的工作原理 我们很早就知道物质有固态、液态、气态三种型态。液体分子质心的排列虽然不具有任何规律性,但是如果这些分子是长形的(或扁形的),它们的分子指向就可能有规律性。于是我们就可将液态又细分为许多型态。分子方向没有规律性的液体我们直接称为液体,而分子具有方向性的液体则称之为“液态晶体”,又简称“液晶”。液晶产品其实对我们来说并不陌生,我们常见到的手机、计算器都是属于液晶产品。液晶是在1888年,由奥地利植物学家Reinitzer发现的,是一种介于固体与液体之间,具有规则性分子排列的有机化合物。一般最常用的液晶型态为向列型液晶,分子形状为细长棒形,长宽约1nm~10nm,在不同电流电场作用下,液晶分子会做规则旋转90度排列,产生透光度的差别,如此在电源ON/OFF下产生明暗的区别,依此原理控制每个像素,便可构成所需图像。 1. 被动矩阵式LCD工作原理 TN-LCD、STN-LCD和DSTN-LCD之间的显示原理基本相同,不同之处是液晶分子的扭曲角度有些差别。下面以典型的TN-LCD为例,向大家介绍其结构及工作原理。 在厚度不到1厘米的TN-LCD液晶显示屏面板中,通常是由两片大玻璃基板,内夹着彩色滤光片、配向膜等制成的夹板? 外面再包裹着两片偏光板,它们可决定光通量的最大值与颜色的产生。彩色滤光片是由红、绿、蓝三种颜色构成的滤片,有规律地制作在一块大玻璃基

板上。每一个像素是由三种颜色的单元(或称为子像素)所组成。假如有一块面板的分辨率为1280×1024,则它实际拥有3840×1024个晶体管及子像素。每个子像素的左上角(灰色矩形)为不透光的薄膜晶体管,彩色滤光片能产生RGB三原色。每个夹层都包含电极和配向膜上形成的沟槽,上下夹层中填充了多层液晶分子(液晶空间不到5×10-6m)。在同一层内,液晶分子的位置虽不规则,但长轴取向都是平行于偏光板的。另一方面,在不同层之间,液晶分子的长轴沿偏光板平行平面连续扭转90度。其中,邻接偏光板的两层液晶分子长轴的取向,与所邻接的偏光板的偏振光方向一致。在接近上部夹层的液晶分子按照上部沟槽的方向来排列,而下部夹层的液晶分子按照下部沟槽的方向排列。最后再封装成一个液晶盒,并与驱动IC、控制IC 与印刷电路板相连接。 在正常情况下光线从上向下照射时,通常只有一个角度的光线能够穿透下来,通过上偏光板导入上部夹层的沟槽中,再通过液晶分子扭转排列的通路从下偏光板穿出,形成一个完整的光线穿透途径。而液晶显示器的夹层贴附了两块偏光板,这两块偏光板的排列和透光角度与上下夹层的沟槽排列相同。当液晶层施加某一电压时,由于受到外界电压的影响,液晶会改变它的初始状态,不再按照正常的方式排列,而变成竖立的状态。因此经过液晶的光会被第二层偏光板吸收而整个结构呈现不透光的状态,结果在显示屏上出现黑色。当液晶层不施任何电压时,液晶是在它的初始状态,会把入射光的方向扭转90度,因此让背光源的入射光能够通过整个结构,结果在显示屏上出现白

三种3D立体成像显示技术

三种3D立体成像显示技术 3D显示(或称立体成像)技术有几百年的历史。从原理上大致可分为三大类:立体图像对技术(Stereo Pair)、体显示技术(Volumetric Displays)、全息技术(Holography)。 立体图像对是目前发展最成熟也是应用最广泛的3D显示技术,戴立体眼镜看3D电影和裸眼就能看到立体效果的显示屏都是基于这种技术实现的。它的基本原理是,先产生场景的两个视图或多个视图,然后用某种机制(如佩戴眼镜)将不同视图分别传送给左右眼,确保每只眼睛只看到对应的视图而看不到其他视图。如果观察者无需佩戴立体眼镜即可看到立体效果,则称为“裸眼立体显示”。 虽然立体图像对技术能够提供立体感,但它本质上只是空间中两张或多张平面图像,通过“欺骗”人眼视觉系统而立体成像。这类技术会使人眼产生矛盾的晶状体焦距调节和视线汇聚调节,长时间观看会产生视觉疲劳。而体显示技术与之不同,它物理上显示了三个维度,能在空间中产生真正的3D效果。成像物体就像在空间中真实存在,观察者能看到科幻电影中一般“悬浮”在半空中的3D透视图像。从数字图像处理技术来说,平面图像对应了二维数组,每个元素被称为像素;而三维图像对应三维数组,每个元素被称为体素。体显示技术正是在空间中表现了这个三维数组。 根据是否有机械结构,体显示可分为两种实现方式,扫描体显示(Swept Volume)和静态体显示(Static Volume)。扫描体显示技术利用高速旋转的平面反射光线,并通过视觉记忆而立体成像。一个成功的产品是Actuality系统公司的Perspecta 3D显示器。而静态体显示的典型产品是Felix3D公司的SolidFelix,它以含有稀土元素的晶体作为显示介质,使用两束相干激光照射晶体内部空间点发光。另一个静态体显示技术的产品是DepthCube 系统,它使用20块液晶屏层叠而成,任何时刻只有一块屏工作,其他都是透明的,而图像也只投射到工作的显示屏上。DepthCube在这20块屏上快速切换显示3D物体截面从而产生纵深感。 全息技术是利用光波的干涉和衍射原理记录并再现物体的真实感的一种成像技术。全息照片记录了物体拍摄时的干涉条纹,重现时用相干光源照射全息照片,根据光的衍射而立

LCD1602自定义显示字符

LCD1602自定义显示字符 从CGROM表中可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个, 实际只有8个字节可用。它的字符码是00000000-00000111这8个地址,表的下面还有8个字节,但因为这个CGRAM的字符码规定0-2位为地址,3位无效,4-7全为零。因此CGRAM的字符码只有最后三位能用也就是8个字节了。等效为0000x111,x为无效位,最后三位为000-111共8个。 如果我们要想显示这8个用户自定义的字符,操作方法和显示CGROM一样,先设置DDRAM位置,再向DDRAM写入字符码,例如“A”就是41H。现在我们要显示CGRAM的第一个自定义字符,就向DDRAM写入00000000B(00H),如果要显示第8个就写入00000111(08H)。 从这个指令可以看出指令数据的高2位已固定是01,只有后面的6位是地址数据,而这6位中的高3位就表示这八个自定义字符,最后的3位就是字模数据的八个地址了。例如第一个自定义字符的字模地址为01000000-01000111八个地址。 我们向这8个字节写入字模数据,让它能显示出“℃” 地址:01000000数据:00010000图示:○○○■○○○○ 0100000100000110○○○○○■■○ 0100001000001001○○○○■○○■ 0100001100001000○○○○■○○○ 0100010000001000○○○○■○○○ 0100010100001001○○○○■○○■ 0100011000000110○○○○○■■○ 0100011100000000○○○○○○○○ 字定义字符地址 0x40————0x00 0x48————0x01 0x50————0x02 0x58————0x03 0x60————0x04 0x68————0x05 0x70————0x06 0x78————0x07 程序操作: 1.定义字符数组 uchar code Word1[]={0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x0A};//自定义字符数组 2.写数据到CGRAM中 uchar j; WriteCommandLCD(0x40); for(j=0;j<8;j++) { WriteDataLCD(Word1[j]); } 3.读取数据并显示 WriteCommandLCD(0xC8);//显示在第一行 WriteDataLCD(0x00);//地址

LCD1602液晶显示器设计

LCD1602液晶显示课程设计 第一章绪论 1.1课题背景 当今时候是一个信息化的时代,信息的重要性不言而喻的,获取手段显得尤其重要。人们所接受的信息有70%来自于人的视觉,无论用何种方式获取的信息最终需要有某种显示方式来表示。在当代显示技术中,主流的有LED显示屏和LCD液晶显示,而在这些显示技术中,尤其以液晶显示器LCD(Liquid crystal display)为代表的平板显示器发展最快,应用最广。LCD是典型的发光器件,它一材料科学为基础,综合利用了精密机械,光电及计算机技术,并正在微机械,微光学,纤维光学等前沿领域研究基础上,向高集成化,智能化方向发展。 液晶显示技术发展迅猛,市场预测表明,液晶显示平均年销售呈增长10%~13%,不久的将来有可能取代CRT,成为电子信息产品的主要显示器件,另外,液晶显示器对空间电磁辐射的干扰不敏感,且在紧凑的仪器空间不需要专门的屏蔽保护,因而课大大简化仪器的结构和制造成本,在各种便携式仪器,仪表将会越来越广泛的应用。特别是在电池供电的单片机产品中,液晶显示更是必选的显示器件。 1.2课题设计目标 本设计是基于AT89C51芯片单片机为主控芯片,结合1602液晶显示模板等外围电路,通过软件程序,来实现液晶显示英文字母。本次设计的目的在于利用单片机和IIC技术来显示英文字母。 1.3课程设计的主要工作 (1)对系统的各个模块的各个功能进行深入分析和研究,在对课题所采用的方案进行可行详细的研究后设计具体功能电路。 (2)熟悉所选芯片的功能并完成具体电路设计。

(3)对系统的最终指标进行测试,针对系统的不足,进行分析并提出一些改正方法。 1.4 设计要求 (1)运行IIC总线技术。 (2)循环显示字母。 第二章硬件设计 2.1 LCD1602简介 2.1.1 LCD1602引脚功能 LCD1602引脚如图2.1所示 图2.1 LCD1602引脚图 引脚图的功能如表2—1所示

1602液晶字符显示

1.基本简介 LCD1602工业字符型液晶,能够同时显示16x02即32个字符。(16列2行) 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。 1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。 目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。2.管脚功能 1602采用标准的16脚接口,其中: 第1脚:VSS为电源地 第2脚:VCC接5V电源正极 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。 第7~14脚:D0~D7为8位双向数据端。 第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。 ⑶特性 3.3V或5V工作电压,对比度可调 内含复位电路 提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能 有80字节显示数据存储器DDRAM

1602液晶显示计算器电路图及程序

#include #include #include #include unsigned char code Error[]={"error"}; unsigned char code Systemerror[]={"system error"}; unsigned char code Lcd[]={"lcd calculate"}; char str[16]; sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; sbit BF=P0^7; /*********************** 函数功能:延时1ms ***********************/ void delay1ms() { unsigned char i,j; for (i=0;i<10;i++) for (j=0;j<33;j++) ; } /************************ 函数功能:延时n毫秒 入口参数:n ************************/ void delaynms(unsigned char n) { unsigned char i; for (i=0;i

LCD1602

LCD1602显示屏与单片机的连接 LCD1602简介 工业字符型液晶,能够同时显示16x02即32个字符。(16列2行) 注:为了表示的方便,后文皆以1表示高电平,0表示低电平。 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。 1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。 管脚功能 LCD1602引脚图 1602采用标准的16脚接口,其中: 第1脚:VSS为电源地 第2脚:VCC接5V电源正极 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。 第7~14脚:D0~D7为8位双向数据端。 第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。 特性 3.3V或5V工作电压,对比度可调 内含复位电路 提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能 有80字节显示数据存储器DDRAM 内建有192个5X7点阵的字型的字符发生器CGROM 8个可由用户自定义的5X7的字符发生器CGRAM 特征应用 微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。 操作控制 注:关于E=H脉冲——开始时初始化E为0,然后置E为1。

LCD1602显示全部字库字符

LCD1602显示全部字库字符、看门狗定时器测试 LCD1602液晶内含有192个字符字库,这个程序是分6屏进行显示,整个显示过程长约7秒,看门狗定时器设置时间为8.38秒,刚好显示完全部字符,修改看门狗就可以看到在显示中途重启,比较直观 LCD_E BIT P3.4 ;LCD片选 LCD_RS BIT P3.5 ;指令、数据位 LCD_RW BIT P3.6 ;读、写位 PORT EQU P0 ;端口定义 WDT_COUNT EQU 0E1H ;看门狗 START: LCALL LCD_INIT LCALL WDT_INIT MOV A,#01H ;清屏 LCALL WR_CMD DISP_LOOP: MOV R0,#06H ;循环计数器 MOV R1,#80H ;LCD地址计数器 MOV R2,#00H ;字符表指针计数器 MOV DPTR,#TAB WR_DAT_LOOP: MOV A,R1 ;地址命令 LCALL WR_CMD INC R1 ;地址加一 MOV A,R2 ;表指针 MOVC A,@A+DPTR LCALL WR_DA T LCALL DELAY100MS INC R2 ;表指针加一 CJNE R1,#90H,BIJIAO ;字符是否到16 MOV R1,#0C0H ;到16,换地址 BIJIAO: CJNE R1,#0D0H,WR_DAT_LOOP ;字符数是否到32 MOV R1,#80H ;地址回归 LCALL DELAY1S MOV A,#1B ;清屏 LCALL WR_CMD DJNZ R0,WR_DA T_LOOP MOV WDT_COUNT,#00110111B LJMP DISP_LOOP LCD_INIT: MOV A,#111000B ;8位总线 LCALL WR_CMD MOV A,#10B ;数据指针清零

1602液晶字符显示

1602液晶字符显示屏的原理 管脚功能/1602字符液晶编辑 1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线 VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,其中: 引脚符号功能说明 1VSS一般接地 2VDD接电源(+5V) 3V0液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 4RS RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。5R/W R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 6E E(或EN)端为使能(enable)端,写操作时,下降沿使能。 读操作时,E高电平有效 7DB0低4位三态、双向数据总线0位(最低位)8DB1低4位三态、双向数据总线1位 9DB2低4位三态、双向数据总线2位 10DB3低4位三态、双向数据总线3位 11DB4高4位三态、双向数据总线4位 12DB5高4位三态、双向数据总线5位

13DB6高4位三态、双向数据总线6位 14DB7高4位三态、双向数据总线7位(最高位)(也是busy flag) 15BLA背光电源正极 16BLK背光电源负极 寄存器选择控制表 RS R/W操作说明 00写入指令寄存器(清除屏等) 01读busy flag(DB7),以及读取位址计数器(DB0~DB6)值 10写入数据寄存器(显示各字型等) 11从数据寄存器读取数据 注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0. busy flag(DB7):在此位为1时,LCD忙,将无法再处理其他的指令要求。 字符集/1602字符液晶编辑 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。 因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如'A’。 以下是1602的16进制ASCII码表: (图片打开是大图) 读的时候,先读上面那列,再读左边那行,如:感叹号!的ASCII为0x21,字母B的ASCII 为0x42(前面加0x表示十六进制)。 显示地址/1602字符液晶编辑 1602字符液晶显示可分为上下两部分各16位进行显示,处于不同行时的字符显示地址如下

LCD1602显示屏地驱动设置及例程

LCD1602显示屏的驱动设置及例程 一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。我手里这块LCD1602的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。如图1所示: 图1 再来一它的背面的,如图2所示:

图2它的16条引脚定义如下: 对这个表的说明: 1. VSS接电源地。 2. VDD接+5V。 3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。或同样阻值的RM065/R M063蓝白可调电阻。见图3。 图3 4. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当R S为高电平时,选择数据。 5. RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态或数据。如果不需要进行读取操作,可以直接将其接VSS。 6. E ,执行命令的使能引脚,接单片机的一个I/O。 7. D0—D7,并行数据输入/输出引脚,可接单片机的P0—P3任意的8个I/O口。如果接P0口,P0口应该接4.7K—10K的上拉电阻。如果是4线并行驱动,只须接4个I/O口。 8. A背光正极,可接一个10—47欧的限流电阻到VDD。 9. K背光负极,接VSS。见图4所示。

图4 二.基本操作 LCD1602的基本操作分为四种: 1. 读状态:输入RS=0,RW=1,E=高脉冲。输出:D0—D7为状态字。 2. 读数据:输入RS=1,RW=1,E=高脉冲。输出:D0—D7为数据。 3. 写命令:输入RS=0,RW=0,E=高脉冲。输出:无。 4. 写数据:输入RS=1,RW=0,E=高脉冲。输出:无。 读操作时序图(如图5): 图5 写操作时序图(如图6):

液晶显示器电源工作原理及维修

液晶显示器电源工作原理及维修 详细介绍液晶显示器电源的作用、工作原理、维修及代换, 一、电源的作用 1、电源的基本知识 液晶电源的作用是为整机提供能量,常见的电源适配器外观如图所示 它的输入是220V交流电,输出为12V、4A直流电。电源适配器的内部电路结构如图所示

2、液晶电源的常见存在形式 常见的液晶电源有内置式和外置式两种。内置式电源一般是和高压板做在一起,形成二合一电源板,驱动板需要的各路电压均有电源板产生。外置式电源也就是通常所说的电源适配器,它一般是220V交流电输入,12V直流电输出,驱动板需要的其他电原在驱动板上进行变换。 二、电源的工作原理 由于LCD采用低电压工作,而一般市电提供提是110V或220V的交流电压,因此显示器需要配备电源。电源的作用是将市电的220V交流电压转变成12V或其它低压直流电,以向液晶显示器供电。 LCD显示器中的电源部分均采用开关电源。由于开关电源具有体积小、重量轻、变换效率高等优点,因此被广泛应用于各种电子产品中,特别是脉宽调制(PWM)型的开关电源。PW M型开关电源的特点是固定开关频率、通过改变脉冲宽度的占空比来调节电压。 PWM开关电源的基本工作原理是:交流电220V输入电源经整流滤波是路变成300V直流电压,再由开关功率管控制和高频变压器降压,得到高频矩形波电压,经整流滤波后获得显示器所需要的各种直流输出电压。脉宽调制器是这类开关电源的核心,它能产生频率固定具脉冲宽度可调的驱动信号,控制开关功率管的导通与截止的占空比,用来调节输出电压的高低,从而达到稳压的目的。 以下将要介绍的电源适配器就是此类开关电源,我们以采用UC3842脉宽调制集成控制器的电源为例讲解相关电路。 1、UC3842的性能特点 (1)它属于电流型单端PWM调制器,具有管脚数量少,外围是路简单、安装调试方便、性能优良、价格低廉等优点。而且通过高频变压器与电网隔离,适合构成无工频变压器的20-50W小功率开关电源。 (2)最高开关频率为500KHZ,频率稳定度高达0.2%。电源效率高,输出电流大,能直接驱动双极型功率晶体管或VMOS管、DMOS管、TMOS管工作。 (3)内部有高稳定的基准电压源,档准值为5V,允许有+0.1%的偏差,温度系数为

已经采用过-LCD1602显示字符和(RAM)数字的汇编程序

单片机LCD1602显示字符和数字的汇编程序(无聊原创) 1,单片机和LCD1602的连线,和程序结果显示如下图: 2,LCD第一行显示字符XIAORENGUANG第二行显示RAM中40H到46H中的数字。程序如下: ORG 0000H AJMP MAIN RS EQU P2.4 RW EQU P2.5 E EQU P2.6 MAIN: MOV SP,#60H MOV 40H,#01H MOV 41H,#02H MOV 42H,#03H MOV 43H,#04H MOV 44H,#05H MOV 45H,#06H MOV 46H,#07H ACALL DD1 ;DD1是LCD初始化

MOV DPTR,#TABLE1 ACALL DD2;DD2是LCD第一行显示TABLE1 ACALL PPP ;PPP是LCD第二行显示RAM中40H到46H中的数据 SJMP $ DD1: MOV p0,#01H ;清屏 CALL ENABLE MOV p0,#38H ;显示功能 CALL ENABLE MOV p0,#0FH ;显示开关控制 CALL ENABLE MOV p0,#06H ;+1 CALL ENABLE RET DD2: MOV p0,#80H;第一行的开始位置 cALL ENABLE CALL WRITE1;到TABLE1取码? RET DD3: MOV p0,#0C0H;第二行的位置 CALL ENABLE CALL WRITE1;到TABLE2 取码 RET ENABLE: CLR RS ;送命令 CLR RW CLR E CALL DELAY SETB E RET WRITE1: MOV R1,#00H ;显示table中的值 A1: MOV A,R1;到table取码 MOVC A,@A+DPTR call wRITE2 ;显示到lcd INC R1 CJNE A,#00H,A1 ;是否到00h RET WRITE2:MOV p0,A ;显示 SETB RS CLR RW CLR E CALL DELAY SETB E RET

液晶显示器工作原理

液晶显示器工作原理

液晶显示器工作原理 现在市场上的液晶显示器都采用了TFT液晶面板,这种液晶面板的是目前最先进的液晶显示器技术,从结构上看,液晶屏由两片线性偏光器和一层液晶所构成。其中,两片线性偏光器分别位于液晶显示器的内外层,每片只允许透过一个方向的光线,它们放置的方向成90度交叉(水平、垂直),也就是说,如果光线保持一个方向射入,必定只能通过某一片线性偏光器,而无法透过另一片,默认状态下,两片线性偏光器间会维持一定的电压差,滤光片上的薄膜晶体管就会变成一个个的小开关,液晶分子排列方向发生变化,不对射入的光线产生任何影响,液晶显示屏会保持黑色。一旦取消线性偏光器间的电压差,液晶分子会保持其初始状态,将射入光线扭转90度,顺利透过第二片线性偏光器,液晶屏幕就亮起来了。当然这是一个很简单的原理模型,真正的液晶显示器内还有更复杂的电路结构。 红绿蓝三原色大家都知道,当这三种颜色同时混合时就会产生白色,这当然实在三原色强度一样的情况下才能够显示器纯正的白色,这样,从图中我们可以看见液晶面板的每一个像素中都有三种原色,这三种原色如果强度不同变化就可以产生不同的混色效果,这样全屏就有1024×768这样的像素,所以真实分辨率就是1024×768。低端的液晶显示板,各个基色只能表现6位色,即2的6次方=64种颜色.可以很简单的得出,每个独立像素可以表现的最大颜色数是64×64×64=262144种颜色,高端液晶显示板利用FRC技术使得每个基色则可以表现8位色,即2的8次方=256种颜色,则像素能表现的最大颜色数为

256×256×256=16777216种颜色.这种显示板显示的画面色彩更丰富,层次感也好.现在基本上显示器都拥有FRC技术,可以显示器16777216种颜色 什么是TFT-LCD 其中彩色LCD又分为STN和TFT两种屏,其中TFT-LCD是英文Thin Film T ransistor-Liquid Crystal Display的缩写,即薄膜晶体管液晶显示器,也就是大家常说的真彩液晶显示屏,显示效果较好;而DSTN-LCD,即双扫瞄液晶显示器,则是STN-LCD的一种显示 液晶是一种介于液体和固体之间的特殊物质,它具有液体的流态性质和固体的光学性质。当液晶受到电压的影响时,就会改变它的物理性质而发生形变,此时通过它的光的折射角度就会发生变化,而产生色彩。 液晶屏幕后面有一个背光,这个光源先穿过第一层偏光板,再来到液晶体上,而当光线透过液晶体时,就会产生光线的色泽改变,从液晶体射出来的光线,还得必须经过一块彩色滤光片以及第二块偏光板。由于两块偏光板的偏振方向成90度,再加上电压的变化和一些其它的装置,液晶显示器就能显示我们想要的颜色了。 液晶显示有主动式和被动式两种,其实这两种的成像原理大同小异,只是背光源和偏光板的设计和方向有所不同。主动式液晶显示器又使用了fet场效晶体管以及共通电极,这样可以让液晶体在下一次的电压改变前一直保持电位状态。这样主动式液晶显示器就不会产生在被动式液晶显示器中常见的鬼影、或是画面延迟的残像等。现在最流行的主动式液晶屏幕是tft(thin film transistor薄膜晶体管),被动式液晶屏幕有stn(super tn超扭曲向列lcd)和dstn(double

单片机+LCD1602液晶显示字符串

1602液晶显示字符串(附带程序)(注意说明:使用的实验板是郭天祥老师的52单片机板)

基本操作电路 状态字说明 RAM地址映射图

初始化相关指令的意思 读时序图

写时序图

要想通过1602液晶来显示你想要显示字符串,其实是很简单的,程序虽然有点长,但是都是按照步骤来的。 1602的五大步骤 第一个步骤: 检查LCD忙状态 lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。第二个步骤: 写指令数据到LCD RS=L,RW=L,E=高脉冲,D0-D7=指令码。 第三个步骤: 写显示数据到LCD RS=H,RW=L,E=高脉冲,D0-D7=数据。 第四个步骤: 设定显示位置 第五个步骤: LCD初始化设定 只要这五步你弄懂了,什么样的字符串都可以按照你的方式显示。至于这其中的步骤的具体的方式,我们就要参照1602的资料和时序图!不过你大可不必,这份文档就足够了! #include #include #define uchar unsigned char #define uint unsigned int

sbit dula=P2^6; sbit wela=P2^7; sbit LCD_RS = P3^5; sbit LCD_RW = P3^6; sbit LCD_EN = P3^4; uchar code dis1[] = {" WLCOME TO "}; uchar code dis2[] = {" JIANG GAN HUA "}; uchar code dis3[] = {" NAN CHANG "}; uchar code dis4[] = {" HANG KONG DX"}; void delay(int ms) { int i; while(ms--) { for(i = 0; i< 110; i++) { _nop_(); } } } bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; _nop_(); _nop_(); _nop_(); _nop_(); result = (bit)(P0&0x80); LCD_EN = 0; return result; } void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd;

相关主题
文本预览
相关文档 最新文档