键盘扫描与数码管及点阵显示设计.docx
《键盘扫描与数码管及点阵显示设计.docx》由会员分享,可在线阅读,更多相关《键盘扫描与数码管及点阵显示设计.docx(26页珍藏版)》请在冰豆网上搜索。
![键盘扫描与数码管及点阵显示设计.docx](https://file1.bdocx.com/fileroot1/2023-1/12/b2b99c95-8906-439e-9e13-67618db997ae/b2b99c95-8906-439e-9e13-67618db997ae1.gif)
键盘扫描与数码管及点阵显示设计
课程设计
课程名称EDA技术
课题名称键盘扫描与数码管及点阵显示设计
专业电子科学与技术
班级0802
学号*******
姓名***
指导教师***
2011年6月20日
湖南工程学院
课程设计任务书
课程名称:
EDA技术
题目:
键盘扫描与数码管及点阵显示设计
专业班级:
电科0802学号:
**
学生姓名:
***
指导老师:
***
审批:
任务书下达日期2011年6月13日
设计完成日期2011年6月20日
设计内容与设计要求
一.设计内容:
1.设计并调试键盘扫描与数码管显示电路;
2.键盘为3*4,数码管为7段8位;
3.以数字形式显示键盘16个输入键的识别;
4.外设置控制开关和防抖动电路;
5.功能扩展(自选):
彩灯状态的转换以及点阵字符的显示
二.设计要求:
1.设计思路清晰,整体设计给出框图,提供顶层电路图;
2.应用vhdl完成各次级模块设计,绘出具体设计程序;
3.完成设计仿真和程序下载;
4.写出设计报告
主要设计条件
1.提供所需元件及芯片;
2.提供电源和调试设备;
3.提供EWB设计软件
说明书格式
1.课程设计封面;
2.设计仿真;
3.编程下载;
4.总结与体会;
5.附录;
6.参考文献。
7.任务书;
8.说明书目录;
9.设计总体思路;
10.单元电路设计程序;
进度安排
月日~日课题电路设计。
月日~日总体电路设计和子模块设计
月日~日软件仿真和联线。
月日~日电路调试
月日写设计报告,打印相关图纸,
月日答辩;
参考文献
一.《电子技术与EDA技术课程设计》郭照南主编
中南大学出版社
目录
第1章总体方案设计分析1
1.1基本设计思路1
1.2总体框图1
第2章各级模块设计与分析2
2.1键盘扫描程序设计及仿真2
2.2点阵显示程序设计及仿真5
2.3彩灯显示程序设计及仿真11
2.4数码管扫描程序设计及仿真14
第3章系统总电路设计与仿真16
3.1系统总电路模块图16
3.2总电路仿真波形16
3.3系统总体电路图17
第4章软件的调试与下载18
4.1引脚锁定18
4.2引脚锁定后总电路图19
4.3程序下载界面19
4.4系统总体仿真结果20
第5章总结与体会21
第6章参考文献22
第7章附录23
7.1点阵字符显示效果图23
7.2彩灯显示结果23
第1章总体方案设计分析
1.1基本设计思路
首先利用键盘扫描程序完成键盘扫描及按键输出值的输出,同时在其中加入按键消抖程序,以保证按键每次按下的键值都是有效准确的理想输出信号。
同时通过按键扫描的输出定义两个控制信号量(程序中即xuanze和dz两信号)以通过按键的按下来达到控制彩灯状态切换以及点阵字符显示切换的目的。
其中,定义了两个彩灯控制信号,以用来选择彩灯模块中两种彩灯显示状态的切换,而点阵控制信号则定义了五个状态以控制点阵显示的五个状态的切换。
从而整个系统则通过键盘扫描程序中的两个控制信号连接成了一个整体。
最后就将键盘扫描的输出信号连接到数码管显示模块,彩灯模块连接到8个led灯,而点阵模块的输出则接入到点阵上。
再在现有的基础上加入清零信号cr。
综上,整个系统的功能即得以实现。
1.2总体框图
图1.1系统总体框图
第2章各级模块设计与分析
2.1键盘扫描程序设计及仿真
2.1.1基本设计思路
本模块采用行输入,列输出,并定义一个五位的矢量信号count,此矢量通过时钟脉冲的输入计数,并且定义一个信号量sel并取其中间两位,以此两位构成的四个状态进行键盘列扫描,同时再在另外一个进程中通过三个条件语句的选择判断以确定三个行键中哪个按下,并结合列扫描中sel所取的四个状态共同连接赋值给一个四位矢量knum,并由此确定了键盘的12个状态。
最后利用另外一个进程中对knum值的判断从而确定对应的按键值的输出,以及其他各控制键值的信号输出(其中包括,控制彩灯状态的控制信号xuanze,以及控制点阵显示状态的控制信号dz)。
2.1.2键盘扫描模块图
图2.1.1键盘扫描模块图
图中clk接时钟脉冲,cr是复位端,kin1,kin2,kin3为行扫描输入,xuanze为彩灯控制信号,dz为点阵控制信号,keyv为列输出,keycode为按键显示数值输出。
2.1.3键盘扫描程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitykeyscanis
port(clk,cr:
instd_logic;--扫描时钟输入
kin1,kin2,kin3:
instd_logic;--按键行扫描输入
xuanze:
outstd_logic_vector(1downto0);
dz:
outstd_logic_vector(2downto0);
keyv:
outstd_logic_vector(3downto0);--按键列扫描
keycode:
outstd_logic_vector(4downto0));--段码显示输出
endkeyscan;
architectureaofkeyscanis
signalsel:
std_logic_vector(1downto0);
signalknum:
std_logic_vector(3downto0);
signalcount:
std_logic_vector(4downto0);
signalcount0:
std_logic;
begin
sel<=count(3downto2);
count0<=count(0);
p1:
process(clk)--产生扫描信号
begin
ifclk'eventandclk='1'then
count<=count+1;
endif;
endprocess;
p2:
process(sel)--扫描信号译码输出
begin
caseselis
when"00"=>keyv<="1110";
when"01"=>keyv<="1101";
when"10"=>keyv<="1011";
when"11"=>keyv<="0111";
whenothers=>keyv<="1111";
endcase;
endprocess;
p3:
process(count0,count,kin1,kin2,kin3)--查键值
begin
if(cr='0')thenknum<='1'&'1'&count(3downto2);
elsifcount0'eventandcount0='1'then
if(kin3='0')andcount
(1)='0'then--第三行有键按下时
knum<='1'&'0'&count(3downto2);
elsif(kin2='0')andcount
(1)='0'then--第二行有键按下时
knum<='0'&'1'&count(3downto2);
elsif(kin1='0')andcount
(1)='0'then--第一行有键按下时
knum<='0'&'0'&count(3downto2);
endif;
endif;
endprocess;
p4:
process(knum)--键值译码显示输出
begin
ifcr='0'thenxuanze<="11";dz<="111";
else
caseknumis
when"0000"=>keycode<="00000";xuanze<="00";dz<="001";
when"0001"=>keycode<="00001";xuanze<="00";dz<="010";
when"0010"=>keycode<="00010";xuanze<="00";dz<="011";
when"0011"=>keycode<="00011";xuanze<="00";dz<="100";
when"0100"=>keycode<="00100";xuanze<="00";dz<="000";
when"0101"=>keycode<="00101";xuanze<="00";dz<="000";
when"0110"=>keycode<="00110";xuanze<="00";dz<="000";
when"0111"=>keycode<="00111";xuanze<="00";dz<="000";
when"1000"=>keycode<="01000";xuanze<="00";dz<="000";
when"1001"=>keycode<="01001";xuanze<="00";dz<="000";
when"1010"=>keycode<="01010";xuanze<="01";dz<="000";
when"1011"=>keycode<="01011";xuanze<="10";dz<="000";
whenothers=>keycode<="01100";xuanze<="00";dz<="000";
endcase;
endif;
endprocess;
enda;
2.1.4键盘扫描仿真波形
图2.1.2键盘扫描仿真波形
2.2点阵显示程序设计及仿真
2.2.1基本设计思路
程序通过键盘扫描程序中的点阵输出控制信号dz来控制点阵字符显示的状态,然后定义点阵的行列为输出类型,通过六个case语句以及16个显示状态的循环扫描来达到字符显示效果。
最终结果,通过6个按键的控制分别输出“湖”,“南”,“工”,“程”,“学”,“院”六个字符。
2.2.2点阵显示模块图
图2.2.1点阵显示模块图
其中clk接时钟脉冲,cr接复位端,dz接从键盘扫描程序中输出的点阵控制信号,hang,lie分别定义为点阵的行列的20个输入引脚。
2.2.3点阵显示程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitydianzhengis
port(clk,cr:
instd_logic;--扫描时钟输入
dz:
instd_logic_vector(2downto0);
hang:
outstd_logic_vector(15downto0);
lie:
outstd_logic_vector(3downto0));
endentitydianzheng;
architecturebehavofdianzhengis
signalsel:
std_logic_vector(3downto0);
signalcount:
std_logic_vector(4downto0);
typezhuangtaiis(s0,s1,s2,s3,s4,s5);
signalcurrent_state,next_state:
zhuangtai;
begin
sel<=count(3downto0);
p0:
process(clk)--产生扫描信号
begin
ifcr='0'thencount<="00000";
elsifclk'eventandclk='1'thencount<=count+1;
if(count="10000")thencount<="00000";
endif;
current_state<=next_state;
endif;
endprocessp0;
p1:
process(sel,dz,current_state)
begin
casecurrent_stateis
whens0=>if(dz="001")then
caseselis
when"0000"=>lie<="1111";hang<="0100001000000010";
when"0001"=>lie<="1110";hang<="0011001000011111";
when"0010"=>lie<="1101";hang<="0001001000010010";
when"0011"=>lie<="1100";hang<="0000001000010010";
when"0100"=>lie<="1011";hang<="1001111111110010";
when"0101"=>lie<="1010";hang<="0110001000011110";
when"0110"=>lie<="1001";hang<="0010001010010010";
when"0111"=>lie<="1000";hang<="0000111111010010";
when"1000"=>lie<="0111";hang<="0001100010010010";
when"1001"=>lie<="0110";hang<="0010100010011110";
when"1010"=>lie<="0101";hang<="1100100010010010";
when"1011"=>lie<="0100";hang<="0100100010010010";
when"1100"=>lie<="0011";hang<="0100100010010010";
when"1101"=>lie<="0010";hang<="0100111110010010";
when"1110"=>lie<="0001";hang<="0100100000101010";
when"1111"=>lie<="0000";hang<="0100000001000100";
whenothers=>count<="00000";hang<="0000000000000000";
endcase;
next_state<=s0;
elsif(dz="010")thennext_state<=s1;
elsif(dz="011")thenlie<="1111";hang<="0000000000000000";next_state<=s2;
elsif(dz="100")thenlie<="1111";hang<="0000000000000000";next_state<=s3;
elsif(dz="000")thenlie<="1111";hang<="0000000000000000";next_state<=s4;
elsif(dz="111")thenlie<="1111";hang<="0000000000000000";next_state<=s5;
elsenull;
endif;
whens1=>
caseselis
when"0000"=>lie<="1111";hang<="0000000100000000";
when"0001"=>lie<="1110";hang<="0000000100000100";
when"0010"=>lie<="1101";hang<="1111111111111110";
when"0011"=>lie<="1100";hang<="0000000100000000";
when"0100"=>lie<="1011";hang<="0000000100000100";
when"0101"=>lie<="1010";hang<="0111111111111110";
when"0110"=>lie<="1001";hang<="0100100000100100";
when"0111"=>lie<="1000";hang<="0100010001000100";
when"1000"=>lie<="0111";hang<="0101111111110100";
when"1001"=>lie<="0110";hang<="0100000100000100";
when"1010"=>lie<="0101";hang<="0100000100000100";
when"1011"=>lie<="0100";hang<="0101111111110100";
when"1100"=>lie<="0011";hang<="0100000100000100";
when"1101"=>lie<="0010";hang<="0100000100000100";
when"1110"=>lie<="0001";hang<="0100000100010100";
when"1111"=>lie<="0000";hang<="0100000000001000";
whenothers=>count<="00000";hang<="0000000000000000";
endcase;
next_state<=s0;
whens2=>
caseselis
when"0000"=>lie<="1111";hang<="0000000000000000";
when"0001"=>lie<="1110";hang<="0000000000001000";
when"0010"=>lie<="1101";hang<="0111111111111100";
when"0011"=>lie<="1100";hang<="0000000100000000";
when"0100"=>lie<="1011";hang<="0000000100000000";
when"0101"=>lie<="1010";hang<="0000000100000000";
when"0110"=>lie<="1001";hang<="0000000100000000";
when"0111"=>lie<="1000";hang<="0000000100000000";
when"1000"=>lie<="0111";hang<="0000000100000000";
when"1001"=>lie<="0110";hang<="0000000100000000";
when"1010"=>lie<="0101";hang<="0000000100000000";
when"1011"=>lie<="0100";hang<="0000000100000000";
when"1100"=>lie<="0011";hang<="0000000100000100";
when"1101"=>lie<="0010";hang<="1111111111111110";
when"1110"=>lie<="0001";hang<="0000000000000000";
when"1111"=>lie<="0000";hang<="0000000000000000";
whenothers=>count<="00000";hang<="0000000000000000";
endcase;
next_state<=s0;
whens3=>
caseselis
when"0000"=>lie<="1111";hang<="0000100000000100";
when"0001"=>lie<="1110";hang<="0001110111111110";
when"0010"=>lie<="1101";hang<="1111000100000100";
when"0011"=>lie<="1100";hang<="0001000100000100";
when"0100"=>lie<="1011";hang<="0001000100000100";
when"0101"=>lie<="1010";hang<="1111111100000100";
when"0110"=>lie<="1001";hang<="0001000111111100";
when"0111"=>lie<="1000";hang<="0011100000000000";
when"1000"=>lie<="0111";hang<="0011011111111110";
when"1001"=>lie<="0110";hang<="0101010000100000";
when"1010"=>lie<="0101";hang<="0101000000101000";
when"1011"=>lie<="0100";hang<="1001000111111100";
when"1100"=>lie<="0011";hang<="0001000000100000";
when"1101"=>lie<="0010";hang<="0001000000100100";
when"1110"=>lie<="0001";hang<="0001011111111110";
when"1111"=>lie<="0000";hang<="0001000000000000";
whenothers=>count<="00000";hang<="0000000000000000";
endcase;
next_state<=s0;
whens4=>
caseselis
when"0000"=>lie<="1111";h