2911|5

3184

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

按键的问题 [复制链接]

INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
{

    KeyCurrent=((GPIO_ReadInputData(GPIOB)&0xc0)>>6);


   if(KeyCurrent!=KeyOld)  //如果两次值不等,说明按键情况发生了改变
    {
     KeyNoChangedTime=0;       //按键按下情况为0
     KeyOld=KeyCurrent;        //保存当前按键情况
     //return;  //·μ??
    }
   else
    {
     KeyNoChangedTime++;             //按下时间累计
     if(KeyNoChangedTime>=1)         //如果按下时间足够
      {
       KeyNoChangedTime=1;
       KeyPress=KeyOld;      //保存按键
       KeyDown|=(~KeyLast)&(KeyPress); //求出新按下的键
       KeyUp|=KeyLast&(~KeyPress);     //求出新释放的键
       KeyLast=KeyPress;                     //保存当前按键情况
      }
    }
    Key();
   TIM2_ClearITPendingBit(TIM2_IT_UPDATE);
}


我用STM8S207C8T6写程序,开发环境IAR,用定时器中断检测按键。
可是按键反应很迟钝。请高手帮忙看看,谢谢!



更多操作


此帖出自stm32/stm8论坛

最新回复

学习了  详情 回复 发表于 2018-2-24 13:36
点赞 关注
个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
 

回复
举报

3471

帖子

11

TA的资源

五彩晶圆(高级)

沙发
 
你看看这个中断里有没有延时类的动作。中断里。尽量减少处理的内容。把最重要的部分执行了。减少中断函数运行时间。
可是按键反应很迟钝。实际情况如何。怎么就迟钝了。描述具体现象。
此帖出自stm32/stm8论坛

点评

没有延时类的动作。现在好了。  详情 回复 发表于 2018-2-7 12:55
 
 

回复

3184

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
ienglgge 发表于 2018-2-7 12:30
你看看这个中断里有没有延时类的动作。中断里。尽量减少处理的内容。把最重要的部分执行了。减少中断函数运 ...

没有延时类的动作。现在好了。
此帖出自stm32/stm8论坛
 
个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
 

回复

63

帖子

0

TA的资源

一粒金砂(中级)

4
 
定时读取按键最简单,即可消除抖动,也提高了效率
此帖出自stm32/stm8论坛
 
 
 

回复

525

帖子

235

TA的资源

版主

5
 
