实验四 键盘扫描及显示设计实验报告

合集下载

实验四 键盘实验

实验四  键盘实验

实验四矩阵键盘控制接口设计实验一、实验目的1、掌握MAX+plus 软件的使用方法。

2、掌握层次化设计方法:底层为文本文件,顶层为图形文件。

3、了解用12 位按健输入开关来设计并实现一个3 x 4 矩阵键盘接口控制器。

了解弹跳消除电路的工作原理。

二、实验设备1、计算机2、MAX+plus II软件及实验箱三、实验原理该实验系统中没有矩阵键盘,可以用12 位按键开关来实现矩阵键盘的功能。

当按键被按下时改按键的节点会呈现‘0’状态,反之为‘1’。

将12 个键进行编码后就可以实现距阵键盘的功能。

键盘编码电路:由于每个按键开关都是独立的,故有12 路输入,3X4 键盘有12 个键值,4位二进制数即可表示全部状态。

因此,键盘编码电路为12 输入4 输出编码器。

12 个按键可分为10 个数字键和2 个功能键。

数字键主要用来输入数字,功能键一般实现一些特殊用途(如确认、清除等)。

4 位输出从0~9 表示10 个数字键,11 和12 表示两个功能键。

弹跳消除电路:因为按键开关是机械式结构,在开关切换的瞬间会在接触点出现来回弹跳的现象,对于激活关闭一般电器并不会有何影响,但对于灵敏度较高的电路,却有可能产生误动作而出错。

跳现象产生的原因可从下图说明。

虽然只是按下按键一次然后放开,然而实际产生的按键信号却不只跳动一次,经过取样的检查后将会造成误判,以为按键两次。

弹跳现象产生错误的抽样结果如果调整抽样频率可以发现弹跳现象获得了改善。

因此在开关输入信号处必须加上弹跳消除电路,避免误操作信号的发生。

注意:弹跳消除电路所使用脉冲信号的频率必须要选用合适,频率太低则按键反应痴动,频率太高则起不到消除弹跳的作用,而且消除弹跳电路设计的不同对频率也有不同的要求。

数码管采用共阴极:段码表四、实验内容1、用12 个按键开关实现矩阵键盘,当按下某一键时在数码管上显示对应的键值。

2、分析仿真示例程序理解弹跳消除的实现原理。

3、通过改变CLK 信号,理解时钟信号对弹跳消除的影响。

键盘扫描程序实验报告

键盘扫描程序实验报告

一、实验目的1. 理解键盘扫描的基本原理。

2. 掌握使用C语言进行键盘扫描程序设计。

3. 学习键盘矩阵扫描的编程方法。

4. 提高单片机应用系统的编程能力。

二、实验原理键盘扫描是指通过检测键盘矩阵的行列状态,判断按键是否被按下,并获取按键的值。

常见的键盘扫描方法有独立键盘扫描和矩阵键盘扫描。

独立键盘扫描是将每个按键连接到单片机的独立引脚上,通过读取引脚状态来判断按键是否被按下。

矩阵键盘扫描是将多个按键排列成矩阵形式,通过扫描行列线来判断按键是否被按下。

这种方法可以大大减少引脚数量,降低成本。

本实验采用矩阵键盘扫描方法,使用单片机的并行口进行行列扫描。

三、实验设备1. 单片机开发板(如51单片机开发板)2. 键盘(4x4矩阵键盘)3. 连接线4. 调试软件(如Keil)四、实验步骤1. 连接键盘和单片机:将键盘的行列线分别连接到单片机的并行口引脚上。

2. 编写键盘扫描程序:(1)初始化并行口:将并行口设置为输入模式。

(2)编写行列扫描函数:逐行扫描行列线,判断按键是否被按下。

(3)获取按键值:根据行列状态,确定按键值。

(4)主函数:调用行列扫描函数,读取按键值,并根据按键值执行相应的操作。

3. 调试程序:将程序下载到单片机,观察键盘扫描效果。

