利用按键开关控制液晶显示器进行十六进制数字显示.docx
《利用按键开关控制液晶显示器进行十六进制数字显示.docx》由会员分享,可在线阅读,更多相关《利用按键开关控制液晶显示器进行十六进制数字显示.docx(23页珍藏版)》请在冰豆网上搜索。
![利用按键开关控制液晶显示器进行十六进制数字显示.docx](https://file1.bdocx.com/fileroot1/2022-11/15/e4821415-885f-4e4b-aa69-150cbf4c645e/e4821415-885f-4e4b-aa69-150cbf4c645e1.gif)
利用按键开关控制液晶显示器进行十六进制数字显示
目录
1、课程设计目的……………………………………………………………………3
2、课程设计内容及要求……………………………………………………………3
2.1、设计内容………………………………………………………………………3
2.2、设计要求………………………………………………………………………3
3、设计方案及实现情况……………………………………………………………3
3.1、设计思路………………………………………………………………………3
3.2、工作原理及框图………………………………………………………………3
3.3、各模块功能描述………………………………………………………………4
3.4、仿真结果………………………………………………………………………11
3.5、试验箱验证情况………………………………………………………………11
4、课程设计总结……………………………………………………………………14
5、参考文献…………………………………………………………………………14
附录1:
液晶显示屏说明书…………………………………………………………15
1、课程设计目的
1.学习操作数字电路设计实验开发系统,掌握液晶显示模块的工作原理及应用。
2.掌握组合逻辑电路、时序逻辑电路的设计方法。
3.学习掌握可编程器件设计的全过程。
2、课程设计内容和要求:
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:
instd_logic;
xdout:
outstd_logic);
endxd;
architectureaofxdis
signalcount:
integerrange0to100;
begin
process(clk,rst,xd)
begin
if(rst='0')then
count<=0;
xdout<='0';
elsif(clk'eventandclk='1')then
if(count=30)then
count<=0;
xdout<=notxd;
else
count<=count+1;
endif;
endif;
endprocess;
enda;
(2)按键输入和译码模块
该模块的作用是将按键输入进来的信号进行处理,每按一次,数自动+1,并将数字的ASCII码编译成8位2进制ASCII码送给液晶屏控制程序,当显示到F时置0(如图3)。
程序代码:
①按键输入模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;图3按键及译码模块硬件原理图
useieee.std_logic_arith.all;
entityajis
port(
aj:
instd_logic;
rst:
instd_logic;
ajout:
outstd_logic_vector(3downto0)
);
endaj;
architectureajworkofajis
signalq:
std_logic;
signalcount:
std_logic_vector(3downto0);
begin
q<=ajwhenrst='1'else'0';
process(q,rst)
begin
if(rst='0')then
count<="0000";
elsifq'eventandq='1'then
ifcount="1111"then
count<="0000";
else
count<=count+1;
endif;
endif;
ajout<=count;
endprocess;
endajwork;
②译码模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityymis
port(ym:
instd_logic_vector(3downto0);
Y:
outstd_logic_vector(7downto0));
endym;
architectureyima_archofymis
signala:
std_logic_vector(3downto0);
begin
a<=ym;
Y<="00110000"when(a="0000")else
"00110001"when(a="0001")else
"00110010"when(a="0010")else
"00110011"when(a="0011")else
"00110100"when(a="0100")else
"00110101"when(a="0101")else
"00110110"when(a="0110")else
"00110111"when(a="0111")else
"00111000"when(a="1000")else
"00111001"when(a="1001")else
"01000001"when(a="1010")else
"01000010"when(a="1011")else
"01000011"when(a="1100")else
"01000100"when(a="1101")else
"01000101"when(a="1110")else
"01000110"when(a="1111")else
"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:
INSTD_LOGIC;
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='0'THEN
IFready='1'THEN
current_state<=XX;
ready<='0';
ELSE
db<="11111001";
req<='1';
ready<='0';
ENDIF;
ELSE
req<='0';
ready<='1';
current_state<=CMD;
ENDIF;
WHENXX=>
IFbusy='0'THEN
IFready='1'THEN
current_state<=YY;
ready<='0';
ELSE
db<="00000111";
req<='1';
ready<='0';
ENDIF;
ELSE
req<='0';
ready<='1';
current_state<=XX;
ENDIF;
WHENYY=>
IFbusy='0'THEN
IFready='1'THEN
current_state<=AS