隔了两天才来更新,因为这两天课还挺多的。每天都有三节课,晚上才来实验室。实在是有些时间捉急了。今天主要是学习按键检测。
按键扫描的基本原理:
首先:按键两个引脚的一端通过上拉电阻到高电平,另一端接地(上拉电阻引脚平时就是输入高电平,如果下拉电阻平时就是低电平)
同时:为了检测,就是去读取引脚现在的电平高低。一般用扫描来做。
其中:需要去抖动,也就是去除干扰信号或者说噪声之类的。因为电平触发再短时间内是会出现信号的极大干扰的(怎么去解释呢,就像你刚刚拉闸放水,然后水冲击河岸的时候会激起浪花,此时的流速不稳定之类的,我是这样去思考的)。一般这时候,我们最简单的方法就是通过延时,然后让我们的单片机读取最稳定时候的电流,不然存在干扰信号的时候,单片机容易误读或者停止工作啥的。
今天的函数:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOX , uint_16 GPIO_Pin);
电平输入函数
其他需要的函数就是延时函数,还有第一天搞得那个GPIO_Write和GPIO_TogglePin
可以通过这个东西来进行一个小小的例子。
比如说我手上有一个野火F103RC的开发板。先看原理图,然后找到相应的一个LED和按键的位置。通过按键来控制灯的亮灭。
那么接下来就实现以下功能
由于野火的开发板MINI上一共只有2个按键KEY,所以说只做两个功能
通过KEY1控制LED1开关,KEY2控制LED2开关。
同样的,通过基于GPIO低电平输出,两个按键上拉电阻输入来配置我的文件。
之后呢,就开始进行如一个编程的思路:
首先,做一个按键扫描函数,用来读取什么呢,就是读取按键的电平。然后需要进行判别。和51一样,就用if。然后其中使用去抖动的延时。大概的就是这样一个方式。
首先来看一下延时函数和去抖动函数,非常的简单:
#ifndef _KEY_SET_
#define _KEY_SET_
#include "main.h"
#include "gpio.h"
void Delay(unsigned int t){
while(t--);
}
void Scan_Key()
{
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13) == GPIO_PIN_RESET)
{
Delay(1000);
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13) == GPIO_PIN_RESET)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);
while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13) == GPIO_PIN_RESET);
}
}
}
#endif
由于我本人再main.c函数中进行定义的时候出现了一些报错且一直无法解决,所以我将它做成了一个叫做hanshu.h的头文件,之后就没问题了。
然后就是主函数部分:
while(1)
{
Scan_Key();
}
对,就这一句话。然后输进去之后,解决下引用或者符号之类的小问题,基本就可以实现一个引脚控制一个灯亮灭的问题了。非常的简单。