利用按键开关控制液晶显示器进行十六进制数字显示Word文档下载推荐.docx
《利用按键开关控制液晶显示器进行十六进制数字显示Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《利用按键开关控制液晶显示器进行十六进制数字显示Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
2.1、设计内容
用VHDL语言编写程序,实现利用按键开关控制液晶屏显示16进制数。
2.2、设计要求
1.学习掌握按键开关控制模块、液晶显示模块的工作原理及应用;
2.熟练掌握VHDL编程语言,编写按键开关控制模块的控制逻辑;
3.仿真所编写的程序,模拟验证所编写的模块功能;
4.下载程序到芯片中,硬件验证所设置的功能,能够实现十六进制数字的显示;
5.整理设计内容,编写设计说明书。
3、
设计方案及实现情况
3.1、设计思路
根据题目设计要求,用按键控制液晶屏显示16进制数,开始的实际本来是要用16个按键来实现,但在硬件实现的过程中,一直出现各种问题,所以采用了一个按键,循环显示0—f。
由于是按键控制,所以加入了消抖程序,对液晶屏的控制则是通过状态机来实现的。
先输入F9,选择8*16ascII码显示模式,在输入坐标XXYY。
3.2、工作原理及框图
本设计将系统分为四个模块,消抖模块,按键输入模块,译码模块和液晶屏控制模块,先分别用MAX+PLUSII文本设计输入编写每个模块,模块功能好了就可以实现最后的结果了。
信号由消抖模块的XD管脚输入,经过消抖程序后,在译码模块中将四位二进制代码翻译成八位2进制的ASCII码,输入到液晶屏控制模块中,实现对液晶屏的控制。
与此同时,每按下一次按键,按键模块中的变量就会+1,当加到1111B时,自动清零,实现了0--F循环显示。
最重要也是最难的液晶屏控制模块采用状态机程序编写,原理祥见附录1(如图1)。
图1系统原理图
3.3、各模块功能描述
(1)消抖电路
加入本模块的原因是因为按键开关在按下时信号会产生抖动,在硬件实现是可能出现按一下跳过很多个数的情况,对程序的输入会产生影响,加入模块后消除抖动(如图2)。
程序代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
图2消抖模块硬件原理图
entityxdis
port(
rst:
instd_logic;
xd:
instd_logic;
clk:
xdout:
outstd_logic);
endxd;
architectureaofxdis
signalcount:
integerrange0to100;
begin
process(clk,rst,xd)
if(rst='
0'
)then
count<
=0;
xdout<
='
;
elsif(clk'
eventandclk='
1'
if(count=30)then
=notxd;
else
=count+1;
endif;
endprocess;
enda;
(2)按键输入和译码模块
该模块的作用是将按键输入进来的信号进行处理,每按一次,数自动+1,并将数字的ASCII码编译成8位2进制ASCII码送给液晶屏控制程序,当显示到F时置0(如图3)。
①按键输入模块
图3按键及译码模块硬件原理图
entityajis
port(
aj:
ajout:
outstd_logic_vector(3downto0)
);
endaj;
architectureajworkofajis
signalq:
std_logic;
signalcount:
std_logic_vector(3downto0);
begin
q<
=ajwhenrst='
else'
process(q,rst)
="
0000"
elsifq'
eventandq='
then
ifcount="
1111"
ajout<
=count;
endajwork;
②译码模块
entityymis
port(ym:
instd_logic_vector(3downto0);
Y:
outstd_logic_vector(7downto0));
endym;
architectureyima_archofymis
signala:
std_logic_vector(3downto0);
a<
=ym;
Y<
00110000"
when(a="
)else
"
00110001"
0001"
00110010"
0010"
00110011"
0011"
00110100"
0100"
00110101"
0101"
00110110"
0110"
00110111"
0111"
00111000"
1000"
)else
00111001"
1001"
01000001"
1010"
01000010"
1011"
01000011"
1100"
01000100"
1101"
01000101"
1110"
01000110"
10011010"
endyima_arch;
(3)液晶屏控制模块
本模块用状态机的方法实现,每次按键按下,模块将液晶屏模式选择代码F9,横坐标07,
纵坐标03分三次输入到液晶屏中,然后再将要显示的数的ASCII码的8位2进制码输入到液晶屏中(如图4)。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
图4液晶显示屏控制模块硬件原理图
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYlcdIS
PORT(busy:
INSTD_LOGIC;
clk_fsm:
db_ascii:
INSTD_LOGIC_VECTOR(7DOWNTO0);
req:
OUTSTD_LOGIC;
db:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDlcd;
ARCHITECTURErtlOFlcdIS
SIGNALready:
STD_LOGIC;
TYPEstateIS(CMD,XX,YY,ASCII);
SIGNALcurrent_state:
state;
BEGIN
PROCESS(clk_fsm,busy,ready,db_ascii)
variablecnt1:
std_logic_vector(2downto0);
BEGIN
IFrising_edge(clk_fsm)THEN
CASEcurrent_stateIS
WHENCMD=>
IFbusy='
THEN
IFready='
THEN
current_state<
=XX;
ready<
='
ELSE
db<
="
11111001"
req<
ENDIF;
ELSE
req<
ready<
current_state<
=CMD;
ENDIF;
WHENXX=>
=YY;
00000111"
ELSE
WHENYY=>
=AS