赞
踩
轻触按键,相当于一种电子开关,按下使开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通断开。
K1、K2、K3、K4一公共端接GND,另一端分别接单片机I/O口的P3^0到P3^3,因为单片机4组I/O口P0—P3都是高电平有效,当按键按下时,将I/O口拉到低电平使按键有效。
对于机械开关,当机械触电断开闭合时,由于机械触电的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动,单片机会检测出来。
当没有按键按下时,电平为高电平,按下时,为0(由于机械触电,会弹逐渐稳定为0),机械开关抖动时间为5—10ms(不同开关时间不同),经过手松开的时间,若松开按键,经过5—10ms时间会逐渐回高电平。
(1)硬件消抖
加一个电路,把电线通过电路,经过触发器之类的操作进行电路过滤。
(2)软件消抖
检测按键按下时,延时时间,再继续操作,松手也同样道理。
当按下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灯视频
以上就是独立按键的简单介绍与应用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。