原创 一类单片机基于事件的键盘处理程序

2008-11-8 09:08 8126 7 8 分类: MCU/ 嵌入式

     前言:大家知道,我们在单片机的键盘处理程序中,经常使用延时操作.目的当然是为了去除抖动.延时去抖的效果是可靠而且简单的.但是,对于经常的键盘操作,延时操作就会降低系统的实时性.而且,关键的是,延时算法对于处理组合键就显得不那么得心应手了.


    今天我们一起交流的就是这个"基于事件处理"的键盘处理程序.


    "基于事件"这个想法是从VB程序中得到的.简单的说,VB程序的工作机制是:程序检测用户操作,检测到用户行为后,发出相应的消息给系统.但是到底对不对这个消息进行处理,则是由另外的消息处理程序进行.移植到我们这个单片机上,就是:单片机检测到了用户的行为,置相关的标志位(发出消息),但是到底对不对这个标志位进行理睬,则是由相应的处理函数决定的.


    下面我们就看一看c语言的例子:


 


//申请一个存储按键状态的结构体   


struct Keyboard


  {


        unsigned char S1_DOWN;     //标志位,标志S1按键被按下


        unsigned int S1_Count;           //S1按键用来去抖的计数器


       unsigned char S2_DOWN;    //标志位,标志S2按键被按下


      unsigned int S2_Count;          //S2按键用来去抖的计数器 


     unsigned char Others_Down; //用来标志是否有除自身以外的其他按键按下


 };


        在下面的主程序中,我们示意一下这种按键处理怎么做,以及它的优缺点:


#define S1     P0^0        //定义S1为P0^0


#define S2     p0^1        //定义S1为P0^1


void main()


{


   for(;;)


  {


//******************   消息产生   **************************************


         if(S1= =0)   //如果有S1按下


        {


                 Keyboard.S1_Count++;      //开始去抖计数


                 if(Keyboard.S1_Count>150)  //这个值是自己系统的情况需要改变.


                {


                            Keyboard.S1_DOWN=YES;   //产生消息


                }


               if(S2_DOWN= = 0)  //如果S2也按下


              {


                          Keyboard.Others_DOWN=YES;


              }


        }


        else


         {


               Keyboard.S1_DOWN=NO;


               Keyboard.S1_Count=0;


               Keyboard.Others_DOWN=NO;


         }


   }  //The End Of If


//*********************  消息处理  **************************************


if(Keyboard.S1_DOWN= =YES&&Keyboard.Others_DOWN= =NO)  //Only S1 down


{


     //your code here


}


else if(Keyboard.S1_DOWN= =YES&&Keyboard.Others_DOWN= =YES) //组合键


{


     if(Keyboard.S2_DOWN= =YES)  //这是S1和S2都按下的情况.


    {


            //your code here


    }


}


}


        从上面来看,主程序是在一直循环的,可以方便的处理组合键的情况.在多个项目中使用都没有发现问题.


        程序有写复杂,但是条理清晰.

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

Cybershu 2009-3-14 15:54

mark
相关推荐阅读
用户767405 2014-06-17 08:42
自制喷漆机器人【涂覆机】【图】
  市场上的涂覆机设备 因为最近有涂覆三防漆的需求,而市场上现成的涂覆设备比较昂贵,可能需要十几万到几十万。我初步想,应该...
用户767405 2012-05-05 15:03
多功能触摸屏红外线遥控器
    图1 ...
用户767405 2011-08-06 19:28
温度PID系统整定过程
   在两年多以前,我写了一篇关于如何整定PID的小文章,收到不少的朋友给我发E-mail,讨论关于PID参数整定的问题。今天刚好有一个小小的项目,需要整定PID参数,我们再用原来的方法,来做一遍,看...
用户767405 2011-06-20 08:44
光伏供电系统配置软件
光伏系统计算软件,适合太阳能路灯等系统: 点击这里去下载...
用户767405 2010-11-09 09:32
【原创软件】16进制-10进制批量转换工具
张彦欣单片1.电子工程师经常需要使用串口获得现场的一些数据用于分析.而一般的串口助手软件获得的数据都是16进制的,这不利于直观的分析或是绘制图形.张彦欣单片机在这种情况下写了这个进制转换工具.2.数据...
用户767405 2010-11-09 09:19
【原创软件】描点绘图软件
    在工程应用中,我们经常需要将上位机采集到的结果绘制出图形来,这就需要一个数据绘图软件。而当前工程师手中很少有这样的合适软件。为此,张彦欣单片机写了一个较简单实用的描点绘图软件。而且,这个软件是...
EE直播间
更多
我要评论
1
7
关闭 站长推荐上一条 /3 下一条