利用按键开关控制液晶显示器进行十六进制数字显示说明书_第1页
利用按键开关控制液晶显示器进行十六进制数字显示说明书_第2页
利用按键开关控制液晶显示器进行十六进制数字显示说明书_第3页
利用按键开关控制液晶显示器进行十六进制数字显示说明书_第4页
利用按键开关控制液晶显示器进行十六进制数字显示说明书_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、中北大学课 程 设 计 说 明 书   学生姓名:张又木学 号: 0906044112学 院: 电子与计算机科学技术学院专 业:电子科学与技术 题 目:利用按键开关控制液晶显示器进行十六进制数字显示   指导教师: 焦新泉 职称: 讲师     2012 年 6 月 20 日目 录1、课程设计目的22、课程设计内容和要求22.1、设计内容22.2、设计要求23、 设计方案及实现情况23.1、设计思路23.2、工作原理及框图23.3、各模块功能描述43.4、

2、仿真结果153.5、实验箱验证情况174、课程设计总结185、参考文献181、课程设计目的1.学习操作数字电路设计实验开发系统,掌握液晶显示模块的工作原理及应用。2.掌握组合逻辑电路、时序逻辑电路的设计方法。3.学习掌握可编程器件设计的全过程2、课程设计内容和要求2.1、设计内容1学习掌握按键开关控制模块、液晶显示模块的工作原理及应用;2. 熟练掌握VHDL编程语言,编写按键开关控制模块的控制逻辑;3. 仿真所编写的程序,模拟验证所编写的模块功能;4. 下载程序到芯片中,硬件验证所设置的功能,能够实现十六进制数字的显示;5. 整理设计内容,编写设计说明书。 2.2、设计要求1本课程设

3、计说明书。2VHDL源程序及内部原理图。3该设计可以在实验箱上正常工作并演示。3、设计方案和实现情况3.1、设计思路对于这个题目,首先对试验箱上的时钟频率进行降频,因为试验箱上的时钟频率很高,而液晶系统并不需要很高的时钟频率,并且低频时钟更加有利于消抖功能的实现,其次对所使用的按键进行消抖处理,然后将消抖处理后的按键信号直接送入按键计数模块进行计数,再将按键计数模块的计数结果送往译码显示模块,严格按照液晶OCMJ的显示时序将要显示的数据的行坐标,列坐标和数据对应的在BUSY信号不为高的情况下,通过数据线送出,然后在REQ信号线上送出一个高脉冲,将数据显示在液晶OCMJ上。3.2、工作原理及框图

4、总体工作原理:在经过分频的时钟信号的驱动下,利用按键计数模块对进行了消抖处理后的按键信号进行计数,然后将计数数据送给译码液晶显示模块,进而驱动液晶屏幕进行数据的显示。系统总体原理图如图1所示。图1 系统总体原理图液晶显示器工作原理:OCMJ中文模块系列液晶显示器内含 GB 2312 16*16点阵国标一级简体汉字和 ASCII8*8(半高)及8*16(全高)点阵英文字库,用户输入区位码或 ASCII 码即可实现文本显示。OCMJ中文模块系列液晶显示器可以实现汉字、ASCII 码、点阵图形和变化曲线的同屏显示,并可通过字节点阵图形方式造字。由于显示的是十六进制数字,故只须掌握接口协议和其中一条用

5、户命令。接口协议为请求/应答(REQ/BUSY)握手方式。应答BUSY 高电平(BUSY =1) 表示 OCMJ 忙于内部处理,不能接收用户命令;BUSY 低电平(BUSY =0)表示 OCMJ 空闲,等待接收用户命令。发送命令到 OCMJ可在BUSY =0 后的任意时刻开始,先把用户命令的当前字节放到数据线上,接着发高电平REQ 信号(REQ =1)通知OCMJ请求处理当前数据线上的命令或数据。OCMJ模块在收到外部的REQ高电平信号后立即读取数据线上的命令或数据,同时将应答线BUSY变为高电平,表明模块已收到数据并正在忙于对此数据的内部处理,此时,用户对模块的写操作已经完成,用户可以撤消数

