第六讲 独立按键

按键是什么东西,我想这个就不必由我向各位阐述了。嗯,如你所见,按键种类繁多,功能有简有繁,极大的充斥着我们的生活。但是无论如何,所有的按键其实都有一个原型,来源于同一种原理,所有的按键无论多复杂,多华丽,都是从这样一个原型发展而成的。好比你就算长的再帅,你也是只猩猩变来的,呵呵。我们平日所见到的绝大部分的按键,其实都可以归类为一种,叫“接触式按键”。下图为一个典型的接触式按键(又称轻触开关)。

需要特别说明的是,这里说的“接触”,是指机械层面上的接触,而不是感光或者某些特殊涂层(比如触摸屏)一类的接触。所以,按键的工作特性其实是一种机械特性,下文会详细说明。

如上图,请对照图一想象,1、2、3、4 分别对应按键的四个引脚,其中蓝色的线表示按键未被按下之时的状态,我成为初始状态,它是不导通的;而绿色的线是却永久导通的。各位明白了么,其实是两个相同的结构连在一起了。我们只要将需要按键开关作用的线路分别接在1、3 和2、4 的任意取一组合,概括起来就是(1,2)、(1,4)、(3,2)、(3,4)四种组合,都可以起到我们预期的开关作用。

相信以上说明使大家对按键的工作原理有了个比较清晰的认识了,现在来说说一个小知识。先看下图(图4):

首先说明的是,上图的连法是不允许的,因为当按键按下之后,电源和地短接,会将导线直接烧毁。但是此处用作特例,假设导线不会烧毁。现在来提出一个问题,当按键按下以后,请问如果这时用万用表测量导线上任何一处的电压,得到的结果是VCC 还是GND 的电压?

答案是:GND,即表示测出的电压为0V。为什么呢,因为导线上,对于两端的电平是一种类似于程序语言逻辑运算里面的“与”,即对于导线两端:有零即为零,只有全为一是才为一。理解了这点,按键的工作前提就有了。

键盘分为编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。而靠软件编程来识别的键盘称为非编码键盘,在单片机组成的各种系统中,用的较多的是非编码键盘。非编码键盘又分为独立键盘和行列式键盘(常说的矩阵键盘)。在这一讲中我们介绍一下单片机中键盘使用。

单片机的IO口既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能,我们把按键的一端接地,另一端与单片机的某个I/O口相连,开始时先给该IO口赋一高电平,然后让单片机不断地检测该I/O口是杏变为低电平,当按键闭合时,即相当于该I/O口通过按键与地相连,变成低电平,程序一旦检测到I/O口变为低电平则说明按键被按下,然后执行相应的指令。

我们先来说一下,按键常常遇到的问题—抖动问题。

还以图四为例,按键未按下之前,图四按键左端的导线因为连在VCC 上而显示高电平,右端显示低电平,按键按下后,按键闭合,整个导线都显示低电平,然后按键松开,又回到按键按下之前的点评状态。如果只考察按键左端的电平变化,应该是上图中所显示的一个负脉冲波形。但是,实际上,正确的波形应该是下图。相比于上图,大家都看到了在高低电平直接有一段锯齿一样的波形,这就是所谓的按键抖动。

为什么会有按键抖动呢,原因很简单,接触式按键是靠机械的接触来实现开关作用的。这种接触方式就注定了它要经历一个“接触不稳定——正在稳定中——彻底稳定”的一种过程。就好比你用手抓紧一颗石头,即使你一开始就很用力的握紧,也不可能马上就达到最紧的状态,也要经历一个从握住到最紧握的过程。那么在这个过程里,接触式按键就处于一种徘徊在“闭合”与“断开”两者之间的状态。体现在电路中,就是在一小段时间内有非常多的“按下——抬起”动作。而这段抖动的时间,大概是10~20 毫秒,依不同的环境条件而定。

解决这个问题常见的方法有软件去抖动和硬件去抖动。

