ImageVerifierCode 换一换
格式:DOC , 页数:21 ,大小:785.88KB ,
资源ID:858890      下载积分:20 积分
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 微信支付   
验证码:   换一换

加入VIP,免费下载资源
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【http://www.wodocx.com/d-858890.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(利用按键开关控制液晶显示器进行十六进制数字显示.doc)为本站会员(精***)主动上传,沃文网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知沃文网(发送邮件至2622162128@qq.com或直接QQ联系客服),我们立即给予删除!

利用按键开关控制液晶显示器进行十六进制数字显示.doc

1、 目 录1、课程设计目的32、课程设计内容及要求32.1、设计内容32.2、设计要求33、设计方案及实现情况33.1、设计思路33.2、工作原理及框图33.3、各模块功能描述43.4、仿真结果113.5、试验箱验证情况114、课程设计总结145、参考文献14附录1:液晶显示屏说明书151、课程设计目的1.学习操作数字电路设计实验开发系统,掌握液晶显示模块的工作原理及应用。2.掌握组合逻辑电路、时序逻辑电路的设计方法。3.学习掌握可编程器件设计的全过程。2、课程设计内容和要求:2.1、设计内容用VHDL语言编写程序,实现利用按键开关控制液晶屏显示16进制数。2.2、设计要求1学习掌握按键开关控制

2、模块、液晶显示模块的工作原理及应用;2. 熟练掌握VHDL编程语言,编写按键开关控制模块的控制逻辑;3. 仿真所编写的程序,模拟验证所编写的模块功能;4. 下载程序到芯片中,硬件验证所设置的功能,能够实现十六进制数字的显示;5. 整理设计内容,编写设计说明书。3、设计方案及实现情况3.1、设计思路根据题目设计要求,用按键控制液晶屏显示16进制数,开始的实际本来是要用16个按键来实现,但在硬件实现的过程中,一直出现各种问题,所以采用了一个按键,循环显示0f。由于是按键控制,所以加入了消抖程序,对液晶屏的控制则是通过状态机来实现的。先输入F9,选择8*16ascII码显示模式,在输入坐标XX YY

3、。3.2、工作原理及框图本设计将系统分为四个模块,消抖模块,按键输入模块,译码模块和液晶屏控制模块,先分别用MAX+PLUS II文本设计输入编写每个模块 ,模块功能好了就可以实现最后的结果了。信号由消抖模块的XD管脚输入,经过消抖程序后,在译码模块中将四位二进制代码翻译成八位2进制的ASCII码,输入到液晶屏控制模块中,实现对液晶屏的控制。与此同时,每按下一次按键,按键模块中的变量就会+1,当加到1111B时,自动清零,实现了0-F循环显示。最重要也是最难的液晶屏控制模块采用状态机程序编写,原理祥见附录1(如图1)。图1 系统原理图3.3、各模块功能描述(1)消抖电路加入本模块的原因是因为按

4、键开关在按下时信号会产生抖动,在硬件实现是可能出现按一下跳过很多个数的情况,对程序的输入会产生影响,加入模块后消除抖动(如图2)。程序代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; 图2 消抖模块硬件原理图entity xd is port( rst:in std_logic; xd: in std_logic; clk: in std_logic; xdout: out std_logic );end xd;architectu

5、re a of xd is signal count:integer range 0 to 100; begin process(clk,rst,xd) begin if(rst=0)then count=0; xdout=0; elsif(clkevent and clk=1)then if(count=30)then count=0; xdout=not xd; else count=count+1; end if; end if; end process;end a;(2)按键输入和译码模块该模块的作用是将按键输入进来的信号进行处理,每按一次,数自动+1,并将数字的ASCII码编译成8位

6、2进制ASCII码送给液晶屏控制程序,当显示到 F时置0(如图3)。程序代码:按键输入模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; 图3 按键及译码模块硬件原理图 use ieee.std_logic_arith.all;entity aj isport( aj:in std_logic; rst:in std_logic; ajout:out std_logic_vector(3 downto 0) );end aj;architecture ajwork of aj issignal

