实验二 键盘扫描实验
- 格式:doc
- 大小:450.00 KB
- 文档页数:5
实验二 键盘扫描实验
一、实验目的
熟悉VHDL的语法和编译排错,重点掌握组合逻辑中显示译码器的设计。附加学习键盘和数码管显示控制。
二、实验内容
1. 设计一个BCD码到LED的七段译码器,非BCD值时仅G段亮(输出为“—”)。
2. 下载验证键盘显示实验。
3. 改写程序,将学号的数据固定地显示在1-8位数码管上。
4. 将F键功能改为换向键,即可以控制数字滚动显示的方向。
三、实验步骤
1. 用文本输入法,在键盘显示程序的译码部分,分别用三种语法填写BCD到LED的译码器。三种语法为When else、With select、Case,建议使用模板。每一种都需编译通过提交程序。
2. 选一种语法,编译,绑定引脚,下载验证结果。
3. 改写程序,将0--7的数据固定地显示在1-8位数码管上。编译、下载验证结果。
4. 将F键功能改为换向键,即可以控制数字滚动显示的方向。编译、下载验证结果。
四、实验硬件图
图1 4x4键盘
图2 数码管动态显示原理框图
一种推荐的适配卡连线如下表所示:
输入
信号名 对应芯片
端子名 引 入端子名 功 能 输出
信号名 对应芯片端子名 引 入端子名 功 能
CLK1 PIN_A20 10HZ 时钟 LED_SEG[2] PIN_C1 C 段选
LED_SEG[3] PIN_B1 D 段选
LED_SEG[4] PIN_C3 E 段选
LED_BIT[0] PIN_G4 BIT1 位选1 LED_SEG[5] PIN_E5 F 段选
LED_BIT[1] PIN_E3 BIT2 位选2 LED_SEG[6] PIN_B3 G 段选
LED_BIT[2] PIN_D2 BIT3 位选3 LED_SEG[7] PIN_B4 H 段选
LED_BIT[3] PIN_C2 BIT4 位选4 KEYCOL[0] PIN_A16 C1 键盘列
LED_BIT[4] PIN_B2 BIT5 位选5 KEYCOL[1] PIN_C17 C2
LED_BIT[5] PIN_C4 BIT6 位选6 KEYCOL[2] PIN_A17 C3
LED_BIT[6] PIN_E6 BIT7 位选7 KEYCOL[3] PIN_A18 C4
LED_BIT[7] PIN_A3 BIT8 位选8 KEYROW[1] PIN_A7 R1 键盘行
LED_SEG[0] PIN_G3 A 段选 KEYROW[2] PIN_A8 R2
LED_SEG[1] PIN_E4 B 段选 KEYROW[3] PIN_A9 R3
KEYROW[4] PIN_A10 R4
五、实验文件(需要填写译码部分)
KEYSCAN 时钟扫描程序
文件名:KEYSCAN.VHD
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity KEYSCAN is
port (
CLK1: in STD_LOGIC;
KEYROW1,KEYROW2,KEYROW3,KEYROW4: in STD_LOGIC;--键盘行接口
KEYCOL: out STD_LOGIC_VECTOR (3 DOWNTO 0);--键盘列接口
LED_BIT: out STD_LOGIC_VECTOR (7 DOWNTO 0); --LED位选接口
LED_SEG: out STD_LOGIC_VECTOR (7 DOWNTO 0)); --LED段选接口
end KEYSCAN;
architecture KEYSCAN_ARCH of KEYSCAN is
SIGNAL SEG : STD_LOGIC_VECTOR (6 DOWNTO 0);--LED段选
SIGNAL BIT : STD_LOGIC_VECTOR (2 DOWNTO 0);--LED位选
SIGNAL NUM : STD_LOGIC_VECTOR (3 DOWNTO 0);--显示数字
SIGNAL COUNT : STD_LOGIC_VECTOR (4 DOWNTO 0);--计数脉冲
SIGNAL COUNT0 : STD_LOGIC; --计数脉冲最低位LSB
SIGNAL COL: STD_LOGIC_VECTOR (1 DOWNTO 0); --键盘列
begin
--计数器模块
PROCESS (CLK1)
BEGIN
IF CLK1'event AND CLK1 = '1' THEN
COUNT <= COUNT+1;
END IF;
END PROCESS;
--计数器模块
--键盘模块
COL <=COUNT(3 DOWNTO 2);
KEYCOL <= "1110" WHEN COL = 0 ELSE
"1101" WHEN COL = 1 ELSE
"1011" WHEN COL = 2 ELSE
"0111" WHEN COL = 3 ELSE
"1111";
COUNT0 <= COUNT(0);
PROCESS (count0,COUNT,KEYIN1,KEYIN2)
BEGIN
IF COUNT0'event and (COUNT0 = '1')THEN
--分四行扫描
IF (KEYROW1 = '0') and (COUNT(1) = '0') THEN
NUM(3 DOWNTO 2)<= "00";
NUM(1 DOWNTO 0) <= COUNT(3 DOWNTO 2);
--COUNT(1 DOWNTO 0)只起分频延时的作用
ELSIF (KEYROW2 = '0') and (COUNT(1) = '0') THEN
NUM(3 DOWNTO 2)<= "01";
NUM(1 DOWNTO 0) <= COUNT(3 DOWNTO 2);
ELSIF (KEYROW3 = '0') and (COUNT(1) = '0') THEN
NUM(3 DOWNTO 2)<= "10";
NUM(1 DOWNTO 0) <= COUNT(3 DOWNTO 2);
ELSIF (KEYROW4 = '0') and (COUNT(1) = '0') THEN
NUM(3 DOWNTO 2)<= "11";
NUM(1 DOWNTO 0) <= COUNT(3 DOWNTO 2);
END IF;
END IF;
END PROCESS;
--键盘模块
--显示模块
BIT <= COUNT(4 DOWNTO 2); --位选扫描信号
LED_BIT <= "11111110" WHEN BIT = 0 ELSE --位选扫描信号译码
"11111101" WHEN BIT = 1 ELSE
"11111011" WHEN BIT = 2 ELSE
"11110111" WHEN BIT = 3 ELSE
"11101111" WHEN BIT = 4 ELSE
"11011111" WHEN BIT = 5 ELSE
"10111111" WHEN BIT = 6 ELSE
"01111111" WHEN BIT = 7 ELSE
"11111111";
--译码部分请填写完整
--pgfedcba
--参考码表0-f 十六进制
--3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH
--6FH 77H 7CH 39H 5EH 79H 71H
--参考码表0-f 二进制
--0111111 0000110 1011011 1001111 1100110 1101101 1111101 0000111
--1111111 1101111 1110111 1111100 0111001 1011110 1111001 1110001
--译码部分完,输出到LED段选,同时选通位选端
LED_SEG(6 DOWNTO 0)<=SEG;
LED_SEG(7) <= '0';
--显示模块
end KEYSCAN_ARCH;
六、实验注意事项
程序较大,结合电路理解很费时间,应事先预习。如果没有单片机键盘显示电路的前续知识,查找资料学习。
七、实验报告要求
提交自己编写的那部分程序清单。
八、实验评分标准
1. 完成步骤1的评C.
2. 完成步骤2的评B
3. 完成步骤3或4的评A.