我们解释一下抖动:关于按键去抖动的解释,我们在手动按键的时候,由于机械抖动或是其它一些非人为的因素很有可能会造成误识别,一般手动按下一次键然后接着释放,按键两片金属膜接触的时间大约为50ms 左右,在按下瞬间到稳定的时间为5-10ms,在松开的瞬间到稳定的时间也为5-10ms,如果我们再首次检测到键被按下后延时10ms 左右再去检测,这时如果是干扰信号将不会被检测到,如果确实是有键被按下,则可确认,以上为按键识别去抖动的原理。

独立按键:

我们先将一下独立按键的使用方法,开发板独立按键电路图如下:

独立按键一共5个,分别连接在单片机的P3.0到P3.4口。去抖动的方式,我们采用软件延时的方法。过程如下:

  1. 先设置IO口为高电平(一般上电默认就为高)
  2. 读取IO口电平确认是否有按键按下
  3. 如有IO电平为低电平后,延时几个ms
  4. 再读取该IO电平,如果任然为低电平,说明对应按键按下
  5. 执行相应按键的程序

/**************************************************************************

* 实验名              : 独立按键实验

* 使用的IO       : LED使用P2,键盘使用P3.0、P3.1、P3.2、P3.3

* 实验效果       : 按下K1键,灭掉LED,按下K2键,打开所有的LED,按下K3键,LED左移一位,按下K4键,LED右移一位。

*   注意                   :由于P3.2口跟红外线共用,所以做按键实验时为了不让红外线影响实验

*效果,最好把红外线先取下来。

**************************************************************************/

#include<reg51.h>

#include<intrins.h>

#define GPIO_LED P2

sbit K1=P3^0;

sbit K2=P3^1;

sbit K3=P3^2;

sbit K4=P3^3;

void Delay10ms( );   //延时10ms

/**************************************************************************

* 函数名         : main

* 函数功能         : 主函数

* 输入           : 无

* 输出          : 无

**************************************************************************/

void main(void)

{

unsigned int i,j;

while(1)

{

if(K1==0)       //检测按键K1是否按下

{

Delay10ms();    //消除抖动

if(K1==0) //再次检测按键是否按下

j=0;

while((i<50)&&(K1==0)) //检测按键松手检测,如果不松手超过延时也会自动结束等待

{

Delay10ms();

i++;

}

i=0;

}

if(K2==0)          //检测按键K2是否按下

{

Delay10ms();

if(K2==0)

j=0xff;

while((i<50)&&(K2==0))

{

Delay10ms();

i++;

}

i=0;

}

if(K3==0)              //检测按键K3是否按下

{

Delay10ms();

if(K3==0)

{

if((j==0)||(j==0xff))      //如果当前状态是全亮的或者全灭的,就点亮他的第一盏灯

{

j=0xfe;

}

else

j=_crol_(j,1);         //左移一位

}

while((i<50)&&(K3==0))

{

Delay10ms();

i++;

}

i=0;

}

if(K4==0)                  //检测按键K4是否按下

{

Delay10ms();

if(K4==0)

{

if((j==0)||(j==0xff))

{

j=0xfe;

}

else

j=_cror_(j,1);     //右移一位

}

while((i<50)&&(K4==0))

{

Delay10ms();

i++;

}

i=0;

}

GPIO_LED=j;

}

}

/*************************************************************************

* 函数名         : Delay10ms

* 函数功能         : 延时函数,延时10ms

* 输入           : 无

* 输出          : 无

**************************************************************************/

void Delay10ms(void)   //误差 0us

{

unsigned char a,b,c;

for(c=1;c>0;c--)

for(b=38;b>0;b--)

for(a=130;a>0;a--);

}

下载独立按键控制led灯.hex,观察实验结果。

实验效果是:按下K1键,灭掉LED,按下K2键,打开所有的LED,按下K3键,LED左移一位,按下K4键,LED右移一

