原创 8.按键识别方法之一

2008-10-18 15:53 2135 4 4 分类: MCU/ 嵌入式

1. 实验任务<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0P1.3显示出其的二进制计数值。


2. 电路原理图


点击开大图


      在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号域,再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。


3. <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = w ns = "urn:schemas-microsoft-com:office:word" />实现程序


1. 汇编源程序


                                     ORG 0


START:                        MOV R1,#00H                     ;初始化R70,表示从0开始计数


                                     MOV A,R1                                     ;


                                     CPL A                                             ;取反指令


                                     MOV P1,A                                     ;送出P1端口由发光二极管显示


REL:                    JNB P3.7,REL                                ;判断SP1是否按下


                                     LCALL DELAY10MS          ;若按下,则延时10ms左右


                                     JNB P3.7,REL                                ;再判断SP1是否真得按下


                                     INC R7                                           ;若真得按下,则进行按键处理,使


                                     MOV A,R7                                     ;计数内容加1,并送出P1端口由


                                     CPL A                                             ;发光二极管显示


                                     MOV P1,A                                     ;


                                     JNB P3.7,$                                     ;等待SP1释放


                                     SJMP REL                                      ;继续对K1按键扫描


DELAY10MS:    MOV R6,#20                                  ;延时10ms子程序


L1:                                MOV R7,#248


                                     DJNZ R7,$


                                     DJNZ R6,L1


                                     RET


                                     END


 


 


 


 


2. C语言源程序


#include <AT89X51.H>


 


unsigned char count;


 


void delay10ms(void)


{


  unsigned char i,j;


  for(i=20;i>0;i--)


  for(j=248;j>0;j--);


}


 


void main(void)


{


  while(1)


    {


      if(P3_7==0)


        {


          delay10ms();            //延时10ms判断按键是否真的被按下


          if(P3_7==0)


            {


              count++;


              if(count==16)


                {


                  count=0;


                }


              P1=~count;


              while(P3_7==0);   //循环等待按键弹起


            }


        }


    }


}


点击看大图


 

 

4、总结


    学习基本的按键按下和弹起的判别方法


 

 

 

 

 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /4 下一条