行列式键盘接口
11
4、键盘接口的操作功能
从按一个键到键的功能被执行主要包括 两项工作: 第一项:键的识别,即在键盘中找出被按的 是哪个键。 第二项:键功能的实现。 第一项工作使用接口电路实现,第二项 工作是通过执行查询/中断服务程序来完成。 我们先讨论第一项,即键盘接口问题。
12
键盘接口的操作功能: ① 键盘扫描,以判定是否有键被按下 (称之为“闭合键”)。 ② 键识别,以确定闭合键的行列位置。 ③ 产生闭合键的键码。 ④ 排除多键、窜键(复按)及去抖动。
13
二 MCS-51对非编码键盘的接口
非编码键盘有两种形式: 独立式键盘接口: 单片机系统中,如只需要几个功能键, 此时,可采用独立式按键结构。 矩阵式(行列式)键盘接口: 单片机系统中,若使用按键较多时,通 常采用矩阵式键盘。
14
1、独立式键盘接口
①按键硬件结构
独立式按键是直接用I/O口线构成的单 个按键电路,其特点是每个按键单独 占用一根I/O口线,每个按键的工作不 会影响其它I/O口线的状态。 独立式按键电路配置灵活,软件结构 简单,但每个按键必须占用一根I/O口 线,因此,在按键较多时,I/O口线浪 费较大,不宜采用。
17
图3-4
18
③独立式按键的软件结构
常采用查询式结构: 先逐位查询每根 I/O 口线的输入状 态,如某一根I/O口线输入为低电平, 则可确认该I/O口线所对应的按键已 按下; 然后,再转向该键的功能处理程序。
19
独 立 式 键 盘 处 理 程 序 流 程
有按键信号? Y
延时等待10ms 仍有按键信号? Y 键盘处理 按键释放? Y
§10.2 键盘接口原理
一、键盘基础知识 二、MCS-51对非编码键盘的接口 三、键盘的工作方式
1
一 键盘基础知识
1、什么是键盘?
键盘是一组按键的组合,它是 最常用的单片机输入设备,操作人 员可以通过键盘输入数据或命令, 实现简单的人机对话。
2
2、按键的分类
按键按照结构原理可分为两类: 触点式开关按键:如机械式开关等。 无触点式开关按键:如磁感应按键。 前者造价低,后者寿命长。 目前,微机系统中最常见的是: 触点式开关按键
23
③矩阵式按键的识别方法
a. 扫描法
b. 线反转法
24
a. 扫描法
第1步:识别键盘有无键按下。 把所有列线置0,检查各行线电平是否 有变化,如有变化,说明有键按下,如 无变化,则无键按下。 第2步:如有键被按下,识别出具体的按键。 先把某一列置低电平,其余各列为高电平, 检查各行线电平的变化,如果某行线电平为 低,可确定此行列交叉点处的按键被按下。
15
MCS-51对独立式非编码键盘的接口
+5V
R╳8
8031
I/O P1
图3-3
此种接口适于键数较少或操作速度较高的场合。
16
②工作原理:
当任何一个键被按下时,与其相连 的输入线被置成 “0”,平时该线为 “ 1”。 工作方式:
图(a)为中断方式的独立式键盘工作电路 图(b)为查询方式的独立式键盘工作电路
8
为什么键盘要考虑去抖动?
一般常用去抖动的方法有几种?
常用的消抖措施有硬件消抖和软件消抖。 硬件方法就是在键盘中附加去抖动电路, 从根本上消除抖动产生的可能性; 软件方法则是采用时间延迟以躲过抖动(大
约延时10~30ms即可),待行线上状态稳
定之后,再进行状态输入。
9
◆软件消抖
25
过程:1.先判断有无键按下
列线输出0000,然后输入行线状态: 若没有键按下,则行线状态为全1(1111); 若有任一键按下,则行线状态不为全1。
26
输出口
P1.3 P1.2 P1.1 P1.0
0
0
0
0
+5 V 0 1 2 3
0
P1.7
1 5 9
2 6
3 7
输 1 4 P1.6 入 1
P1.5 口
图3-5
N
N
N
20
2、矩阵式(行列式)键盘接口
①按键硬件结构
用于按键数目较多的场合,由行线和列 线组成,按键位于行、列的交叉点上。 行列式键盘与独立式键盘相比,要节省很多的I/OFra bibliotek线。21
22
②矩阵式键盘工作原理
• 无键按下,该输入(行)线为高电平,当 有键按下时,输入(行)线电平由输出(列) 线的电平来决定。 • 由于行、列线为多键共用,各按键彼此 将相互发生影响,必须将行、列线信号配 合起来并作适当的处理,才能确定闭合键 的位置。
3
键盘按其结构形式可分为两种: 编码键盘:由硬件逻辑自动提供与键对 应的编码。使用方便,但电路复杂,价 格较贵,在单片机应用系统中较少采用。 非编码键盘:由软件来实现键盘的定义 与识别。结构简单、成本低廉,在单片 机应用系统中被普遍采用。
4
3、按键去抖动处理
由于通常的按键所用的开关是机械开关, 当开关闭合、断开时并不是马上稳定地 接通和断开,而是在闭合与断开瞬间均 伴随有一连串的抖动。 当扫描表明有键被按下之后,紧接着应 进行去抖动处理。抖动时间长、短与键 的机械特性有关,一般为5~l0ms。
就是在第一次检测到有键按下时先不动 作,延时一段时间(一般为10ms),再次 检测按键的状态,如果仍保持闭合状态, 则确认真正有键按下。 当检测到按键释放后,也要给 5ms~10ms的延时,待后沿抖动消失后 才能转入按键的处理程序。
10
对于两个或多个按键同时按下的重键 问题,可以采用“先入有效”或“后 留有效”的原则加以处理。 “先入有效”:指当多个按键同时按 下时,只有第一个按下的键有效,其 它键无效。 “后留有效”:指当多个按键同时按 下时,只有最后松开的按键有效,其 它键均无效。
5
如图所示:
键按下 闭合稳定 键释放
前沿抖动
后沿抖动
图3-1
按键抖动波形示意图
6
★请思考
什么是键抖动? 为什么键盘要考虑去抖动?
一般常用去抖动的方法有哪些?
7
什么是键抖动?
由于通常的按键所用的开关是机械开 关,被按下时,由于机械触点的弹性及 电压突跳等原因,触点闭合或断开的瞬 间会出现电压抖动。 键抖动可能导致计算机将人工按一次 键操作识别为多次,为了消除干扰,保 证在按键闭合稳定状态下读取键值,需 要对键盘进行消抖处理。
键盘接口设计
键盘接口设计键盘接口设计摘要:本文主要介绍了键盘的工作原理和六种键盘接口电路的结构及其按键的识别方法,可以满足各种应用场合对于键盘的要求。
关键词:独立式行列式阶梯式ADC Pin I/O Pin和ADC Pin 二极管一、引言键盘是基本的输入设备,在单片机应用系统中能实现向单片机输入数据、传送命令等功能,是人工干预单片机的主要手段。
下面介绍键盘的工作原理,键盘接口类型及其按键识别方法。
二、键盘的工作原理1、键盘输入的特点键盘实质上是一组按键开关的集合。
通常,键盘开关利用了机械触点的合、断作用。
一个电压信号通过键盘开关机械触点的断开、闭合,其行线电压输出波形如图1所示。
图1 键盘开关及其波形图1中T1和T3分别是按键的闭合和断开过程中的抖动期(呈现一串负脉冲),抖动时间长短和开关的机械特性有关,一般为5~10ms,T2为稳定的闭合期,其时间由按键动作所确定,一般为十分之几秒到几秒,T0、T4为断开期。
2、按键的确认按键的闭合与否,反映在行线输出电压上就是呈现高电平或低电平,如果高电平表示按键断开,低电平表示按键闭合,通过对行线电平高低状态的检测,便可确认按键按下与否。
为了确保MCU对一次按键动作只确认一次按键有效,必须消除抖动期T1和T3的影响。
3、软件消除按键抖动通常采用软件来消除按键抖动,基本思想是:在第一次检测到有键按下时,假设该键所对应的行线为低电平,执行一段延时10ms的子程序后,确认该行线电平是否仍为低电平,如果仍为低电平,则确认该行确实有按键按下。
当按键松开时,行线的低电平变为高电平,执行一段延时10ms的子程序后,检测该行线为高电平,说明按键确实已经松开。
三、键盘接口类型及原理1、独立式键盘接口独立式键盘就是各键相互独立,每个按键各接一个Input Pin,通过检测Input Pin的电平状态可以很容易的判断哪个按键被按下。
在按键数目较多时,独立式键盘电路需要较多的Input Pin,且电路结构繁杂,故此种键盘适用于按键较少或操作速度较高的场合。
行列式键盘
错误键值?
N 显示键值 延时
//检测按键 //返回-1表示没有检测到按键按下
char getkey(void){ char k1=0,k2=0,i=0; P3=0xf0; delay(10); if(P3!=0x0f){ //行线有键按下 k1=P3; //保存行线状态 delay(10);//消抖处理 if(P3==k1){ P3=0x0f; //扫描列线 delay(10);
void delay(unsigned int time) { unsigned int j=0; for(;time>0;time--) for(j=0;j<125;j++); } //经典延时程序 void main(void){ char key=0; P2=0x00; //关闭LED数码管 while(1){ key=getkey(); if(key!=-1){ P2=led_mod[key]; //赋初值 } delay(10); } }
键盘扫描原理(以P3口为例):
①判断判断哪一行有键压 下 写端口(0xf0):行线电 平=0;列线电平=1。 读端口进行判断:若P3 = 0xf0→没有按键压下; 若 P3≠0xf0→某行有键压端口(0x0f):行线电平=1;列线电平=0。 读端口进行判断:若P3 = 0x0f→没有按键压下; 若P3≠ 0x0f→某列有键压下→K2 ③ 将K1与K2相“与” 并存于K2(形成键值)——闭合键所在行、列 的状态均为1,其余皆为0。 第一行的键值: 00010001、00100001、01000001、10000001 整个键盘的键值: 0x11、0x21、0x41、0x81 0x12、0x22、0x42、0x82 0x14、0x24、0x44、0x84 0x18、0x28、0x48、0x88 ④ 利用查表比对法求出闭合按键的键模。 将各键的键值依次存放在一个数组中,其顺序号就是键模。 利用循环变量i控制比对过程,两者相等时的i就是闭合键的键模。
第5讲 IO口的应用二—行列式键盘
成于大气 信达天下
行列式按键硬件电路
Chengdu University of Information Technology
成于大气 信达天下
行列式按键硬件电路解析
Chengdu University of Information Technology
测试按键按下以前, 测试按键按下以前,先将行置为高电 平,列置为低电平。如果某个按键被按下, 列置为低电平。如果某个按键被按下, 原来输出高电平的,被外部拉低,这样就判 原来输出高电平的,被外部拉低, 断出到底哪行有键按下; 断出到底哪行有键按下;然后将行列电平反 转,就可以判断出是哪列有键按下了。有了 就可以判断出是哪列有键按下了。 行和列的值, 行和列的值,就可以确定出是哪个键被按下 了。
成于大气 信达天下
行列式按键扫描程序
Chengdu University of Information Technology
行列式按键扫描程序结构: 行列式按键扫描程序结构:
判断是否有键按下; 判断是否有键按下; 判断是哪个键按下; 判断是哪个键按下; 根据按下的键,执行相应的程序代码。 根据按下的键,执行相应的程序代码。
成于大气 信达天下
行列式按键键号对应的键值
Chengdu University of Information Technology
行列式按键中每个键号对应一个唯一 的键值, 的键值,通过对键值的查询就可以判断出是 哪个按键被按下了,这种查询在C语言中可 哪个按键被按下了,这种查询在 语言中可 以用switch{case …}语句来描述。 语句来描述。 以用 语句来描述
应当注意:在判断键按下及执行程序过程中,还需要 判断键是否弹起,如果不做该判断,那有可能使程序一直 检测到有按键按下,从而导致程序出错。
9 接口技术II键盘接口
P.168
b. 线反转法
采用线反转法的键盘行线、 列线端口各自应当可以在输 入与输出方式间切换! 如图:高四位与低四位均可 独立改变其输入或输出方式
实验板4×4键盘 实验板 × 键盘 连接82C55的端口线 连接 的端口线 PC3 PC2 PC1 PC0 PC4 PC5 PC6 PC7
图10-10线反转法原理图 10-10线反转法原理图 第1步:列线输出为全‘0’ ,随后输入行线电平如有‘0’,则 线输出为全‘ 随后输入行线电平如有‘ , 所在的行就是闭合的按键所在行; 则无键闭合。 ‘0’所在的行就是闭合的按键所在行;无‘0’则无键闭合。 所在的行就是闭合的按键所在行 则无键闭合 随后输入列线电平如有‘ , 第2步:行线输出为全‘0’ ,随后输入列线电平如有‘0’,则 线输出为全‘ 则无键闭合。 所在的列就是闭合的按键所在列; 则无键闭合 ‘0’所在的列就是闭合的按键所在列;无‘0’则无键闭合。 所在的列就是闭合的按键所在列 结合上述两步,可确定按键所在行和列。 结合上述两步,可确定按键所在行和列。
键盘扫描子程序---3 TEST2011.ASM 键盘扫描子程序--3 KN:MOV MOV MUL MOV JMP A,61H B,#05H AB DPTR,#K0 DPTR,#K0 @A+DPTR ;根据查表获得的键号00H~0FH之一转向相应处理程序 根据查表获得的键号00H~0FH之一转向相应处理程序 00H ;转移表中每个键号处理程序占 转移表中每个键号处理程序占5 ;转移表中每个键号处理程序占5个地址单元
键盘扫描子程序---1 TEST2011.ASM 键盘扫描子程序--1 KEY:MOV 键盘扫描子程序(反转法) KEY:MOV A,#81H ;键盘扫描子程序(反转法) MOV DPTR,#0FEFFH ;C口先初始化为高 位输出驱行线、 口先初始化为高4 MOVX @DPTR,A ;C口先初始化为高4位输出驱行线、低4位输入列线 MOV DPTR,#0FEFEH 键盘行线 行线( 输出驱动全 驱动全'0' MOV A,#00H ;键盘行线(高4位)输出驱动全'0' MOVX @DPTR,A A,@DPTR 输入键盘列线电平 列线电平( 60H单元 MOVX A,@DPTR ;输入键盘列线电平(低4位)存60H单元 MOV 60H,A ;C口改初始化为高 位输入行线、 口改初始化为高4 MOV A,#88H ;C口改初始化为高4位输入行线、低4位输出驱列线 MOV DPTR,#0FEFFH MOVX @DPTR,A MOV DPTR,#0FEFEH 键盘列线 列线( 输出驱动全 驱动全'0' MOV A,#00H ;键盘列线(低4位)输出驱动全'0' MOVX @DPTR,A 行线电平( 输入键盘行线电平 MOVX A,@DPTR ;输入键盘行线电平(高4位)在A中 ANL 60H,#0FH ;列线电平值保留所在的低4位 列线电平值保留所在的低4 行线电平值保留所在的高4 ANL A,#0F0H ;行线电平值保留所在的高4位 ;两次输入的列线电平值 行线电平值组合成 两次输入的列线电平值、 合成8 ORL 60H,A ;两次输入的列线电平值、行线电平值组合成8位行列码
矩阵键盘的接口与控制
完整程序实例
#include <reg51.h> #define uchar unsigned char
void keyscan(void); void dlms(void); uchar keyvalue=0xff; void main(void) { while(1) { keyscan(); P2=~keyvalue; } } void dlms(void) { uchar i; for(i=200;i>0;i--); }
STEP5:将得到的行号和列号进行译码,得到键值
P3.0 ) if(recode==0xfb { switch(sccode) { P3.1 case 0xfe: keyvalue=16;break; case 0xfd:keyvalue=17;break; case 0xfb:keyvalue=18;break; P3.2 case 0xf7:keyvalue=19;break; case 0xef:keyvalue=20;break; case 0xdf:keyvalue=21;break; case 0xbf:keyvalue=22;break; case 0x7f:keyvalue=23;break; P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 default:break; } }
STEP1: 检测是否有键按下 void keyscan( ) 向单片机的行扫描口输出全0,检测列输出口的状态是否全为“ 1” { unsigned char temp_key; P1=0xff; P3=0xf8; temp_key=P1; if(temp_key!=0xff) { … P3.0 } } “0”
STEP6: 松手检测
矩阵式键盘的接口设计与编程
;<--------------------------判断是否真的有键按下--------------------->
T_KEY:
ACALL
DL_20MS
;调用延时子程序
ACALL
P_KEY
;再次调用“有无按键按下子程序”
JNZ
IN_SCAN
;若有键按下,则执行逐行扫描程序
AJMP
SCAN
;若无键按下,则不断查询
;<--------------------------扫描数据初始化----------------------->
单片机原理及应用技术
—1—
one 矩阵式键盘接口设计——基于行反转法
4×4矩阵式键盘接 口设计如图所示
—2—
图中P1口的低4位作为行线,P2口的低4位作为列线。行线通过74LS21进行逻辑与操作后作为单 片机的外部中断源输入,当有键按下时以中断形式去执行相应的按键处理程序。
行反转法因判键时将输入与输出线反转互换而得名,步骤如下:
PB口作为扫描口需要设为输出,PA口设为读入。 逐行扫描时,PB口的状态为:
PB7 PB6 PB5 PB4 111 1 111 1 111 1 111 1 111 0 110 1 101 1 011 1
PB3 PB2 PB1 PB0 1 110 1 101 1 011 0 111 1 111 1 111 1 111 1 111
—3—
【例9-3】 行反转法判断按键编号,并存入40H单元,程序如下
ORG
0000H
LJMP
MAIN
ORG
0003H
LJMP
INT0
ORGБайду номын сангаас
单片机与键盘接口
第二讲 单片机与键盘接口1.键盘结构● 键盘结构:独立式键盘;行列式键盘。
● 按键识别法:扫描工作方式。
由程序调用键盘扫描子程序,读取按键值。
缺点是可能会丢失按键值。
中断式工作方式。
当按键有闭合时即产生中断请求,CPU 响应中断,读取按键值。
● 消抖动措施:双稳态消抖动电路;滤波消抖动电路;软件消抖动。
按键触点的机械抖动双稳态去抖电路VCC (+5 V)2. 独立式键盘接口设计独立式键盘是直接用I/O口线构成单个按键电路,每个按键占用1根I/O口线。
按键多时不宜采用。
上拉电阻保证按键断开后,I/O口线有确定的高电平。
当I/O口内部有上拉电阻时,外电路可以不接上拉电阻。
例题1:;S1键按下,P1.0连接的LED灯亮,再次按下,LED灯灭。
6MHz晶振,无按键释放判别。
(S1按键接P2.2口)ORG 0000HSETB P2.2NOPBEGIN: JB P2.2,BEGINACALL DL10MSJB P2.2,BEGINCPL P1.0AJMP BEGIN;----------------------------------DL10MS: MOV R6,#10 ;10mSDL1: MOV R7,#7DHDL0: NOPNOPDJNZ R7,DL0DJNZ R6,DL1RET;-----------------------------------END实验证明:该按键可靠性不高,工作不稳定。
例题2:;S1键按下,P1.0连接的LED灯亮,再次按下,LED灯灭。
6MHz晶振,有按键释放判别。
(S1按键接P2.2口)ORG 0000HSETB P2.2NOPBEGIN: JB P2.2,BEGINACALL DL10MSJB P2.2,BEGINL1: JNB P2.2,L1ACALL DL10MSJNB P2.2,L1CPL P1.0AJMP BEGIN;----------------------------------DL10MS: MOV R6,#10 ;10mSDL1: MOV R7,#7DHDL0: NOPNOPDJNZ R7,DL0DJNZ R6,DL1RET;-----------------------------------END实验证明:加入按键释放程序后该按键可靠性显著提高,工作稳定可靠。
实验3行列式键盘
一.实验目的
1、了解行列式键盘的工作原理
2、掌握行列式键盘的程序设计方法
二.实验器材
单片机开发板、电脑
三.实验任务
编写行列式键盘的驱动程序,在液晶显示屏上边显示所按键的编号
四.实验原理
1、行列式键盘的硬件电路
4×4的行列式键盘由行线和列线组成。行线对应的接口为P10~P13,列线对应的接口为P14~P17。利用单片机编程扫描是否有按键按下的时候,将行线P10~P13设为高电平1(即输出数字1)。列线P14~P17设为0,再读回行线P10~P13的数值,就可以知道是否有按键按下。如果有键按下,则行线输入的信号就不全为1,例如,K5按下,则行线输入的信号就会变成1101。在行列式的键盘中,通常分三个步骤处来检测、识别和处理键盘的事件。
K13键
11010111
0xd7
K14键
10110111
0xb7
K15键
01110111
0x77
2.键盘识别流程
五.实验步骤
1.建立工程文档key.uv2
2.新建key.c文件,并加入工程项目中。
3.在key.c中加入下列程序代码。如下页所示。
#include "reg52.h"
#defineuintunsignedint
#defineucharunsigned char
/*LCD端口定义*/
//LCD端口要根据实际的连接情况分配IO
#define busy 0x80
sbitRS=P2^5;
sbitRW=P2^6;
sbitE=P2^7;
sfr LCDData=0x80;//0x80--P0,0X90--P1,0xa0--P2,0xb0--P3
矩阵键盘
FPGA学习心得——矩阵键盘1、行列式键盘概述为了减少键盘与单片机接口时所占用I/O口线的数目,在键数较多时,通常都将键盘排列成行列矩阵式,行列式键盘又叫矩阵式键盘。
用带有I/O口的线组成行列结构,按键设置在行列的交点上。
例如用2*2的行列结构可以构成4个键的键盘,4*4的行列结构可以构成有16个键的键盘。
这样,当按键数量平方增长时,I/O口线只是线性增长,这样就可以节省I/O口线。
2、行列式键盘原理教研室已有薄膜矩阵键盘,其实物图如图所示。
其电路原理图如下图所示。
由行列式键盘的原理可以知道,要正确地完成按键输入工作必须有按键扫描电路产生keydrv3~keydrv0信号。
同时还必须有按键译码电路从keydrv3~keydrv0信号和keyin3~keyin0信号中译码出按键的键值。
此外,一般还需要一个按键发生标志信号用于和其他模块接口,通知其它模块键盘上有按键动作发生,并可以从键盘模块中读取按键键值。
由于各个模块需要的时钟频率是不一样的,因此时钟产生模块就是用于产生各个模块需要的时钟信号。
因此得到键盘接口电路的结构如图2所示。
图2 键盘接口电路结构图行列式键盘电路的FPGA实现主要解决三个问题,一是如何检测是否有按键按下并防止采集到干扰信号;二是在按键闭合时如何防止抖动;三是如何判断为哪一个按键位动作,并对其进行译码。
因此,为了解决这些问题,程序中使用不同的进程分别实现键盘扫描信号的产生、键盘去抖以及键盘的译码。
3、源程序[plain]view plaincopy1.----------------------------------------------------------------------------------2.-- Company:3.-- Engineer:4.--5.-- Create Date: 08:46:57 07/31/20126.-- Design Name:7.-- Module Name: MatrixKeyboard - Behavioral8.-- Project Name:9.-- Target Devices:10.-- Tool versions:11.-- Description:12.--13.-- Dependencies:14.--15.-- Revision:16.-- Revision 0.01 - File Created17.-- Additional Comments:18.--19.----------------------------------------------------------------------------------20.library IEEE;e IEEE.STD_LOGIC_1164.ALL;e IEEE.STD_LOGIC_ARITH.ALL;e IEEE.STD_LOGIC_UNSIGNED.ALL;24.25.---- Uncomment the following library declaration if instantiating26.---- any Xilinx primitives in this code.27.--library UNISIM;28.--use UNISIM.VComponents.all;29.30.entity MatrixKeyboard is31. Port ( Clk : in STD_LOGIC;32. Reset : in STD_LOGIC;33. KeyIn : in STD_LOGIC_VECTOR (3 downto 0);34. KeyScan : out STD_LOGIC_VECTOR (3 downto 0);35. LED : out STD_LOGIC_VECTOR (3 downto 0)36. );37.end MatrixKeyboard;38.39.architecture Behavioral of MatrixKeyboard is40.41.Signal Clk_scan : STD_LOGIC := '0';42.Signal Clk_5ms : STD_LOGIC := '0';43.Signal Clk_2ms : STD_LOGIC := '0';44.Signal Key_Scan : STD_LOGIC_VECTOR(3 downto 0);45.Signal Key_Decode : STD_LOGIC_VECTOR(7 downto 0);46.47.Type State_Key is(st_key1,st_key2,st_key3,st_key4);48.Signal Current_Key : State_Key := st_key1;49.50.Type State_Scan is(st_scan1,st_scan2,st_scan3,st_scan4);51.Signal Current_Scan : State_Scan := st_scan1;52.53.begin54.55. Proc_Clk_5ms : process(Clk)56. variable cnt_clk : integer range 0 to 250000 := 0;57. begin58. if(rising_edge(Clk)) then59. if(cnt_clk < 125000) then60. cnt_clk := cnt_clk + 1;61. Clk_scan <= '0';62. elsif(cnt_clk < 249999) then63. cnt_clk := cnt_clk + 1;64. Clk_scan <= '1';65. else66. cnt_clk := 0;67. end if;68. Clk_5ms <= Clk_scan;69. end if;70. end process Proc_Clk_5ms;71.72. Proc_Clk_2ms : process(Clk)73. variable cnt_clk : integer range 0 to 100000 := 0;74. begin75. if(rising_edge(Clk)) then76. if(cnt_clk < 50000) then77. cnt_clk := cnt_clk + 1;78. Clk_2ms <= '0';79. elsif(cnt_clk < 99999) then80. cnt_clk := cnt_clk + 1;81. Clk_2ms <= '1';82. else83. cnt_clk := 0;84. end if;85. end if;86. end process Proc_Clk_2ms;87.88.89. Proc_Scan:process(Clk_5ms)90. begin91. if(rising_edge(Clk_5ms)) then92. case Current_Scan is93. when st_scan1 =>94. Key_Scan <= "1110";95. Current_Scan <= st_scan2;96. when st_scan2 =>97. Key_Scan <= "1101";98. Current_Scan <= st_scan3;99. when st_scan3 =>100. Key_Scan <= "1011";101. Current_Scan <= st_scan4;102. when st_scan4 =>103. Key_Scan <= "0111";104. Current_Scan <= st_scan1;105. end case;106. end if;107.108. end process Proc_Scan;109.110. KeyScan <= Key_Scan;111. Key_Decode <= Key_Scan & Keyin;112.113. Proc_Keyboard:process(Clk_2ms,Reset)114. variable cnt_btn : integer range 0 to 50000 := 0;115. begin116. if(Reset = '1') then117. LED <= x"1";118. Current_Key <= st_key1;119. elsif(falling_edge(Clk_2ms)) then120. case Current_Key is121. when st_key1 => --Check whether any keys are p ressed122. if((Keyin and "1111") = "1111") then123. Current_Key <= st_key1;124. else125. Current_Key <= st_key2;126. end if;127. when st_key2 => --keys debouncing128. if((Keyin and "1111") = "1111") then129. Current_Key <= st_key1;130. else131. case Key_Decode is132. when "11101110" => LED <= "0001";133. when "11101101" => LED <= "0010";134. when "11101011" => LED <= "0011";135. when "11100111" => LED <= "1010";136. when "11011110" => LED <= "0100";137. when "11011101" => LED <= "0101";138. when "11011011" => LED <= "0110";139. when "11010111" => LED <= "1011";140. when "10111110" => LED <= "0111";141. when "10111101" => LED <= "1000";142. when "10111011" => LED <= "1001";143. when "10110111" => LED <= "1100";144. when "01111110" => LED <= "1110";145. when "01111101" => LED <= "0000";146. when "01111011" => LED <= "1111";147. when "01110111" => LED <= "1101";when others => null;148. end case;149. end if;150. Current_Key <= st_key3;151. when st_key3 => --Check whether the pressed keys a re released152. if((Keyin and "1111") /= "1111") then153. Current_Key <= st_key3;154. else155. Current_Key <= st_key4;156. end if;157. when st_key4 => --keys debouncing158. if((Keyin and "1111") /= "1111") then159. Current_Key <= st_key3;160. else161. LED <= x"0";162. Current_Key <= st_key1;163. end if;164. end case;165. end if;166. end process Proc_Keyboard;167.168.end Behavioral;169.薄膜键盘矩阵键盘4x4 ,单片机开发配件,机械手按键。
单片机实验报告实验5行列式键盘实验
学号姓名专业电气工程及其自动化班级实验5 行列式键盘实验一、实验目的(1)、学习掌握行列式键盘接口方法(2)、学习掌握行列式键盘编程方法。
二、实验内容用单片机P1口接4*4键盘,P0口接共阳数码管,编程实现键字的显示。
P1.0-P1.3为行,P1.4-P1.7为列。
先给端口设处置FEH,相当于给第一行置0,然后分写列值,如果对应的列值为0,说明该行与该列交叉处的键是按下的,接下来扫描第二行,与第一行的操作相同。
这就是行列式键盘扫描原理。
当扫描到某行的键按下时,就退出扫描,然后取键值,再将键值对应的额编码送P0端口显示。
三、实验设备计算机(已安装Keil和Proteus软件)元器件:A T89C51, CAP, CAP-ELEC, CRYSTAL, RES, 7SEG-COM-AN-GRN, RESPACK-7, BUTTON四、实验硬件电路实验源程序:#include<reg51.h>charled_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x7 1};charkey_buf[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x 77};char getkey(void){char key_scan[]={0xef,0xdf,0xbf,0x7f};char i=0,j=0;for(i=0;i<4;i++){P1=key_scan[i];if((P1&0x0f)!=0x0f){for(j=0;j<16;j++){if(key_buf[j]==P1)return j;}}}return -1;}void main(void){char key=0;P0=0x00;while(1){key=getkey();if(key!=1)P0=~led_mod[key]; }}五、实验要求(1)、根据实验内容设计相应的调试程序,并通过仿真,运行正确。