7、q: std_logic;signal count : std_logic_vector(3 downto 0);begin q=aj when rst=1else 0; process(q,rst) begin if(rst=0)then count=0000; elsif qevent and q=1 then if count=1111 then count=0000; else count=count+1; end if; end if; ajout=count; end process; end ajwork;译码模块library ieee;use ieee.std_logic_1

8、164.all;use ieee.std_logic_unsigned.all;entity ym is port(ym:in std_logic_vector(3 downto 0); Y:out std_logic_vector(7 downto 0);end ym;architecture yima_arch of ym issignal a:std_logic_vector(3 downto 0);begina=ym;YIF busy=0 THENIF ready=1 THEN current_state = XX;ready = 0;ELSEdb = 11111001;req = 1

9、;ready = 0;END IF;ELSEreq = 0;ready = 1;current_state IF busy=0 THENIF ready=1 THENcurrent_state = YY;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;ready = 0;ELSEdb = 00000011;req = 1;ready = 0;END IF;ELSEr

10、eq = 0;ready =1;current_state IF busy=0 THENIF ready=1 THENcurrent_state = CMD;ready = 0;ELSE db =db_ascii; req = 1;ready = 0END IF;ELSEreq = 0;ready = 1;current_state = ASCII;END IF;END CASE;END IF;END PROCESS;END rtl;3.4、仿真结果本实验结果主要表现在波形的DB7.0信号的波形输出,实现了16进制数的显示(如图5、6)。图5 09仿真波形图 图6 AF并置0波形图3.5、实验

11、箱验证情况(1)部分管脚分配(自动分配)(如图7)。图7 部分管脚图(自动分配)(2)程序硬件实现结果的部分显示(如图815)。 图8 数字1 图9 数字2 图10 数字3 图11 数字8 图12 数字9 图13 数字10图14 数字11 图15 数字12(3)总体硬件图(如图16)。 图16 整体硬件图4、课程设计总结 通过本次课程设计我学到了很多东西,以前虽然也做过不少VHDL程序的设计,但都是在已经有写好的程序的情况下。这次从设计到实现都独立完成还是第一次,自己亲身试过之后才会发现,软件上做出来的正确结果和硬件的实现有着巨大的差距。编译好的程序在硬件实现时还有很多的因素要考虑,要处理。比

12、如,消抖程序中的count值的设定,有的同学count=5就足够了,而有的在设定为5时抖动的相当厉害,这都需要在硬件实现时再进行调试,有时候甚至整个程序都要重新编写。这次课程设计我收获了很多。5、参考文献1侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计. 西安:西安电子科技大学出版社,19992求是科技.CPLD/FPGA应用开发技术与工程实践. 北京:人民邮电出版社,20053罗苑棠.CPLD/FPGA常用模块与综合系统设计实例精讲. 北京:电子工业出版社,20074任勇峰,庄新敏.VHDL与硬件实现速成.北京:国防工业出版社,2005附录1:液晶显示屏说明书1)表1:OCMJ2X8(

13、128X32)引脚说明引脚名称方向说明引脚名称方向说明1VLED+I背光源正极(LED+5V)8DB1I数据12VLED-I背光源负极(LED-OV)9DB2I数据23VSSI地10DB3I数据34VDDI(+5V)11DB4I数据45REQI请求信号,高电平有效12DB5I数据56BUSYO应答信号=1:已收到数据并正在处理中 =0:模块空闲,可接收数据13DB6I数据67DB0I数据014DB7I数据7硬件接口接口协议为 请求/应答(REQ/BUSY) 握手方式。应答BUSY 高电平(BUSY =1) 表示 OCMJ 忙于内部处理,不能接收用户命令;BUSY 低电平(BUSY =0)表示

14、OCMJ 空闲,等待接收用户命令。发送命令到 OCMJ可在BUSY =0 后的任意时刻开始,先把用户命令的当前字节放到数据线上,接着发高电平REQ 信号(REQ =1)通知OCMJ请求处理当前数据线上的命令或数据。OCMJ模块在收到外部的REQ高电平信号后立即读取数据线上的命令或数据,同时将应答线BUSY变为高电平,表明模块已收到数据并正在忙于对此数据的内部处理,此时,用户对模块的写操作已经完成,用户可以撤消数据线上的信号并可作模块显示以外的其他工作,也可不断地查询应答线BUSY是否为低(BUSY =0?),如果BUSY =0,表明模块对用户的写操作已经执行完毕。可以再送下一个数据。如向模块发

