当前位置: 首页 > article >正文

51单片机-按键

1、独立按键

1.1、按键介绍

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

1.2、独立按键原理

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

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

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

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

 

2)软件消抖

 通过延迟来解决。

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

#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、矩阵按键扫描原理

#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];
  }
}

http://www.kler.cn/a/558011.html

相关文章:

  • 紧随“可信数据空间”政策风潮,数造科技正式加入开放数据空间联盟
  • 系统验收文档(验收交付全套资料集)
  • 鸿蒙NEXT开发-学生管理系统小案例
  • 西安电子科技大学计算机科学与技术学院考研复试笔试、机试分数情况
  • Spring MVC 与 Spring Boot:从“手动挡”到“自动驾驶”的进化论,兼谈前后端分离的哲学
  • Linux 文件的三个时间:Access、Modify 和 Change
  • 14.7 LangChain Experimental 模块解析:解锁 Auto-GPT 开发新范式
  • tcpdump 用法示例
  • 动态订阅kafka mq实现(消费者组动态上下线)
  • 在windows10上基于Python部署marker,实现PDF转markdown文件(保姆级)
  • ue5地面上出现preview字样
  • 小程序(物流、快递),接入GPS北斗获取路线以及当前车辆位置
  • 【后端】gitHub访问速度太慢解决办法
  • UE5.3 C++ TArray系列(一)
  • 【Python爬虫(43)】云端探秘:Python分布式爬虫部署攻略
  • Jenkins 自动构建Job
  • 14.5 基于LangChain重构Auto-GPT:新一代自主智能体架构设计实践
  • 当前 Java Web 开发的最新实现方式
  • 【复习】计算机网络
  • Spring Boot Validation 接口校验:从零到掌握