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

下载本文档

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

文档简介

1、学号:1206024118 姓名:张帅中北大学课程设计说明书学生姓名:张帅学 号:1206024118学 院:仪器与电子学院专 业:微电子题 目:利用按键开关控制液晶显示器进行十六进制数字显示指导教师:焦新泉 赵冬青2010年 6月 30日目 录第一章、课程设计目的第二章、课程设计内容及要求2.1、设计内容2.2、设计要求第三章、设计方案及实现情况3.1、设计思路3.2、工作原理及框图3.3、各模块功能描述及仿真结果3.4、试验箱验证情况第四章、课程设计总结第五章、参考文献附录1:系统整体电路图 FPGA引脚分配图 液晶显示屏说明书第1章 课程设计目的1.学习操作数字电路设计实验开发系统,掌握

2、液晶显示模块的工作原理及应用。2.掌握组合逻辑电路、时序逻辑电路的设计方法。3.学习掌握可编程器件设计的全过程。第二章 课程设计内容和要求2.1、设计内容用VHDL语言编写程序,实现利用按键开关控制液晶屏显示16进制数。2.2、设计要求1学习掌握按键开关控制模块、液晶显示模块的工作原理及应用;2. 熟练掌握VHDL编程语言,编写按键开关控制模块的控制逻辑;3. 仿真所编写的程序,模拟验证所编写的模块功能;4. 下载程序到芯片中,硬件验证所设置的功能,能够实现十六进制数字的显示;5. 整理设计内容,编写设计说明书。第三章 设计方案及实现情况3.1、设计思路根据题目设计要求,利用单一按键控制液晶屏

3、循环显示16进制数,0F。设计将系统分为五个模块,延时模块,消抖模块,按键输入模块,译码模块和液晶屏控制模块,先分别用quartus编写每个模块并生成顶层文件 ,最后下载到试验箱就可以实现最后的结果了。3.2、工作原理及框图EP3C10E144C8内部时钟经过延时程序后,信号由消抖模块的XD管脚输入,消抖完成后,又在译码模块中将四位二进制代码翻译成八位2进制的ASCII码,最后输入到液晶屏控制模块中,实现对液晶屏的控制。与此同时,每按下一次按键,按键模块中的变量就会+1,当加到1111B即F时,自动清零,实现了0-F循环显示。流程图如下:信号消抖模块按键输入模块译码模块 时 钟 信 号LCD液

4、晶控制模块 系统流程框图3.3、各模块功能描述及仿真结果(1)延时电路由于FPGA芯片内部时钟频率很高,而OCMJ 系列液晶显示屏的工作频率一般在100HZ-1KZ左右,因此若果要直接利用芯片内部时钟,则必须进行降频即分频处理,否则当按键输入信号时,液晶屏由于工作频率很高而无法正常显示字符。程序代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity yanshi isport( clk,rst:in std_logic;clko

5、ut:out std_logic);end yanshi;architecture fenpin_behave of yanshi issignal inclk: std_logic_vector(12 downto 0);signal inner: std_logic;beginprocess(clk,rst)beginif rst = 0 theninclk = 0000000000000;inner = 0;elsif clkevent and clk = 1 then-每来一个上升沿,inclk加一if inclk = 1111111111111 theninner = not inn

6、er;-当inclk加满的时候,inner取反inclk = inclk + 1;else inclk = inclk + 1;end if;end if;end process;clkout = inner;end fenpin_behave;仿真结果:如图仿真结果,利用功能仿真减少误差(以下各模块均使用功能仿真),延时电路可以把FPGA内置10MHZ的时钟信号进行大约81920分频(count=1111111111111)为666HZ左右的信号,因此,此模块可以吧FPGA内部时钟信号分频到合适的频率信号以保证液晶模块的正常工作。(2)消抖电路加入本模块的原因是因为按键开关在按下时信号会产生

7、抖动,在硬件实现是可能出现按一下跳过很多个数的情况,对程序的输入会产生影响,因此加入模块后消除抖动。程序代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity xiaodou is port( rst:in std_logic; anjian: in std_logic; clk: in std_logic; anjianout: out std_logic );end xiaodou;architecture a of xia

