第8章 人机交互接口设计
39 38 37 36 35 34 33 32
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12
21 22 23 24 25
P2.5/A13 26
P2.6/A14 27
P2.7/A15 28
P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13
程序中用到了外部中断。当没有键按下时,标志 keyflag=0,程序一直执行“do{ }while( )”循环。当有键按 下时,则74LS04的输出端产生低电平,向单片机的脚发出中断 请求信号,单片机响应中断,执行中断函数,在中断函数中把 keyflag置1,并得到键值。当执行完中断函数后,再进入 “do{ }while( )”循环,此时由于“if(keyflag)”中的 keyflag =1,则可根据键值keyvalue,执行 “switch(keyvalue)”分支语句,进行按下键的处理。
独立式按键的识别和编程都比较简单,只需把与按键相 连的I/O口线的状态读入到单片机内,如为高电平,则按键没 有按下;如为低电平,先延时10ms去抖,再读该I/O口线的状 态,若仍为低电平,则认为确实有键按下。
在上述几种独立式键盘电路中,各按键均采用了 上拉电阻,这是为了保证在按键断开时,各I/O口有确定 的高电平,当然如果输入口线内部已有上拉电阻,则外电 路的上拉电阻可省去。 独立式按键的识别和编程都比较简单,只需把与按键相连 的I/O口线的状态读入到单片机内,如为高电平,则按键 没有按下;如为低电平,先延时10ms去抖,再读该I/O口 线的状态,若仍为低电平,则认为确实有键按下。
IE=0x81; IP=0x01; keyflag=0; do { if(keyflag)
//中断允许设置 //中断优先级设置
//如果标志keyflag=1,则有12
{
keyvalue=~keyvalue; //键值取反
switch(keyvalue) //根据按下键的键值进行分
支跳转
{
case 1: ......;
if(keyvalue==rekey)
{
keyflag=1; //有键按下,设置标志位为1
}
IE=0x81;
//中断允许
}
void delay (unsigned int n) {
unsigned int i,j; for(i=0;i<n;i++)
for(j=0;j<125;j++) ; }
//延时n ms函数
case 16: ……;break; //处理K5键
case 32: ……;break; //处理K6键
case 64:……; break; //处理K7键
case 128:……; break; //处理K8键
default:
//无按下
键处理
break;
}
}
while(1);
11
【例8-2】 对于图8-2(b)所示的独立式键盘,编写中断方式
此外,还可以采用扩展的I/O口作为独立式按键接口电路 ,图8-3所示为采用82C55扩展的独立式键盘接口。
图8-3 82C55扩展的独立式键盘接口
在上述几种独立式键盘电路中,各按键均采用了上拉电 阻,这是为了保证在按键断开时,各I/O口有确定的高电平, 当然如果输入口线内部已有上拉电阻,则外电路的上拉电阻 可省去。
4
8.1.1 键盘的工作原理 1.按键的特性
键盘实质上是一组按键开关的集合,在单片机系统中 最常用的键盘是机械式按键键盘。如图8-1(a)所示,按键 开关的两端分别连接行线和列线,通过键盘开关机械触点的 断开、闭合,行线电压信号的输出波形如图8-1(b)所示。
按键在闭合或断开瞬间,触点由于机械弹性作用会出 现抖动现象,然后才能稳定。
6
8.1.2 键盘的接口电路 常用的键盘接口有两种:一种是独立式键盘接口,
另一种是矩阵式键盘接口。
1.独立式键盘接口 独立式键盘就是每个按键各接一根I/O输入线,所有
按键有一个公共地或公共正端,通过检测I/O输入线的电平 状态,可以很容易地判断哪个按键被按下,各个按键之间是 相互独立,互不影响的。
按下标志 }
}while(1);
case 32: ......; //处
break; case 64: ......; //处理
break; case 128: ......; //处理
default:
break;
break;
keyflag=0;
//清除按键
14
void int0( ) interrupt 0 {
//从P1口读入键盘状
态
keyvalue = ~keyvalue; //键盘状态取反
10
switch(keyvalue)
{
case 1: ……; break; //处理K1键
case 2: ……; break;
//处理K2键
case 4: ……; break;
//处理K3键
case 8: ……; break; //处理K4键
扫描法是常用的按键识别方法。可分两步进行:第 一步,识别键盘有无键按下;第二步,如有键被按下,识 别出具体的按键。
下面以图8-4(b)所示的键7被按下为例,说明扫描法识别此 键的过程。
第一步,识别键盘有无键按下。首先把所有的列线均置 为低电平,然后检查各行线电平是否都为高电平,如果不全为 高电平,则说明有键被按下,否则说明无键被按下。当键7按下 时,第二行线电平为低电平,但还不能确定是键7被按下,因为 如果同一行的键4、5或6之一被按下,行线也会呈现低电平。所 以,通过这一步只能得出第二行有键被按下的结论。
//处理K1键
break;
case 2: ......;
//处理K2键
break;
case 4: ......;
//处理K3键
break;
case 8: ......;
//处理K4键
break;
case 16: ......; //处理K5键
break;
13
理K6键
K7键
K8键
//无按下键处理 }
图8-4 矩阵键盘
(1)矩阵式键盘工作原理 按键设在行、列线交点上。行线通过上拉电阻接到
+5V上。无按键按下时,行线处于高电平状态;当有按键按 下时,行线电平状态将由与此行线相连的列线的电平决定。 列线的电平如果为低,则行线电平为低;列线的电平如果 为高,则行线的电平也为高,这一点是识别行列式键盘按 键是否按下的关键所在。由于行列式键盘中行、列线为多 键共用,各按键均影响该键所在行和列的电平,因此各按 键彼此将相互发生影响,所以必须将行、列线信号配合起 来并做适当的处理,才能确定闭合键的位置。 (2)按键的识别方法
的键盘处理程序。
C51参考程序如下:
#include<reg51.h>
bit keyflag;
//keyflag为有键按下
的标志位
unsigned char keyvalue;
//keyvalue为键值
void delay (unsigned int n);
//软件延时n ms函
数
void main(void) {
当按键数目较多时,独立式键盘接口电路需要的输 入口线较多,故该种键盘电路仅适用于按键数目较少的应用 系统。下面从实际应用的角度介绍几种独立式键盘的接口。
7
图8-2(a)所示为查询方式的独立式键盘接口电路,按键 直接与单片机的I/O口线相连,通过读I/O口,判断I/O口线的电 平状态,即可识别出按下的键。图8-2(b)所示为中断方式的独立 式键盘接口电路,只有在键盘有按键按下时,才进行处理,所以 实时性强,效率高。当键盘中有按键按下时, 8输入与非门 74LS30的输出经过74LS04反相后向单片机的中断请求输入引脚发 出低电平的中断请求信号,单片机响应中断后,在中断服务程序 中,对按下的键进行识别。
第8章 人机交互接口设计 1
8.1 键盘接口
8.1.1 键盘的工作原理
8.1.2 键盘的接口电路
8.1.3 键盘的工作方式
8.2 LED数码管显示器接口
8.2.1 LED数码管的结构
8.2.2 LED数码管的工作原理
8.3 键盘与LED数码管显示器接口综合设计实例
8.3.1 利用并行I/O芯片82C55实现的键盘/显示器 接口
unsigned char rekey; IE=0x80; keyflag=0; P1=0xff; keyvalue=P1; delay(10); rekey=P1;
//有键按下,进入中断函数
//屏蔽中断 //设置键按下标志位 //P1口锁存器置1 //从P1口读入键盘状态 //延时10ms去抖 //再次读取P1口状态
3
2
1
0
7
6
5
4
B
A
U1
19 XTAL1 18 XTAL2
9 RST
29 30
PSEN ALE
31 EA
1 P1.0 2 P1.1 3 P1.2 4 P1.3 5 P1.4 6 P1.5 7 P1.6 8 P1.7
80C51
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
编码键盘采用硬件方法完成键盘识别功能,每按下一 个键,键盘通过其编码电路自动产生一个编码信息,即键码。 这种键盘使用方便,但硬件较复杂,计算机所用键盘即为编码 键盘。非编码键盘是由软件完成键盘识别功能的,它利用一套 专用键盘编码程序来识别按键的位置,并转换成相应的编码信 息,形成键码。这种键盘硬件简单,广泛用于各种单片机应用 系统中。下面介绍主要非编码键盘的工作原理及其工作方式。