4072|3

126

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

转帖:一类单片机基于事件的键盘处理程序 [复制链接]

转帖king_of_wind的一篇文章:
前言:大家知道,我们在单片机的键盘处理程序中,经常使用延时操作.目的当然是为了去除抖动.延时去抖的效果是可靠而且简单的.但是,对于经常的键盘操作,延时操作就会降低系统的实时性.而且,关键的是,延时算法对于处理组合键就显得不那么得心应手了.
    今天我们一起交流的就是这个"基于事件处理"的键盘处理程序.
    "基于事件"这个想法是从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
    }
}
}
        从上面来看,主程序是在一直循环的,可以方便的处理组合键的情况.在多个项目中使用都没有发现问题.
        程序有写复杂,但是条理清晰.
此帖出自单片机论坛

最新回复

感谢楼主分享你的资料!!!!!!  详情 回复 发表于 2009-6-19 09:40
点赞 关注(1)
 

回复
举报

126

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
请教这个程序结构可以正常运行吗?
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


这部分一直在循环,外面的程序得不到运行,是这样吗?
此帖出自单片机论坛
 
 

回复

126

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
没有人用这种方法吗?????:L
此帖出自单片机论坛
 
 
 

回复

416

帖子

0

TA的资源

纯净的硅(高级)

4
 
感谢楼主分享你的资料!!!!!!
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表