详解单片机的按键检测与控制
按键在单片机控制系统中起到人机交互的作用,通过按键可以输入数据、命令和各种参数,按键侧键测处理是单片机系统设计和开发中一个重要的内容,关系到整个系统的交互性能和稳定性。按键处理形式在单片机系统中有两种形式:直接按键和矩阵编码键盘,下面分别对这两种按键检测电路的特点及编程思路和方法进行分析和介绍。
按键抖动问题产生的原因及解决方法
按键的抖动问题是指按键的触点在闭合和断开瞬间由于接触情况不稳定,从而导致电压信号的抖动现象(由按键的机械特性造成,不可避免)。图8-1所示为一次按键的抖动过程,在按键的前沿和后沿都会有5~10ms的抖动。
图8-1 按键抖动示意图
对于时钟是微秒级的单片机而言,键盘的抖动有可能造成单片机对一次按键的多次处理。为了提高系统的稳定性,我们必须采用有效的方式消除抖动。
去除抖动可以采用硬件方式和软件方式。硬件方式一般是在按键与单片机的输入通道上安装硬件去抖电路(如RS触发器)。软件方式的实现方法是:当查询到电路中有按键按下时,先不进行处理,而是先执行10~20ms的延时程序,延时程序结束后,再次查询按键状态,若此时按键仍为按下状态,则视为按键被按下。
按键检测电路及应用
1. 独立式按键
独立式键盘相互独立,每个按键占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其他按键的工作状态,CPU可直接读取该I/O线的高/低电平状态。这种按键硬件、软件结构简单,判键速度快,使用方便,但占用I/O口线较多,适用于按键数量较少的系统中。
独立连接式键盘连接如图8-2所示。当没有键被按下时,所有的数据输入线均为高电平;当任意一个按键被按下时,与之相连的数据输入线将变为低电平;通过相应指令,可以判断是否有键被按下。
图8-2 独立式键盘接口设计
【例8-1】 利用单片机的P1.0~P1.34个I/O口检测4个按键的触发信息,以实现不同功能的控制。
硬件电路参见图8-2所示,C51参考程序如下:
2. 矩阵式按键
在单片机系统中,当按键数量较多时,为了减少IO口的使用,通常将按键排列成矩阵型式。例如下例中的16个按键,被排列成了如图8-3所示的4X4矩阵方式。该矩阵式键盘由4根行线和4根列线组成,每个行线和列线的交叉点是一个按键。
【例8-2】 将矩阵式键盘的按键值通过数码管显示出来。
电路连接如图8-3所示(电源和震荡电路未标出)。
图8-3 矩阵式键盘按键显示电路图
如何判断被按下的键值呢?
分析如下:
根据下面的电路图,如果已知P1.0端口被置为低电平“0”,那么当按键K0被按下时,可以肯定P1.4端口的电平也变为了低电平“0”。基于这个原理,总结矩阵键盘识别按键的步骤如下:
a)首先判断是否有按键被按下
本例中矩阵键盘中P1端口低4位连接的是列线,高4位连接的是行线。将全部行线置为低电平“0”,全部列线置为高电平“1”。然后检测列线的状态。只要有一根列线的电平为低,则表示有按键被按下。否则没有按键按下。
b)按键消抖
当判断到有按键被按下后,还要进行消抖处理,以确认真正有按键被按下。
c)按键识别
当确认有键被按下后,采用逐行扫描的方法来确定是哪一个按键被按下。先扫描第一行,即将第一行输出低电平“0”,然后读取列值,那一列出现低电平“0”,则说明该列与第一行交叉处的按键被按下。如果读入的列值全部为"1",说明与第一行连接的按键均没有被按下。那么接下来开始扫描第二行,以此类推。直到完成全部行线的扫描。
C51程序如下:
矩阵式键盘与I/O接口应用
【例8-3】 四位数字密码锁
四位数字密码锁功能:通过键盘输入密码,当输入密码与内置密码相同时,继电器动作,表示密码锁解开。为了简化功能,该密码锁只使用12个键(即4x3键盘),其中S1~S9为1~9数字键,S10为0数字键,S11为“*”键作为确认键使用,而S12为“#”键作为复位键,键盘接口电路如图8-4所示,键值布局如表8-1所示。
图8-4 行列式键盘电路连接图
表8-1 键盘布局表
单片机上电时,数码管显示“0000”,此时输入数字,数码管将显示按键值,数字逐个向左递增,四次输入完毕,四个数码管显示输入的数,此时按“*”号按键将启动比较,若输入数字与内设密码相同,继电器动作。如不同,则系统复位等待重新输入密码。当按“#”号键,系统复位,数码管显示“0000”。
在上面键扫描程序基础上增加的源程序如下:
51单片机实现篮球计分器程序,按键加减分 计数器减分
/** .两个七段数码管动态显示 **/
//==声明区====================================
#include<reg52.h> // 定义头文件
#define delay_time 1000
#define seg_data P1
#define delay_display 1000
unsigned char jifen;
unsigned char TAB[10]={0x3f, 0x06, 0x5b, 0x4f, 0x66,// 数字0-4
0x6d, 0x7d, 0x07, 0x7f, 0x6f };// 数字5-9
sbit ADD1=P2^1; //定义硬件的接口
sbit ADD2=P2^3;
sbit ADD3=P2^5;
sbit SUB=P3^5;
sbit MP1=P3^0;
sbit MP2=P3^1;
void delay (unsigned int a) // 声明延迟函数
{
while(a--);
}
void yifen() //分数加 子函数
{
if(ADD1==0)
{
delay(delay_time);
if(ADD1==0)
{
if(jifen>=99) jifen=99;
else jifen++;
}
while(ADD1==0);
}
if(ADD2==0)
{
delay(delay_time);
if(ADD2==0)
{
if(jifen>=99) jifen=99;
else jifen++; jifen++;
}
while(ADD2==0);
}
if(ADD3==0)
{
delay(delay_time);
if(ADD3==0)
{
if(jifen>=99) jifen=99;
else jifen++; jifen++;jifen++;
}
while(ADD3==0);
}
/*if(SUB==0) //按键减分
{
delay(delay_time);
if(SUB==0)
{
if(jifen>=99) jifen=99;
else jifen--;
}
while(SUB==0);
}
****/////
}
void display() //显示子函数
{
seg_data=TAB[jifen/10];
MP1=0;MP2=1;
delay(delay_display);
MP1=1;MP2=1;
seg_data=TAB[jifen%10];
MP1=1;MP2=0;
delay(delay_display);
MP1=1;MP2=1;
}
void INIT()
{
TMOD=0x50;
TH1=(65536-3)/256;
TL1=(65536-3)%256;
TR1=1; //启动定时计数器
EA=1; //中断总开关
ET1=1; //使能定时计数器中断
}
//==主程序====================================
main() // 主程序开始
{ INIT(); //条调用INIT函数,初始化中断
P1=0x3f;MP1=0;MP2=0; //启动时数码管显示“00”
while(1)
{
yifen(); //包调用
display();
}
}
void Timer0() interrupt 3 //计数器的中断服务函数
{
jifen--;
TH1=(65536-3)/256; //重装初值
TL1=(65536-3)%256;
}
相关问答
单片机 如何让 按键 控制温度 加减 ?要让单片机通过按键控制温度加减,首先需要连接一个温度传感器来获取当前温度值。然后,编写程序读取按键输入,并根据按键的不同操作进行相应的温度调节操作。例...
请问 单片机 怎么用独立 按键 按一下实现一个功能,按另一个 按键 实现另一个功能,这个代码要怎么写啊?如果这两个功能都是一个死循环,可以考虑用中断,这样就不必在两个独立的功能中插入按键检测了while(1){while(flag==1){死循环1}while(flag==2){死循环2}}....
单片机 电子记分牌课程设计要求:(1)选择51 单片机 ,晶振采用12...[最佳回答]单片机电子记分牌设计要求有哪些。
单片机 4*4 按键 扫描看不懂第3句key_l=P1& 0xf0;//11100000key_...[最佳回答]key_l=P1&0xf0;//读出高四位,行,检测某行有按键key_l=key_l|0x0f;//把高四位的数据或上0x0fP1=key_l;//把P1口置成输出口(除了有按键的那一...
51 单片机 ,2个按钮2个数码管,实现外部清零与计数,一个按钮按一下加1?假设第一个文本框变量名为text1,第二个文本框变量名为text2按钮A的AS为:on(release){_root.text1++}按钮B的AS为:on(release){_r...
单片机 一个 按键 实现短按,中长按,更长按,也就是三种功能,程序怎么写?在0.5S的时候做一次判断,如果弹起了则表示短按,没弹起,再经过2.5S再判断次,再经过2s再判断是否弹起,基本能实现在0.5S的时候做一次判断,如果弹起了则表示短按...
单片机 用汇编语言编写一个。用十个按钮分别控制十个灯。比如:按下按钮K1 LED1灯亮。按下"?检测是否有按键按下,相应的指示灯点亮,并熄灭其它的指示灯。至于10S锁住其他按钮,如果程序不做其它的事情,最简单的方法就是点亮指示灯后延时10S,再回到主函...
单片机 程序:用一个开关按钮控制一个灯,按钮在上面灯恒亮(高...一是第一次检测到按键按下后加延时,二是等待按键抬起,用while(!key1&&key2…);后面的switch(key)和P2=…不要放在等待按键抬起过程之中这和只有一个按键...
51 单片机 如何用一个 按键 控制一段程序的运行与停止?1、创建项目文件。2、按键:S1=P3^2,点亮:led=P1^5。3、创建C语言主函数。4、创建循环效果,检测效果。while(1){}。5、选择输出的效果。6、当按下一个...
单片机 用按键控制步进电机按下正转松开反转! 单片机按键 按下时步进电机正转松开时反转,按第二个按?我只能提示一下,由于时间关系楼主你也要动脑子吧,从左至右流动就是正转,停纸法也有其他),进入中断就是停止了(这个没有要求,右至左流动就是反转了(这相当...