五、实验程序```c#include <reg51.h>#define ROW P2#define COL P3void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 123; j++);}void scan_key() {unsigned char key_val = 0xFF;ROW = 0xFF; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值ROW = 0x00; // 初始化行delay(1); // 延时消抖key_val = ROW & COL; // 获取按键值}void main() {while (1) {scan_key();if (key_val != 0xFF) {// 执行按键对应的操作}}}```六、实验结果与分析1. 实验结果:程序下载到单片机后,按键按下时,单片机能够正确读取按键值。

从键盘输入数据并显示实验报告

从键盘输入数据并显示实验报告

从键盘输入数据并显示实验报告一、实验目的与内容1、实验目的掌握接收键盘数据的方法,并了解将键盘数据显示时须转换为ASCII码的原理,并在程序中设置错误出口。

2、实验内容编写程序,将键盘接收到的四位十六进制数按“Enter”回车键转化为二进制数,再显示在屏幕上, 按“空格键”结束!。

若输入的不是0-F间的数字,则显示出错信息,并要求重新输入。

二、实验设备(环境)1、实验设备(含芯片名称、功能简介)微型计算机一台2、实验环境TPC-ZK-II集成环境3、使用语言汇编语言三、实验原理(实验所用到的知识点及相关内容)1.在TPC-ZK-II集成环境下输入汇编程序,编译、连接,生成.exe文件。

2.按提示输入数据,在屏幕显示的运行结果中查看结果是否正确。

3.输入不同的数据,可得到不同的结果。

4、参考流程图四、实验步骤(包括步骤、代码、实验截图及其必要说明)编写程序,将键盘接收到的 4 位 16 进制数转换为等值的二进制数,再显示在荧光屏上。

分析:整个程序分为 3 个部分:键盘输入、转换、显示,可以分别用子程序来完成。

1. 输入。

输入可以利用字符串输入。

这时需要在主程序中先开辟一段输入缓冲区。

字符串输入 ( 0AH 功能 ),入口参数 DS : DX = 缓冲区的首地址,( DS :DX ) = 限制最多输入的字符数,功能号 AH = 0AH,类型号 21H。

出口参数 ( DS : DX+1 ) =实际键入的字符 ( 不含回车符 ),从( DS : DX+2 ) 开始顺序存放键入的字符串,回车符 0DH为串尾最后一字符。

实现功能:等待从键盘输入字符串,并存入设定的缓冲区内,同时回显字符串,光标随着移动,回车符使光标回到行首。

注意事项:应按要求先定义缓冲区,再调用。

数据缓冲区的设置如下:DATA SEGMENT ; 定义缓冲区MARK DB ?MESS DB 'input:$' ;输入字符串提示ERROR DB 0DH,0AH,'input error!',0DH,0AH,'$' ;输入错误提示DATA ENDS从键盘输入‘ ABCD ’, 回车,内存的存放结果 :子程序如下:INPUT PROCLEA DX, striMOV AH, 09H ; 调显示功能INT 21HLEA DX , maxMOV AH , 0AHINT 21H ; 调 0A输入功能RETINPUT ENDP2. 转换。

数码管显示和键盘扫描实验资料

数码管显示和键盘扫描实验资料

实验三LED数码管动态显示及4 X4 键盘控制实验一、实验目的1.巩固多位数码管动态显示方法。

2.掌握行扫描法矩阵式按键的处理方法。

3.熟练应用AT89S52学习板实验装置,进一步掌握keil C51的使用方法。

二、实验内容使用AT89S52学习板上的4位LED数码管和4 X 4矩阵键盘阵列做多位数码管动态显示及行扫描法键盘处理功能实验。

用P0口做数据输出,利用P1做锁存器74HC573的锁存允许控制,编写程序使4位LED数码管按照动态显示方式显示一定的数字;按照行扫描法编写程序对4 X 4矩阵键盘阵列进行定期扫描,计算键值并在数码管上显示。

