




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
英文字符液晶模块1602的FPGA控制液晶模块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”字的代码就行了。但具体的写入是要按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),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A” 上表中的字符代码与我们PC中的字符代码是基本一致的。因此我们在向DDRAM写C51字符代码程序时甚至可以直接用P1A这样的方法。PC在编译时就把“A”先转为41H代码了。 字符代码0x000x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。后面我会详细说的。 0x200x7F为标准的ASCII码,0xA00xFF为日文字符和希腊文字符,其余字符码(0x100x1F及0x800x9F)没有定义。 那么如何对DDRAM的内容和地址进行具体操作呢,下面先说说HD44780的指令集及其设置说明,请浏览该指令集,并找出对DDRAM的内容和地址进行操作的指令。共11条指令:1.清屏指令功能: 清除液晶显示器,即将DDRAM的内容全部填入空白的ASCII码20H; 光标归位,即将光标撤回液晶显示屏的左上方; 将地址计数器(AC)的值设为0。2.光标归位指令功能: 把光标撤回到显示器的左上方; 把地址计数器(AC)的值设置为0; 保持DDRAM的内容不变3.进入模式设置指令功能:设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的情况如下所示:位名设置I/D0=写入新数据后光标左移1=写入新数据后光标右移 S0=写入新数据后显示屏不移动1=写入新数据后显示屏整体右移1个字4.显示开关控制指令功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下:位名设置 D0=显示功能关 1=显示功能开 C0=无光标 1=有光标 B0=光标闪烁 1=光标不闪烁5.设定显示屏或光标移动方向指令功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下:S/C R/L设定情况0 0光标左移1格,且AC值减10 1光标右移1格,且AC值加11 0显示器上字符全部左移一格,但光标不动1 1显示器上字符全部右移一格,但光标不动6.功能设定指令功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下:位名设置 DL0=数据总线为4位1=数据总线为8位 N0=显示1行1=显示2行 F0=57点阵/每字符1=510点阵/每字符7.设定CGRAM地址指令功能:设定下一个要存入数据的CGRAM的地址。8.设定DDRAM地址指令功能:设定下一个要存入数据的CGRAM的地址。(注意这里我们送地址的时候应该是0x80+Address,这也是前面说到写地址命令的时候要加上0x80的原因)9.读取忙信号或AC地址指令功能: 读取忙碌信号BF的内容,BF=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令;当BF=0时,液晶显示器可以接收单片机送来的数据或指令; 读取地址计数器(AC)的内容。10.数据写入DDRAM或CGRAM指令一览功能: 将字符码写入DDRAM,以使液晶显示屏显示出相对应的字符; 将使用者自己设计的图形存入CGRAM。11.从CGRAM或DDRAM读出数据的指令一览功能:读取DDRAM或CGRAM中的内容。基本操作时序:读状态 输入:RS=L,RW=H,E=H输出:DB0DB7=状态字写指令 输入:RS=L,RW=L,E=下降沿脉冲,DB0DB7=指令码 输出:无读数据 输入:RS=H,RW=H,E=H输出:DB0DB7=数据写数据 输入:RS=H,RW=L,E=下降沿脉冲,DB0DB7=数据 输出:无例1 VHDL控制1602液晶显示英文字符,第一行显示,从AP,学习体会如何写入控制指令,写入数据指令,学习如何在指定位置显示字符。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; LCD_RS : out std_logic; -寄存器选择信号 LCD_RW : out std_logic; -液晶读写信号 LCD_EN : out std_logic; -液晶时钟信号 LCD_Data : out std_logic_vector(7 downto 0); -液晶数据信号end LCD1602;architecture Behavioral of LCD1602 istype state is (set_dlnf,set_cursor,set_dcb,set_cgram,write_cgram,set_ddram,write_LCD_Data);signal Current_State:state;signal Clk_Out : std_logic;signal LCD_Clk : std_logic;beginprocess(CLK)-分频进程,CLK输入,CLK_Out输出,50MHz输入,125Hz输出,8ms variable n1:integer range 0 to 199999; begin if rising_edge(CLK) then if n1199999 then n1:=n1+1; else n1:=0; Clk_Out=not Clk_Out; end if; end if;end process;LCD_RW = 0 ; -RW=0;写入设置LCD_EN = Clk_Out ; -用125Hz作为LCD的使能,也作为LCD的时钟LCD_Clk = Clk_Out; -用125Hz作为LCD的时钟process(LCD_Clk,Reset,Current_State) -状态机控制显示variable cnt1: std_logic_vector(4 downto 0):=00000; begin if Reset=0then Current_State=set_dlnf; - Reset就清屏,Reset接出用一个按钮作为复位按键即可,按下就为0复位。 cnt1:=11110; LCD_RS=0; elsif rising_edge(LCD_Clk) then Current_State = Current_State ; LCD_RS cnt1:=00000; LCD_Data=00000001; - /*清除显示*/ 清屏指令 Current_State LCD_Data=00110000;-/*设置8位格式,2行,5*7*/ Current_State LCD_Data=00001100; -/*整体显示,关光标,不闪烁*/ Current_State LCD_Data=00000110; -/*显示移动格式,看最后两位,10表示光标右移 Current_State LCD_RS=1; -主体显示,写显示内容 LCD_Data=01000001+CNT1; Current_State IF CNT101111 THEN CNT1:=CNT1+1; -主体显示,写显示地址DDRam(RS=0) ELSE CNT1:=00000; END IF; IF CNT1=01111 THEN LCD_Data =10000000+CNT1; END IF; Current_State LCD_Data=00000000; Current_State null; end case; end if;end process;end Behavioral;例2 VHDL控制显示1602字符液晶,分屏分时显示WWW.SCAU.EDU.CN,COLLEGE OF SCIENCE,South China of Agricultural Univers等字符。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; LCD_RS : out std_logic; -寄存器选择信号 LCD_RW : out std_logic; -液晶读写信号 LCD_EN : out std_logic; -液晶时钟信号 LCD_Data : out std_logic_vector(7 downto 0); -液晶数据信号end LCD1602;architecture Behavioral of LCD1602 istype state is (set_dlnf,set_cursor,set_dcb,set_cgram,write_cgram,set_ddram,write_LCD_Data);signal Current_State:state;type ram1 is array(0 to 31) of std_logic_vector(7 downto 0);type ram2 is array(0 to 31) of std_logic_vector(7 downto 0);type ram3 is array(0 to 31) of std_logic_vector(7 downto 0);constant cgram1 : ram1 :=(x57,x57,x57,x2e,x53,x43,x41,x55,x2e,x45,x44,x55,x2e,x43,x4e,x20,x30,x31,x32,x33,x34,x35,x36,x37,x38,x39,x20,x20,x20,x20,x20,x20); -分行显示WWW.SCAU.EDU.CN 和0123456789constant cgram3 : ram3 :=(x53,x6F,x75,x74,x68,x20,x43,x68,x69,x6E,x61,x20,x41,x67,x72,x69,x63,x75,x6C,x74,x75,x72,x61,x6C,x20,x55,x6E,x69,x76,x65,x72,x73); -显示South China of Agricultural Universconstant cgram2 : ram2 :=(x43,x4f,x4c,x4c,x45,x47,x45,x20,x4f,x46,x20,x53,x43,x49,x45,x4e,x43,x45,x20,x20,x20,x20,x20,x20,x20,x20,x20,x20,x20,x20,x20,x20); -显示COLLEGE OF SCIENCEsignal CLK1 : std_logic;signal Clk_Out : std_logic;signal LCD_Clk : std_logic;signal m :std_logic_vector(1 downto 0);beginprocess(CLK) -分频进程,CLK输入,CLK_Out输出,50MHz输入,1250Hz输出,0.8ms variable n1:integer range 0 to 19999; begin if rising_edge(CLK) then if n119999 then n1:=n1+1; else n1:=0; Clk_Out=not Clk_Out; end if; end if;end process;LCD_RW = 0 ; -RW=0;写入设置LCD_EN = Clk_Out ; -用1250Hz作为LCD的使能,也作为LCD的时钟LCD_Clk = Clk_Out; -用1250Hz作为LCD的时钟process(Clk_Out) -再分频,1250/1000=1.25Hz,0.8s的周期输出,CLK1输出周期1.25Hzvariable n2:integer range 0 to 499; begin if rising_edge(Clk_Out) then if n2499 then n2:=n2+1; else n2:=0; Clk1=not Clk1; end if; end if;end process;process(Clk1) -设置m的值,m分别=0,1,2;5个CLK1周期内,m为00;再5个周期,m为01;再5个周期,m为10,m应为时间控制字variable n3:integer range 0 to 14; begin if rising_edge(Clk1) then n3:=n3+1; if n3=4 then m=00; elsif n34 then m=01; else m=10; end if; end if;end process;process(LCD_Clk,Reset,Current_State) -状态机控制显示variable cnt1: std_logic_vector(4 downto 0); begin if Reset=0then Current_State=set_dlnf; - Reset就清屏,Reset接出用一个按钮作为复位按键即可,按下就为0复位。 cnt1:=11110; LCD_RS=0; elsif rising_edge(LCD_Clk) then Current_State = Current_State ; LCD_RS cnt1:=00000; LCD_Data=00000001; - /*清除显示*/ 清屏指令 Current_State LCD_Data=00111000; -/*设置8位格式,2行,5*7*/ Current_State LCD_Data=00001100; -/*整体显示,关光标,不闪烁*/ Current_State LCD_Data=00000110; Current_State LCD_RS=1; if m=00 then LCD_Data=cgram1(conv_integer(cnt1); elsif m=01then LCD_Data=cgram2(conv_integer(cnt1); else LCD_Data=cgram3(conv_integer(cnt1); end if; Current_State if cnt111111 then cnt1:=cnt1+1; else cnt1:=00000; end if; if cnt1=01111 then LCD_Data=10000000+cnt1;-80H -显示数据, else LCD_Data=11000000+cnt1-10000;-C0H end if; Current_State LCD_Data=00000000; Current_State null; end case; end if;end process;end Behavioral;思考题1 阅读下列液晶1602的显示程序,掌握调用函数进行字符ASCII码转换的程序,掌握使用WHEN_ELSE并行赋值语句的状态机输出赋值特点,自行修改程序,设置合适的显示流程。显示流程参考:初始化=清屏=SETFUNCTION=屏开关=设置光标=写显示内容=写显示地址=SETFUNCTIONlibrary 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; -50MHZ Reset : in std_logic; -复位输入 lcd_rs : out std_logic; -液晶RS位 lcd_rw : out std_logic; -液晶读写RW位 lcd_e : buffer std_logic; -液晶使能 data : out std_logic_vector(7 downto 0); -数据/指令输出 - stateout: out std_logic_vector(10 downto 0); clk_out: out std_logic); -CLK_out输出end lcd;architecture Behavioral of lcd isconstant IDLE : std_logic_vector(10 downto 0) :=00000000000; -使用1位热码编码的状态机,状态共12种constant CLEAR : std_logic_vector(10 downto 0) :=00000000001;constant RETURNCURSOR : std_logic_vector(10 downto 0) :=00000000010;constant SETMODE : std_logic_vector(10 downto 0) :=00000000100;constant SWITCHMODE : std_logic_vector(10 downto 0) :=00000001000;constant SHIFT : std_logic_vector(10 downto 0) :=00000010000;constant SETFUNCTION : std_logic_vector(10 downto 0) :=00000100000;constant SETCGRAM : std_logic_vector(10 downto 0) :=00001000000;constant SETDDRAM : std_logic_vector(10 downto 0) :=00010000000;constant READFLAG : std_logic_vector(10 downto 0) :=00100000000;constant WRITERAM : std_logic_vector(10 downto 0) :=01000000000;constant READRAM : std_logic_vector(10 downto 0) :=10000000000;constant cur_inc : std_logic :=1; -液晶指令中的控制字,用语言符号表示数字信号控制字,方便程序体中调用constant cur_dec : std_logic :=0;constant cur_shift : std_logic :=1;constant cur_noshift : std_logic :=0;constant open_display : std_logic :=1;constant open_cur : std_logic :=0;constant blank_cur : std_logic :=0;constant shift_display : std_logic :=1;constant shift_cur : std_logic :=0;constant right_shift : std_logic :=1;constant left_shift : std_logic :=0;constant datawidth8 : std_logic :=1;constant datawidth4 : std_logic :=0;constant twoline : std_logic :=1;constant oneline : std_logic :=0;constant font5x10 : std_logic :=1;constant font5x7 : std_logic :=0;signal state : std_logic_vector(10 downto 0);signal counter : integer range 0 to 127;signal div_counter : integer range 0 to 15;signal flag : std_logic;constant DIVSS : integer :=15;signal char_addr : std_logic_vector(5 downto 0);signal data_in : std_logic_vector(7 downto 0);component char_ram port( address : in std_logic_vector(5 downto 0) ; data : out std_logic_vector(7 downto 0) );end component;signal clk_int: std_logic;signal clkcnt: std_logic_vector(18 downto 0);constant divcnt: std_logic_vector(18 downto 0):=1111001110001000000; -498752*2=997504分频signal clkdiv: std_logic;signal tc_clkcnt: std_logic;beginprocess(clk,reset) -做一个clkcnt的累加,在Reset来的时候清零,在等于divcnt时也清零 begin if (reset=0) then clkcnt=0000000000000000000; -Reset清零 elsif (clkevent and clk=1) then if(clkcnt=divcnt)then clkcnt=0000000000000000000; -等于divcnt也清零 else clkcnt=clkcnt+1; end if; end if;end process;tc_clkcnt=1 when clkcnt=divcnt else -当等于divcnt的时候给一个上升沿tc_clkcnt 0;process(tc_clkcnt,reset) -对clkdiv进行取反,每次tc_clkcnt上升沿来信时进行clkdiv的取反,做一个997504的分频,50.125Hz,0.02s begin if(reset=0)then clkdiv=0; elsif (tc_clkcntevent and tc_clkcnt=1) then clkdiv=not clkdiv; end if;end process;process(clkdiv,reset) -对clkdiv再分频,clk_int输出2分频,25Hz,0.04sbegin if (reset=0) then clk_int=0; elsif (clkdivevent and clkdiv=1) then clk_int= not clk_int; end if;end process;clk_out=clk_int; -输出clk_int到clk_out中process(clkdiv,reset) -使用clkdiv作为敏感信号,Reset复位begin if (reset=0) then lcd_e=0; elsif (clkdivevent and clkdiv=0) then lcd_echar_addr,data=data_in); -例化调用char_ram,char_addr输入address,data输出data_inlcd_rs = 1 when state =WRITERAM or state = READRAM else -规定了什么状态RS为1或0,WRITERAM或READRAM,读写RAM,符合1602的指令 0;lcd_rw = 0 when (state =CLEAR or state = RETURNCURSOR or state=SETMODE or state=SWITCHMODE or state=SHIFT or state= SETFUNCTION or state=SETCGRAM or state =SETDDRAM or state =WRITERAM) else 1; -规定RW状态,按1602硬件指令设置data =00000001 when (st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023三年级英语上册 Unit 2 Friends and Colours Lesson 8 Letters说课稿 冀教版(三起)
- 工业计量课题申报书
- 2025-2030中国长租公寓轻资产运营模式可行性分析
- 2025-2030中国短租公寓市场格局与竞争策略研究报告
- 2025-2030中国电子烟行业监管趋势与渠道转型策略报告
- 2025-2030中国智能仓储物流机器人集群调度算法突破方向研究
- 2025-2030中国智慧港口自动化设备更新周期与投资测算
- 2025贵州黔东南州三穗县选聘城市社区工作者工作考试参考试题及答案解析
- 2025广东茂名市交通高级技工学校招聘编外合同制教师17人考试参考试题及答案解析
- 2025内蒙古测铖矿业开发有限责任公司招聘3人考试参考试题及答案解析
- 老人骨折术前护理
- 工伤认定申请证人证言模板
- 压裂返排液的深度处理及再利用技术研究进展
- 2024届江西省南昌市高三上学期零模物理试题【含答案解析】
- 南京理工大学介绍课件模板
- 高中物理听评课记录表
- 2025届天津市春季高考升学考试全真模拟试卷(一)英语(无答案)
- 《流行音乐发展史》课件
- GB 17761-2024电动自行车安全技术规范
- 建设项目土地预审和土地报批收费标准参考
- 电磁感应现象及应用课件
评论
0/150
提交评论