FPGA培训模块资料应用物理系1英文字符液晶模块1602的FPGA控制液晶模块1602所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。1602液晶的正面(绿色背光,黑色字体)1602液晶背面(绿色背光,黑色字体)另一种1602液晶模块,显示屏是蓝色背光白色字体字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:FPGA培训模块资料应用物理系2HD44780内置了DDRAM、CGROM和CGRAM。DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表:也就是说想要在LCD1602屏幕的第一行第一列显示一个A字,就要向DDRAM的00H地址写入“A”字的代码就行了。但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。那么一行可有40个地址呀?是的,在FPGA培训模块资料应用物理系31602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下:DDRAM地址与显示位置的对应关系(事实上我们往DDRAM里的00H地址处送一个数据,譬如0x31(数字1的代码)并不能显示1出来。这是一个令初学者很容易出错的地方,原因就是如果你要想在DDRAM的00H地址处显示数据,则必须将00H加上80H,即80H,若要在DDRAM的01H处显示数据,则必须将01H加上80H即81H。依次类推。大家看一下控制指令的的8条:DDRAM地址的设定,即可以明白是怎么样的一回事了)FPGA培训模块资料应用物理系41602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”上表中的字符代码与我们PC中的字符代码是基本一致的。因此我们在向DDRAM写C51字符代码程序时甚至可以直接用P1='A'这样的方法。PC在编译时就把“A”先转为41H代码了。字符代码0x00~0x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。后面我会详细说的。0x20~0x7F为标准的ASCII码,0xA0~0xFF为日文字符和希腊文字符,其余字符码(0x10~0x1F及0x80~0x9F)没有定义。那么如何对DDRAM的内容和地址进行具体操作呢,下面先说说HD44780的指令集及其设置说明,请浏览该指令集,并找出对DDRAM的内容和地址进行操作的指令。共11条指令:1.清屏指令功能:1清除液晶显示器,即将DDRAM的内容全部填入空白的ASCII码20H;2光标归位,即将光标撤回液晶显示屏的左上方;3将地址计数器(AC)的值设为0。2.光标归位指令功能:1把光标撤回到显示器的左上方;2把地址计数器(AC)的值设置为0;3保持DDRAM的内容不变3.进入模式设置指令FPGA培训模块资料应用物理系5功能:设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的情况如下所示:位名设置I/D0=写入新数据后光标左移1=写入新数据后光标右移S0=写入新数据后显示屏不移动1=写入新数据后显示屏整体右移1个字4.显示开关控制指令功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下:位名设置D0=显示功能关1=显示功能开C0=无光标1=有光标B0=光标闪烁1=光标不闪烁5.设定显示屏或光标移动方向指令功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下:S/CR/L设定情况00光标左移1格,且AC值减101光标右移1格,且AC值加110显示器上字符全部左移一格,但光标不动11显示器上字符全部右移一格,但光标不动6.功能设定指令FPGA培训模块资料应用物理系6功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下:位名设置DL0=数据总线为4位1=数据总线为8位N0=显示1行1=显示2行F0=5×7点阵/每字符1=5×10点阵/每字符7.设定CGRAM地址指令功能:设定下一个要存入数据的CGRAM的地址。8.设定DDRAM地址指令功能:设定下一个要存入数据的CGRAM的地址。(注意这里我们送地址的时候应该是0x80+Address,这也是前面说到写地址命令的时候要加上0x80的原因)9.读取忙信号或AC地址指令功能:1读取忙碌信号BF的内容,BF=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令;当BF=0时,液晶显示器可以接收单片机送来的数据或指令;2读取地址计数器(AC)的内容。10.数据写入DDRAM或CGRAM指令一览FPGA培训模块资料应用物理系7功能:1将字符码写入DDRAM,以使液晶显示屏显示出相对应的字符;2将使用者自己设计的图形存入CGRAM。11.从CGRAM或DDRAM读出数据的指令一览功能:读取DDRAM或CGRAM中的内容。基本操作时序:读状态输入:RS=L,RW=H,E=H输出:DB0~DB7=状态字写指令输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码输出:无读数据输入:RS=H,RW=H,E=H输出:DB0~DB7=数据写数据输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据输出:无例1VHDL控制1602液晶显示英文字符,第一行显示,从A~P,学习体会如何写入控制指令,写入数据指令,学习如何在指定位置显示字符。libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityLCD1602isPort(CLK:instd_logic;Reset:instd_logic;LCD_RS:outstd_logic;--寄存器选择信号LCD_RW:outstd_logic;--液晶读写信号LCD_EN:outstd_logic;--液晶时钟信号FPGA培训模块资料应用物理系8LCD_Data:outstd_logic_vector(7downto0));--液晶数据信号endLCD1602;architectureBehavioralofLCD1602istypestateis(set_dlnf,set_cursor,set_dcb,set_cgram,write_cgram,set_ddram,write_LCD_Data);signalCurrent_State:state;signalClk_Out:std_logic;signalLCD_Clk:std_logic;beginprocess(CLK)--分频进程,CLK输入,CLK_Out输出,50MHz输入,125Hz输出,8msvariablen1:integerrange0to199999;beginifrising_edge(CLK)thenifn1199999thenn1:=n1+1;elsen1:=0;Clk_Out=notClk_Out;endif;endif;endprocess;LCD_RW='0';--RW='0';写入设置LCD_EN=Clk_Out;--用125Hz作为LCD的使能,也作为LCD的时钟LCD_Clk=Clk_Out;--用125Hz作为LCD的时钟process(LCD_Clk,Reset,Current_State)--状态机控制显示variablecnt1:std_logic_vector(4downto0):=00000;beginifReset='0'thenCurrent_State=set_dlnf;--Reset就清屏,Reset接出用一个按钮作为复位按键即可,按下就为'0'复位。cnt1:=11110;LCD_RS='0';elsifrising_edge(LCD_Clk)thenCurrent_State=Current_State;LCD_RS='0';caseCurrent_Stateiswhenset_dlnf=cnt1:=00000;LCD_Data=00000001;--/*清除显示*/清屏指令Current_State=set_cursor;whenset_cursor=LCD_Data=00110000;--/*设置8位格式,2FPGA培训模块资料应用物理系9行,5*7*/Current_State=set_dcb;whenset_dcb=LCD_Data=00001100;--/*整体显示,关光标,不闪烁*/Current_State=set_cgram;whenset_cgram=LCD_Data=00000110;--/*显示移动格式,看最后两位,10表示光标右移Current_State=write_cgram;whenwrite_cgram=LCD_RS='1';--主体显示,写显示内容LCD_Data=01000001+CNT1;Current_State=set_ddram;whenset_ddram=IFCNT101111THENCNT1:=CNT1+1;--主体显示,写显示地址DDRam(RS='0')ELSECNT1:=00000;ENDIF;IFCNT1=01111THENLCD_Data=10000000+CNT1;ENDIF;Current_State=write_LCD_Data;whenwrite_LCD_Data=LCD_Data=00000000;Current_State=set_cursor;whenothers=null;endcase;endif;endprocess;endBehavioral;例2VHDL控制显示1602字符液晶,分屏分时显示,COLLEGEOFSCIENCE,SouthChinaofAgriculturalUnivers等字符。libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;FPGA培训模块资料应用物理系10entityLCD1602isPort(CLK:instd_logic;--状态机时钟信号,同时也是液晶时钟信号,其周期应该满足液晶数据的建立时间Reset:instd_logic;LCD_RS:outstd_logic;--寄存器选择信号LCD_RW:outstd_logic;--液晶读写信号LCD_EN:outstd_logic;--液晶时钟信号LCD_Data:outstd_logic_vector(7downto0));--液晶数据信号endLCD1602;architectureBehavioralofLCD1602istypestateis(set_dlnf,set_cursor,set_dcb,set_cgram,write_cgram,set_ddram,write_LCD_Data);signalCurrent_State:state;typeram1isarray(0to31)ofstd_logic_vector(7downto0);typeram2isarray(0to31)ofstd_logic_vector(7downto0)