贴一段自己写过的按键检测代码,14个独立按键,思路可供参考。
处理思路为:
中断函数:读取当前按键状态->识别按键状态(例如需要识别按下、抬起、长短按键等)->迭代按键状态
KEY_InFIFO()是缓存函数,可以解决按键状态丢失的情况。

  1. void Key_Detect(void)
  2. {
  3.         uint8_t i;
  4.         Key_Status[0].key_cur_value=KBI1_IO_DATA;       
  5.         Key_Status[1].key_cur_value=KBI2_IO_DATA;
  6.         Key_Status[2].key_cur_value=KBI3_IO_DATA;
  7.         Key_Status[3].key_cur_value=KBI4_IO_DATA;
  8.         Key_Status[4].key_cur_value=KBI5_IO_DATA;
  9.         Key_Status[5].key_cur_value=KBI6_IO_DATA;
  10.         Key_Status[6].key_cur_value=KBI7_IO_DATA;
  11.         Key_Status[7].key_cur_value=KBI8_IO_DATA;
  12.         Key_Status[8].key_cur_value=KBI9_IO_DATA;
  13.         Key_Status[9].key_cur_value=KBI10_IO_DATA;
  14.         Key_Status[10].key_cur_value=KBI11_IO_DATA;
  15.         Key_Status[11].key_cur_value=KBI12_IO_DATA;
  16.         Key_Status[12].key_cur_value=KBI13_IO_DATA;
  17.         Key_Status[13].key_cur_value=KBI14_IO_DATA;
  18.         Key_Status[14].key_cur_value=KBI15_IO_DATA;       
  19.        
  20.         for(i=0;i<KEYNUM;i++)       
  21.         {
  22.                 if((Key_Status[i].key_pre_value==1)&&(Key_Status[i].key_cur_value==0))        //--------高->低 按下
  23.                 {               
  24.                         if((i!=12)&&(i!=5))                                                                //fall edge key pressed                KEY12
  25.                         {
  26.                                 Key_InFIFO(&KEY_BUFF,(i+1));
  27.                         }       
  28.                         //此处添加代码,用来检测需要达到规定时长的按键
  29.                         Key_Status[i].KEY_status=1;//按下       
  30.                         Key_Status[i].key_pres_time=0;                               
  31.                                                        
  32.                 }
  33.                 else if((Key_Status[i].key_pre_value==0)&&(Key_Status[i].key_cur_value==1))        //--------低->高 松开
  34.                 {
  35.                         Key_Status[i].KEY_status=0;//松开
  36. //                        if(((i==12)||(i==5))&&(Key_Status[i].key_pres_time>=50))                //fall edge key pressed       
  37. //                        {
  38. //                                Key_InFIFO(&KEY_BUFF,(i+1));
  39. //                        }       
  40.                         if((i==6)||(i==7)||(i==8)||(i==9)||(i==10)||(i==11))//  k7 k8 k9 k10 k11 k12 long pressed        key       
  41.                         {
  42.                                         Key_InFIFO(&KEY_BUFF,(0x10+(i+1)));//识别按键是否抬起       
  43.                         }
  44.                 }               
  45.                 else if((Key_Status[i].KEY_status!=0)&&(Key_Status[i].key_pre_value==0)&&(Key_Status[i].key_cur_value==0))        //--------低->高 松开
  46.                 {
  47.                         if(((i==12)||(i==5))&&(Key_Status[i].key_pres_time>=50))                //fall edge key pressed       
  48.                         {
  49.                                 Key_Status[i].KEY_status=0;//表示抬起
  50.                                 Key_InFIFO(&KEY_BUFF,(i+1));
  51.                         }       
  52.                 }
  53.                 //长按功能暂时未使用
  54.                 if(Key_Status[i].KEY_status==1)
  55.                 {
  56.                         Key_Status[i].key_pres_time++;
  57.                         if((Key_Status[i].key_pres_time>50)&&(Key_Status[i].key_pres_time%10==0))
  58.                         {
  59.                                 if((i==6)||(i==7)||(i==8)||(i==9)||(i==10)||(i==11))//  k7 k8 k9 k10 k11 k12 long pressed        key       
  60.                                 {
  61.                                         Key_InFIFO(&KEY_BUFF,(LONG+(i+1)));//长按识别按键
  62.                                 }       
  63.                         }
  64.                 }                       
  65.         }
  66.        
  67.         Key_Status[0].key_pre_value=Key_Status[0].key_cur_value;
  68.         Key_Status[1].key_pre_value=Key_Status[1].key_cur_value;
  69.         Key_Status[2].key_pre_value=Key_Status[2].key_cur_value;
  70.         Key_Status[3].key_pre_value=Key_Status[3].key_cur_value;
  71.         Key_Status[4].key_pre_value=Key_Status[4].key_cur_value;
  72.         Key_Status[5].key_pre_value=Key_Status[5].key_cur_value;
  73.         Key_Status[6].key_pre_value=Key_Status[6].key_cur_value;
  74.         Key_Status[7].key_pre_value=Key_Status[7].key_cur_value;
  75.         Key_Status[8].key_pre_value=Key_Status[8].key_cur_value;
  76.         Key_Status[9].key_pre_value=Key_Status[9].key_cur_value;
  77.         Key_Status[10].key_pre_value=Key_Status[10].key_cur_value;
  78.         Key_Status[11].key_pre_value=Key_Status[11].key_cur_value;
  79.         Key_Status[12].key_pre_value=Key_Status[12].key_cur_value;
  80.         Key_Status[13].key_pre_value=Key_Status[13].key_cur_value;
  81.         Key_Status[14].key_pre_value=Key_Status[14].key_cur_value;       
  82. }
复制代码
此帖出自stm32/stm8论坛
 
个人签名爱电子,爱生活
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
学习了
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

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-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表