三、实验系统组成及工作原理1.4位LED数码管和4 X 4矩阵键盘阵列电路原理图2.多位数码管动态显示方式a b c d e f g dp com a b c d e f g dpcoma b c d e f g dpcoma b c d e f g dpcomD0IO(2)IO(1)说明4位共阴极LED动态显示3456数字的工作过程首先由I/O口(1)送出数字3的段选码4FH即数据01001111到4个LED共同的段选线上,接着由I/O口(2)送出位选码××××0111到位选线上,其中数据的高4位为无效的×,唯有送入左边第一个LED的COM端D3为低电平“0”,因此只有该LED的发光管因阳极接受到高电平“1”的g、d、c、b、a段有电流流过而被点亮,也就是显示出数字3,而其余3个LED因其COM端均为高电平“1”而无法点亮;显示一定时间后,再由I/O口(1)送出数字4的段选码66H即01100110到段选线上,接着由I/O 口(2)送出点亮左边第二个LED的位选码××××1011到位选线上,此时只有该LED的发光管因阳极接受到高电平“1”的g、f、c、b段有电流流过因而被点亮,也就是显示出数字4,而其余3位LED不亮;如此再依次送出第三个LED、第四个LED的段选与位选的扫描代码,就能一一分别点亮各个LED,使4个LED从左至右依次显示3、4、5、6。

键盘显示实验报告

键盘显示实验报告

键盘显示实验报告键盘显示实验报告一、引言键盘是我们日常生活中常用的输入设备之一,它通过按下不同的按键来输入字符和命令。

在计算机科学领域,键盘显示是一项重要的实验,它涉及到了计算机硬件和软件的相互配合。

本文将介绍一个键盘显示实验的设计和结果分析。

二、实验设计1. 实验目的本实验的目的是通过键盘输入字符,并在计算机屏幕上进行显示。

通过这个实验,我们可以深入了解键盘的工作原理和计算机输入输出的基本知识。

2. 实验材料本实验所需的材料包括:计算机、键盘、显示器和相应的连接线。

3. 实验步骤(1) 将键盘与计算机通过连接线连接好。

(2) 打开计算机,并启动相应的键盘显示程序。

(3) 在键盘上按下不同的按键,观察计算机屏幕上的显示效果。

(4) 分析和记录实验结果。

三、实验结果在本次实验中,我们按下了键盘上的不同按键,并观察了计算机屏幕上的显示效果。

实验结果表明,键盘输入的字符能够准确地显示在屏幕上,并且显示的速度非常快。

四、结果分析1. 键盘工作原理键盘是一种输入设备,它通过按下不同的按键来输入字符和命令。

当我们按下键盘上的某个按键时,键盘会发送一个信号给计算机,计算机通过解读这个信号来确定我们按下的是哪个按键,并将相应的字符显示在屏幕上。

2. 计算机输入输出键盘显示实验涉及到了计算机的输入输出过程。

输入是指将外部信息传递给计算机的过程,而输出是指将计算机处理后的信息传递给外部的过程。

在本实验中,键盘是输入设备,它将我们按下的按键信息传递给计算机;而显示器是输出设备,它将计算机处理后的字符信息显示在屏幕上。

3. 键盘显示的应用键盘显示技术在计算机领域有着广泛的应用。

无论是在日常办公还是在专业领域,键盘输入都是必不可少的。

通过键盘,我们可以输入文字、命令、密码等信息,实现与计算机的交互。

键盘显示技术的发展也为计算机的普及和应用提供了方便。

五、实验总结通过本次键盘显示实验,我们深入了解了键盘的工作原理和计算机输入输出的基本知识。

实验四 键盘显示程序设计

实验四 键盘显示程序设计

实验四 键盘显示程序设计实验目的1、理解串行接口键盘单片机汇编语言程序的基本结构2、了解单片机汇编语言程序的设计和调试方法3、掌握几个的基本的传送类、控制类指令的使用方法实验仪器单片机开发板、万利仿真机、稳压电源、计算机实验原理1、 键盘接口电路工作原理串行接口键盘盘电路如图4-15所示。

键盘扫描线与显示位选扫描信号共用。

键盘输入只需要一根线,电路简单。

