时间紧迫,先给大家代码 >@<
书接上回,经过上一篇文章的学习,你已经成功变成点灯大师,那么接下来,我们来看看按键如何去书写。现在已经是4月10号了,距离蓝桥杯开始就剩下两天了,所以我决定先把代码放在上面,注释写的详细一些,方便大家和我自己看,等到蓝桥杯结束之后,我在补充比较详细的说明,感觉时间紧迫,话不多说先上代码
按键的短按和长按:
配置成上拉电阻:
我习惯于先去定义一个这个,看各位的喜好吧
/*定义缩写*/
#define uint unsigned int
#define uchar unsigned char
初始化( 一定要记得开启定时器中断)
/*初始化*/
led_display(0x00); //先把led全部关掉
HAL_TIM_Base_Start_IT(&htim4); //开启定时器4的中断
按键的参数
struct keys
{
uint key_state;//按件是高电平还是低电平
uint key_judge;//按键的判断
uint key_flag;//短按的标志位
uint key_time;//长按的时间
uint key_long_flag;//长按的标志位
};
struct keys key[4];//四个按键
再就是按键的写法了
补充:
考完蓝桥杯的第一天:我来补充补充:
思路:
1.在前面我们配置了一个0.01s的定时器,也就是说进入中断的时间很快,一直在进入,对吧。理解了这一点,我们就可以看成几乎是在一直执行定时器计数中断里面的事情,是吧。
2.那么我们在获取按键所对应的gpio的电平值,由于蓝桥杯它的引脚的初始状态时高电平,所以当按键按下来的时候,此时此刻它是低电平的。
3.当我们按下按下按键的时候,按键的状态置为低电平,会把key[i].key_judge置为1,再进行一次判断的目的是为了消抖。按住不懂之后,按键的时间就会加加,当你松开手的时候,去看看按键的时间是否大于1s,如果大于1s那么就是长按,如果小于1s那么就是短按。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if( htim->Instance == TIM4)
{
/*读取每个按键的高低电平,低电平是按键按下*/
key[0].key_state = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
key[1].key_state = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
key[2].key_state = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
key[3].key_state = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
for( int i = 0; i < 4; i++)
{
switch(key[i].key_judge)
{
case 0:
{
if( key[i].key_state == 0) /*按下按键*/
{
key[i].key_judge = 1;
}
}
break;
case 1:
{
if( key[i].key_state == 0) /*消抖*/
{
key[i].key_judge = 2;
}
else if( key[i].key_state == 1)
{
key[i].key_judge = 0;
}
}
break;
case 2:
{
if( key[i].key_state == 0) /*一直按着,也就是长按,按键时间积累*/
{
key[i].key_time++;
}
else if( key[i].key_state == 1)
{
if( key[i].key_time >= 100) /* 大于1s就是长按*/
{
key[i].key_long_flag = 1;
}
else if( key[i].key_time <= 100) /*小于就是短按*/
{
key[i].key_flag = 1;
}
key[i].key_time = 0;
key[i].key_judge = 0;
}
}
break;
}
}
}
}
最后就是在主程序中验证一下
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if( key[0].key_flag == 1) /*按键b1是可以用的*/
{
t_led |= 0x01;
led_display(t_led);
key[0].key_flag = 0;
}
}
确实写的比较急,我过几天肯定会继续补充的