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];
  }
}
相关推荐
LCG米1 天前
STM32硬件CRC外设实测:多项式固定陷阱、CRC-32校验不匹配根因与软件查表法耗时对比落地
stm32·单片机·嵌入式硬件
La Pulga1 天前
【FreeRTOS源码学习笔记】任务切换
单片机·mcu·学习·嵌入式·freertos·实时操作系统
女神下凡1 天前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
硅基手札1 天前
【Linux 内核专栏 19】20 · 嵌入式子系统 — GPIO·pinctrl·clock·regulator
linux·运维·单片机·linux内核·嵌入式开发·调试定位
何粥学1 天前
Vivado 2024.2 开发记录(AC820 Zynq-7020)——软件使用,点亮led灯
单片机·嵌入式硬件·zynq
Sakura_j_h_1 天前
51 单片机驱动四位数码管:动态扫描、限流电阻与消影的取舍
单片机·嵌入式硬件·51单片机·嵌入式·数码管·动态扫描·限流电阻
HANDY092001 天前
从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架
开发语言·人工智能·嵌入式硬件·智能家居
飞凌嵌入式2 天前
千次静电放电试炼,守住飞凌嵌入式硬件可靠底线
嵌入式硬件
蹊黎2 天前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
无敌贵点大王2 天前
从寄存器层面重学STM32(6)——串口USART实战部分
stm32·单片机·嵌入式硬件