51单片机独立按键

简介: 51单片机独立按键

前言

本篇文章将带大家学习独立按键按键的基本操作。


独立按键式直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。


一、按键原理图

板子上面一共有4个独立按键,分别接到了P30-P33。

通过原理图可以知道当按键按下时P30-P33都接到了GND,电平为低电平,当按键没有按下时电平为高电平。

image.png

二、代码编写

这里我们需要对按键进行消抖,因为当按键按下时会发生抖动,当按键发生抖动的时候去读取按键值这个时候读出的按键值是不准确的。

在这里我们可以延时10ms等按键电平稳定的时候再去读取按键的值,这样就可以得到比较稳定的按键值了。

当按键按下时引脚的电平会发生如下图一样的抖动,所以需要等待一段时间再去读取电平数值。

image.png

#include <reg52.h>
//定义独立按键控制脚
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
unsigned char key_val = 0;
/*延时函数
单位:ms
x:延时的数值
*/
void delayms(unsigned int x)
{
   unsigned char i;
   while(x--)
   {
     for(i=0;i<113;i++);
   }
}
unsigned char key_scan(void)
{
  if(KEY1 == 0)
  {
    delayms(10);//延时消抖
    if(KEY1 == 0)
    {
      return 0;//代表按键1按下
    }
    while(KEY1 == 0);//等待按键松开
  }
  else if(KEY2 == 0)
  {
    delayms(10);//延时消抖
    if(KEY2 == 0)
    {
      return 0;//代表按键2按下
    }
    while(KEY2 == 0);//等待按键松开
  }
  else if(KEY3 == 0)
  {
    delayms(10);//延时消抖
    if(KEY3 == 0)
    {
      return 0;//代表按键3按下
    }
    while(KEY3 == 0);//等待按键松开
  }
  else if(KEY4 == 0)
  {
    delayms(10);//延时消抖
    if(KEY4 == 0)
    {
      return 0;//代表按键4按下
    }
    while(KEY4 == 0);//等待按键松开
  }
}
void main(void)
{
  while(1)
  {
    key_val = key_scan();//读取按键值
  }
}

三、模块化管理按键

什么叫模块化编程?我的理解就是每一个模块都分别写成对应的.c和.h文件,有的人可能会问道为什么要这样写呢?这样写不是增加文件数量吗?其实模块化编程主要的好处就是代码看起来更加整洁,不会显得凌乱,而且方便移植。

这里我们创建一个key.c和key.h文件将按键代码模块化管理起来,方便我们以后的调用。

以后需要使用到按键这个模块的时候将.c和.h文件添加进入我们的工程即可。


key.c


image.png

unsigned char key_val = 0;
unsigned char key_scan(void)
{
  if(KEY1 == 0)
  {
    delayms(10);//延时消抖
    if(KEY1 == 0)
    {
      return 0;//代表按键1按下
    }
    while(KEY1 == 0);//等待按键松开
  }
  else if(KEY2 == 0)
  {
    delayms(10);//延时消抖
    if(KEY2 == 0)
    {
      return 0;//代表按键2按下
    }
    while(KEY2 == 0);//等待按键松开
  }
  else if(KEY3 == 0)
  {
    delayms(10);//延时消抖
    if(KEY3 == 0)
    {
      return 0;//代表按键3按下
    }
    while(KEY3 == 0);//等待按键松开
  }
  else if(KEY4 == 0)
  {
    delayms(10);//延时消抖
    if(KEY4 == 0)
    {
      return 0;//代表按键4按下
    }
    while(KEY4 == 0);//等待按键松开
  }
}

key.h

下面的这些宏的作用就是防止头文件的重复包含。

#ifndef __KEY_H
#define __KEY_H
//定义独立按键控制脚
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
unsigned char key_scan(void);
#endif

总结

独立按键的操作还是很简单的,主要就是要主要按键的延时消抖处理。

这里再给大家提一点:延时函数在项目开发中最好就是少使用。延时函数的大量使用会造成系统的卡顿。大家可以想一下可以使用什么方法对按键进行消抖处理。

相关文章
【单片机】按键声光报警实验(蜂鸣器)
【单片机】按键声光报警实验(蜂鸣器)
462 0
定时器+按键控制LED流水灯模式+定时器时钟——“51单片机”
定时器+按键控制LED流水灯模式+定时器时钟——“51单片机”
|
2月前
|
C语言
独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”
独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”
|
11月前
单片机按键的使用
单片机按键的使用
142 0
|
2月前
|
缓存 编译器 索引
单片机中按键检测函数详细分析经典
单片机中按键检测函数详细分析经典
118 0
|
11月前
|
C语言
51单片机按键
学习按键处理
98 0
51单片机按键
|
11月前
【单片机期中测试】7.按键调光
【单片机期中测试】7.按键调光
44 0
|
11月前
【单片机期中测试】4.按键不同时长控制流水灯
【单片机期中测试】4.按键不同时长控制流水灯
47 0
|
11月前
【单片机期中测试】3.按键控制流水灯循环
【单片机期中测试】3.按键控制流水灯循环
135 0
|
11月前
【单片机期中测试】2.独立按键控制LED移位
【单片机期中测试】2.独立按键控制LED移位
90 0