键盘扫描信号从74LS164输出,低电平有效。

当扫描到某个键时,若按键按下,在KEY 端得到低电平,否则得到高电平。

通过判断KEY 的电平就可以知道相应键盘是否按下。

图4-15 键盘接口电路图2、 读键盘程序设计从上面工作原理分析可知,读键程序可以和显示程序结合在一起,也可以单独设计。

这种结构的键盘同样存在抖动问题。

为了减少程序误动作,程序设计时也要考虑去抖动问题。

这里设计一个把键值显示在LED 上的程序。

为了简化问题,把读键程序与显示结合起来。

程序流程图如图4-16所示。

图4-16 键盘扫描程序流程图主程序 初值化,显示缓冲区,键值暂存,键盘缓存调用键盘显示程序键值相同 N显示计数为0 …… 键盘显示程序 N显示程序 延时程序执行后 读当前扫描的键状态,并存入键值暂存寄存器实验内容1、设计程序把键值显示在数码管。

2、设计程序按不同键时实现不同功能。

按最左边按键:小数点循环移位按向上键:最右边一位数码管数值加1(0-9),到9时加1回到0按向下键:最右边一位数码管数值减1(9-0),到0时减1回到9按向左键:显示数字左移一位按向右键:显示数字右移一位实验步骤及调试过程1、连接单片机开发板、万利仿真机2、连接仿真调试电缆(并口JTAG)3、打开ARM集成开发环境ADS,进行程序加载。

实验程序:#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit CLK=P3^4;sbit DIN=P2^3;sbit key=P1^0;char num1=0;num=1;num2;char k;uchar code table[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71,0xFE};//0到F及off的代码void wei(uchar x); //声明函数void delay(uchar ms);void display(char wei,char shu);void clear164();uchar keyscan();void main(){clear164();wei(1);P0=0x03; //初始化显示的数为0,位数为第一位while(1){k=keyscan();switch(k){case 8:{++num2;if(num2>7) num2=0; }break; //最左边按键(原理图中的第七个):小数点循环移位case 1:{++num;if(num>7) num=0; };break; //按向右键(原理图中的第六个):显示数字右移一位case 5:{num1--;if(num1<0) num1=9;}break; //按向下键:最右边一位数码管数值减加1(9-0),到0时减1回到9case 4:{num1++;if(num1>9) num1=0;}break; //按向上键:最右边一位数码管数值加1(0-9),到9时加1回到0case 7:{--num;if(num<0) num=7;};break; //按向左键:显示数字左移一位}display(num2,16);display(num,num1);delay(2);}}void wei(char x) //数码管第X位显示{ char j;for (j=1;j<9;j++){if (x==j){ DIN=0;CLK=0;CLK=1;}else{DIN=1;CLK=0;CLK=1;}}P0=0xFE;}void delay(uchar ms) // 延时子程序(晶振12M){uchar i;while(ms--){for(i = 0; i < 120; i++);}}uchar keyscan(){char i,j;j=0;clear164();P0=0xff; //清除没有用到的位显示DIN=0;for(i=0;i<8;i++){CLK=0;CLK=1;DIN=1;if(key==0) //判断检测端口是否为0,若是就为按键值{delay(10);if(key==0){while(!key); //松手检测j=i+1;}}}return j;}void clear164()//将164输出所以清零{char k;for(k=0;k<8;k++){DIN=1;CLK=0;CLK=1;}}void display(char wei,char shu){uchar m,n;clear164();DIN=0;for(n=wei;n>0;n--)//去掉没有显示的位数{CLK=0;CLK=1;DIN=1;}CLK=0;CLK=1;P0=table[shu]; //显示号码的位数delay(5);for(m=8-wei;m>0;m--)//去掉剩下的位数{DIN=1;CLK=0;CLK=1;}}实验思考题1、当按加1键时,每按一次数码管值变化可能超过1,是什么原因?答:1)因为,按键在闭合和断开过程中出现一段抖动期,由于按键的不稳定性引起的,这是会呈现一串脉冲,可能是在松手时没去抖动。