普中单片机 独立按键word文档20180923相关推荐

  1. 如何在富文本中插入表情,word文档,及数学公式?

    前言 互联网寒冬一直在持续,不知道大家过的还好吗?不过话说回来,技术过硬,你在哪里都是最靓的仔.今天就给大家补充一点弹药,如何在富文本中插入表情,word文档,及数学公式. 为什么是 TinyMCE ...

  2. Word处理控件Aspose.Words功能演示:在 Python 中比较两个 Word 文档

    在各种情况下执行 Word 文档的比较以确定差异.各种在线工具允许您比较 Word 文档,但是,您可能需要在应用程序中实现比较功能.为实现它,本文展示了如何在 Python 中比较两个 Word 文档 ...

  3. 假想面试题:现在有一串字符串2, 2, 3……,其中字符串中的数字类似于Word文档中的标题级别,最终效果是让它们按照Word文档导航窗格中的标题级别格式进行展示

    目录 一.问题 二.答案 1.依赖 2.代码 3.结果 4.思路分析 三.拓展 1.反向思维 2.引用数据类型 四.实战 1.背景 2.实战模拟 2.1.代码 2.2.结果 一.问题 现在有一串字符串 ...

  4. C#中5步完成word文档打印的方法

    在日常工作中,我们可能常常需要打印各种文件资料,比如word文档.对于编程员,应用程序中文档的打印是一项非常重要的功能,也一直是一个非常复杂的工作.特别是提到Web打印,这的确会很棘手.一般如果要想选 ...

  5. Java Web项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob.Apache POI.Java2Word.iText等各种方式,其实在从Office 2003开始,就 ...

  6. Java项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob.Apache POI.Java2Word.iText等各种方式,其实在从Office 2003开始,就 ...

  7. 在IE浏览器中如何直接显示word文档

    //开始读取           if(myRead.Read()   ==   true)           {             Byte[]   Buffer   =   (Byte[] ...

  8. Word的样式库在 选项卡中_如何使用word文档?word文档使用技巧教程?

    Word文档使用方法与教程: 使用正确的部分和章节标题 我们在前面的章节中介绍了预设样式,但是这些样式可用于快速创建章节,子标题和标题页.在"主页"功能区选项卡中找到样式,可以在其 ...

  9. 如何在Python中将数据插入到Word模板中生成一份Word文档

    在一些的项目开发中,会有一些生成Word文件的操作,比如将获取到的一些数据添加到Word模板当中的相应的位置生成一份Word文档. 由于最近的Python项目当中需要将一些从服务器查出的数据添加到Wo ...

最新文章

  1. php的一些基本概念梳理
  2. 大家都来说说为什么要学习jQuery Mboile?
  3. Playmaker Input篇教程之PlayMaker菜单概述
  4. python简单代码input-Python简单程序的练习
  5. css sprite技巧详解
  6. 苹果公司推出新款iMac产品
  7. webstorm+nodejs+JetBrains IDE Support+chrome打造前端开发神器
  8. IDEA中debug
  9. oracle密码文件认证,Oracle OS认证与口令文件认证详解
  10. 洲明科技与意法半导体合作开发新一代LED显示屏
  11. I00006 打印等腰三角形字符图案(底边在下)
  12. mysql seconds_behind_master_MySQL同步状态双Yes的假象及seconds_behind_master的含义
  13. JavaSE知识点:finalize,treeMap
  14. React躬行记(8)——样式
  15. 关于冒泡、快排、二分排序算法分析
  16. 安卓原生系统_安卓原生系统为什么比MIUI和EMUI等国产系统更流畅
  17. SAP BAPI_EXCHANGERATE_GETDETAIL计算货币转换汇率
  18. 史上最全!数据分析进阶教程,看这一篇就够了!
  19. 密码算法测试向量——目录
  20. 安卓开发常用icon/png图样

热门文章

  1. android给view的overlay添加bitmap
  2. Python打开shp文件报错:Set SHAPE_RESTORE_SHX config option to YES to restore or create it.
  3. CISA笔记之一:前言
  4. 微信支付提示:当前交易存在被骗风险,为保障你的资金安全,暂时无法完成支付。请谨防刷单兼职、先支付后返利、色情服务等网络骗局。
  5. 做wish需要会PHP吗,Wish用户下单后会发生什么?
  6. 数据库框架Sugar的使用
  7. 自动驾驶之无人驾驶车辆与模型预测控制
  8. spyder使用虚拟环境_spyder如何快速稳定的安装使用?
  9. 三菱FX3U六轴标准程序,程序包含本体3轴控制,扩展3个1PG定位模块,一共六轴
  10. oracle 次幂函数,excel幂函数-Excel如何进行乘幂运算,开方运算,比如9的6次幂,10000开4次方...