51单片机-按键

1、独立按键

1.1、按键介绍

轻触开关是一种电子开关,使用时,轻轻按开关按钮就可使开关接通,当松开手时,开关断开。

1.2、独立按键原理

按键在闭合和断开时,触点会存在抖动现象。P2\P3\P1都是准双向IO口,内部都有上拉电阻。P0口是漏极开路,没有上拉,只有外部加一个上拉,才能对高低电平进行控制。

在硬件和软件上进行消抖处理

1)硬件消抖电路(成本高):

通过RC的充放电延迟时间,利用**施密特触发器(74HC132)**可以整理波形成为方方正正的波形。

2)软件消抖

通过延迟来解决。

1.3、编写独立按键控制程序

cpp 复制代码
#include "reg52.h"

typedef unsigned char u8;
typedef unsigned int u16;

sbit led = P2^0;
sbit k1=P3^1; // 开关接口

void delay(u16 i) //10us
{
  while(i--);
}

void keypros()
{
   if(k1==0)
   {
     //消抖处理
     delay(1000); //10ms
     if(k1==0){
        led=~led;
     }
     while(!k1); //再次按下
   }
}

void main()
{
  while(1)
  {
     keypros();
  }
}

2、矩阵按键

2.1、矩阵按键的由来

将独立按键每一个按键的管脚连接起来,形成一根线。矩阵键盘用最少的IO口控制电路。

矩阵按键扫描的原理:

  • 逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
  • 行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,就这样能够确定是哪一个按键按下了。

2.2、矩阵按键扫描原理

cpp 复制代码
#include "reg52.h"
#include <intrins.h>
 
typedef unsigned char u8;
typedef unsigned int u16;
//定义38译码器 
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
 
#define GPIO_KEY P1
#define GPIO_DIG P0

u8 keyValue;

// 发生字码:code关键词,保持变量到flash里面,如果没有code保持在data里面
u8 code  smgduan[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


void delay(u16 i)
{
   while(i--);
}
void keyDown()
{
   u8 a;
   GPIO_KEY=0X0f;
   if(GPIO_KEY!=0X0F){  // 判断是否按键按下
        delay(1000); //延迟消抖
        if(GPIO_KEY!=0X0F){
            GPIO_KEY=0X0F;
            swith(GPIO_KEY)
             {
                 case(0x07): keyValue=0; break; //S1 根据按下的按键进行判断
                 case(0x0b): keyValue=1; break; //S2
                 case(0x0d): keyValue=2; break; //S3 
                 case(0x0e): keyValue=3; break; //S4
             }
            GPIO_KEY=0XF0;
            swith(GPIO_KEY)
             {
                 case(0x70): keyValue=keyValue; break; //S1 根据按下的按键进行判断
                 case(0xb0): keyValue=keyValue+4; break; //S2
                 case(0xd0): keyValue=keyValue+8; break; //S3 
                 case(0xe0): keyValue=keyValue+12; break; //S4
             }
             // 判断按键是否松开,GPIO_KEY检测行按键已经松开,a<50用于判断是否一直按着
             while((a<50)&&(GPIO_KEY!=0xf0))
             { 
                   delay(10000);
                   a++;
             }
        }
   }

}


void main()
{
  //选择数码管
  LSA=0;
  LSB=0;
  LSC=0;
  while(1)
  {
     keyDown();
     GPIO_DIG=smgduan[keyValue];
  }
}
相关推荐
LCMICRO-133108477461 小时前
长芯微LPS123完全P2P替代ADP123,高性能、低压差的线性稳压器
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·线性稳压器
守护安静星空3 小时前
esp32开发笔记-工程搭建
笔记·单片机·嵌入式硬件·物联网·visual studio code
ACP广源盛139246256733 小时前
破局 Type‑C 切换器痛点@ACP#GSV6155+LH3828/GSV2221+LH3828 黄金方案
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
时空自由民.4 小时前
ST7701S 3.5寸显示屏
单片机
金戈鐡馬5 小时前
BetaFlight中的定时器引脚绑定详解
stm32·单片机·嵌入式硬件·无人机
智者知已应修善业5 小时前
【51单片机单按键切换广告屏】2023-5-17
c++·经验分享·笔记·算法·51单片机
Wave8456 小时前
FreeRTOS软件定时器详解
stm32·单片机·freertos
VBsemi-专注于MOSFET研发定制6 小时前
奶茶制作机器人功率MOSFET选型方案——高效、精准与可靠驱动系统设计指南
单片机·嵌入式硬件
水云桐程序员8 小时前
单片机项目从入门到精通
单片机·嵌入式硬件
Wave8458 小时前
STM32 裸机中断与 FreeRTOS 中断管理的四大核心差异
单片机·嵌入式硬件