前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Proteus】按键的实现『⒉种』

【Proteus】按键的实现『⒉种』

作者头像
謓泽
发布2024-07-06 08:24:27
670
发布2024-07-06 08:24:27
举报
文章被收录于专栏:【C】系列【C】系列

介绍原理

按键实际上分为很多种种类,但是我们常用的种类有:④引脚的独立按键、⑥脚的话就有自锁开关像单片机下载的就是自锁的。等...... 那么我们单片机上用的基本都是轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。

独立按键具有四个"头",独立按键主要有四个部分:1、底座,2、金属弹片(这个金属弹片是鼓起来的,当你按下去的时候它会变平,松手的时候又会鼓起来的),3、就是按键的头,4、就是金属的盖子。那么在相同的两个引脚当中其实它就是内部连接起来的金属片,无论你按不按下去,它前后的两个引脚都是连接起来的。就是始终都是具有导通性质的,向外具有两个接触的点。按下的时候四个引脚全部都是连接的,松手的时候两边分别连接,之间是断开的。 按键原理 结构:通过一个上拉电阻连接到单片机上的IO口上,再通过一个按键进行接地。那么当我们没有按下的时候相当于断开就为高电平。当我们按下的时候由于接地(Gnd),此时为低电平相当于闭合。因此我们在单片机上的轻触按键是低电平有效的。 这里的上拉电阻主要确保初始电压为高电平以及起到一个对电路保护作用防止短路。

按键消抖

  • 对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。
  • 在按键闭合的时候会产生一些抖动,没有按键按下的话它就是一个高电平(1)(单片机上电的时候所有的IO口默认都是高电平)。在我们按下按键的时候它就会变成(0),并且由于它的是机械触电会弹开,然后上下抖动几下,然后才会稳定的变成(0)。抖动的时间上面图中也表示的是(5~10)ms。当抖动消失的时候进入了一个稳定的低电平(0),这个持续时间是看你手什么时候松开这个按键。在松手的时候也会产生抖动,它也不会突然变成高电平(1),也会抖动产生时间为(5~10)ms。最后,松手。

按键的消抖有两种方法如下↓ 加个线,把这个线通过这些电路里面进行一些触发器等等,通过一些电路来进行操作,把这个抖动进行一些过冲,然后再给我们单片机进行点上。比较麻烦!

  • 通过软件来进行一个延迟函数,把这个消抖进行操作。

键盘的分类

独立式键盘

键盘的分类分为两种:独立式键盘和行列键盘。

独立式键盘特点⇢每个键占用一根并口线,键位多的时候占用并口线多。用于建位较少的情况下,处理简单直接判并口线。 行列式对于按键较多的情况下使用起来具有优势。

Proteus 按键仿真

概述→用独立按键控制数码管上的显示,每次按下一次按键数码管就自增+1数字。

用的到元器件仿真如下↓

  • AT89C51
  • 数码管:7seg,注:⑧位数码管。在Proteus在下端的线是共阴的,在上端共阳的。
  • GROUND:接地。
  • RES:电阻。
  • BUTTON:轻触按键。
  • 上述上拉电阻钳位高电平以及起到一个保护的作用。

题目→用独立按键控制数码管上的显示,每次按下一次按键数码管就自增+1数字。

程序文件如下↓
代码语言:javascript
复制
#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键的键盘,而直接用端口线则只能多出一键(⑨键) 由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

Proteus 矩阵仿真

概述→用独立按键控制数码管上的显示,每次按下一次按键数码管就自增+1数字。

用的到元器件仿真如下↓

  • AT89C51
  • 数码管:7seg,注:在Proteus在下端的线是共阴的,在上端共阳的。
  • GROUND:接地。
  • BUTTON:轻触按键。

注:进行逐行扫描的话,开发板是会出现问题的。说明一下这个开发板!不是这个矩阵键盘和知识点的一个问题。这是它内部电路的连接问题按行扫描的话这个P15口的话可能会一会给高电平或者低电平。(会连接到五线四相步进电机然后BZ连接到蜂鸣器上,因为我们这个蜂鸣器它是无源蜂鸣器,所以当你按行扫描的时候它有可能就会发出声音)

所以,我们通常会采取逐列扫描。当上述L0被置为低电平,L1、L2、L3全部为高电平的话,那么就相当于只有L0的那一列可以被扫描,如果我们把H0置为低电平的话,H1、H2、H3为高电平的话。此时我们的第一个按键就被按下了。同理。

如果对这块不了解的话可以看博主写的那个单片机系列的内容。

题目→使用矩阵键盘上的第一个按键控制数码管1~9显示上电默认为0,已逐列扫描的形式。

程序文件如下↓
代码语言:javascript
复制
#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();
	}
}

程序经过上述是可以实现的(●'◡'●)

当然这里只是最基本的操作,只要我们知道它的原理就能实现复杂的操作了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 键盘的分类
  • 独立式键盘
    • Proteus 按键仿真
      • 程序文件如下↓
      • 行列按键 - 矩阵按键
        • Proteus 矩阵仿真
          • 程序文件如下↓
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档