按键控制键盘检测原理与应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uchar keyscan(void)
{
uchar cord_h=0;
uchar cord_l=0;
P2=0xf0;
if(P2!=0xf0)
{Delay_ms(10);
if(P2!=0xf0)
{
cord_h=P2;
P2=0x0f;
cord_l=P2;
return(cord_h|cord_l);
}
}
return(0xff);
通常,按键的开关为机械弹性触点开关,它是利用机械触点接触和分离实现电路的通、断。由于机械触点的弹性作用,加上人们按键时的力度、方向的不同,按键开关从按下到接触稳定要经过数毫秒的弹跳抖动,既在按下的几十毫秒时间里会连续产生多个脉冲。释放按 键时,电路也不会一下断开,同样会产生抖动。这两次抖动的时间分别为 10.20ms 左右,而按键的稳定闭合期通常大于0.3.0.5 秒。因此,为了确保 MCU 对一次按键动作只确认一次,在确认按键是否闭合时,必须要进行消抖处理。否则,由于 MCU 软件执行的速度很快,非常可能将抖动产生的多个脉冲误认为多次的按键。
程序流程图
程序示例
编写keyscan函数注释,定义keyscan函数并编写框架。keyscan函数主要负责扫描矩阵键盘是否被按下,并且根据按下的按键返回不同的值,所以应该为无参、有返回值函数。因为有按键按下时返回值是将两次P2=0xf0和P2=0x0f的结果相或,无按键按下时返回值为0xff,所以将函数返回值定义为uchar型即可。
程序流程图
程序示例:
在编写程序开始的部分,将系统头文件“STC89C52RC.H”包含进来,对常用的变量类型进行宏定义,规划各函数和变量,对变量进行定义和初始化,对自定义子函数进行声明并添加相应标注,程序开始部分如下
sbit IN1=P1^0;
sbit IN2=P1^1;
Void key();
编写主函数,在主函数中就是调用按键检测函数。
独立式按键示意图
独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。
程序开始,检测按键是否被按下,若按下,则移动机器人启动,未被按下,继续检测。这里将程序分成三个部分,分别是延时子函数、按键子函数、主函数。
延时子函数,通过参数t设置延时时间;按键模块子函数需用到延时函数,对按键进行消抖;主函数主要调用按键检测程序,实现对移动机器人的控制。程序流程图如图1.2.2所示
case 0xbb:P0=LED_Val[10];break;
case 0xb7:P0=LED_Val[11];break;
case 0x7e:P0=LED_Val[12];break;
case 0x7d:P0=LED_Val[13];break;
case 0x7b:P0=LED_Val[14];break;
IN2=~IN2;
}
}
}
在上面的程序中,就只有一个检查按键扫描的函数key(),key()函数是检查有没有按键按下编写的。当有按键下的时候P2口取反。
2、矩阵键盘
(1)矩阵连接式键盘
在单片机系统中键盘中按钮数量较多时,为了减少I/O口的占用,常常将按钮排列成矩阵形式,如下图所示:
矩阵键盘形式
矩阵按键实物图
消除按键的抖动既可采用硬件方法,也可采用软件的方法。使用硬件消抖的方式,需要在按键连接的硬件设计上增加硬件消抖电路,如采用 R.S 触发器或 RC 积分电路等。采用硬件消抖方式增加了系统的成本,而利用软件方式消抖则是比较经济的做法,但增加了软件设计的复杂性。
软件方式消抖的基本原理是在软件中对按键进行两次测试确认,既在第一次检测到按键按下后,间隔 10ms 左右再次检测该按键是否按下,只有在两次都测到按键按下时才最终确认有键按下,从而消除了抖动的影响。在按键接口软件中,除了要考虑按键消抖外,一般还要判别按键的释放,只有检测到按键释放以后,才能确定为一次完整的按键动作完成。
按键识别方法分为三种,分别是程序控制扫描方式、定时扫描方式和中断扫描方式。
①程序控制扫描方式
程序控制扫描方式是指单片机在空闲时,才调用键盘扫描子程序,并反复地扫描键盘,直到用户从键盘上输入命令或数据,而在执行键入命令或处理键入数据过程中,CPU将不再响应键入要求,直到CPU重新扫描键盘为止。
过程如下:
switch(key)
{
case 0xee:P0=LED_Val[0];break;
case 0xed:P0=LED_Val[1];break;
case 0xeb:P0=LED_Val[2];break;
case 0xe7:P0=LED_Val[3];break;
case 0xde:P0=LED_Val[4];break;
矩阵连接式键盘键按矩阵排列,各键处于矩阵行/列的结点处,CPU通过对连在行(列)的I/O线送已知电平的信号,然后读取列(行)线的状态信息。逐线扫描,得出键码。其特点是键多时占用I/O口线少,硬件资源利用合理,但判断按键速度慢。多用于设置数字键,适用于键数多的场合。
(2)按键识别方法
1扫描法
第1步,识别键盘有无键按下;第2步,如有键被按下,识别出具体的键位。其工作过程为先把所有列线均置为0,然后检查各行线电平是否都为高,如果不全为高,说明有键按下,否则无键被按下。再采用逐列扫描法,在某一时刻只让1条列线处于低电平,其余所有列线处于高电平,识别出按键具体位置。
Void main()
{
key();
}
编写key()按键检测函数,按键按下,输出低电平,通过if语句检测低电平,延时10ms后,再次检测,若检测为高电平,则表示为机械抖动,若检测到低电平表示按键按下。
Void key()
{
if(IN1==0)
{
delay_ms(10);
if(IN1==0)
{
while(IN1==0);
case 0xdd:P0=LED_Val[5];break;
case 0xdb:P0=LED_Val[6];break;
case 0xd7:P0=LED_Val[7];break;
case 0xbe:P0=LED_Val[8];break;
case 0xbd:P0=LED_Val[9];break;
}
编写主函数,系统从主函数开始执行,首先点亮数码管,将数字“0”的段码赋值给P0口,然后进入while无限循环,在while循环里,调用keyscan函数,并将返回值赋值给变量key,同时要定义变量可以。
void main()
{
uΒιβλιοθήκη Baiduhar key;
P0=0XC0;
while(1)
{
key=keyscan();
程序编写
矩阵式键盘最主要的是按键识别,按键识别是采用线翻转的方法。线翻转法是先让P2= 0xf0;当有按键按下时P2口的状态就会改变不在是0xf0,当按键按下时,P2的状态改变了,此时存储当前P2口的状态1,然后让P2=0xf0因为程序执行时间很短,此时按键还没抬起来,由于按键按下的原因P2状态不再是0xf0,存储此时P2口的状态2,把状态1与状态2的值相或,因为每个按键按下的值都是不一样的,根据按键返回的值给数码管赋不同的断码值,从而达到显示0~F的目的。利用线反转法编写程序流程如图1.2.4所示:
case 0x77:P0=LED_Val[15];break;
}
}
}
1、实物调试
1)、电路连接
电路连接
2)、上电调试
上电测试
五、背景知识:
在控制系统中,通常需利用按键进行系统参数的设置。按键时单片机应用系统中常用的输入设备之一,线性键盘分为独立按键、矩阵键盘两种。
键盘是由一组规则排列的按键组成,一个按键实际上是一个开关元件,也就是说键盘是一组规则排列的开关。键盘的工作方式有3种,即程序控制扫描、定时扫描和中断扫描方式。
按键控制键盘检测原理与应用
一、任务目标:
认知目标
1、掌握按键分类及工作原理
2、掌握IF条件选择结构和使用方法
3、掌握循环结构和使用原理
4、掌握独立按键子函数的编写原理及方法
1、独立键盘
在简单的单片机应用系统中,往往只需要几个功能键就能满足要求,此时,可采用独立式按键结构。
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键的典型应用如图1.2.1所示。
⑴判断有无键按下;
⑵延时后判断是否确实有键按下。如果有,确认有键按下,如果没有,那么确认为键抖动;
⑶判断是哪个键被按下(键扫描获得闭合键的行、列值);
⑷等待按键被释放。如果没有释放,继续等待;如果释放,转到相应的处理程序进行处理。
②定时扫描方式
定时扫描方式就是每隔一定时间对键盘扫描一次,它利用单片机内部的定时器产生一定的时间的定时,当定时时间到就产生定时器溢出中断,CPU响应中断后对键盘进行扫描,并在有键按下时识别出该键执行响应的键功能程序。
综上所述,扫描法的思想是,先把某一列置为低电平,其余各列置为高电平,检查各行线电平的变化,如果某行线电平为低电平,则可确定此行此列交叉点处的按键被按下。
2线反转法
线反转法的具体步骤为让行线编程为输入线,列线编程为输出线,并使输出线输出为全低电平,则行线中电平由高变低的所在行为按键所在行。再把行线编程为输出线,列线编程为输入线,并使输出线输出为全低电平,则列线中电平由高变低所在列为按键所在列。
③中断扫描方式
键盘工作在程序控制扫描方式时,当无键按下时CPU要不间断的扫描键盘,直到有键按下为止。如果CPU要处理很多事情,这种方式将不能适应。定时扫描方式只要时间一到,CPU就去扫描键盘,工作效率有了进一步的提高。但这两种方式常使CPU处于空扫状态,而中断方式下,CPU可以一直处理自己的工作,知道有键闭合时发出中断申请,CPU响应中断,执行相应的中断服务程序,才对键盘进行扫描,从而提高了CPU的工作效率。
{
uchar cord_h=0;
uchar cord_l=0;
P2=0xf0;
if(P2!=0xf0)
{Delay_ms(10);
if(P2!=0xf0)
{
cord_h=P2;
P2=0x0f;
cord_l=P2;
return(cord_h|cord_l);
}
}
return(0xff);
通常,按键的开关为机械弹性触点开关,它是利用机械触点接触和分离实现电路的通、断。由于机械触点的弹性作用,加上人们按键时的力度、方向的不同,按键开关从按下到接触稳定要经过数毫秒的弹跳抖动,既在按下的几十毫秒时间里会连续产生多个脉冲。释放按 键时,电路也不会一下断开,同样会产生抖动。这两次抖动的时间分别为 10.20ms 左右,而按键的稳定闭合期通常大于0.3.0.5 秒。因此,为了确保 MCU 对一次按键动作只确认一次,在确认按键是否闭合时,必须要进行消抖处理。否则,由于 MCU 软件执行的速度很快,非常可能将抖动产生的多个脉冲误认为多次的按键。
程序流程图
程序示例
编写keyscan函数注释,定义keyscan函数并编写框架。keyscan函数主要负责扫描矩阵键盘是否被按下,并且根据按下的按键返回不同的值,所以应该为无参、有返回值函数。因为有按键按下时返回值是将两次P2=0xf0和P2=0x0f的结果相或,无按键按下时返回值为0xff,所以将函数返回值定义为uchar型即可。
程序流程图
程序示例:
在编写程序开始的部分,将系统头文件“STC89C52RC.H”包含进来,对常用的变量类型进行宏定义,规划各函数和变量,对变量进行定义和初始化,对自定义子函数进行声明并添加相应标注,程序开始部分如下
sbit IN1=P1^0;
sbit IN2=P1^1;
Void key();
编写主函数,在主函数中就是调用按键检测函数。
独立式按键示意图
独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。
程序开始,检测按键是否被按下,若按下,则移动机器人启动,未被按下,继续检测。这里将程序分成三个部分,分别是延时子函数、按键子函数、主函数。
延时子函数,通过参数t设置延时时间;按键模块子函数需用到延时函数,对按键进行消抖;主函数主要调用按键检测程序,实现对移动机器人的控制。程序流程图如图1.2.2所示
case 0xbb:P0=LED_Val[10];break;
case 0xb7:P0=LED_Val[11];break;
case 0x7e:P0=LED_Val[12];break;
case 0x7d:P0=LED_Val[13];break;
case 0x7b:P0=LED_Val[14];break;
IN2=~IN2;
}
}
}
在上面的程序中,就只有一个检查按键扫描的函数key(),key()函数是检查有没有按键按下编写的。当有按键下的时候P2口取反。
2、矩阵键盘
(1)矩阵连接式键盘
在单片机系统中键盘中按钮数量较多时,为了减少I/O口的占用,常常将按钮排列成矩阵形式,如下图所示:
矩阵键盘形式
矩阵按键实物图
消除按键的抖动既可采用硬件方法,也可采用软件的方法。使用硬件消抖的方式,需要在按键连接的硬件设计上增加硬件消抖电路,如采用 R.S 触发器或 RC 积分电路等。采用硬件消抖方式增加了系统的成本,而利用软件方式消抖则是比较经济的做法,但增加了软件设计的复杂性。
软件方式消抖的基本原理是在软件中对按键进行两次测试确认,既在第一次检测到按键按下后,间隔 10ms 左右再次检测该按键是否按下,只有在两次都测到按键按下时才最终确认有键按下,从而消除了抖动的影响。在按键接口软件中,除了要考虑按键消抖外,一般还要判别按键的释放,只有检测到按键释放以后,才能确定为一次完整的按键动作完成。
按键识别方法分为三种,分别是程序控制扫描方式、定时扫描方式和中断扫描方式。
①程序控制扫描方式
程序控制扫描方式是指单片机在空闲时,才调用键盘扫描子程序,并反复地扫描键盘,直到用户从键盘上输入命令或数据,而在执行键入命令或处理键入数据过程中,CPU将不再响应键入要求,直到CPU重新扫描键盘为止。
过程如下:
switch(key)
{
case 0xee:P0=LED_Val[0];break;
case 0xed:P0=LED_Val[1];break;
case 0xeb:P0=LED_Val[2];break;
case 0xe7:P0=LED_Val[3];break;
case 0xde:P0=LED_Val[4];break;
矩阵连接式键盘键按矩阵排列,各键处于矩阵行/列的结点处,CPU通过对连在行(列)的I/O线送已知电平的信号,然后读取列(行)线的状态信息。逐线扫描,得出键码。其特点是键多时占用I/O口线少,硬件资源利用合理,但判断按键速度慢。多用于设置数字键,适用于键数多的场合。
(2)按键识别方法
1扫描法
第1步,识别键盘有无键按下;第2步,如有键被按下,识别出具体的键位。其工作过程为先把所有列线均置为0,然后检查各行线电平是否都为高,如果不全为高,说明有键按下,否则无键被按下。再采用逐列扫描法,在某一时刻只让1条列线处于低电平,其余所有列线处于高电平,识别出按键具体位置。
Void main()
{
key();
}
编写key()按键检测函数,按键按下,输出低电平,通过if语句检测低电平,延时10ms后,再次检测,若检测为高电平,则表示为机械抖动,若检测到低电平表示按键按下。
Void key()
{
if(IN1==0)
{
delay_ms(10);
if(IN1==0)
{
while(IN1==0);
case 0xdd:P0=LED_Val[5];break;
case 0xdb:P0=LED_Val[6];break;
case 0xd7:P0=LED_Val[7];break;
case 0xbe:P0=LED_Val[8];break;
case 0xbd:P0=LED_Val[9];break;
}
编写主函数,系统从主函数开始执行,首先点亮数码管,将数字“0”的段码赋值给P0口,然后进入while无限循环,在while循环里,调用keyscan函数,并将返回值赋值给变量key,同时要定义变量可以。
void main()
{
uΒιβλιοθήκη Baiduhar key;
P0=0XC0;
while(1)
{
key=keyscan();
程序编写
矩阵式键盘最主要的是按键识别,按键识别是采用线翻转的方法。线翻转法是先让P2= 0xf0;当有按键按下时P2口的状态就会改变不在是0xf0,当按键按下时,P2的状态改变了,此时存储当前P2口的状态1,然后让P2=0xf0因为程序执行时间很短,此时按键还没抬起来,由于按键按下的原因P2状态不再是0xf0,存储此时P2口的状态2,把状态1与状态2的值相或,因为每个按键按下的值都是不一样的,根据按键返回的值给数码管赋不同的断码值,从而达到显示0~F的目的。利用线反转法编写程序流程如图1.2.4所示:
case 0x77:P0=LED_Val[15];break;
}
}
}
1、实物调试
1)、电路连接
电路连接
2)、上电调试
上电测试
五、背景知识:
在控制系统中,通常需利用按键进行系统参数的设置。按键时单片机应用系统中常用的输入设备之一,线性键盘分为独立按键、矩阵键盘两种。
键盘是由一组规则排列的按键组成,一个按键实际上是一个开关元件,也就是说键盘是一组规则排列的开关。键盘的工作方式有3种,即程序控制扫描、定时扫描和中断扫描方式。
按键控制键盘检测原理与应用
一、任务目标:
认知目标
1、掌握按键分类及工作原理
2、掌握IF条件选择结构和使用方法
3、掌握循环结构和使用原理
4、掌握独立按键子函数的编写原理及方法
1、独立键盘
在简单的单片机应用系统中,往往只需要几个功能键就能满足要求,此时,可采用独立式按键结构。
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键的典型应用如图1.2.1所示。
⑴判断有无键按下;
⑵延时后判断是否确实有键按下。如果有,确认有键按下,如果没有,那么确认为键抖动;
⑶判断是哪个键被按下(键扫描获得闭合键的行、列值);
⑷等待按键被释放。如果没有释放,继续等待;如果释放,转到相应的处理程序进行处理。
②定时扫描方式
定时扫描方式就是每隔一定时间对键盘扫描一次,它利用单片机内部的定时器产生一定的时间的定时,当定时时间到就产生定时器溢出中断,CPU响应中断后对键盘进行扫描,并在有键按下时识别出该键执行响应的键功能程序。
综上所述,扫描法的思想是,先把某一列置为低电平,其余各列置为高电平,检查各行线电平的变化,如果某行线电平为低电平,则可确定此行此列交叉点处的按键被按下。
2线反转法
线反转法的具体步骤为让行线编程为输入线,列线编程为输出线,并使输出线输出为全低电平,则行线中电平由高变低的所在行为按键所在行。再把行线编程为输出线,列线编程为输入线,并使输出线输出为全低电平,则列线中电平由高变低所在列为按键所在列。
③中断扫描方式
键盘工作在程序控制扫描方式时,当无键按下时CPU要不间断的扫描键盘,直到有键按下为止。如果CPU要处理很多事情,这种方式将不能适应。定时扫描方式只要时间一到,CPU就去扫描键盘,工作效率有了进一步的提高。但这两种方式常使CPU处于空扫状态,而中断方式下,CPU可以一直处理自己的工作,知道有键闭合时发出中断申请,CPU响应中断,执行相应的中断服务程序,才对键盘进行扫描,从而提高了CPU的工作效率。