按键控制键盘检测原理与应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

按键控制键盘检测原理与应用

一、任务目标:

认知目标

1、 掌握按键分类及工作原理

2、 掌握IF 条件选择结构和使用方法

3、 掌握循环结构和使用原理

4、 掌握独立按键子函数的编写原理及方法

1、独立键盘

在简单的单片机应用系统中,往往只需要几个功能键就能满足要求, 此时,可采用独立

式按键结构。

独立式按键是直接用 I/O 口线构成的单个按键电路,其特点是每个按键单独占用一根 I/O 口线,每个按键的工作不会影响其它 I/O 口线的状态。独立式按键的典型应用如图

1.2.1

所示。

独立式按键示意图

独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根 I/O 口线,因此,

在按键较多时,I/O 口线浪费较大,不宜采用。

程序开始,检测按键是否被按下,若按下,则移动机器人启动,未被按下,继续检测。 这里将程序分成三个部分,分别是延时子函数、按键子函数、主函数。

延时子函数,通过参数 t 设置延时时间;按键模块子函数需用到延时函数,对按键进行

消抖;主函数主要调用按键检测程序,实现对移动机器人的控制。程序流程图如图 1.2.2所

开始

< 'J

延时消抖

prpppppp

—1

To

TD

E >T \T \T.\EV>

状态取反

程序流程图

程序示例:

在编写程序开始的部分,将系统头文件“STC89C52RC.H ”包含进来,对常用的变量类

型进行宏定义,规划各函数和变量,对变量进行定义和初始化,对自定义子函数进行声明并添加相应标注,程序开始部分如下

sbit IN仁P1A0;

sbit IN2=P1A1;

Void key();

编写主函数,在主函数中就是调用按键检测函数。

Void mai n()

{

key();

}

编写key()按键检测函数,按键按下,输出低电平,通过if语句检测低电平,延时10ms 后,再次检测,若检测为高电平,则表示为机械抖动,若检测到低电平表示按键按下。

Void key()

{

if(IN1==0)

{

delay_ms(10);

if(IN 仁=0) {

while(IN 仁=0);

IN2=~IN2 ;

} }

}

在上面的程序中,就只有一个检查按键扫描的函数key(),key()函数是检查有没有按键

按下编写的。当有按键下的时候P2 口取反。

2、矩阵键盘

(1 )矩阵连接式键盘

在单片机系统中键盘中按钮数量较多时,为了减少I/O 口的占用,常常将按钮排列成矩阵

形式,如下图所示:

矩阵键盘形式矩阵按键实物图

矩阵连接式键盘键按矩阵排列,各键处于矩阵行/列的结点处,C P U通过对连在行(列)的I/O线送已知电平的信号,然后读取列(行)线的状态信息。逐线扫描,得出键码。其特点是键多时占用

I/O 口线少,硬件资源利用合理,但判断按键速度慢。多用于设置数字键,适用于键数多的场合。

(2)按键识别方法

①扫描法

第1步,识别键盘有无键按下;第2步,如有键被按下,识别出具体的键位。其工作过程为先把所有列线均置为0,然后检查各行线电平是否都为高,如果不全为高,说明有键按

下,否则无键被按下。再采用逐列扫描法,在某一时刻只让1条列线处于低电平,其余所有

列线处于高电平,识别出按键具体位置。

综上所述,扫描法的思想是,先把某一列置为低电平,其余各列置为高电平,检查各行

线电平的变化,如果某行线电平为低电平,则可确定此行此列交叉点处的按键被按下。

②线反转法

线反转法的具体步骤为让行线编程为输入线,列线编程为输出线,并使输出线输出为全

低电平,则行线中电平由高变低的所在行为按键所在行。再把行线编程为输出线,列线编程

为输入线,并使输出线输出为全低电平,则列线中电平由高变低所在列为按键所在列。

程序编写

矩阵式键盘最主要的是按键识别,按键识别是采用线翻转的方法。线翻转法是先让P2= 0xf0 ;

当有按键按下时P2 口的状态就会改变不在是0xf0,当按键按下时,P2的状态改变了,此时存储当前P2 口的状态1,然后让P2=0xf0因为程序执行时间很短,此时按键还没抬起来,由于按键按下的原因P2状态不再是0xf0,存储此时P2 口的状态2,把状态1与状态2的值相或,因为每个按键按下的值都是不一样的,根据按键返回的值给数码管赋不同的断码值,

从而达到显示0~F的目的。利用线反转法编写程序流程如图 1.2.4所示:

主程序 键盘扫描程序

键值显示函数

程序示例

编写keyscan 函数注释,定义keyscan 函数并编写框架。keyscan 函数主要负责扫描矩 阵键盘是否被

按下,并且根据按下的按键返回不同的值,所以应该为无参、有返回值函数。 因为有按键按下时返回值是将两次

P2=0xf0和P2=0x0f 的结果相或,无按键按下时返回值为 Oxff ,所以将函数返回值定义为 uchar 型即可。

uchar keysca n( void) {

uchar cord_h=0; uchar cord_l=O; P2=0xf0; if(P2!=0xf0) { Delay_ms(10);

if(P2!=0xf0) {

cord_h=P2; P2=0x0f; cord_l=P2;

开始

开始

开始

系统初始化

1 1

键盘扫描程序

1

F

显示键值

有键按下?

延时消抖

Case

Oxee; PO 口送 0

段码

switch

按键返回值

Case Oxed; PO 口送 1

Break

结束

返回Oxff

程序流程图

P2= OXFO

有键按下?

返回(状态1|状态2)

Case 0x77; PO 口送 F

段码

相关文档
最新文档