独立按键与矩阵键盘
+5V
图8.1 独立式键盘接口
特点:每个按键占用一条I/O 线,当按键数量较多时,I/O 口利用率不高,但程序编制简 单。适用于所需按键较少的场 合。
图8.2 矩阵式键盘接口
特点:电路连接复杂,但提 高了I/O口利用率,软件编程 较复杂。适用于需使用大量 按键的场合。
U1
P10 1 P11 2 P12 3 P13 4 P14 5 P15 6 P16 7 P17 8
后沿 抖动
图8.5 键闭合及断开时的抖动
为确保每按一次键单片机只进行一次处理,使 键盘可靠地工作,必须消除按键抖动。消抖方法有 硬件消抖和软件延时两种。
(1)硬件消抖ห้องสมุดไป่ตู้:就是在键盘中附加去抖动电
路,从根上消除抖动产生的可能性。右图所示电路
实际上是由R-S触发器构成的单脉冲电路。当按钮
开关按下时Q端输出低电平,当开关松开时Q端恢
+5V
101 110 110 01
行线输出 列线输入
0111 1011 1101 1110
1111 1110 1111 1111
(2)线反转法。 线反转法也是识别闭合键的一种常用方法, 该法 比行扫描速度快, 但在硬件上要求行线与列线外接 上拉电阻。 先将行线作为输出线, 列线作为输入线, 行线输出 全“0”信号, 读入列线的值, 那么在闭合键所在的列 线上的值必为0;然后从列线输出全“0”信号,再 读取行线的输入值,闭合键所在的行线值必为 0。 这样,当一个键被按下时, 必定可读到一对唯一的行 列值。再由这一对行列值可以求出闭合键所在的位 置。
复高电平,即输出一个负脉冲,以此消除抖动。
Q
Q
&
&
+5V
图8.6 硬件去抖动电路
(2)软件消抖法:键按下的时间与操作者的按 键动作有关,约为十分之几到几秒不等。而键抖动 时间与按键的机械特性有关,一般为5~10ms不等。 软件消抖法即是采用延时(一般延时10~20ms) 的方法,以避开按键的抖动,即在按键已稳定地闭 合或断开时才读出其状态。
…… else if (表达式n-1) (语句n-1;) else {语句n}
【例】 if语句的用法。 (1)if (x!=y) printf(“x=%d,y=%d\n”,x,y); 执行上面语句时,如果x不等于y,则输出x的值和y的值。 (2)if (x>y) max=x;
else max=y; 执行上面语句时,如x大于y成立,则把x送给最大值变
(3)每一个case常量表达式的值必须不同否则会出现自相 矛盾的现象。
(4)case语句和default语句的出现次序对执行过程没有影 响。
(5)每个case语句后面可以有“break”,也可以没有。有 break语句,执行到break则退出switch结构,若没有,则会 顺次执行后面的语句,直到遇到break或结束。
A K11 E K15
B F
P17 P16 P15 P14
扫描法 和线反转法
+5V
89s52
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
图8.2 矩阵式键盘接口
0
1
2
3
ee
de
be
7e
4
5
6
7
ed dd bd 7d
8
9
A
B
eb db bb 7b
量max,如x大于y不成立,则把y送给最大值变量max。使 max变量得到x、y中的大数。
(3)if (score>=90) printf(“Your result is an A\n”);
else if (score>=80) printf(“Your result is an B\n”);
else if (score>=70) printf(“Your result is an C\n”);
100m s
10m
10m
s 键抖动时间 s
图8.7 软件消抖法延时区间示意图
3. 计算键码
键码是每个按键的标识。被按键确定下来之后, 接下来的工作是计算闭合键的键码,然后才能根据键 码进行对应的操作。
为编程方便,键码通常都是以键的排列顺序安 排,按照从左到右、从上向下的顺序编排。键码可 根据行号列号以查表求得,也可通过计算得到。我 们将结合实例加以介绍。
switch (表达式) {case 常量表达式1:{语句1;}break; case 常量表达式2:{语句2;}break; …… case 常量表达式n:{语句n;}break; default:{语句n+1;}
说明如下:
(1)switch后面括号内的表达式,可以是整型或字符型表 达式。
(2)当该表达式的值与某一“case”后面的常量表达式的 值相等时,就执行该“case”后面的语句,然后遇到break语 句退出switch语句。若表达式的值与所有case后的常量表达 式的值都不相同,则执行default后面的语句,然后退出 switch结构。
TT0189S52
EA/VP
P20 P21 P22 P23 P24 P25 P26 P27
21 22 23 24 25 26 27 28
X1 X2
RESET
RD WR
VCC GND RXD TXD ALE/P PSEN
40 20 10 11 30 29
P12K8 P13K12
8 K9 C K13
9 K10 D K14
键盘接口
键盘是单片机应用系统中使用最广泛的一种 数据输入设备。键盘是一组按键的组合。键通常 是一种常开型按钮开关,常态下键的两个触点处 于断开状态,按下键时它们才闭合(短路)。
通常,键盘有编码和非编码两种。编码键盘通 过硬件电路产生被按按键的键码和一个选通脉冲。 选通脉冲可作为CPU的中断请求信号。这种键盘使 用方便,所需程序简单,但硬件电路复杂,常不被 单片机采用。
…… else if (表达式n-1) (语句n-1;) else {语句n}
【例】 if语句的用法。 (1)if (x!=y) printf(“x=%d,y=%d\n”,x,y); 执行上面语句时,如果x不等于y,则输出x的值和y的值。 (2)if (x>y) max=x;
else max=y; 执行上面语句时,如x大于y成立,则把x送给最大值变
else if (score>=60) printf(“Your result is an D\n”);
else printf(“Your result is an E\n”); 执行上面语句后,能够根据分数score分别打出A、B、
C、D、E五个等级。
switch/case语句
if语句通过嵌套可以实现多分支结构,但结构复杂。 switch是C51中提供的专门处理多分支结构的多分支 选择语句。它的格式如下:
89C51 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
设第2行第 4列键按下
10 10 10 0
+5V 行值:1011
10 0 10 10
列值:1110
2.消抖 由于按键按下时的机械动作,在按键被按下或松 开的瞬间,其输出电压会产生波动,称为键的抖动。
键按下
前沿 抖动
5.1.2 键盘接口和键输入软件中应解决的几个问题
1.消除键抖动
键按下
键稳定
前沿抖动
后沿抖动
图5.2 键合断时的电压抖动
if语句 if语句是C51中的一个基本条件选择语句,它通常 有三种格式: (1)if (表达式) {语句;} (2)if (表达式) {语句1;} else {语句2;} (3)if (表达式1) {语句1;} else if (表达式2) (语句2;) else if (表达式3) (语句3;)
}
键盘控制流程
单片机对矩阵式 键盘接口处理的一 般过程如图8.3所示。
N
等待键释放
开始 键扫描
有键按下? Y
消除抖动
键扫描
确有键按下? Y
求键值
键释放? Y
按键处理
键扫描 N
消抖 N
求键码 等待释放 按键处理
返回
图8.3 键盘处理流程框图
1. 键扫描 键扫描就是要判断有无键按下,当扫描到有键
按下时再进行下一步处理,否则退出键盘处理程序。 独立式键盘扫描只需读取IO口状态,而矩阵式键盘 描通常有两种实现方法:逐行扫描法和线反转法。
switch (表达式) {case 常量表达式1:{语句1;}break; case 常量表达式2:{语句2;}break; …… case 常量表达式n:{语句n;}break; default:{语句n+1;}
(1) 逐行扫描法。依次从第一至最末行线上发出 低电平信号, 如果该行线所连接的键没有按下的 话, 则列线所接的端口得到的是全“1”信号, 如果 有键按下的话, 则得到非全“1”信号。
设第2行第 4列键按下
89C51 P1.0 P1.1 P1.2 P1.3 P1.4 11 11 11 1011 P1.5 P1.6 P1.7
非编码键盘按组成结构又可分为独立式键盘和 矩阵式键盘。独立式键盘的工作过程与矩阵式键盘 类似,无论是硬件结构还是软件设计都比较简单,。
P1.4 P1.5 P1.6 P1.7
89S52
+5V
S1 S2 S3 S4
89s52
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
4.等待释放
等待释放是为了保证键的一次闭合仅进行一次处 理。求得键码后,然后通过不断进行键扫描,如有键 按下,则继续扫描,否则认为键已释放。