实验二 键盘扫描实验

  • 格式: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.