蓝桥杯嵌入式学习笔记--GPIO--tim控制key(2)

现在,学习按键!

首先,还是开始的基本操作--设置时钟(1)里面写了,因为这个笔记主要是给我自己复习看的,因此,这里跳过,还有配置的细节也跳过

然后,咱们还是看原理图!

通过下面的原理图,我们可以知道,控制这个板子的四个按键分别连接了板子的A0,B0,B1,B2四个口,并且是按下之后板子会受到低电平------那么,说明没按下时,我们应该初始化要上拉电平(这里注意,按键的输入口最好不要处于悬空端,不然按键很容易失控!)

ps:这里用定时器控制是为了减少主程序负担

然后,配置CubeMX

输入配置inport

定时器配置,这里用的tim2,因为我们(1)里面设置的时钟是80M,这里有一个公式,我是按这个来算扫描的时间

所以这里一目了然,我们配置的80M频率,那么,我上面那个prescaler配置8000-1,下面那个Period配置10000-1,结果得8000*10000/80=1000 000us=1s

再,进入keil,key文件不展开说说了,直接代码

首先,把定时器写好,用(1)写的led测试tim配的是否成功

定时器测试代码

找一个位置写中断回调函数

然后在主函数里把定时器的开关打开

然后进行测试,发现板子上测试的led可以亮,说明tim可以正常运行

接下来,配置key的代码(我在b站上看到的,感觉写的很妙)

1.在key.h文件中定义key的结构体

#include "stdbool.h"
struct keys
{
    bool key_sk;//判断是否松开
    bool key_ax;//按下
    uchar key_count;//记录按下

};

2.在定时器中断回调函数里面配置key的代码

#include "key.h"
void KEY_go();
struct keys key[4]={0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM2)
    {
//    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_15);
//    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
//    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
        
        key[0].key_ax=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
        key[1].key_ax=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);        
        key[2].key_ax=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
        key[3].key_ax=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);    
        KEY_go();
    }
}
 

void KEY_go()
{
    for(int i=0;i<4;i++)
    {
        switch(key[i].key_count)
        {
            case 0:
                if(key[i].key_ax==0)//等于0代表read读到值了
                    key[i].key_count=1;
                break;
            case 1:
                if(key[i].key_ax==0)//继续扫描
                        key[i].key_count=2;
                else
                    key[i].key_count=0;
                break;
            case 2:
                key[i].key_count=0;
                key[i].key_sk=1;
            break;
        
        }
    }
}
 

3.在主函数里写一个收到信号的函数

void KEY_select()
{

        if(key[0].key_sk==1)
        {
        LED_go_all(0xaa);
            key[0].key_sk=0;
        }
        if(key[1].key_sk==1)
        {
        LED_go_all (0x55);
            key[1].key_sk=0;
        }
    

}

4.然后在main里面的while调用KEY_select()就行

明天写长按的!

  • 24
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值