15、出一个完整的显示汉字的命令,包括坐标及汉字代码在内共需5个字节,模块在接收到最后一个字节后才开始执行整个命令的内部操作,因此,最后一个字节的应答BUSY 高电平(BUSY =1)持续时间较长,具体的时序图参见 图-1,对应的具体时间参数说明参见 表-1图1:对模块写汉字时序图电性能参数模块时间参数表编号名称单位值说 明最小值最大值1TruS0.4-数据线上数据稳定时间2TbuS220最大模块响应时间3TrtuS11-最小REQ保持时间4Ts1uS2045最大数据接收时间5Ts2mS-0.130*最大命令指令处理时间*:不同命令所占用的时间各不相同,具体时间在命令表中给出模块主要电气参数表编号名

16、称单位值说 明2X84X85X101电源工作电压V5552电源电流mA2353输入引脚电压V5554最大输入电压建立时间uS1115最小复位电压持续时间uS666RES端高电平时间6复位内部处理时间mS151515此时模块不接收命令7背光电压V5558标称背光电流mA1201802509外接灰度调节电位器5K20010K用户命令 用户通过用户命令调用 OCMJ 系列液晶显示器的各种功能。命令分为操作码及操作数两部分,操作数为十六进制。1)显示国标汉字命令格式: F0 XX YY QQ WW该命令为5字节命令(最大执行时间为1.2毫秒,Ts2=1.2mS),其中XX:为以汉字为单位的屏幕行坐标值

17、,取值范围00到07、02到09、00到09YY:为以汉字为单位的屏幕列坐标值,取值范围00到01、00到03、00到04QQ WW:坐标位置上要显示的GB 2312 汉字区位码2) 显示8X8 ASCII字符命令格式:F1 XX YY AS该命令为4字节命令(最大执行时间为0.8毫秒,Ts2=0.8mS),其中XX:为以ASCII码为单位的屏幕行坐标值,取值范围00到0F、04到13、00到13YY:为以ASCII码为单位的屏幕列坐标值,取值范围00到1F、00到3F、00到4FAS:坐标位置上要显示的ASCII 字符码3) 显示8X16 ASCII字符命令格式:F9 XX YY AS该命令

18、为4字节命令(最大执行时间为1.0毫秒,Ts2=1.0mS),其中XX:为以ASCII码为单位的屏幕行坐标值,取值范围00到0F、04到13、00到13YY:为以ASCII码为单位的屏幕列坐标值,取值范围00到1F、00到3F、00到4FAS:坐标位置上要显示的ASCII 字符码4) 显示位点阵 命令格式: F2 XX YY 该命令为3字节命令(最大执行时间为0.1毫秒,Ts2=0.1mS),其中XX:为以1*1点阵为单位的屏幕行坐标值,取值范围00到7F、20到9F、00到9FYY:为以1*1点阵为单位的屏幕列坐标值,取值范围00到40、00到40、00到405) 显示字节点阵命令格式: F

19、3 XX YY BT该命令为4字节命令(最大执行时间为0.1毫秒,Ts2=0.1mS),其中XX:为以1*8点阵为单位的屏幕行坐标值,取值范围00到0F、04到13、00到13YY:为以1*1点阵为单位的屏幕列坐标值,取值范围00到1F、00到3F、00到4FBT:字节像素值,0 显示白点,1 显示黑点 (显示字节为横向) 8051与OCMJ4X8模块连接 1) 写模块子程序(双线应答方式)-该程序使用REQ及BUSY两条控制线的握手方式对模块进行写操作。 SUB1:JBBUSY,SUB1 ;确信模块空闲(BUSY=0)MOV P1,A ;向总线送数NOP;等待数据总线稳定SETB REQ ;