8、odou is signal count:integer range 0 to 100; begin process(clk,rst,anjian)begin if(rst=0)then count=0; anjianout=0; elsif(clkevent and clk=1)then if(count=100)then count=0; anjianout=not anjian; else count=count+1; end if; end if; end process;end a;仿真结果:如图所示消抖模块方仿真结果,由仿真图可以看出,当按键时间小于30ms时,按键输出不产生信号,

9、因此可以避免键盘抖动产生的误操作,很好的实现了键盘消抖功能。(3) 计数电路该模块的作用是将按键key输入进来的信号进行处理,每按一次,数自动+1,直到count为1111时自动循环,将按键的数值通过keyout发送给译码模块。程序代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity jishu isport( key:in std_logic; rst:in std_logic; keyout:out std_logic_v

10、ector(3 downto 0) );end jishu;architecture keywork of jishu issignal q: std_logic;signal counter : std_logic_vector(3 downto 0);begin q=key when rst=1else 0; process(q,rst) begin if(rst=0)then counter=0000; elsif qevent and q=1 then if counter=1111 then counter=0000; else counter=counter+1; end if;

11、end if; keyout=counter; end process; end keywork;仿真结果:如图仿真结果,按键模块将按键次数装换成四位二进制数发送给下一个模块,以实现十六数字的循环显示。(4)译码电路该模块的作用是将数字的ASCII码编译成8位2进制ASCII码送给液晶屏控制程序,当显示到 F时置0。程序代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity yima is port(B:in std_logic_vector(3 downto 0); X:out st

12、d_logic_vector(7 downto 0);end yima;architecture B1 of yima issignal c:std_logic_vector(3 downto 0);begin c=B;X=00110000 when ( c=0000 ) else 00110001 when ( c=0001 ) else 00110010 when ( c=0010 ) else 00110011 when ( c=0011 ) else 00110100 when ( c=0100 ) else 00110101 when ( c=0101 ) else 00110110

13、 when ( c=0110 ) else 00110111 when ( c=0111 ) else 00111000 when ( c=1000 ) else 00111001 when ( c=1001 ) else 01000001 when ( c=1010 ) else 01000010 when ( c=1011 ) else 01000011 when ( c=1100 ) else 01000100 when ( c=1101 ) else 01000101 when ( c=1110 ) else 01000110 when ( c=1111 ) else 00110000

14、;end B1;仿真结果:如图所示四位二进制代码0-F经过译码后变为八位二进制代码,然后输出给下一个模块即显示模块。(5)液晶屏显示电路本模块用状态机的方法实现,每次按键按下,显示模块接收到要显示的8位二进制ASCII码时,模块将液晶屏模式选择代码F9,横坐标07,纵坐标03分三次输入到液晶屏中,然后再将要显示的数的ASCII码的8位2进制码输入到液晶屏进行显示。其中液晶屏横纵坐标,以及BUSY和REQ信号的控制将在附录中给出,此处不再赘述。程序代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;US

15、E IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY xianshi ISPORT(busy:inSTD_LOGIC;clk1 :inSTD_LOGIC;db_ascii:inSTD_LOGIC_VECTOR(7 DOWNTO 0);req:outSTD_LOGIC;db:outSTD_LOGIC_VECTOR(7 DOWNTO 0);END xianshi;ARCHITECTURE XS OF xianshi ISSIGNALready:STD_LOGIC;TYPEstate IS (CMD_SEND,XX_SEND,YY_SEND,ASCII_SEND); SIGNAL

16、 current_state:state;-SIGNAL db_send: std_logic_vector(7 downto 0);BEGINPROCESS(clk1,busy,ready,db_ascii) variable cnt1: std_logic_vector(2 downto 0); BEGIN -db_sendIF busy=0 THENIF ready=1 THEN current_state = XX_SEND;ready = 0;ELSEdb = 11111001;req = 1;ready = 0;END IF;ELSEreq = 0;ready = 1;curren

17、t_state IF busy=0 THENIF ready=1 THENcurrent_state = YY_SEND;ready = 0;ELSEdb = 00000111;req = 1;ready = 0;END IF;ELSEreq = 0;ready = 1;current_state IF busy=0 THENIF ready=1 THENcurrent_state = ASCII_SEND;ready = 0;ELSEdb = 00000011;req = 1;ready = 0;END IF;ELSEreq = 0;ready =1;current_state IF bus

18、y=0 THENIF ready=1 THENcurrent_state = CMD_SEND;ready = 0;ELSE db =db_ascii; req = 1;ready = 0; END IF;ELSEreq = 0;ready = 1;current_state = ASCII_SEND;END IF;END CASE;END IF;END PROCESS;END XS;仿真结果:此仿真结果需要用到译码电路的8位二进制ASCII码,因此使用总体仿真结果替代之,同时也可以验证总体仿真结果。 由仿真结果可以看出,液晶模块最后根据按键输入一次输出F9 07 03 31,F9 07 03

19、 32,F9 07 03 33.以此类推,最后成功的把要显示的字符输出给液晶模块,实现了利用按键控制液晶屏显示十六进制数。利用protues仿真结果初步验证了各模块和整体电路的系统功能,最后通过USB下载到试验箱中,利用硬件验证系统的整体功能,由下图可以看出,本实验设计的系统功能是完整可靠的,可以很好的完成实验要求。3.4、试验箱验证情况第四章 课程设计总结 通过本次课程设计我学到了很多东西,以前虽然也做过不少VHDL程序的设计,但都是在已经有写好的程序的情况下。这次从设计到实现都独立完成还是第一次,自己亲身试过之后才会发现,软件上做出来的正确结果和硬件的实现有着巨大的差距。编译好的程序在硬件

20、实现时还有很多的因素要考虑,要处理。比如,消抖程序中的count值的设定,有的同学count=50就足够了,而有的在设定为50时抖动的相当厉害,这都需要在硬件实现时再进行调试,有时候甚至整个程序都要重新编写。这次课程设计我收获了很多学到了很多。今后会更加珍惜课程设计的机会,努力让自己学到更多的知识。第五章 参考文献1侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计. 西安:西安电子科技大学出版社,19992求是科技.CPLD/FPGA应用开发技术与工程实践. 北京:人民邮电出版社,20053罗苑棠.CPLD/FPGA常用模块与综合系统设计实例精讲. 北京:电子工业出版社,20074任勇峰,

21、庄新敏.VHDL与硬件实现速成.北京:国防工业出版社,2005附录1:系统整体电路图附录2:FPGA引脚分配图EP3C10E144C8芯片作为主芯片,以下为具体I/O分配表:附录3:液晶显示屏说明书OCMJ2X8(128X32)引脚说明引脚名称方向说明引脚名称方向说明1VLED+I背光源正极(LED+5V)8DB1I数据12VLED-I背光源负极(LED-OV)9DB2I数据23VSSI地10DB3I数据34VDDI(+5V)11DB4I数据45REQI请求信号,高电平有效12DB5I数据56BUSYO应答信号=1:已收到数据并正在处理中=0:模块空闲,可接收数据13DB6I数据67DB0I数

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

23、的写操作已经完成,用户可以撤消数据线上的信号并可作模块显示以外的其他工作,也可不断地查询应答线BUSY是否为低(BUSY =0?),如果BUSY =0,表明模块对用户的写操作已经执行完毕。可以再送下一个数据。如向模块发出一个完整的显示汉字的命令,包括坐标及汉字代码在内共需5个字节,模块在接收到最后一个字节后才开始执行整个命令的内部操作,因此,最后一个字节的应答BUSY 高电平(BUSY =1)持续时间较长。电性能参数模块时间参数表编号名称单位值说 明最小值最大值1TruS0.4-数据线上数据稳定时间2TbuS220最大模块响应时间3TrtuS11-最小REQ保持时间4Ts1uS2045最大数据接收时间5Ts2mS-0.130*最大命令指令处理时间*:不同命令所占用的时间各不相同,具体时间在命令表中给出用户命令用户通过用户命令调用 OCMJ 系列液晶显示器的各种功能。命令分为操作码及操作数两部分,操作数为十六进制。1)显示国标汉字命令格式: F0 XX YY QQ WW该命令为5字节命令(最大执行时间为1.2毫秒,Ts2=1.2mS),其中

温馨提示

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

评论

0/150

提交评论