OpenEdv-开源电子网

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

定时器中断消抖 如何实现上升沿触发返回键值

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-9-27
在线时间
1 小时
发表于 2020-12-2 09:05:20 | 显示全部楼层 |阅读模式
1金钱
在识别按键这里,为了不影响主程序的进行,利用定时器实现按键消抖。
外部中断识别按键按下后开启定时器中断,定时器中断中多次识别按键电平判断是否抖动,然后返回键值。
这里按键常态是低电平,按下为高电平,松开后恢复。
外部中断初始化中设定为上升沿触发,但在实际使用中发现,返回键值是在松开按键后,怎么让他在定时器中断结束后就立刻返回键值?

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

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-9-27
在线时间
1 小时
 楼主| 发表于 2020-12-2 09:06:31 | 显示全部楼层
贴上部分程序:

外部中断部分
void EXTI0_IRQHandler(void)
{
        if(TA==1)        //检测按键1是否按下
        {   
                memset(TuchState,0,sizeof(TuchState) );//触摸按键状态数组清空
                tuch_num =1;//通过检测该参量将定时器中断分为不同线路
                Timer3Start();        //开启定时器中断
        }
        EXTI->PR=1<<0;  //清除LINE0上的中断标志位  
}


定时器中断部分
//定时器3中断服务程序         
void TIM3_IRQHandler(void)
{                                                                           
        if(TIM3->SR&0X0001)                        //溢出中断
        {
                if(FlagofTimeStart3 == 1)
                {
                         FlagofTimeStart3 = 0;
                }
                else
                {       
                        if(Timeout3!=4)
                        {
                                //判断电平状态
                                if(tuch_num==1)
                                {
                                        if(TA==1)
                                        {
                                        TuchState[0][Timeout3]=1;
                                        }                               
                                }
                                else if(tuch_num==2)
                                {
                                        if(TB==1)
                                        {
                                        TuchState[1][Timeout3]=1;                                       
                                        }
                                }
                                else if(tuch_num==3)
                                {
                                        if(TC==1)
                                        {
                                        TuchState[2][Timeout3]=1;                                       
                                        }
                                }
                                else if(tuch_num==4)
                                {
                                        if(TD==1)
                                        {
                                        TuchState[3][Timeout3]=1;                                       
                                        }
                                }
                                Timeout3+=1;
                        }
                        else if(Timeout3==4)
                        {
                                Timeout3=0;
                                Timer3Stop();
                                //按键的解析
                                if(TuchState[0][0]==1 && TuchState[0][1]==1 && TuchState[0][2]==1&& TuchState[0][3]==1)
                                {
                                        printf("按键1按下");
                                }
                                else if(TuchState[1][0]==1 && TuchState[1][1]==1 && TuchState[1][2]==1&& TuchState[1][3]==1)
                                {
                                        printf("按键2按下");
                                }
                                else if(TuchState[2][0]==1 && TuchState[2][1]==1 && TuchState[2][2]==1&& TuchState[2][3]==1)
                                {
                                        printf("按键3按下");
                                }
                                else if(TuchState[3][0]==1 && TuchState[3][1]==1 && TuchState[3][2]==1&& TuchState[3][3]==1)
                                {
                                        printf("按键4按下");
                                }
                                TIM3->SR &= ~(1<<0);                //清除中断标志位
                        }
                }                                                                                                               
        }                                               
}
回复

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4512
金钱
4512
注册时间
2018-5-14
在线时间
964 小时
发表于 2020-12-2 10:15:19 | 显示全部楼层
状态机就能实现,可以分成 未按下状态,按下去抖状态,按下确认状态,按下持续状态,释放去抖状态,释放成功状态的循环。正常只要在按下确认态和释放成功态进行按键处理就行了。
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1436
金钱
1436
注册时间
2020-5-12
在线时间
394 小时
发表于 2020-12-2 10:19:15 | 显示全部楼层
这个需求我一般用轮询做的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 07:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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