[AVR单片机] 求 AVR M16 的独立按键 C语言源码

[复制链接]
 楼主| 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;
    }
  }
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

粉丝
快速回复 在线客服 返回列表 返回顶部