打印

简单按键程序的实现方法

[复制链接]
2242|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在一些需要按键比较少的场合,不需要设计复杂的键盘,只要有几个按键,同时系统功能比较简单,51单片机可以实现正确识别即可。此时就可以采取最简单的一个端口外接一个按键的方法,实现所需功能。
电路图

按下某个按键时,被按键的**总会有轻微抖动,这种拉动会持续10ms左右,因此,CPU在按键抖动期间扫描键盘必然会得到错误的按键位置信号,消除按键抖动通常用的硬件消抖一般采用双稳态消抖电路

程序如下
;简单按键键盘子程序
KEY:  MOV  P0 ,#0FFH                 ;预读P0口的准备
        MOV  P1 ,#0FFH                 ;关闭LED灯
MOV  A , P0                    ;读P0口的值
MOV  R2 ,A                     ;保存P0口的值到P2
LCALL   DELAY20MS             ;延时消除抖动
MOV  P0 ,#0FFH                 
MOV  A, P1                     ;再读P0口的值
CJNE  A, R2,KEY               ;与上次保存的值比较
CJNE  A ,#01H,KEY2            ;判断是否键1
LJMP  PKEY1                      ;是键1,转到键1服务程序
KEY2: CJNE  A ,#02H,KEY3            ;判断是否键2
        LJMP  PKEY2                       是键2,转到键2服务程序
KEY3: CJNE  A ,#03H,KEY4            ;以下说明类似
        LJMP  PKEY3
KEY4: CJNE  A ,#04H,KEY5
        LJMP  PKEY4
KEY5: CJNE  A ,#05H,KEY6
        LJMP  PKEY5
KEY6: CJNE  A ,#06H,KEY7
        LJMP  PKEY6
KEY7: CJNE  A ,#07H,KEY8
        LJMP  PKEY7
KEY8: CJNE  A ,#08H,RETURN            ;如果都不是,则重新读健值
        LJMP  PKEY8
RETURN:LJMPKEYEND                           
PKEY1:MOV  P1 ,#0FFH                    ;键1的服务程序
        CLR   P1.0                           ;P1.0口接的LED灯亮
        LCALL  DELAY1S
LJMP   RETURN
PKEY2:MOV  P1 ,#0FFH                    ;以下子程序类似
        CLR   P1.1
        LCALL  DELAY1S
LJMP   RETURN
PKEY3:MOV  P1 ,#0FFH
        CLR   P1.2
        LCALL  DELAY1S
LJMP   RETURN
PKEY4:MOV  P1 ,#0FFH
        CLR   P1.3
        LCALL  DELAY1S
LJMP   RETURN
PKEY5:MOV  P1 ,#0FFH
        CLR   P1.4
        LCALL  DELAY1S
LJMP   RETURN
PKEY6:MOV  P1 ,#0FFH
        CLR   P1.5
        LCALL  DELAY1S
LJMP   RETURN
PKEY7:MOV  P1 ,#0FFH
        CLR   P1.6
        LCALL  DELAY1S
LJMP   RETURN
PKEY8:MOV  P1 ,#0FFH
        CLR   P1.7
        LCALL  DELAY1S
LJMP   RETURN
KEYEND: RET                                   
DELAY20MS:MOV  R7 ,100                      ;延时20MS
MOV  R6 ,100                         ;100*(100*2+1+2)微妙
DELAY01:DJNZ  R6,DELAY01
           MOV  R6,100
           DJNZ  R7,DELAY01
RET
DELAY1S:MOV  R5 ,50                           ;延时1S
           LCALL  DELAY20MS
           DJNZ  R5, DELAY1S
           RET

相关帖子

沙发
tianm| | 2012-4-5 11:41 | 只看该作者
这种方法占用IO比较多

使用特权

评论回复
板凳
tianli1980| | 2012-4-5 21:39 | 只看该作者
独立式按键的简单键盘的识别程序比较简单,因而在按键数目比较少,单片机功能要求简单的应用场合可以采用。

使用特权

评论回复
地板
shenmu2012| | 2012-4-6 16:34 | 只看该作者
楼主的介绍对于我这样的初学者很实用的啊,不过整不住你这汇编语言啊,要是能整个C的程序更是感激不尽了啊。。。

使用特权

评论回复
5
dgun| | 2012-4-6 17:31 | 只看该作者
学习学习

使用特权

评论回复
6
iEye| | 2012-4-6 18:38 | 只看该作者
同一个端口使用定时器,隔10ms检测一下,还很方便做防抖。

使用特权

评论回复
7
huangfeng33|  楼主 | 2012-4-6 20:29 | 只看该作者
4# shenmu2012
C语言程序如下
//**简单按键键盘子程序**
void  main( )
{ uchar   keycode ;
P1=0xff;                                       //关闭LED
P0=0x00                                       //全0扫描
if ((P0&0x 00)!= 0x00)                           //判断有无键位按下
{
delay20ms();                               //延时去抖动
if ((P0&0x 00)!= 0x00)
keycode=P0;                            //得到按键值
    else
keycode=0xff;
   }
switch(keycode)                                //键位处理函数
      {
      case 0xfe: P1=0xff ;delay20ms( ); P1.0=0 ; delay1s( ) ;break;    //按键1
      case 0xfd: P1=0xff ;delay20ms( ); P1.1=0 ; delay1s( ) ;break;    //按键2
      case 0xfb: P1=0xff ;delay20ms( ); P1.2=0 ; delay1s( ) ;break;    //按键3
      case 0xf8: P1=0xff ;delay20ms( ); P1.3=0 ; delay1s( ) ;break;    //按键4
      case 0xef: P1=0xff ;delay20ms( ); P1.4=0 ; delay1s( ) ;break;    //按键5
      case 0xdf: P1=0xff ;delay20ms( ); P1.5=0 ; delay1s( ) ;break;    //按键6
  case 0xbf: P1=0xff ;delay20ms( ); P1.6=0 ; delay1s( ) ;break;    //按键7
      case 0x8f: P1=0xff ;delay20ms( ); P1.7=0 ; delay1s( ) ;break;    //按键8
      default:                   break;
      }
}
void  delay20ms(void)                        ;延时20ms子程序
{
uchar i,p;
for  (i=100 ; i>0 ; i-- )
   {
for  (p=200 ; p>0 ; p-- );
}
}
void  delay1s(void)                        ;延时1s子程序
{
uchar i ;
for  (i=50 ; i>0 ; i-- )
delay20ms( )
}

使用特权

评论回复
8
hanyz123| | 2013-1-7 12:58 | 只看该作者
感谢楼主的C语言 程序

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

506

主题

2446

帖子

8

粉丝