数电实验报告七

数电实验报告七

实验7 4*4 键盘扫描控制器1.实验任务说明:设计并实现4*4 键盘扫描控制电路,判断哪个按键被按下,在数码管上显示键值,并通过蜂鸣器发出按键音。

要求:●键值采用16 进制编码,即16 个按键分别对应显示16 进制数0~F,按键对应关系如下:最上面一行从左至右依次为0~3,第二行从左至右依次为4~7,第三行从左至右依次为8~B,最下面一行从左至右依次为C~F,其中b、d 显示为小写,其他字母大写;●按键按下时显示当前键值并保持,直到下一按键被按下时更新显示;●只有按键被按下时蜂鸣器发出按键音,放开后蜂鸣器不发声。

●选做:每个按键对应不同的按键音。

●2.实验设计思路将本实验分为4个部分,分别是顶层,分频器(扫描时钟的分频器和为蜂鸣器提供频率的分频器),数码管译码电路,扫描信号发生电路。

顶层利用状态机实现,状态转移为s0->s1->s2->s3->s0,分别对应扫描到col[0->3->0]。

同时把row 信号转化为一个“时钟信号”clock_change,当有按键按下就输出1,没有则输出0。

并以这个时钟设计一个时序逻辑,当clock_change的上升沿到来才更新tempSegin(传递给数码管的输入信号)和choose(传递给蜂鸣器分频器的输入信号),输出sound信号时,将蜂鸣器输出的信号与clock_change信号相与,以达到按下一次键盘蜂鸣器发声,数码管显示的目的。

