现在,学习按键!
首先,还是开始的基本操作--设置时钟(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()就行
明天写长按的!