打印
[AVR单片机]

求 AVR M16 的独立按键 C语言源码

[复制链接]
1304|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
good_ty|  楼主 | 2012-8-18 15:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
M16 PD 口 PD0~PD7 接8个独立按键,
要求是要按键要放手后,键值才有效,及要检测长按及短按,如长按 1秒才有效。
本人是 C 的新手,在网上也找到类似的源码,个都是按下时,键值就有效。
找不到放手才有效的例子。
请高手指点一下。
感激不尽!

相关帖子

沙发
dqyubsh| | 2012-8-18 23:08 | 只看该作者
状态机的例子看过吗,中间套上定时器,实现这个应该不难。我做的就是放手才有效。

使用特权

评论回复
板凳
good_ty|  楼主 | 2012-8-20 15:23 | 只看该作者
因我对C 不是那么熟,你有没有C 源码来参考一下?

使用特权

评论回复
地板
begin920| | 2012-9-8 18:37 | 只看该作者
//key_value 新按键值
//old_key_value 旧按键值
//key_cnt   按键计数
switch(key_value)
   {
     case key_off:    //无键按下
    {
       if(key_value != old_key_value)
        {
         switch(old_key_value)
         {
          case key_power:   
            {
           break;
          }
          ;
          ;
          ;
          ;
        }
       old_key_value=key_value;
       key_cnt=0;
      }
     break;
    }
     case key_power:    //电源设置键按下
      {
     if(key_value != old_key_value)
      {
       old_key_value=key_value;
       key_cnt=0;
      }
     break;
    }
  }

使用特权

评论回复
5
joyme| | 2012-9-10 11:39 | 只看该作者
KEYPARA                keyPress;

void                init_key(void)
{
        keyPress.index = 0xff;
        keyPress.status = KEY_IDLE;
        keyPress.presstime = 0;
        keyPress.isLongPress = 0;
}

void                KeyScan(void)                                     //execute every 32ms
{
        BYTE        i;
        if(keyPress.status == KEY_RELEASED)
        {
                 if(keyPress.presstime >= KEY_SHORT)
                {
                         if(keyPress.presstime <= KEY_LONG)
                                keyPress.isLongPress = 0;
                        else
                                keyPress.isLongPress = 1;
                               
                        if(keyPress.index != 0xff)
                                Key_Process();
                }
                init_key();
                return ;
        }
       
        if((keyPress.status == KEY_PRESSED)&&(keyPress.index != 0xff))
        {
                       
                if(GET_KEY_LEVEL(keyPress.index) == KEY_PRESS_LEVEL)         
                {
                         keyPress.presstime++;
                        if(keyPress.presstime > MAX_TIME_CNT)
                                keyPress.presstime = MAX_TIME_CNT;
                }
                else
                         keyPress.status = KEY_RELEASED;
                       
                return ;
        }
       
        for(i=0;i<KEY_NUM;i++)
        {
                if(GET_KEY_LEVEL(i) == KEY_PRESS_LEVEL)
                {
                         keyPress.index = i;
                        keyPress.status = KEY_PRESSED;
                        keyPress.presstime = 0;
                        break;
                }
        }

}

使用特权

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

本版积分规则

0

主题

4

帖子

0

粉丝