3.源程序:1)分频器扫描时钟的分频器:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;entity divide is--divide the frequency to 1/ngeneric( n:natural:=200);port( clk: in std_logic;clk_out: out std_logic);end divide;architecture div_arch of divide is--temporary signalsignal temp: std_logic;beginprocess( clk )--count variable count from 0 to n/2-1--means every n/2 period reverse the clk variable count: integer range 0 to n/2-1;beginif (clk'event and clk='1') thenif( count = n/2-1) thentemp <= not temp;count := 0;elsecount := count + 1;end if;end if;end process;clk_out <= temp;end div_arch;为蜂鸣器提供频率的分频器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;entity divide_sound is--the origin clk is 50MHz--divide the frequency to 1/ngeneric( n0:natural:=4;n1:natural:=8;n2:natural:=12;n3:natural:=16;n4:natural:=20;n5:natural:=24;n6:natural:=28;n7:natural:=42;n8:natural:=46;n9:natural:=50;n10:natural:=54;n11:natural:=58;n12:natural:=62;n13:natural:=66;n14:natural:=70;n15:natural:=74);port( clk: in std_logic;choose: in integer range 0 to 15;sound_out: out std_logic);end divide_sound;architecture div_arch of divide_sound is --temporary signalsignal temp: std_logic;beginprocess( clk )--count variable count from 0 to n/2-1--means every n/2 period reverse the clk variable count: integer range 0 to 100;variable n:integer range 0 to 200;--count'max is over the n(max)/2 - 1begincase choose iswhen 0 =>n := n0;when 1 =>n := n1;when 2 =>n := n2;when 3 =>n := n3;when 4 =>n := n4;when 5 =>n := n5;when 6 =>n := n6;when 7 =>n := n7;when 8 =>n := n8;when 9 =>n := n9;when 10 =>n := n10;when 11 =>n := n11;when 12 =>n := n12;when 13 =>n := n13;when 14 =>n := n14;when 15 =>n := n15;when others => n:= n0;end case;if(clk'event and clk='1') thenif( count = n/2 - 1) thentemp <= not temp;count := 0;elsecount := count + 1;end if;end if;end process;sound_out <= temp;end div_arch;2)扫描信号发生电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity scan_seq is--produce the column scan signalport( clk,reset: in std_logic;col: out std_logic_vector(3 downto 0));end scan_seq;architecture arch of scan_seq isbeginprocess(clk)variable count: integer range 0 to 3;--M=4 counter,every count output the porper impulse beginif( reset ='1')thencount := 0;elsif( clk'event and clk='1' )thenif( count = 3)thencount := 0;elsecount := count +1;end if;end if;case count iswhen 0 => col<="1110";when 1 => col<="1101";when 2 => col<="1011";when 3 => col<="0111";end case;end process;end arch;3)数码管译码电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY seg7_1H IS --seg7 decoding PORT(a: IN STD_LOGIC_VECTOR(3 DOWNTO 0); --inputb: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --outputcat: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --selcect);END seg7_1H;ARCHITECTURE aa OF seg7_1H ISsignal temp: std_logic_vector(3 downto 0);BEGINprocess(a)beginCASE a IS --b6-0 -> abcdefg WHEN "0000" => b <= "1111110"; --0WHEN "0001" => b <= "0110000"; --1WHEN "0010" => b <= "1101101"; --2WHEN "0011" => b <= "1111001"; --3WHEN "0100" => b <= "0110011"; --4WHEN "0101" => b <= "1011011"; --5WHEN "0110" => b <= "1011111"; --6WHEN "0111" => b <= "1110000"; --7WHEN "1000" => b <= "1111111"; --8WHEN "1001" => b <= "1111011"; --9WHEN "1010" => b <= "1110111"; --AWHEN "1011" => b <= "0011111"; --bWHEN "1100" => b <= "1001110"; --CWHEN "1101" => b <= "0111101"; --dWHEN "1110" => b <= "1001111"; --EWHEN "1111" => b <= "1000111"; --FWHEN others => b <= "0000000"; --others END CASE;end process;cat <= "11111110";END aa;4)顶层LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity scanKeyboard is--scan the keyboard and display, sound at the same time port(clk,reset: in std_logic;row: in std_logic_vector(3 downto 0);col: out std_logic_vector(3 downto 0);sound: out std_logic;b: out std_logic_vector(6 downto 0);cat: out std_logic_vector(7 downto 0);seeclk: out std_logic);end scanKeyboard;architecture arch of scanKeyboard iscomponent divide_sound is--the origin clk is 50MHz--divide the frequency to 1/ngeneric( n0:natural:=4;n1:natural:=8;n2:natural:=12;n3:natural:=16;n4:natural:=20;n5:natural:=24;n6:natural:=28;n7:natural:=42;n8:natural:=46;n9:natural:=50;n10:natural:=54;n11:natural:=58;n12:natural:=62;n13:natural:=66;n14:natural:=70;n15:natural:=74);port( clk: in std_logic;choose: in integer range 0 to 15;sound_out: out std_logic);end component;component scan_seq is--produce the column scan signalport( clk,reset: in std_logic;col: out std_logic_vector(3 downto 0));end component;component seg7_1H IS --seg7 decoding PORT(a: IN STD_LOGIC_VECTOR(3 DOWNTO 0); --inputb: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --outputcat: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --selcect);END component;component divide is--divide the frequency to 1/ngeneric( n:natural:=200);port( clk: in std_logic;clk_out: out std_logic);end component;--clk_scan is the scan signal for column--tempSound is the output of the sound divider--tempSegin is the input of the seg7 translate part--clock_change is disgned to record the row's impulse appear--choose is the select of the keyboardsignal clk_scan: std_logic;signal tempSound:std_logic;signal tempSegin:std_logic_vector(3 downto 0);signal clock_change:std_logic;signal choose: integer range 0 to 15;type state is (s0,s1,s2,s3);signal presentstate, nextstate : state;beginu0:divide_sound port map(clk => clk,choose=>choose,sound_out=>tempSound);u1:divide port map(clk =>clk, clk_out=>clk_scan);u2:scan_seq port map(clk=>clk_scan,reset=>reset,col=>col);u3:seg7_1H port map(a=>tempSegin,b=>b,cat=>cat); --discrible the register for clk_scanp1_reg:process(clk_scan,reset)beginif(reset ='1')thenpresentstate<= s0;elsif( clk_scan'event and clk_scan='1' )thenpresentstate<= nextstate;end if;end process;--discrible the state for clk_scanp2_stateChange:process(presentstate)begincase presentstate iswhen s0 => nextstate<= s1;when s1 => nextstate<= s2;when s2 => nextstate<= s3;when s3 => nextstate<= s0;end case;end process;--discrible the outputp3_out:process(presentstate,row,clock_change)begin--behave synchronize with the clock_changeif( clock_change'event and clock_change = '1')then case presentstate is-- column[0]when s0 => case row iswhen "1110"=>choose <= 12;tempSegin <= "1100";when "1101"=>choose <= 8;tempSegin <= "1000";when "1011"=>choose <= 4;tempSegin <= "0100";when "0111"=>choose <= 0;tempSegin <= "0000";when others=>choose <= 0;tempSegin <= tempSegin;end case;-- column[1]when s1 => case row iswhen "1110"=>choose <= 13;tempSegin <= "1101";when "1101"=>choose <= 9;tempSegin <= "1001";when "1011"=>choose <= 5;tempSegin <= "0101";when "0111"=>choose <= 1;tempSegin <= "0001";when others =>choose <= 0;tempSegin <= tempSegin;end case;-- column[2]when s2 => case row iswhen "1110"=>choose <= 14;tempSegin <= "1110";when "1101"=>choose <= 10;tempSegin <= "1010";when "1011"=>choose <= 6;tempSegin <= "0110";when "0111"=>choose <= 2;tempSegin <= "0010";when others=>choose <= 0;tempSegin <= tempSegin;end case;-- column[3]when s3 => case row iswhen "1110"=>choose <= 15;tempSegin <= "1111";when "1101"=>choose <= 11;tempSegin <= "1011";when "1011"=>choose <= 7;tempSegin <= "0111";when "0111"=>choose <= 3;tempSegin <= "0011";when others=>choose <= 0;tempSegin <= tempSegin;end case;end case;end if;end process;--discrible clkchangep3_clkchange:process(row)beginif( row = "1111")thenclock_change <='0';elseclock_change<='1';end if;end process;--output the sound signalsound <= tempSound and clock_change;--to see the clock_change in waveformseeclk <= clock_change;end arch;4.仿真波形及分析1)分频器1(扫描时钟的分频器)图1-1分频器整体图1-2 分频器计数到99翻转(高翻低)图1-3 分频器计数到99翻转(低翻高)实际应采用分频比为,50k,现仿真时为方便仿真取为200分频,由图1-1可以看到整体分频的情况,由图1-2可以看到分频器在计数到99时由高电平翻为低电平,由图1-3可以看到分频器在计数到99时由低电平翻为高电平。

键盘扫描显示实验报告

键盘扫描显示实验报告

一、实验目的1. 理解键盘扫描的基本原理,掌握键盘扫描的方法。

2. 掌握数码管显示的基本原理,实现键盘扫描信息的实时显示。

3. 熟悉8255并行接口芯片在键盘扫描和数码管显示中的应用。

二、实验原理1. 键盘扫描原理:键盘扫描是指通过硬件电路对键盘按键进行检测,并将按键信息转换为可识别的数字信号的过程。

本实验采用行列式键盘,通过扫描键盘的行线和列线,判断按键是否被按下。

2. 数码管显示原理:数码管是一种用来显示数字和字符的显示器,由多个发光二极管(LED)组成。

本实验采用七段数码管,通过控制各个段(A、B、C、D、E、F、G)的亮灭,显示相应的数字或字符。

3. 8255并行接口芯片:8255是一款通用的并行接口芯片,具有三个8位并行I/O口(PA、PB、PC),可用于键盘扫描和数码管显示的控制。

三、实验设备1. 实验平台:PC机、8255并行接口芯片、行列式键盘、七段数码管、面包板、导线等。

2. 软件环境:汇编语言编程软件、仿真软件等。

四、实验步骤1. 硬件连接:将8255并行接口芯片、行列式键盘、七段数码管连接到实验平台上,按照电路图进行连线。

2. 编写程序:使用汇编语言编写键盘扫描和数码管显示的程序。

(1)初始化8255并行接口芯片:设置PA口为输出端口,PB口为输出端口,PC口为输入端口。

(2)扫描键盘:通过PC口读取键盘的行线状态,判断是否有按键被按下。

若检测到按键被按下,读取对应的列线状态,确定按键的位置。

(3)数码管显示:根据按键的位置,控制数码管的段(A、B、C、D、E、F、G)的亮灭,显示相应的数字。

3. 仿真调试:使用仿真软件对程序进行调试,确保程序能够正确扫描键盘和显示数字。

五、实验结果与分析1. 实验结果:成功实现了键盘扫描和数码管显示的功能。

当按下键盘上的任意按键时,数码管上会显示对应的数字。

2. 分析:(1)键盘扫描部分:通过读取PC口的行线状态,判断是否有按键被按下。

当检测到按键被按下时,读取PB口的列线状态,确定按键的位置。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四键盘扫描及显示设计实验报告
一、实验要求
1. 复习行列矩阵式键盘的工作原理及编程方法。

2. 复习七段数码管的显示原理。

3. 复习单片机控制数码管显示的方法。

二、实验设备
1.PC 机一台
2.TD-NMC+教学实验系统
三、实验目的
1. 进一步熟悉单片机仿真实验软件 Keil C51 调试硬件的方法。

2. 了解行列矩阵式键盘扫描与数码管显示的基本原理。

3. 熟悉获取行列矩阵式键盘按键值的算法。

4. 掌握数码管显示的编码方法。

5. 掌握数码管动态显示的编程方法。

四、实验内容
根据TD-NMC+实验平台的单元电路,构建一个硬件系统,并编写实验程序实现如下功能:
1.扫描键盘输入,并将扫描结果送数码管显示。

2.键盘采用 4×4 键盘,每个数码管显示值可为 0~F 共 16 个数。

实验具体内容如下:
将键盘进行编号,记作 0~F,当按下其中一个按键时,将该按键对应的编号在一个数码
管上显示出来,当再按下一个按键时,便将这个按键的编号在下一个数码管上显示出来,数
码管上可以显示最近 4 次按下的按键编号。

五、实验单元电路及连线
矩阵键盘及数码管显示单元
图1 键盘及数码管单元电路
实验连线
图2实验连线图
六、实验说明
1. 由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。

因而在闭合及断开的瞬间均伴随有一连串的抖动。

抖动时间的长短由按键的机械特性决定,一般为 5~10ms。

这是一个很重要的时间参数,在很多场合都要用到。

键抖动会引起一次按键被误读多次。

为了确保 CPU 对键的一次闭合仅做一次处理,必须去除键抖动。

在键闭合稳定时,读取键的状态,并且必须判别;在键释放稳定后,再作处理。


键的抖动,可用硬件或软件两种方法消除。

2. 为了减少键盘与单片机接口时所占用 I/O 线的数目,在键数较多时,通常都将键盘排列成行列矩阵形式。

3. 从数码管显示方式看,数码管分为静态显示和动态显示两种方式。

静态显示就是系统中每位数码管的显示值都保持不变,直到显示新值为止;动态显示就是系统工作的每个时刻仅仅显示 1 位数码管的值,在人眼的视觉暂留效应(时间为 100ms)的时间范围内,显示完所有数码管的值。

这两种方式各有优缺点,两种方式的比较情况如表所列。

实际使用要根据不同需要选用不同的显示方式。

比如,设计一个亮暗显示可程序控制的数码管显示系统,控制亮暗实际上就是控制数码管动态刷新时间的问题,因此可以利用动态显示方式。

表数码管静态显示和动态显示方式的比较
七、思考题
1. 简述行列矩阵键盘的工作原理。

2. 图 4.4.1 中,7407 的作用是什么?
3. 简述数码管静态显示和动态显示的区别。

4. 根据图 4.4.1 和图 4.4.2,则数码管显示数据“5”的编码为多少?。

相关文档
最新文档