6、据线上的信号并可作模块显示以外的其他工作,也可不断地查询应答线BUSY是否为低(BUSY =0?),如果BUSY =0,表明模块对用户的写操作已经执行完毕。可以再送下一个数据。液晶显示器显示8X8ASCII字符命令:格式:F1 XX YY AS该命令为4字节命令(最大执行时间为0.8毫秒,Ts2=0.8mS),其中XX:为以ASCII码为单位的屏幕行坐标值,取值范围00到0F、04到13、00到13;YY:为以ASCII码为单位的屏幕列坐标值,取值范围00到1F、00到3F、00到4F;AS:坐标位置上要显示的ASCII 字符码。OCMJ液晶控制时序图如图2所示:3.3、各模块功能描述说明书要

7、求:图2 OCMJ液晶控制时序图3.3、各模块功能描述总原理图如图3所示:图3 总原理图模块一:分频模块图4 分频模块符号利用VHDL语言生成的分频符号如图4所示,clk和rst分别是输入的时钟信号引脚和复位引脚,clkout是分频后的时钟输出引脚。本模块使用13位计数常量分频,可以将试验箱上1.25MHZ的时钟频率降到150HZ左右,这足以驱动液晶工作。代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity fenpin

8、isport( clk,rst:in std_logic;clkout:out std_logic);end fenpin;architecture fenpin_behave of fenpin issignal inclk: std_logic_vector(12 downto 0);signal inner: std_logic;beginprocess(clk,rst)beginif rst = '0' theninclk <= "0000000000000"inner <= '0'elsif clk'event

9、and clk = '1' then-每来一个上升沿,inclk加一inner <= not inner;-当inclk加满的时候,inner取反inclk <= inclk + 1;else inclk <= inclk + 1;end if;end if;end process;clkout <= inner;end fenpin_behave;模块二:消抖模块图5 消抖模块符号利用VHDL语言生成的按键消抖模块符号如图5所示,clk和rst分别是时钟信号引脚和复位引脚,din是按键的输入信号,直接连接在试验箱的按键上,dout是经过消抖处理后的输出

10、引脚。本模块采用状态机实现,共八个状态,当din信号为低的时候,状态机才会向下传递状态,否则重新回到状态0,也就是说当有按键按下的时候,需要低电平信号持续八个时钟周期,才能算是一个信号输入。由于本系统的时钟频率是150HZ,经过计算,每次按键必须持续大约50ms才算有效,如果din信号持续为低电平,那么输出端每隔约50ms,输出一个低脉冲。代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity key_xd isport(clk,rst,din:in std_logic;dout:

11、out std_logic);end entity;architecture rtl of key_xd istype xd_state is (s0,s1,s2,s3,s4,s5,s6,s7);signal pre_s,next_s:xd_state;beginpcs0:process(rst,clk)beginif rst = '0' then pre_s <= s0;elsif clk'event and clk = '1' then-每次时钟来临,把next_s给pre_spre_s <= next_s;elsenull;end if

12、;end process pcs0;pcs1:process(pre_s,next_s,din)begincase pre_s iswhen s0 =>dout <= '1'-dout置高,确保到不为低电平if din = '1' thennext_s <= s0;-如果din=1,那么返回起始状态elsenext_s <= s1;-如果din=0,那么进入下一个状态end if;when s1 =>-状态s1到s6同上dout <= '1'if din = '1' thennext_s <

13、;= s0;elsenext_s <= s2;end if;when s2 =>dout <= '1'if din = '1' thennext_s <= s0;elsenext_s <= s3;end if;when s3 =>dout <= '1'if din = '1' thennext_s <= s0;elsenext_s <= s4;end if;when s4 =>dout <= '1'if din = '1' thenn

14、ext_s <= s0;elsenext_s <= s5;end if;when s5 =>dout <= '1'if din = '1' thennext_s <= s0;elsenext_s <= s6;end if;when s6 =>dout <= '1'if din = '1' thennext_s <= s0;elsenext_s <= s7;end if;when s7 =>dout <= '0'if din = '1&#

