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];
  }
}
相关推荐
GilgameshJSS21 小时前
STM32H743-ARM例程23-USB_HID
arm开发·stm32·嵌入式硬件
日更嵌入式的打工仔1 天前
存储同步管理器SyncManager 归纳
笔记·单片机·嵌入式硬件
社会大青年1 天前
STM32 GPIO-------设置成51单片机模式输出
stm32·嵌入式硬件·51单片机
麻辣长颈鹿Sir1 天前
单片机进入 B. 中断无限循环异常解决方法
单片机·嵌入式硬件·b.中断·异常中断处理·程序无限循环异常处理·芯海spi异常中断·芯海芯片
red watchma1 天前
Xshell->MCU Ymodem协议实现
网络·单片机·嵌入式硬件
XINVRY-FPGA1 天前
XC7A100T-2FGG484I Xilinx Artix-7 FPGA
arm开发·嵌入式硬件·fpga开发·硬件工程·信息与通信·信号处理·fpga
lingzhilab1 天前
零知IDE——基于STM32F407VET6和ESP-01的SHT2X温湿度监测与云传输系统
stm32·单片机·嵌入式硬件
国科安芯1 天前
高辐射环境下AS32S601ZIT2型MCU的抗辐照性能与应用潜力分析
网络·人工智能·单片机·嵌入式硬件·fpga开发
Rousson1 天前
硬件学习笔记--82 连接器的选用原则与流程
笔记·单片机·学习
三佛科技-134163842121 天前
高速风筒方案开发 高速风筒MCU控制方案设计
单片机·嵌入式硬件·智能家居·pcb工艺