目录
一、独立按键的介绍
1.按键介绍
2.按键原理图
3.按键抖动
4.按键的消抖
二、独立按键控制LED指示灯亮灭
三、按键实验视频
总结
一、独立按键的介绍
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—255typedef 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;}elseLedNum--;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灯视频
总结
以上就是独立按键的简单介绍与应用。