长短按键(此定时器的时钟频率是80MHz,F103是72MHz)

1.GPIO口设置成上拉输入(默认为高电平,按下按键时为低电平)

2.基本定时器是TIM6和TIM7,按键设定为10ms扫描一次,PSC设为80,ARR为10000,一定要记得在NVIC里开启中断,同时别忘了中断初始化

 

 

Key_State Key[]={0, 0, 0, 0};
uint8_t Key_Num = 0; //长短按键计次
 
typedef struct{
    uint8_t Key_Judge;
    bool Key_Sta;
    bool Key_Long_Flag;
    bool Key_Short_Flag;
}Key_State;
 
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim -> Instance == TIM6)
    {
        Key[0].Key_Sta = HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin);
        Key[1].Key_Sta = HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin);
        Key[2].Key_Sta = HAL_GPIO_ReadPin(Key3_GPIO_Port, Key3_Pin);
        Key[3].Key_Sta = HAL_GPIO_ReadPin(Key4_GPIO_Port, Key4_Pin);
        
        for(uint8_t i=0; i<4; i++)
        {
            switch(Key[i].Key_Judge)
            {
                case 0:
                {
                    if(Key[i].Key_Sta == 0)Key[i].Key_Judge = 1;
                }
                break;
                
                case 1:
                {
                    if(Key[i].Key_Sta == 0)Key[i].Key_Judge = 2;
                    else Key[i].Key_Judge = 0;
                }
                break;
                
                case 2:
                {
                    Key_Num ++;
                    if(Key[i].Key_Sta == 1)
                    {
                        Key[i].Key_Judge = 0; //别漏
                        if(Key_Num < 100)
                        {
                            Key[i].Key_Short_Flag = 1;
                            Key_Num = 0;
                        }
                        if(Key_Num >= 100)
                        {
                            Key[i].Key_Long_Flag = 1;
                            Key_Num = 0;
                        }
                    }
                }
                break;
                
            }
        }
    }
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值