介绍原理
按键实际上分为很多种种类,但是我们常用的种类有:④引脚的独立按键、⑥脚的话就有自锁开关像单片机下载的就是自锁的。等...... 那么我们单片机上用的基本都是轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。
独立按键具有四个"头",独立按键主要有四个部分:1、底座,2、金属弹片(这个金属弹片是鼓起来的,当你按下去的时候它会变平,松手的时候又会鼓起来的),3、就是按键的头,4、就是金属的盖子。那么在相同的两个引脚当中其实它就是内部连接起来的金属片,无论你按不按下去,它前后的两个引脚都是连接起来的。就是始终都是具有导通性质的,向外具有两个接触的点。按下的时候四个引脚全部都是连接的,松手的时候两边分别连接,之间是断开的。 按键原理 结构:通过一个上拉电阻连接到单片机上的IO口上,再通过一个按键进行接地。那么当我们没有按下的时候相当于断开就为高电平。当我们按下的时候由于接地(Gnd),此时为低电平相当于闭合。因此我们在单片机上的轻触按键是低电平有效的。 这里的上拉电阻主要确保初始电压为高电平以及起到一个对电路保护作用防止短路。
按键消抖
按键的消抖有两种方法如下↓ 加个线,把这个线通过这些电路里面进行一些触发器等等,通过一些电路来进行操作,把这个抖动进行一些过冲,然后再给我们单片机进行点上。比较麻烦!
键盘的分类分为两种:独立式键盘和行列键盘。
独立式键盘特点⇢每个键占用一根并口线,键位多的时候占用并口线多。用于建位较少的情况下,处理简单直接判并口线。 行列式对于按键较多的情况下使用起来具有优势。
概述→用独立按键控制数码管上的显示,每次按下一次按键数码管就自增+1数字。
用的到元器件仿真如下↓
题目→用独立按键控制数码管上的显示,每次按下一次按键数码管就自增+1数字。
#include <REGX51.H>
sbit key0 = P1^0;
unsigned int Num;
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
int main(void)
{
while(1)
{
P2 = NixieTable[Num];
if(key0 == 0)
{
Delay(20); //延时消抖
while(key0==0); //松手检测
Delay(20); //延时消抖
Num++;
}
if(Num==10)
{
Num = 0;
}
}
}
程序经过上述是可以实现的(●'◡'●)
特点:键位上分布在行和列交叉点上,占用的并口线少,键位越多越明显。 介绍如下↓ 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。 采用逐行或逐列的"扫描",就可以读出任何位置按键的状态。 结构:在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(⑨键) 由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
概述→用独立按键控制数码管上的显示,每次按下一次按键数码管就自增+1数字。
用的到元器件仿真如下↓
注:进行逐行扫描的话,开发板是会出现问题的。说明一下这个开发板!不是这个矩阵键盘和知识点的一个问题。这是它内部电路的连接问题按行扫描的话这个P15口的话可能会一会给高电平或者低电平。(会连接到五线四相步进电机然后BZ连接到蜂鸣器上,因为我们这个蜂鸣器它是无源蜂鸣器,所以当你按行扫描的时候它有可能就会发出声音)
所以,我们通常会采取逐列扫描。当上述L0被置为低电平,L1、L2、L3全部为高电平的话,那么就相当于只有L0的那一列可以被扫描,如果我们把H0置为低电平的话,H1、H2、H3为高电平的话。此时我们的第一个按键就被按下了。同理。
如果对这块不了解的话可以看博主写的那个单片机系列的内容。
题目→使用矩阵键盘上的第一个按键控制数码管1~9显示上电默认为0,已逐列扫描的形式。
#include <REGX51.H>
sbit H1 = P1^4;
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned int Num = 0;
void detect()
{
//检测P1口的按键是否被按下
P1 = 0xFE;
if(H1 == 0)
{
Delay(20);
while(H1==0);
Delay(20);
P2 = NixieTable[Num+1];
Num++;
if(Num == 10)
{
Num = 0;
}
P2 = NixieTable[Num];
}
}
int main(void)
{
//刚开始上电默认为0数码管
P2 = NixieTable[Num];
while(1)
{
//检测
detect();
}
}
程序经过上述是可以实现的(●'◡'●)
当然这里只是最基本的操作,只要我们知道它的原理就能实现复杂的操作了。