一、独立按键的介绍
1.按键介绍
轻触按键,相当于一种电子开关,按下使开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通断开。
2.按键原理图
K1、K2、K3、K4一公共端接GND,另一端分别接单片机I/O口的P3^0到P3^3,因为单片机4组I/O口P0—P3都是高电平有效,当按键按下时,将I/O口拉到低电平使按键有效。
3.按键抖动
对于机械开关,当机械触电断开闭合时,由于机械触电的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动,单片机会检测出来。
当没有按键按下时,电平为高电平,按下时,为0(由于机械触电,会弹逐渐稳定为0),机械开关抖动时间为5—10ms(不同开关时间不同),经过手松开的时间,若松开按键,经过5—10ms时间会逐渐回高电平。
4.按键的消抖
(1)硬件消抖
加一个电路,把电线通过电路,经过触发器之类的操作进行电路过滤。
(2)软件消抖
检测按键按下时,延时时间,再继续操作,松手也同样道理。
二、独立按键控制LED指示灯亮灭
当按下k1时,LED小灯D1亮起,松开按键时D1灭掉;
当按下k2时, LED小灯全都亮起,再次按下时全都灭掉;
当按下k3时,LED小灯向右移位,按下k4时LED小灯向左移位;
有兴趣的小伙伴可以尝试一下将LED小灯亮灭做成二进制递增的形式。
代码示例:
/******************** *******************
*** 项目名称:独立按键控制LED灯开关
*** 项目效果:当按下k1时,LED小灯D1亮起,松开按键时D1灭掉;当按下k2时,LED小灯全都亮起,再次按下时全都灭掉;当按下k3时,LED小灯向右移位,按下k4时LED小灯向左移位
*** 连线方式:无
*** 注意事项:无
********************* *******************/
#include "reg52.h"
#include "intrins.h"
//用u8,u16代替方便编写代码
typedef unsigned char u8; //0—255
typedef unsigned int u16; //0—65535
#define LED P2
/*定义管脚*/
//独立按键
sbit k1 = P3^1;
sbit k2 = P3^0;
sbit k3 = P3^2;
sbit k4 = P3^3;
u16 i ; //定义判读哪一个按键按下
u16 s ;
u16 LedNum; //定义led灯移位
/***************************
** 函数名称 :Delay_ms
** 函数作用 :延时函数
** 输入 :ms(毫秒数)
** 输出 :
** 注意 :输入不能超出范围,否则会回到周期
****************************/
int Delay_ms(u16 ms)
{
unsigned char i, j;
while(ms)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
ms--;
}
}
/***************************
** 函数名称 :Key_k1
** 函数作用 :当按下k1时,LED小灯D1亮起,松开按键时D1灭掉
** 输入 :无
** 输出 :无
****************************/
void Key_k1()
{
if(k1 == 0)
{
LED = 0xFE;//让D1亮起来
}
else{
LED = 0xFF;
}
}
/***************************
** 函数名称 :Key_k2
** 函数作用 :当按下k2时,LED小灯全都亮起,再次按下时全都灭掉
** 输入 :无
** 输出 :无
****************************/
void Key_k2()
{
if(k2 == 0) //判断按键按下
{
Delay_ms(10); //延时消抖
if(k2 == 0) //再次判断是否按下
{
LED = ~LED; //取反LED灯的状态//这种效果是按下不松手一直亮,松手即灭
}
while(!k2); //判断是否松开按键
}
//== 另一种写法 ==//
// if(k2 == 0) //判断按键按下
// {
// Delay_ms(10); //延时消抖
// while(k2 == 0); //再次判断是否按下
// Delay_ms(10); //检测松手
// LED = ~LED; //这种效果是按下不松手不亮,松手即亮
// }
}
/***************************
** 函数名称 :Key_k3_k4
** 函数作用 :当按下k3时,LED小灯向右移位,按下k4时LED小灯向左移位
** 输入 :无
** 输出 :无
** 注意 :这里没有初始化,D8开始没有亮,只是为了方便写函数
****************************/
void Key_k3_k4()
{
if(k3 == 0) //判断k3按键是否按下
{
Delay_ms(10); //消抖
while(k3 == 0); //再次判断是否按下
Delay_ms(10); //消抖
//== 操作 ==//
LedNum++;
if(LedNum >= 8) //限制控制大小
{
LedNum = 0;
}
LED = ~(0x80 >> LedNum); //移位
}
if(k4 == 0)
{
Delay_ms(10); //消抖
while(k4 == 0); //再次判断是否按下
Delay_ms(10); //消抖
//== 操作 ==//
if(LedNum == 0) //限制控制大小
{
LedNum = 7;
}
else
LedNum--;
LED = ~(0x80 >> LedNum); //移位
}
}
/***************************
** 函数名称 :Judgement
** 函数作用 :判断哪一个按键成功按下
** 输入 :P3
** 输出 :无
****************************/
int Judgement()
{
if(k1 == 0)
{
i = 1;
}
if(k2 == 0)
{
i = 2;
}
if(k3 == 0 || k4 == 0)
{
i = 3;
}
return i;
}
/***************************
** 函数名称 :main
** 函数作用 :主函数
** 输入 :
** 输出 :
****************************/
void main()
{
while(1)
{
i = Judgement();
switch(i)
{
case 1:
Key_k1();
break;
case 2:
Key_k2();
break;
case 3:
Key_k3_k4();
break;
default:
LED == 0x00;
break;
}
}
}
三、按键实验视频
独立按键控制LED灯视频
总结
以上就是独立按键的简单介绍与应用。
本文含有隐藏内容,请 开通VIP 后查看