实验四 键盘扫描及显示设计实验报告
实验四 键盘实验
实验四矩阵键盘控制接口设计实验一、实验目的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口的列线状态,确定按键的位置。
微机原理键盘扫描及显示完整实验报
实验9键盘扫描及显示实验
实验时间2019年12月18日
实验类型■验证性□设计性□综合性
1.实验目的
了解键盘扫描及数码显示的基本原理,熟悉8255的编程。
2.实验内容及过程(主要内容、操作步骤)
将8255单元与键盘及数码管显示单元连接,编写实验程序,扫描键盘输入,并将扫描结果送数码管显示。
键盘采用4X4键盘,每个数码管显示值可为0~F 共16个数。
实验具体内容如下:将键盘进行编号,记作0~F,当按下其中-一个按键时,将该按键对应的编号在一个数码管上显示出来,当再按下一个按键时,便将这个按键的编号在下一个数码管上显示出来,数码管上可以显示最近4次按下的按键编号。
3.测试数据及实验结果
4.实验分析及总结(主要考察内容)
通过本次实验,我理解了键盘扫描及数码显示的基本原理,通过理解分析程序,自己对程序进行了一些总结和修改,并进行了验证,进一步掌握了微机接口的学习方法。
教师评阅
评价指标:实验目的、操作步骤、设计、算法、程序结构、实验结果、实验分析、实验总结
1/ 1。
行列扫描键盘实验报告
一、实验目的1. 了解行列扫描键盘的工作原理和设计方法。
2. 掌握行列扫描键盘的硬件电路连接和程序编写。
3. 通过实验验证行列扫描键盘的正确性和稳定性。
二、实验原理行列扫描键盘是一种常用的键盘设计方法,它通过将多个独立按键按照行、列的结构组合起来,形成一个整体键盘。
在这种设计中,行线和列线分别连接到单片机的IO口,通过控制行线和列线的电平状态,可以实现对按键的扫描和识别。
行列扫描键盘的原理如下:1. 将按键按照行、列结构连接,行线连接到单片机的输出端,列线连接到单片机的输入端。
2. 当行线输出低电平时,列线上的按键状态被检测。
如果列线上的电平状态与设定的预期状态不符,则表示有按键被按下。
3. 通过扫描行线和列线,可以确定按键的位置和状态。
三、实验设备1. 单片机:如51单片机、STM32等。
2. 行列扫描键盘:如4x4矩阵键盘。
3. 电源:5V电源。
4. 连接线:用于连接单片机和键盘的导线。
四、实验步骤1. 硬件连接:将行列扫描键盘的行线连接到单片机的输出端,列线连接到单片机的输入端。
同时,将电源连接到键盘的电源端。
2. 程序编写:编写程序实现对行列扫描键盘的扫描和识别。
(1)初始化:设置单片机的IO口为输出或输入模式。
(2)扫描行线:依次将行线输出低电平,读取列线状态,判断是否有按键被按下。
(3)识别按键:根据扫描到的行线和列线状态,确定按键的位置和状态。
(4)按键处理:根据按键的位置和状态,执行相应的操作。
3. 实验验证:将编写好的程序烧录到单片机中,连接键盘和电源,观察按键是否能够被正确识别。
五、实验结果与分析1. 实验结果:在实验过程中,成功实现了行列扫描键盘的扫描和识别功能。
按下键盘上的任意按键,单片机都能够正确识别并执行相应的操作。
2. 实验分析:通过实验,我们了解到行列扫描键盘的设计方法和原理。
在实际应用中,行列扫描键盘具有以下优点:(1)节省单片机的IO口资源:通过将多个按键按照行、列结构连接,可以减少单片机的IO口使用数量。
单片机4X4键盘扫描和显示课程设计
表示任意一个十六进制数)分别表示键盘的第二行、第二行、第四行;OxXE、OxXD、OxXB、0xX7(X表示任意一个十六进制数)则分别表示键盘的第一列、第二列、第三列和第四列。
例如0xD7是键盘的第二行第四列的按键对于数码管的连接,采用了共阳极的接法,其下拉电阻应保证芯片不会因为电流过大而烧坏。
五、电路设计及功能说明4X4键盘的十六个按键分成四行四列分别于P1端口的八条I/O 数据线相连;两个七段数码管分别与单片机的P0 口和P2 口的低七位I/O数据线相连。
数码管采用共阳极的接法,所以需要下拉电阻来分流。
结合软件程序,即可实现 4 X4键盘的接口及显示的设计。
当按下键盘其中的一个按键时,数码管上会显示出该按键在4X4键盘上的行值和列值。
所以实现了数码管显示按键位置的功能二、实验内容"3■审■ "X I►Tf9fe设计并实现一 4 X 4键盘的接口,并在两个数码管上显示键盘所在的行与列。
即将8255单元与键盘及数码管显示单元连接,编写实验程序扫描键盘输入,并将扫描结果送数码显示,键盘采用4 X 4键盘,每个数码管值可以为0到F, 16 个数。
将键盘进行编号记作0—F 当按下其中一个按键时将该按键对应的编号在 一个数码管上显示出来,当按下下一个按键时便将这个按键的编号在下一个数码 管上显示出来,且数码管上可以显示最近 6次按下按键的编号。
基本原理1•电路设计及功能说明2•硬件原理框图及电路图(包括接口芯片简介) 电路图:叫"11I —0 - 0E E可编辑2・q 戟r :fQfiWElFQ^IS六、实验步骤(1) . 把实验平台与PC机串行口连起来,根据实验连线提示在实验台上连线,之后打开电源。
(2) . 在PC机上用鼠标点击“ Wave ”图标,进入 WINDOWS 调试环境,而后进行初始化设置。
点击[仿真器仿真器设置]出现“仿真器设置”窗,进行仿真器的设置。
⑶. 用鼠标点一下[文件打开文件],输入文件名*asm,创建新文件,在该窗口中输入事先编好的程序。
键盘扫描实验
实验键盘扫描显示实验一、实验要求编写程序,将键盘上的值显示在第八位LED七段数码管上。
二、实验目的1.掌握LED七段数码管动态显示的原理。
2.学习键盘扫描的原理及其编程方法。
三、实验说明图1 矩阵键盘原理图电路如图1所示。
键盘矩阵输入电路采用行列扫描法实现。
将行线接输出口,列线接到输入口,采用列扫描法,先将某一行输出为低电平,其它行输出为高电平,用输入口来查询列线上的电平,逐次读入列值,如果行线上的值为0时,列线上的值也为0,则表明有按键按下。
否则,接着读入下一列,直到找到该行有按下的键为止。
如该行没有找到有按键按下,就按此方法逐行找下去,直到扫描完全部的行和列,并显示键值。
四、实验电路连线此实验不需要连线。
五、程序框图开始数码管消隐启动T0计时中断计时至0.1ms扫描键盘按键消抖发送位码和段码显示数字六、程序代码#include <C:\keil\c51\INC\STC\STC15.h>sbit P_HC595_SER = P4^0; //pin 14 SER data inputsbit P_HC595_RCLK = P5^4; //pin 12 RCLk store (latch) clocksbit P_HC595_SRCLK = P4^3; //pin 11 SRCLK Shift data clockunsigned char code rui[]={// 0 1 2 3 4 5 6 7 8 9 A B C D E F0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x10}; //段码//unsigned char code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码unsigned char i,j;unsigned char code T_COM = 0x01;unsigned char display_index = 0; //显示位索引void Send_595(unsigned char dat, unsigned char dat2){ unsigned char a;for(a=0; a<8; a++){ dat <<= 1; //选数码管,位码P_HC595_SER = CY;P_HC595_SRCLK = 1;P_HC595_SRCLK = 0;}for(a=0; a<8; a++) //要显示的数字,段码{ dat2 <<= 1;P_HC595_SER = CY;P_HC595_SRCLK = 1;P_HC595_SRCLK = 0; }P_HC595_RCLK = 1;P_HC595_RCLK = 0; //锁存输出数据}void main(void){TMOD=0x01;TL0=0xCE;TH0=0xFF;ET0=1; //允许T0中断EA=1; //开总中断TR0=1; //启动T0计数i=500;Send_595(0xff,rui[17]);Send_595(0xff,rui[17]);//消抖while(1);}//中断函数void T0_ISR(void) interrupt 1{unsigned char a,b,hang,lie;TL0=0xCE;TH0=0xFF; //1毫秒显示一次i--;hang = 0x10;for(a=0;a<4;a++){P0=~hang;hang <<= 1;if( (P0&0x0f) < 0x0f ){lie = 0x01;for(b=0;b<4;b++){if( (P0&lie) == 0x00 ){if( i=500&&(P0&lie) == 0x00 ){while( (P0&lie) == 0x00 );display_index = a*4+b;Send_595(~T_COM,rui[display_index]); //共阴输出位码,段码i=500;return;}}lie <<= 1;}}}}七、问题与解决数码管初始化时,显示的数字是乱码,可能原因是寄存器重置时存入的数是随机的。
实验四键盘扫描及显示设计实验报告
实验四键盘扫描及显⽰设计实验报告实验四键盘扫描及显⽰设计实验报告⼀、实验要求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. 从数码管显⽰⽅式看,数码管分为静态显⽰和动态显⽰两种⽅式。
相关单片机实验4教案与实验指导-键盘-显示实验
键盘/显示实验说明和讲解第一种实验法1、键盘工作原理:板子上的键盘电路为理解键盘工作原理的方法是给出扫描信号,如果恰在扫描信号线上有按键,则也能得到扫描信号,这样主动生成的扫描信号和得到的实际信号合成在一起,就可以得到一个按键的具体值。
将这个具体值进行编码,或直接与显示字模对应起来,则就可以显示相关键值。
2、显示原理:下面给出部分与显示有关的主要电路。
只要按要求建立字模,显示电路就可以把相关的字符显示出来。
3、分析下面程序中的接口和键盘/显示的链接关系,并说明键盘中扫描信号是什么,如何得到键的具体值,如何查找字模,如何显示字模即相关键的键面值。
ORG 0000HST: M OV A,#11111110BMOV P3,AJNB P3.7,PKFJNB P3.6,PKBJNB P3.5,PK7JNB P3.4,PK3LJMP ST0PKF:LCALL DL10MOV A,#0FHLCALL DIRLJMP STPKB:LCALL DL10MOV A,#0BHLCALL DIRLJMP STPK7:LCALL DL10MOV A,#07HLCALL DIRLJMP STPK3:LCALL DL10LCALL DIRLJMP STST0:MOV A,#11111101B MOV P3,AJNB P3.7,PKEJNB P3.6,PKAJNB P3.5,PK6JNB P3.4,PK2LJMP ST1PKE:LCALL DL10MOV A,#0EHLCALL DIRLJMP STPKA:LCALL DL10MOV A,#0AHLCALL DIRLJMP STPK6:LCALL DL10MOV A,#06HLCALL DIRLJMP STPK2:LCALL DL10MOV A,#02HLCALL DIRLJMP STST1:MOV A,#11111011B MOV P3,AJNB P3.7,PKDJNB P3.6,PK9JNB P3.5,PK5JNB P3.4,PK1LJMP ST2PKD:LCALL DL10MOV A,#0DHLCALL DIRLJMP STPK9:LCALL DL10MOV A,#09HLCALL DIRLJMP STPK5:LCALL DL10LCALL DIRLJMP STPK1:LCALL DL10MOV A,#01HLCALL DIRLJMP STST2:MOV A,#11110111BMOV P3,AJNB P3.7,PKCJNB P3.6,PK8JNB P3.5,PK4JNB P3.4,PK0LJMP STPKC:LCALL DL10MOV A,#0CHLCALL DIRLJMP STPK8:LCALL DL10MOV A,#08HLCALL DIRLJMP STPK4:LCALL DL10MOV A,#04HLCALL DIRLJMP STPK0:LCALL DL10MOV A,#00HLCALL DIRLJMP ST;*********显示子程序*************DIR: MOV DPTR,#TAB ;查表MOVC A,@A+DPTRMOV P0,A ;A送P0口显示RET;***********延时10ms程序*********DL10: MOV R7,#0AHDEL1: MOV R6,#0FFHDEL2: DJNZ R6,DEL2DJNZ R7,DEL1RETTAB: DB 11000000B,11111001B,10100100B,10110000B ;0123DB 10011001B,10010010B,10000010B,11111000B ;4567DB 10000000B,10010000B,10100000B,10000011B ;89abDB 10100111B,10100001B,10000100B,10001110B ;cdefEND第二种实验法1、键盘工作原理:2、分析下面程序中的接口和键盘/显示的链接关系,并说明键盘中扫描信号是什么,如何得到键的具体值,如何查找字模,如何显示字模即相关键的键面值。
4 4键盘扫描实验
4*4键盘扫描实验目的:1. 熟悉51系列单片机矩形4*4键盘扫描的工作原理。
2. 掌握4*4键盘扫描的编程方法。
实验原理:键盘实际上是由排列成矩阵形式的一系列按键开关组成的,它是单片机系统中最常用的人机联系的一种输入设备。
用户通过键盘可以向CPU输入数据、地址和命令。
键盘按其结构形式可分为编码式键盘和非编码式键盘两大类。
编码式键盘是由其内部硬件逻辑电路自动产生被按键的编码。
这种键盘使用方便,但价格较贵。
4×4表示有4根行线和4根列线,在每根行线和列线的交叉点上均分布1个单触点按键,共有16个按键。
行扫描法所谓行扫描法,就是通过行线发出低电平信号,如果该行线所连接的键没有按下的话,则列线所连接的输出端口得到的是全“1”信号;如果有键按下的话,则得到的是非全“1”信号。
列扫描法所谓列扫描法,就是通过列线发出低电平信号,如果该列线所连接的键没有按下的话,则列线所连接的输出端口得到的是全“1”信号;如果有键按下的话,则得到的是非全“1”信号。
实验内容:1.编写一程序,4*4键盘扫描#include"reg51.h"#define uchar unsigned char#define uint unsigned intuchar keyno;uchar disp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c,0x39,0x5e,0x79,0x71}; uchar lieno;void delay1ms(uchar i){uchar j;while(i--)for(j=0;j<110;j++);}void main(){uchar tem;P0=0xff;while(1){P1=0x0f;if(P1!=0x0f)delay1ms(5);if(P1!=0x0f)tem=P1^0x0f;switch (tem){case 0x01:lieno=0;break;case 0x02:lieno=4;break;case 0x04:lieno=8;break;case 0x08:lieno=12;break;default :lieno=16;}P1=0xf0;tem=(P1>>4)^0x0f;switch (tem){case 0x01:keyno=lieno;break;case 0x02:keyno=lieno+1;break;case 0x04:keyno=lieno+2;break;case 0x08:keyno=lieno+3;}P0=disp[keyno];delay1ms(10);}}。
实验四 键盘扫描实验
一、实验目的、要求设计一个4X4的矩阵键盘,键盘的号码0~15,要求编写出一个键盘输入扫描程序,要求单片机能根据键盘排列顺序,能将按下去键盘号正确识别出来,并采用两个数码管分别键盘号码的个位和十位。
二、实验原理三、源程序清单或实验步骤1.设计电路,并按照电路接线2.编写调试程序:#include<reg51.h> //包含51单片机寄存器定义的头文件sbit P14=P1^4;sbit P15=P1^5;sbit P16=P1^6;sbit P17=P1^7;unsigned char codeTab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字0~9的段码unsigned char keyval;/**************************************************************函数功能:数码管动态扫描延时**************************************************************/void led_delay(void){unsigned char j;for(j=0;j<200;j++);}/**************************************************************函数功能:按键值的数码管显示子程序**************************************************************/void display(unsigned char k){P2=0xbf;P0=Tab[k/10];led_delay();P2=0x7f;P0=Tab[k%10];led_delay();}/**************************************************************函数功能:软件延时子程序**************************************************************/void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){EA=1;ET0=1;TMOD=0x01;TH0=(65536-500)/256;TL0=(65536-500)%256;TR0=1;keyval=0x00;while(1){display(keyval);}}/************************************************************** 函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位**************************************************************/ void time0_interserve(void) interrupt 1 using 1{P1=0xf0;if((P1&0xf0)!=0xf0)delay20ms();if((P1&0xf0)!=0xf0){P1=0xfe;if(P14==0)keyval=1; if(P15==0) keyval=2; if(P16==0) keyval=3;if(P17==0)keyval=4;P1=0xfd;if(P14==0)keyval=5;if(P15==0)keyval=6;if(P16==0)keyval=7;if(P17==0)keyval=8;P1=0xfb;if(P14==0)keyval=9;keyval=10;if(P16==0)keyval=11;if(P17==0)keyval=12;P1=0xf7;if(P14==0)keyval=13;if(P15==0)keyval=14;if(P16==0)keyval=15;if(P17==0)keyval=16;}TR0=1;TH0=(65536-500)/256;TL0=(65536-500)%256;}四、实验结果经过调试:矩阵键盘上的输入按键的键号能够正常显示在LED数码管上。
单片机按键扫描实验报告
单片机按键扫描实验报告键盘扫描一.实验目的(1)掌握矩阵键盘接口电路和键盘扫描编程方法。
(2)掌握按键值处理与显示电路设计。
二.实验任务(1)设计 4_4 键盘,编写各个键的特征码和对应的键值(0~F);(2)编程扫描按键,将按键对应的数字值使用数码管显示出来。
三.实验电路及连线方法1.采用动态显示连线方法:电路由2 片74LS573,1 个六字一体的共阴数码管组成。
由U15 输出段选码,U16 做位选码,与单片机的采用I/O 口连接方式,短路片J22 连接P2.0,J23 连接P2.3,做输出信号锁存。
(实际电路连接是 d7-d6-d5-d4-d3-d2-d1-d0 h-c-d-e-g-b-a-f)。
PW12 是电源端。
2.键盘电路连线方法:电路由16 个按键组成,用P1 口扩展4 _____4 行列式键盘。
J20 是键盘连接端,连接到P1 口。
J21 是行列键盘、独立键盘选择端,当J21 的短路片连接2-3 脚时,构成4 _____4 行列式键盘;当J21 的短路片连接2-1 脚时,可形成3 _____4 行列式键盘,4 个独立式按键S4、S8、S12、S16,这4 个独立按键分别连接P1.4~P1.7;其他12 个键3 _____4 行列式键盘。
PW15 是电源端。
四.编程思路1.采用反转法识别按键的闭合。
2.采用动态显示将键值显示出来。
五.算法流程图六.资源分配 1.用 P1 口进行查找按键 2.用 R3 做键值指针 3.用 R1 做动态显示为选码指针。
4.R5 为延时指针。
七.程序设计ORG0000H KPIN: MOVP1,#0F0HMOVA,P1ANLA,#0F0HMOVB,AMOVP1,#0FHMOVA,P1ANLA,#0FHORLA,BCJNEA,#0FFH,KPIN1 AJMPE_IT KPIN1: MOV B,AMOVDPTR,#TABKP MOVR3,#0 KPIN2: MOV A,R3MOVCA,@A+DPTRCJNEA,B,KPIN3MOVA,R3LOOP: MOVR1,#0FEH;键盘动态显示 LOOP1: MOV A,R3ANLA,#0FHMOVDPTR,#TABMOVCA,@A+DPTRCLRP2.0CLRP2.1MOVP0,ASETBP2.0NOPCLRP2.0 LOOP2: MOVA,R1;位选码MOVP0,ASETBP2.1MOVR5,#250 LOOP3: DJNZR5,LOOP3CLRP2.1SJMPLOOPKPIN3: INCR3CJNEA,#0FFH,KPIN2 E_IT: RET TABKP: DB0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH,0EBHDB0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H,67H,0FFH TAB: DB 77H,44H,3EH,6EH,4DH,6BH,7BH,46H,7FH,6FH,5FHDB79H,33H,7CH,3BH,1BHEND 八.调试出现的问题及解决问题 1:程序正常运行,但按键显示出现乱码解决:动态显示笔形码错误,并改正。
FPGA实验四键盘扫描显示电路
实验四矩形键盘扫描显示电路设计一、实验目的:1、熟悉Verilog语言编写的键盘扫描显示电路。
2、在Libero软件中,并对其电路进行仿真。
二、实验原理:键盘扫描显示电路的Verilog HDL程序主要由3个always模块构成:第一个为模4计数器模块;第二个为完成对键盘进行扫描和编程的功能,在计数器的每个状态从FPGA内部送出一列扫描数据给键盘,然后读入经过去抖处理的4行数据,并根据行,列数据之间的关系,对按键进行编码,确定按下的是哪个键;第三个模块完成键值的显示,即显示按键的编号。
下面是个键盘扫描的程序,大家仿真分析下。
module scankey(outled,scansig,dsw,clk,keyvaule);input clk;//键盘扫描时钟信号input [3:0]dsw;//去抖后的按键信号output [3:0]scansig;//输出扫描信号给键盘output [7:0]keyvaule;output [7:0]outled; //输出七段码给共阴极数码管reg [3:0]scansig;reg [7:0]keyvaule;reg [7:0]outled;reg [1:0] q;always @(posedge clk)beginq<=q+1’b1;endalways @(q or dsw)case(q)2’b00: beginscansig=4’b0111;case (dsw)4'b0111: keyvaule=8'b0111_0111; //key04'b1011: keyvaule=8'b0111_1011; //44'b1101: keyvaule=8'b0111_1101; //84'b1110: keyvaule=8'b0111_1110; //cdefault : keyvaule=8'b1111_1111;endcaseend2’b01: beginscansig=4’b1011;case (dsw)4'b0111: keyvaule=8'b1011_0111; //key14'b1011: keyvaule=8'b1011_1011; //54'b1101: keyvaule=8'b1011_1101; //94'b1110: keyvaule=8'b1011_1110; //ddefault : keyvaule=8'b1111_1111;endcaseend2’b10: beginscansig=4’b1101;case (dsw)4'b0111: keyvaule=8'b1101_0111; //key24'b1011: keyvaule=8'b1101_1011; //64'b1101: keyvaule=8'b1101_1101; //a4'b1110: keyvaule=8'b1101_1110; //edefault : keyvaule=8'b1111_1111;endcaseend2’b11: beginscansig=4’b1110;case (dsw)4'b0111: keyvaule=8'b1110_0111; //key34'b1011: keyvaule=8'b1110_1011; //74'b1101: keyvaule=8'b1110_1101; //b4'b1110: keyvaule=8'b1110_1110; //fdefault : keyvaule=8'b1111_1111;endcaseendendcasealways@(keyvaule)case(keyvaule)8'b0111_0111: outled=8’h3f;8'b0111_1011: outled=8’h66;8'b0111_1101: outled=8’h7f;8'b0111_1110: outled=8’h39;8'b1011_0111: outled=8’h06;8'b1011_1011: outled=8’h6d;8'b1011_1101: outled=8’h6f;8'b1011_1110: outled=8’h5e;8'b1101_0111: outled=8’h5b;8'b1101_1011: outled=8’h7d;8'b1101_1101: outled=8’h77;8'b1101_1110: outled=8’h79;8'b1110_0111: outled=8’h4f;8'b1110_1011: outled=8’h07;8'b1110_1101: outled=8’h7c;8'b1110_1110: outled=8’h71;default: outled=8’h00;endcaseendmodule三、实验步骤:1、先分析Verilog语言编写键盘扫描显示电路。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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”的编码为多少?。