15、39; then-若din=1,回到起始状态next_s <= s0;Else-若din=0,回到s1状态,进入循环next_s <= s1;end if;end case;end process pcs1;end rtl;模块三:计数模块图6 计数模块符号利用VHDL语言生成的计数模块符号如图6所示,key和rst分别是按键输入引脚和复位引脚,dout是计数结果输出引脚。本模块采用基本的计数原理,即每当key来一个上升沿,做为缓冲的内部四位二进制信号inclk自增一,最后将inclk给到dout。代码如下:library ieee;use ieee.std_logic_1164.

16、all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity cnt isport( key,rst:in std_logic;dout:out std_logic_vector(3 downto 0);end cnt;architecture cnt_behave of cnt issignal inclk: std_logic_vector(3 downto 0);beginprocess(key,rst)beginif rst = '0' theninclk <= "0000

17、"elsif key'event and key='0' then-每次来一个下降沿,inclk加一inclk <= inclk + 1;end if;end process;dout <= inclk;end cnt_behave;模块四:译码及显示模块图7 译码及显示模块符号利用VHDL语言生成的译码及显示模块符号如图7所示,clk和rst分别是时钟输入引脚和复位引脚,busy是来自液晶的握手信号,din是需要显示的十六进制数据,req是向液晶发出的握手信号,dout是向液晶发出要显示的数据的信息的引脚。本模块采用状态机来实现,严格按照液晶的时

18、序图经过判断busy信号不为高的情况下向液晶依次输出ASCII码命令字,行坐标,列坐标以及经过译码得到的ASCII码,然后再从req输出一个高脉冲。从而驱动液晶屏幕工作。代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity disply is -实体说明port( clk,busy,rst:in std_logic; din:in std_logic_vector(3 downto 0); req:out std_logi

19、c; dout:out std_logic_vector(7 downto 0);end disply;architecture disply_arch of disply istype ztstate is (st0,st1,st2,st3,st4,st5,st6,st7,st8,st9,st10,st11,st12,st13,st14);signal state: ztstate;Begin -结构体说明process(rst,clk) begin if rst='0' then-复位信号req <= '0'state <= st0;dout &

20、lt;= "ZZZZZZZZ" elsif clk'event and clk = '1' then case state is when st0=>dout <= "11110100"-清屏命令字req<='0'state<=st1; when st1=>-req输出一个高脉冲req<= '1'state<=st2; when st2=>req<= '0'state<=st3; when st3=> if busy

21、= '0' then dout <= "11110001"-写ASCII命令字 req<='0' state<=st4;elsestate<=st3;end if; when st4=>req<= '1'state<=st5; when st5=>req<= '0'state<=st6; when st6=>-写列坐标if busy='1' then state<=st6;else dout <= "0000

22、1111" req<='0' state<=st7;end if; when st7=>req<='1'state<=st8; when st8=>req<= '0'state<=st9; when st9=>-写行坐标if busy='1' then state<=st9;else dout <= "00000001" req<='0' state<=st10;end if; when st10=>r

23、eq<='1'state<=st11; when st11=>req<= '0'state<=st12; when st12=>if busy='1' then state<=st12;else case din is-根据输入写ASCII码when "0000" =>dout <= "00110000"when "0001" =>dout <= "00110001"when "0010&qu

24、ot; =>dout <= "00110010"when "0011" =>dout <= "00110011"when "0100" =>dout <= "00110100"when "0101" =>dout <= "00110101"when "0110" =>dout <= "00110110"when "0111" =>d

25、out <= "00110111"when "1000" =>dout <= "00111000"when "1001" =>dout <= "00111001"when "1010" =>dout <= "01000001"when "1011" =>dout <= "01000010"when "1100" =>dout <=

26、"01000011"when "1101" =>dout <= "01000100"when "1110" =>dout <= "01000101"when "1111" =>dout <= "01000110"when others =>dout <= "00000000"end case;req<='0'state<=st13;end if; when st13=>req<='1'state<=st14; when st14=>req<= '0'state<=st3; when others=>state<=st0; end case; end if; end process;end disply_arch;3.4、仿真结果1.分频器仿真如图8所示:图8 分频器功能仿真波

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论