四脚轻触按键开关的工作原理及接法

2,444 阅读5分钟

四脚轻触按键开关的工作原理及接法

image-20220917201307835

上图为四脚轻触开关的尺寸图和电路图。

根据专家的经验,一般只要是对角就可以直接焊接。

需要注意的是,按下按钮开关的工作原理,按下按钮时接近,即导通松开时,芯片分离,即断开。

事实上,四脚轻触开关与普通按钮开关的工作原理基本相同,由常开触点、常闭触点组合而成。在四脚按钮开关中,常开触点的作用是,当压力向常开触点施加压力时,该电路处于连接状态,取消该压力时,恢复原始常闭触点,即所谓的断开。这种压力是用我们的手打开按钮,关闭按钮的动作。

注:按键开关的工作原理,就是按键按下的时候两个贴片挨近了,也就是导通了;松开的时候,贴片分离,也就是断开了。

轻触四角按键开关,看着感觉挺复杂,其实它的工作原理很简单,在没有人使用它时,四个脚只有两个在一起,当它被按下时四个脚是连接的。以上对轻触四角开关的介绍很详细,感兴趣的朋友可以坐下来细细研究哦

独立键盘与单片机连接时,每一个按键都需要单片机的一个 I/O 口,若某单片机系统需较多按键,如果用独立按键便会占用过多的 I/O 口资源。单片机系统中 I/O 口资源往往比较宝贵,当用到多个按键时为了减少 I/O 口引脚,引入了矩阵键盘。本章以 4*4 矩阵键盘为例讲解其工作原理和检测方法。开发板上将 16 个按键排成 4 行 4 列,第一行将每个按键的一端连接在一起构成行线,第一列将每个按键的另一端连接在一起构成列线,这样便一共有 4 行 4 列共 8 根线,我们将这 8 根线连接到单片机的 8 个 I/O 口上,通过程序扫描键盘就可检测 16 个键。用这种方法我们也可实现 3 行 3 列 9 个键、 5 行 5 列 25 个键、 6 行6 列 36 个键甚至更多。

无论是独立键盘还是矩阵键盘,单片机检测其是否被按下的依据都是一样的,也就是检测与该键对应的 I/O 口是否为低电平。独立键盘有一端固定为低电平,单片机写程序检测时比较方便。而矩阵键盘两端都与单片机 I/O 口相连,因此在检测时需编程通过单片机 I/O 口送出低电平。检测方法有多种,最常用的是行列扫描和线翻转法。

行列扫描法检测时,先送一列为低电平,其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行哪一列的,用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平,这样即可检测完所有的按键,当有键被按下时便可判断出按下的键是哪一个键。当然我们也可以将行线置低电平,扫描列是否有低电平。从而达到整个键盘的检测。

线翻转法,就是使所有行线为低电平时,检测所有列线是否有低电平,如果有,就记录列线值;然后再翻转,使所有列线都为低电平,检测所有行线的值,由于有按键按下,行线的值也会有变化,记录行线的值。从而就可以检测到全部按键。 矩阵键盘也少不了按键消抖的环节,本章实验中采用的是行列扫描法来检测 哪个按键按下。

电路是集成的,4*4 矩阵按键引出的 8 根控制管脚直接连接到 51 单片机的 P1 IO 口上。电路中的 P17 表示矩阵键盘第 1 行,P14 表示矩阵键盘第 1 列.

/*************************************************************************************
​
*
实验现象:下载程序后数码管显示0,按下矩阵按键上的按键显示对应的数字
         
注意事项:                                       
​
                                          
**************************************************************************************
​
*/
#include "reg52.h"           //此文件中定义了单片机的一些特殊功能寄存器
​
typedef unsigned int u16;     //对数据类型进行声明定义
typedef unsigned char u8;
​
#define GPIO_DIG P0
#define GPIO_KEY P1
​
​
u8 KeyValue;    //用来存放读取到的键值//数码管
u8 code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                    0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//显示0~F的值
//
/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
    while(i--); 
}
​
/*******************************************************************************
* 函 数 名         : KeyDown
* 函数功能         : 检测有按键按下并读取键值
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void KeyDown(void)
{
    char a=0;
    GPIO_KEY=0x0f;
    if(GPIO_KEY!=0x0f)//读取按键是否按下
    {
        delay(1000);//延时10ms进行消抖
        if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
        {   
            //测试列
            GPIO_KEY=0X0F;
            switch(GPIO_KEY)
            {
                case(0X07): KeyValue=0;break; //0111
                case(0X0b): KeyValue=1;break; //1011
                case(0X0d): KeyValue=2;break; //1101
                case(0X0e): KeyValue=3;break; //1110
            }
            //测试行
            GPIO_KEY=0XF0;
            switch(GPIO_KEY)
            {
                case(0X70): KeyValue=KeyValue;break;
                case(0Xb0): KeyValue=KeyValue+4;break;
                case(0Xd0): KeyValue=KeyValue+8;break;
                case(0Xe0): KeyValue=KeyValue+12;break;
            }
            
        }
    }
    while((a<50)&&(GPIO_KEY!=0xf0))  //检测按键松手检测
    {
        delay(100);
        a++;
    }
}
​
​
/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   
​
    while(1)
    {   
        KeyDown();         //按键判断函数
        GPIO_DIG=~smgduan[KeyValue];      //
    }       
}