我用的是下面这个板子:如图所示,该板子提供了3个可以供用户自由配置和使用的按键,开源资料上提供不是基于Keil的例程,因此为了更快掌握这个开发板的使用,需要重新编写基于Keil环境的代码,这一节,我们来实现3个按键分别控制三个LED灯,当按下任意一个按键时候,LED灯点亮,再按一下,LED灯熄灭。
一、关于按键和LED灯的电路原理图
如上图所示,三个按键分别为KEY1(PE11),KEY2(PE14),KEY3(PE10),按下为低电平,释放为高电平。
如上图所示,三个LED分别为LED1(PB6),LED2(PE3),LED3(PD15),低电平有效。
二、软件实现(基于Keil+STM32CubeMX HAL)
2.1 配置时钟
2.2 配置IO口
2.3 生成Keil
为了让代码生成看起来美观一些,必须将这个项勾选上。
2.4 编写代码
void Key_Scan(void)
{
static bool Lock1 = false,Lock2 = false,Lock3 = false;
//读取KEY1 IO口的状态,如果按下了
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0)
{
//判断当前按键锁是否为false,为false则执行一次LED灯翻转
if(false == Lock1){
HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
Lock1 = true ;
}
}
else
{
//当释放按键时,解除按键锁
Lock1 = false ;
}
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 0)
{
if(false == Lock2){
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
Lock2 = true ;
}
}
else
{
Lock2 = false ;
}
if(HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 0)
{
if(false == Lock3){
HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin);
Lock3 = true ;
}
}
else
{
Lock3 = false ;
}
}
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Key_Scan();
}
/* USER CODE END 3 */
}
代码巧妙的利用了一个静态布尔变量,通过true-false这样的判断来实现最终的需求。
运行结果:
当按下任意一个按键时,对应的LED点亮,当同一个按键重复再按一次时候,LED熄灭。
转载:https://blog.csdn.net/morixinguan/article/details/102326173
查看评论