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

单片机-独立按键矩阵按键实验

1、按键介绍 

按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态, 如果按键按下,初始导通状态变为断开,初始断开状态变为导通 

我们开发板是采用软件消抖,一般来说一个简单的按键消抖就是先读取按键的状态,如果得到按键按下之后,延时 10ms,再次读取按键的状态,如果按键还是按下状态,那么说明按键已经按下。其中延时10ms 就是软件消抖处理

2、独立按键 

K1连在P3^1管脚,     K2——P3^0,       K3——P3^2,        K4——P3^3

需求:通过开发板上的独立按键 K1 控制 D1 指示灯亮灭 

#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
void delay_10us(u16 ten_us){
    while(ten_us--);
}
sbit LED1=P2^0;    //控制D1指示灯
sbit LED2=P2^1;   //控制D2指示灯
sbit LED3=P2^2;   //控制D3指示灯
sbit LED4=P2^3;   //控制D4指示灯
//使用宏定义的方法控制独立按键的键值
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
//没有任何按键被按下
#define KEY_UNPRESS 0

//定义按键对应的管脚口
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;

//封装函数实现按键返回一个键值
//定义一个只能传递0或1的模式model
//0单次扫描,1连续扫描
u8 key_scan(u8 model){
    //打一个标志
    static u8 key=1;  //static 静态变量
    if(model==1){
    key=1;
    }

    if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0)){
        //消抖处理,使用延迟操作 5ms~10ms
        delay_10us(1000);
        key=0;
        //如果按键仍是按下状态,说明信号稳定
        if(KEY1==0){
            return KEY1_PRESS;
        }
        else if(KEY2==0){
            return KEY2_PRESS;
        }
        else if(KEY3==0){
            return KEY3_PRESS;
        }
        else if(KEY4==0){
            return KEY4_PRESS;
        }
}
    else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1){//没有按键被按下
        key=1;
        return KEY_UNPRESS;
    }
}

void main(){
    u8 value=0;
    while(1){
        value=key_scan(0);
        if(value==KEY1_PRESS){
            LED1=!LED1;
            //delay_10us(50000);    //加一下延时可以验证,单次扫描和连续扫描的情况
        }
        else if(value==KEY2_PRESS){
            LED2=!LED2;
        }
        else if(value==KEY3_PRESS){
            LED3=!LED3;
        }
        else if(value==KEY4_PRESS){
            LED4=!LED4;
        }
    }
}

3、矩阵按键 

矩阵键盘两端都与单片机 I/O 口相连,因此在检测时需编程通过单片机 I/O 口送出低电平。

4*4 矩阵键盘的工作原理和检测方法。开发板上将 16 个按键排成 4 行 4 列,第一行将每个按键的一端连接在一起构成行线,第一列将每个按键的另一端连接在一起构成列线,这样便一共有 4 行 4 列共 8 根线,我们将这 8 根线连接到单片机的 8 个 I/O 口上,通过程序扫描键盘就可检测 16 个键。

单片机 I/O 口送出低电平检测方法有多种,最常用的是行列扫描法线翻转法

(1)行列扫描法检测时,先送一列为低电平,其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行哪一列的

(2)线翻转法,就是使所有行线为低电平时,检测所有列线是否有低电平,如果有,就记录列线值;然后再翻转,使所有列线都为低电平,检测所有行线的值,由于有按键按下,行线的值也会有变化,记录行线的值。从而就可以检测到全部按键

 

3.1行列扫描法

 

3.2线翻转法


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

相关文章:

  • IDE和IDEA详解和具体差异
  • 现代前端框架
  • 微信小程序Uniapp
  • 云架构Web端的工业MES系统设计之区分工业过程
  • Go语言的 的垃圾回收(Garbage Collection)基础知识
  • JVM学习:CMS和G1收集器浅析
  • [Qt] 输入控件 | Line | Text | Combo | Spin | Date | Dial | Slider
  • python基于diagrams库绘制系统架构图
  • 基于Redis有序集合实现滑动窗口限流
  • 【C#特性整理】C#特性及语法基础
  • C# 找出给定三角形的所有角度(Find all angles of a given triangle)
  • 银行系统安全用电解决方案
  • Day29:continue 语句
  • 什么是.net framework,什么是.net core,什么是.net5~8,版本对应关系
  • linux 系统配置ip
  • Linux 内核中网络接口的创建与管理
  • win11 vs2022 opencv 4.10使用vs Image Watch插件实时可视化内存mat对象
  • 洛谷P5318 【深基18.例3】查找文献(c嘎嘎)
  • 常见的框架漏洞
  • 【OceanBase】使用 Superset 连接 OceanBase 数据库并进行数据可视化分析
  • vuedraggable 选项介绍
  • SSM-SpringMVC
  • 基于 Python Django 的花卉商城系统的研究与实现
  • 文档 | Rstudio下的轻量级单页面markdown阅读器 markdownReader
  • 【Nginx】Nginx代理模式相关概念解释及Nginx安装
  • 【Linux系列】Vim 编辑器中的高效文本编辑技巧:删除操作