OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2352|回复: 4

按键处理问题

[复制链接]

17

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2016-9-27
在线时间
53 小时
发表于 2016-11-3 18:53:03 | 显示全部楼层 |阅读模式
1金钱
#define Key_Poewr GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY0     ((adc>424)&&(adc<824))
#define KEY1     ((adc>1011)&&(adc<1411))
#define KEY2     ((adc>1645)&&(adc<2045))
#define KEY3     ((adc>2257)&&(adc<2657))
#define KEY4     ((adc>2872)&&(adc<3272))
#define KEY5     ((adc>3523)&&(adc<3923))



//#define Key_Poewr                 //KEY0°′&#207;&#194;
#define Key_Enter        1        //KEY1°′&#207;&#194;
#define Key_Measure        2       
#define Key_Set   3            
#define Key_Return 4
#define Key_Up 5
#define Key_Down 6

uint8_t Get_Key(uint8_t mode);
void gman_key_init(void);




以上为.h文件


****************************************************/
     uint16_t adc = 0;

uint8_t Get_Key(uint8_t mode)
{         
        static u8 key_up=1;//°′&#188;ü°′&#203;é&#191;a±ê&#214;&#190;
        if(mode)key_up=1;  //&#214;§3&#214;á&#172;°′       
        adc=Get_Adc_Average(ADC_Channel_5,10);
       
        if(key_up&&(adc>424&&adc<3923))
        {
                gman_delay_ms(50);//è¥&#182;&#182;&#182;ˉ
                key_up=0;
                if(KEY0)return Key_Enter;
                else if(KEY1)return Key_Measure;
                else if(KEY2)return Key_Set;
                else if(KEY3)return Key_Return;
                else if(KEY4)return Key_Up;
                else if(KEY5)return Key_Down; ;
        }else if(adc<424&&adc>3923)key_up=1;             
        return 0;// &#206;T°′&#188;ü°′&#207;&#194;
}

ad采集到按键值进行判断,为什么按键模式不能使用不连续模式,只能使用连按,不使用连按,按键按下没有反应,这是为什么??

while(1)
        {
                if(Get_Key(1)==Key_Up)
                  {
                        if(ClockNum>120)
                                {
                                   ClockNum=0;
                                }
                            ClockNum+=5;   
                                LCD_ShowNum(90,228,ClockNum/10,2,12,0,WHITE,SAFFRON);
                                LCD_ShowString(106,228,6,12,12, ".",0,WHITE,SAFFRON);
                                LCD_ShowNum(112,228,ClockNum%10,1,12,0,WHITE,SAFFRON);

                       
                       
                 }
                else if(Get_Key(1)==Key_Down)
                  {
                         if(ClockNum<5)
                                 {
                                         ClockNum=125;
                                 }
                                 ClockNum-=5;
                                LCD_ShowNum(90,228,ClockNum/10,2,12,0,WHITE,SAFFRON);
                                LCD_ShowString(106,228,6,12,12, ".",0,WHITE,SAFFRON);
                                LCD_ShowNum(112,228,ClockNum%10,1,12,0,WHITE,SAFFRON);
                       
                       
                  }       

而且使用连按模式,在这个程序中触发的特别快,别的地方都是按一下,数据加1或减1,但是在这个程序中会出现,按一下,数据增加减少的频率特别快,这是什么情况??本来想使用不连续模式,结果该模式不能使用,哪位大神能指点一二???,谢谢了!!!




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2016-9-27
在线时间
53 小时
 楼主| 发表于 2016-11-4 08:35:20 | 显示全部楼层
没有人看到吗?大神帮忙看一下,谢谢
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-11-4 09:02:29 | 显示全部楼层
这样的问题没人回答基本上是大家都不屑一看,因为太基础的问题了!主要原因就是按键程序没处理好,比如:

if(button1 ==true) //按键被按下
{
   Delay_ms(10); //延时消抖
   if(button1 ==true)  //消抖后再次判断按键状态,如果有效说明此时按键是被用户按下
   {
      //处理用户程序
   
     while(button ==true); //用户程序处理结束后判断按键是否还处于有效状态,如果处于有效状态就等待。
   }
   
   Delay_ms(10); //延时消抖,比如按键松开时的抖动
   while(button ==true); //再次判断用户按键有效性,如果无效一次按键程序结束
}
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-11-4 09:08:55 | 显示全部楼层
本帖最后由 shuaigew88 于 2016-11-4 09:11 编辑

如果是定时器中断扫描按键,处理方式如下:

void Key() //定时器中断每10MS调用一次按键扫描
{
   static byte cnt =0;
   
   if(button1 =true) //按键被按下
   {
     cnt ++;
     if(cnt ==2)  //当第二次进入中断后(20ms后)按键依然有效,说明按键不是误触发
     {

        //处理用户程序
     }

    if(cnt >2)cnt =2;  //不要让按键有效计数大于2,否则按键时间太久会被误触发
   }else cnt =0; //如果下次进入中断时按键无效(无效至少有两种可能,1:按键干扰 2:按键抖动),按键有效时间计数清除
}
回复

使用道具 举报

17

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2016-9-27
在线时间
53 小时
 楼主| 发表于 2016-11-4 20:12:31 | 显示全部楼层
shuaigew88 发表于 2016-11-4 09:08
如果是定时器中断扫描按键,处理方式如下:

void Key() //定时器中断每10MS调用一次按键扫描

谢谢了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 22:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表