20、置模块REQ端为高电平(REQ=1),向模块发请求命令 HE3:JNB BUSY,HE3 ;等待模块响应(BUSY =1) CLR REQ ;撤消REQ请求信号,数据输入结束RET ;返回2) 写模块子程序(单线延时方式)-该程序仅使用REQ一条控制线方式对模块进行写操作。在MPU 的 I/O口短缺的情况下非常适用。 SUB2:MOV P1,A ;向总线送数NOP;等待数据总线稳定SETB REQ ;置模块REQ端为高电平(REQ=1),向模块发请求命令 LCALL DALEY1 ;调延时子程序DALEY1等待模块响应 *1 CLR REQ ;撤消REQ请求信号,数据输入结束 LCALL DA

21、LEY2 ;调延时子程序DALEY2等待模块内部处理完成 *2RET ;返回注:*1、延时时间参照表4中的Tb及Trt*2、延时时间参照表4中的Ts1及Ts23) 写汉字程序-该程序显示一个汉字“啊”(区位码为1001H )MOV A,#0F0H ;选显示汉字命令字ACALL SUB1 ;调用写子程序MOV A,#02H ;O2H,XX,16*16点阵为单位的屏幕坐标ACALL SUB1 ;调用写子程序MOV A,#00H ;00H,YY,16*16点阵为单位的屏幕坐标ACALL SUB1;调用写子程序MOV A,#10H ;10H,QQ,GB2312汉字区位码高位ACALL SUB1;调用写

22、子程序MOV A,#01H ;01H,WW,GB2312汉字区位码低位ACALL SUB1;调用写子程序4) 写8*16 ASCII码程序 -该程序显示一个8*16 ASC码 “A” :MOV A,#0F9H ;选显示8*16 ASCII字符命令字ACALL SUB1 ;调用写子程序MOV A,#04H ;04H,XX,8*8点阵为单位的屏幕坐标值XACALL SUB1MOV A,#00H ;00H,YY,1*1点阵为单位的屏幕坐标值YACALL SUB1MOV A,#41H ;AS,ASCII字符代码“A”ACALL SUB1注:X坐标(本例中的 #04H)与ASC码中规定的相同,Y坐标(本

23、例中的 #00H)以点阵单元为单位。5) 写8*8 ASCII码程序 -该程序显示一个8*8 ASC码 “A” :MOV A,#0F1H ;选显示8*8 ASCII字符命令字ACALL SUB1 ;调用写子程序MOV A,#04H ;04H,XX,8*8点阵为单位的屏幕坐标值XACALL SUB1MOV A,#00H ;00H,YY,1*1点阵为单位的屏幕坐标值YACALL SUB1MOV A,#41H ;AS,ASCII字符代码“A”ACALL SUB16) 绘图一点(1*1点阵)程序MOV A,#0F2H ;选显示位点阵命令字ACALL SUB1 ;调用写子程序MOV A,#20H ;20

24、H,XX,以1*1点阵为单位的屏幕坐标值XACALL SUB1MOV A,#00H ;00H,YY,以1*1点阵为单位的屏幕坐标值YACALL SUB17) 绘图一横线(1*8点阵)程序MOV A,#0F3H ;选显示字节点阵命令字ACALL SUB1 ;调用写子程序MOV A,#04H ;04H,XX,以1*8点阵为单位的屏幕坐标值XACALL SUB1MOV A,#00H ;00H,YY,以1*1点阵为单位的屏幕坐标值YACALL SUB1MOV A,#0FH ;OFH,为输入字节数据,1为黑点,0为白点ACALL SUB18) 清屏程序MOV A,#0F4H ;选清屏指令命令字ACALL

25、 SUB1 ;调用写子程序9) 初始化程序ORG000H ;程序首址LJMP 100H ;跳过中断区ORG100H MOVSP,#60H ;设堆栈CLRREQ ;REQ=0SETBBUSY ;BUSY=110) 汉字内码转换成区位码程序 -该程序将外部数据(如上位机)中的汉字内码转换成区位码以便模块直接显示。 R5-存放机内码高位;R6-存放机内码低位 SUB7:PUSH A;把机内码高位放到A累加器 CLR C ; MOV A,R5; SUBB A,#0A0H;机内码减A0H为国标区码 MOV R5,A;把转换好的区码放回R5 CLR C MOV A,R6;把机内码低位放到A累加器 SUBB A,#0A0H;机内码减A0H为国标位码 MOV R6,A;把转换好的位码放回R6 POP A RETOCMJ2X8模块尺寸图21

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922