图2 键盘逻辑实际原理图
上图中Module 1模块实现分频功能,CLK来自单片机80C196KC的CLKOUT脚,其周期为3个时钟振荡周期,占空比为33%。若单片机用16M晶振,其频率约为:16M/3=5.33M。Module 1 把频率降至约1K,Module 2模块以一秒的间隔使O3~O0依次循环输出低电平进行键盘扫描 。当有键按下时,I3~I0中有一个为低电平,异或门输出1个高电平脉冲,锁存键盘状态并向单片机申请中断。系统为键盘分配的地址空间为0xf100~0xf1ff,在此范围内可读取键盘的扫描码。
由于篇幅有限,以下只给出Module 2的VHDL语句,具体如下:
LIBRARY ieee;
USE ieee.STd_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY Module2 IS
PORT ――定义端口
( clk :IN std_logic;
q :OUT std_logic_vector(3 DOWNTO 0)
);
END Module2;
ARCHITECTURE Module2 of Module2 IS
BEGIN
PROCESS(clk)
VARIBLE sum:integer:=0; ――定义变量sum,初值为0
BEGIN
IF(clk’event AND clk=’1’)THEN
sum:=sum+1; ――clk为上升沿时,sum加1
IF(sum>=5)THEN
sum:=1;
END IF;
END IF;
CASE sum IS ――根据sum输出相应的值
WHEN 1 => q<=“1110”;
WHEN 2 => q<=“1101”;
WHEN 3 => q<=“1011”;
WHEN 4 => q<=“0111”;
WHEN THERS => q<=“1111”;
END CASE;
END PROCESS;
END Module2;