OpenEdv-开源电子网

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

请大神指点

[复制链接]

20

主题

67

帖子

0

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2016-12-1
在线时间
65 小时
发表于 2017-3-6 16:27:26 | 显示全部楼层 |阅读模式
2金钱
在外部中断按键,怎么去实现wk_up键控制key0,key1键
如,wk_up不按,key0,key1执行功能1

wk_up按下,key0key1执行功能2


(最好有一段程序)

谢谢指点





最佳答案

查看完整内容[请看2#楼]

延迟10毫秒是为了防抖么?不能在中断里这么写的。 再说没必要一个按键对应一个中断吧?可以考虑在while(1)里不断循环判断引脚电平,弄个计数器判断是不是大于100。类似的操作实现防抖。非要用中断的话,里面除了清标志和+1其它什么都不要干。简单写段代码,就是写个大概意思,具体里面写法和时间长度你自搞。 uint8 key_get_press_status(uint16_t GPIO_Pin) { uint8 value; value = GPIO_ReadInputDataBit(GPIOA,GPIO_Pi ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2017-3-6 16:27:27 | 显示全部楼层
本帖最后由 yuzeyuan1 于 2017-3-7 13:42 编辑
kifea 发表于 2017-3-6 18:22
这是我自己写的一段代码,没有达到效果,应该细节有问题

static  u8 wk_up_bz=0;   //wk_up检测按下标 ...

延迟10毫秒是为了防抖么?不能在中断里这么写的。
再说没必要一个按键对应一个中断吧?可以考虑在while(1)里不断循环判断引脚电平,弄个计数器判断是不是大于100。类似的操作实现防抖。非要用中断的话,里面除了清标志和+1其它什么都不要干。简单写段代码,就是写个大概意思,具体里面写法和时间长度你自搞。
uint8 key_get_press_status(uint16_t GPIO_Pin)
{
        uint8 value;
        value = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin);
        return value;
}

void key_scan(void)
{
        uint8 key = 0xff;
        for(i=0; i<6; i++) //有六个按键
        {
                if(key_get_press_status(g_pad_gpio) == 0)
                {
                        key = i;
                        break;
                }
        }
        if(key < 6)  //说明有按键按下
        {
                // 按键按下处理
                if(last_key_code != key)  //这块的last_key_code你自己加逻辑,大概意思是判断上一次按键按下是不是相同的按键
                {
                        dith_times = 0;
                        last_key_code = key;
                }
                dith_times++;       
                if(dith_times == 100)
                {
                        rt_kprintf("防抖时间够了\r\n");
                }       
        }
        else //说明按键松开了,清一些标志或是执行什么操作。
        {
                rt_kprintf("这里做些清标志等操作\r\n");
        }
}

while(1)
{
        key_scan();
        rt_thread_delay(1);
}

自在随心
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2017-3-6 17:06:36 | 显示全部楼层
兄弟,逻辑你自己都写出来了,还有搞不出来的代码么。
无非就几种状态,全不按,按一个,按两个,按三个。
自在随心
回复

使用道具 举报

20

主题

67

帖子

0

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2016-12-1
在线时间
65 小时
 楼主| 发表于 2017-3-6 17:13:06 | 显示全部楼层
这是我自己写的一段代码,没有达到效果,应该细节有问题

static  u8 wk_up_bz=0;   //wk_up检测按下标志

u8 EXTI0_IRQHandler()
{

  delay_ms(10);    //&#207;&#251;&#182;&#182;
        if(WK_UP==1)
        {         
                wk_up_bz=!wk_up_bz;    //è&#161;·′
          EXTI_ClearITPendingBit(EXTI_Line0);  //&#199;&#229;3yEXTI0&#207;&#223;&#194;·1ò&#198;e&#206;&#187;
                return         wk_up_bz;
        }
}
void EXTI9_5_IRQHandler(void)
{                        
        delay_ms(10);        //&#207;&#251;&#182;&#182;

        if(KEY0==0)
        {
                if(wk_up_bz==1)
                {
                        a++;
                        if(a==24)
                        a=0;
               
                }
                else
                {                        LED0=!LED0;
                        b++;
                        if(b==60)
                                {
                                        a++;
                                        b=0;
                                        if(a==24)
                                        a=0;
                                                                        
                                }
                        LED0=!LED0;                        
                }
        }
                LCD_ShowxNum(140,100,c,2,24,0);//&#207;&#212;ê&#190;&#195;&#235;
                LCD_ShowxNum(104,100,b,2,24,0);//&#207;&#212;ê&#190;·&#214;
                LCD_ShowxNum(70,100,a,2,24,0);//&#207;&#212;ê&#190;ê±                                       
          EXTI_ClearITPendingBit(EXTI_Line5);    //&#199;&#229;3yLINE5é&#207;μ&#196;&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;  
                                                
}

void EXTI15_10_IRQHandler(void)
{
        delay_ms(10);        //&#207;&#251;&#182;&#182;

        if(KEY1==0)
         {
                        if(wk_up_bz==1)
                        {
                                a--;
                                if(a==24)
                                        a=0;
                        
                        }
                else
                {
                        LED1=!LED1;        
                        b--;
                        if(b==60)
                                {
                                        a--;
                                        b=0;
                                        if(a==24)
                                        a=0;
                                                                        
                                }
                        LED1=!LED1;                        
                }
        }
          LCD_ShowxNum(140,100,c,2,24,0);//&#207;&#212;ê&#190;&#195;&#235;
                LCD_ShowxNum(104,100,b,2,24,0);//&#207;&#212;ê&#190;·&#214;
                LCD_ShowxNum(70,100,a,2,24,0);//&#207;&#212;ê&#190;ê±        
               
               
                EXTI_ClearITPendingBit(EXTI_Line15);  //&#199;&#229;3yLINE15&#207;&#223;&#194;·1ò&#198;e&#206;&#187;
                                
}
回复

使用道具 举报

20

主题

67

帖子

0

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2016-12-1
在线时间
65 小时
 楼主| 发表于 2017-3-6 18:22:22 | 显示全部楼层
yuzeyuan1 发表于 2017-3-6 17:06
兄弟,逻辑你自己都写出来了,还有搞不出来的代码么。
无非就几种状态,全不按,按一个,按两个,按三个。

这是我自己写的一段代码,没有达到效果,应该细节有问题

static  u8 wk_up_bz=0;   //wk_up检测按下标志

u8 EXTI0_IRQHandler()
{

  delay_ms(10);    //&#207;&#251;&#182;&#182;
        if(WK_UP==1)
        {         
                wk_up_bz=!wk_up_bz;    //è&#161;·′
          EXTI_ClearITPendingBit(EXTI_Line0);  //&#199;&#229;3yEXTI0&#207;&#223;&#194;·1ò&#198;e&#206;&#187;
                return         wk_up_bz;
        }
}
void EXTI9_5_IRQHandler(void)
{                        
        delay_ms(10);        //&#207;&#251;&#182;&#182;

        if(KEY0==0)
        {
                if(wk_up_bz==1)
                {
                        a++;
                        if(a==24)
                        a=0;
               
                }
                else
                {                        LED0=!LED0;
                        b++;
                        if(b==60)
                                {
                                        a++;
                                        b=0;
                                        if(a==24)
                                        a=0;
                                                                        
                                }
                        LED0=!LED0;                        
                }
        }
                LCD_ShowxNum(140,100,c,2,24,0);//&#207;&#212;ê&#190;&#195;&#235;
                LCD_ShowxNum(104,100,b,2,24,0);//&#207;&#212;ê&#190;·&#214;
                LCD_ShowxNum(70,100,a,2,24,0);//&#207;&#212;ê&#190;ê±                                       
          EXTI_ClearITPendingBit(EXTI_Line5);    //&#199;&#229;3yLINE5é&#207;μ&#196;&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;  
                                                
}

void EXTI15_10_IRQHandler(void)
{
        delay_ms(10);        //&#207;&#251;&#182;&#182;

        if(KEY1==0)
         {
                        if(wk_up_bz==1)
                        {
                                a--;
                                if(a==24)
                                        a=0;
                        
                        }
                else
                {
                        LED1=!LED1;        
                        b--;
                        if(b==60)
                                {
                                        a--;
                                        b=0;
                                        if(a==24)
                                        a=0;
                                                                        
                                }
                        LED1=!LED1;                        
                }
        }
          LCD_ShowxNum(140,100,c,2,24,0);//&#207;&#212;ê&#190;&#195;&#235;
                LCD_ShowxNum(104,100,b,2,24,0);//&#207;&#212;ê&#190;·&#214;
                LCD_ShowxNum(70,100,a,2,24,0);//&#207;&#212;ê&#190;ê±        
               
               
                EXTI_ClearITPendingBit(EXTI_Line15);  //&#199;&#229;3yLINE15&#207;&#223;&#194;·1ò&#198;e&#206;&#187;
                                
}
回复

使用道具 举报

3

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2013-12-24
在线时间
28 小时
发表于 2017-3-7 10:46:06 | 显示全部楼层
这代码,是何等的握草……中断时间那么宝贵,你在里面延时10ms!!!!!!!!!还在里面写lcd!!!!!
回复

使用道具 举报

13

主题

186

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2016-6-30
在线时间
97 小时
发表于 2017-3-7 10:48:49 | 显示全部楼层
弄个状态机 想清楚每步的状态就木问题的啦
回复

使用道具 举报

20

主题

67

帖子

0

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2016-12-1
在线时间
65 小时
 楼主| 发表于 2017-3-7 18:49:02 | 显示全部楼层
yuzeyuan1 发表于 2017-3-6 16:27
延迟10毫秒是为了防抖么?不能在中断里这么写的。
再说没必要一个按键对应一个中断吧?可以考虑在while( ...

好的,谢谢指点
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 17:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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