第10章 键盘显示器接口
图10-1 8段LED数码管结构及外形
4
按照上述格式,显示各种字符的8段LED数码管的段码如表
10-2所示。
5
表10-1只列出了部分段码,读者也可对某些显示的字符重
新定义,也可选择其他字型的LED数码管。 除了“8”字型的LED数码管外,市面上还有“±1”型、“ 米”字型和“点阵”型LED显示器,如图10-2所示。厂家也 可根据用户的需要定做特殊字型的数码管。
void main(void)
{ uchar key; while(1)
{key= keyscan( ); /*调用键盘扫描函数,返回的键值送变量key*/
delay( ); /*延时*/ /*延时函数*/
}
void delay(void); { } uchar i; for(i=0;i<200;i++){ }
reread_key=P1&0x07; if(key_value==reread_key)
/*延时10ms*/
/*再次读取P1口的状态*/
{
}
key_flag=1;
/*设置中断标志为1*/
/*中断允许*/
IE=0x81; }
32
2. 矩阵式键盘(自学)
矩阵式(也称行列式)键盘用于按键数目较多场合,由行线 和列线组成,一组为行线,另一组为列线,按键位于行、列的 交叉点上。如图10-10所示,一个44的行、列结构可以构成一 个16个按键的键盘。在按键数目较多的场合,与独立式键盘相
2014-10-16 第8章 接口技术基础 11
例2:在4个数码管上显示字符"1"、"2"、"3"、"4"
见文档
例3:设计一个2位10进制计数器,每秒加1,在 LED上显示
见文档
2014-10-16
第8章 接口技术基础
12
10.2 键盘的接口设计
键盘功能:向单片机输入数据、命令等,是人与单片机对 话的主要手段。下面介绍键盘工作原理和工作方式。 10.2.1 键盘接口应解决的问题 1.键盘的任务 任务有3项: (1)首先判别是否有键按下?若有,进入下一步。
2014-10-16
第8章 接口技术基础
18
2014-10-16
第8章 接口技术基础
19
10.2.2
键盘接口设计举例
键盘两类:非编码键盘和编码键盘。 非编码键盘按键直接与单片机相连,通常使用在按键数量 较少的场合。用这种键盘,系统功能通常比较简单,需处理 的任务较少,但可降低成本、简化电路设计。按下按键的键
图10-7(b)所示的t1和t3分别为键的闭合和断开过程中的 抖动期(呈现一串负脉冲),抖动时间长短与开关的机械特性 有关,一般为5~10ms,t2为稳定的闭合期,其时间由按键动 作确定,一般为十分之几秒到几秒,t0、t4为断开期。
14
8031
+5V
P1.0
键按下 键释放 释放稳定
闭合稳定
前沿抖动
}
31
void int0( ) { IE=ox80;
interrupt 0 /*屏蔽中断*/
uchar reread_key;
key_flag=0;
P1=0xff; key_value=P1;
/*设置中断标志*/
/* P1口锁存器置1*/ /*读入P1口的状态*/
delay_10ms(void);
(2)识别哪一个键被按下,并求出相应的键值。
(3)根据键值,找到相应键值的处理程序入口。
13
2. 键盘输入的特点
常见键盘:触摸式键盘、薄膜键盘和按键式键盘,最常用的 是按键式键盘。 键盘按键实质上是一个开关。如图10-7(a)所示,按键开 关的两端分别连接在行线和列线上,通过键盘开关机械触点的
断开、闭合,其行线电压输出波形如图10-7(b)所示。
比,要节省较多的I/O口线。
(1)查询式键盘,编写查询式的键 盘处理程序。
33
图10-10 矩阵式键盘接口
首先判键盘有无键按下,即把所有行线P1.0~P1.3均置为
低电平,然后检查各列线的状态,若列线不全为高电平,则 表示键盘中有键被按下;若所有列线列均为高电平,说明键 盘中无键按下。 在确认有键按下后,即可进入确定具体闭合键的过程。判
21
图10-8 独立式键盘的接口电路
按键检测程序入口 键闭合? Y 延时消抖 键闭合? Y S1按下否? „ N „
N
键码值置0
N Y
键码值置0
键码值置1 „
S4按下否?
N 返回键码
Y
键码值置4
23
【例10-3】键盘为图10-8所示的独立式键盘,采用查询方
式对键盘的键值读取。参考程序如下:
#include<reg51.h> void main(void) { unsigned char keyvalue; do { P1=0xff; keyvalue=P1; keyvalue=~keyvalue;
case 64: „„;
break; case 128: „„; default: break; } } while(1) }
/*处理6号键*/
/*处理7号键*/ /*无按下键处理*/
26
(2)中断扫描方式的独立式键盘程序
为进一步提高扫描键盘工作效率,可采用中断扫描方式, 如图10-9。键盘只有在键盘有按键按下时,才进行处理,所 以实时性强,效率高。 当键盘中有按键按下时,74LS30的输出经过74LS04反相
后向单片机的中断请求输入引脚INT0*发出中断请求信号,
单片机响应中断,执行键盘扫描程序中断服务子程序,识别 出按下按键的键号,并跳向该按键的处理程序。
27
图10-9 独立式键盘的接口电路
28
【例10-4】键盘接口见图10-9,编写中断方式的独立式键
盘处理程序。程序如下。
#include<reg51.h>
24
switch(keyvalue)
{ case 1: „„; break; /*处理0号键*/
case 2: „„;
break; case 4: „„;
/*处理1号键*/
/*处理2号键*/
break;
case 8: „„; break; case 16: „„; break; case 32: „„; break; /*处理5号键*/ /*处理4号键*/ /*处理3号键*/
30
case 16: „„;
break; case 32: „„; break; case 64: „„; break; case 128: „„; default: break; } key_flag=0; } while(TRUE); }
/*处理4号键*/
/*处理5号键*/ /*处理6号键*/ /*处理7号键*/ /*无效按键,如多个键同时按下*/
36
uchar keyscan(void)
{ uchar code_h; uchar code_l;
/*键盘扫描函数*/
/*行扫描值*/ /*列扫描值*/
P1=0xf0;
if((P1&f0)!=0xf0) { delay( );
/*P1.0~P1.3输出都为0,准备读列状态*/
/*如果P1.4~P1.7不全为1,可能有键按下*/ /*延时去抖动*/ /* P1.0置为0,开始行扫描*/
初始:S接A,A=0,所以Q=1,/Q=0 A—B:A不稳定, /Q=0, Q=1,维持 接B点:由于B=0, Q=1, 所以/Q=1, Q=0,翻转
(B--A):由于 /Q=1, A=1所以Q=0,维持 接A点:A=0, Q=1,翻转
17
2014-10-16
第8章 接口技术基础
2) 软件消抖(重点) 软件消抖不需要增加硬件电路,而是在第一次 检测到按键按下后,执行一段延时程序(如 10~20ms),然后再次检测,确认该按键是否仍保持 闭合状态,如果是则认为是真正有按键按下,否则 认为是干扰,不预理会。这样就可以避开抖动,以 免发生误操作。
8
段码线占用一个8位I/O口,而位选控制使用一个I/O口的4位口
线。动态显示就是通过段码线向显示器(所有的)输出所要显 示字符的段码。每一时刻,只有一位位选线有效,其他各位都 无效。 与静态显示比,动态显示优点节省I/O口,显示器越多,优
势越明显。
缺点显示亮度不如静态显示的高,要调整好“扫描”速率 ,如果“扫描”速率较低,会出现闪烁现象。
if((P1&f0)!=0xf0) /*重读P1.4~P1.7,若还是不全为1,定有键按下*/
code_h=0xfe; while((code_h&0x10)!=0xf0); /*判断是否为最后一行,若不是,继续扫 描*/ { P1= code_h; if((P1&f0)!=0xf0); /*P1口输出行扫描值*/ /*如果P1.4~P1.7不全为1,该行有键按下*/
#include<absacc.h>
#define uchar unsigned char #define TRUE 1
#define FALSE 0
bit key_flage; uchar key_value;
void delay_10ms(void);
/*延时10ms函数*/
29
void main(void) { IE=0x81; IP=0x01; key_flag=0; /*设置中断标志为0*/ do{ if(key_flag) /*如果按键有效*/ { switch(key_value) /*根据按键分支*/ { case 1: „„; /*处理.0号键*/ break; case 2: „„; /*处理1号键*/ break; case 4: „„; /*处理2号键*/ break; case 8: „„; /*处理3号键*/ break;