您的位置 首页 测评

单片机学习之十:查询方法按键

一、实验现象最右面的数码管初始显示0,每次按下外部按键K1执行加一,计数到九时重新回零。二、实验目的掌握读取外部按键时候应该注意的事项,掌握查询方式响应按键的方法掌

  一、试验现象

  最右面的数码管初始显现0,每次按下外部按键K1履行加一,计数到九时从头回零。

  二、试验意图

  把握读取外部按键时分应该留意的事项,把握查询办法呼应按键的办法

  把握读取按键去颤动的办法

  把握判直接寻址位搬运指令jb,jnb的用法。

  三、试验任务分析

  单片机呼应外部按键的办法有两种,一种是查询办法,一种是中止办法。

  查询办法的呼应进程如下:单片机不断的查询是否有按键按下,假如有按键按下的话,就履行相应的程序,不然持续查询。

  中止办法的呼应进程如下:单片机处理自己的作业,假如有按键按下,向单片机宣布中止恳求。单片机停下现在正在处理的作业,转去履行中止程序,履行之后回来持续方才的作业。

  本试验程序咱们选用查询办法完结,下一个试验咱们选用中止办法完结。

  仍是先看看电路图吧,当JMP4跳线拔下的时分,电路图如下图6-1所示。

  (注:假如JMP4跳线插上,则按键和中止树立联络。在本试验中,JMP4跳线能够插也能够不插。因为咱们选用查询办法,没有开中止。详细情况下一个试验介绍。)

  

 

  从图上咱们能够看到,当按键k1按下的时分,对应P1.0输入低电平。因而,咱们要查询k1是否按下,只需检测到p1.0是低电平就能够拉。

  留意,在查询按键是否按下时分,特别需求留意按键的去颤动问题,为什么呢?

  因为按键或许键盘都是使用机械触点的合、断效果。因为机械触点的弹性效果,在闭合和断开的瞬间都会呈现颤动问题。因为这种颤动,使得电压信号在机械触点的闭合、断开瞬间会呈现一系列的脉冲信号,如下图所示。颤动的时刻长短,与开关的机械特性有关,一般为5~10ms。

  按键的安稳闭合期,由操作人员的按键动作确认,一般为十分之几秒至几秒。为了确保按下一次按键,单片机只对按键作一次处理,就必须经曩昔颤动处理。

  

 

  通常去颤动的办法有硬件和软件两种。

  硬件去抖是使用根本RS触发器或许单稳态电路构成,咱们能够参阅相关数电教材。

  软件处理的办法是:在检测到按键按下时,履行一个10ms左右的延时程序后,再次检测该按键是否按下。假如仍然是按下状况,就确以为键真实按下,然后消除了颤动的影响。

  依照这个思路编写的程序如下:

  四、试验程序

  org 0000h

  start: clr p1.5

  mov p0,#48h

  mov p2,#01h ;初始状况最右面的数码管显现0

  main: mov r7,#0ffh

  wait1: jb p1.0,wait1 ;假如P1.0为1,转回wait1持续查询。不然调用延时程序

  lcall del10ms ;调用10ms延时

  jb p1.0,wait1 ;再次查询P1.0,假如是1,表明是颤动,转回wait1

  ljmp play1 ;确认按键按下,转去数码显现程序

  play1: inc r7

  mov a,r7

  mov dptr,#tab

  movc a,@a+dptr ;使用查表指令找欲显现的数字,

  mov p0,a ;把 这个数字送到P0显现

  cjne a,#48h,wait1 ;假如没有显现到最后一个数字,就持续查询按键状况

  ljmp main ;假如显现到最后一个数字就从头开始

  tab: db 0ebh,52h,62h,0e1h,64h,44h,0eah,40h,60h,48h ;寄存欲显现数字的表格

  del10ms:mov r6,#14h ;10ms延时子程序

  del1: mov r5,#0ffh

  del2: djnz r4,del2

  djnz r3,del1

  ret

  end

  把这个程序下载到学习板上,按下k1,发现了什么?

  咱们发现这个程序运转不是很安稳,假如咱们按下的时刻略微长一点,显现的数字就会改换几回。

  这是为什么呢?

  因为数字显现之后,单片时机回来从头查询P1.0的状况,假如按下的时刻很长,就会导致单片机又检测到低电平,所以就持续显现。因而就会呈现过错。

  假如咱们期望按下一次按键,不管时刻长短,单片机只作一次按键处理,应该怎么办呢?

  咱们能够这样作:在数字显现之后,回来从头查询之前,咱们参加一条指令,让单片机检测P1.0是否回到高电平。假如是,就表明按键按下了一次,程序能够回来持续查询,不然等候,一直到P1.0回到高电平。这样就确保了按键按下一次,不管时刻长短,单片机只作一次按键处理。

  详细的做法是在本来的程序中添加如下的赤色句子,改善后的程序如下:

  org 0000h

  start:clr p1.5

  mov p0,#48h

  mov p2,#01h ;初始状况右面数码管显现0

  main: mov r7,#0ffh

  wait1:jb p1.0,wait1 ;按键没有按下,等候

  call del10ms ;调用延时

  jb p1.0,wait1 ;持续查询

  ljmp play1

  play1: inc r7

  mov a,r7

  mov dptr,#tab

  movc a,@a+dptr

  mov p0,a ;查表显现数字

  wait2: jnb p1.0,wait2 ;等候按键弹起

  cjne a,#48h,wait1 ;判别是否显现到最后一个数字

  ljmp main

  ret

  tab: db 0ebh,52h,62h,0e1h,64h,44h,0eah,40h,60h,48h

  del10ms:mov r6,#14h

  del1: mov r5,#0ffh

  del2: djnz r4,del2

  djnz r3,del1

  ret

  end

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/298864.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部