HAL库实现按键点亮LED

key.h

#ifndef _KEY_H
#define _KEY_H

#include "stm32f4xx.h"
#include "sys.h"

#define KEY_UP_GPIO_PORT GPIOA
#define KEY_UP_GPIO_PIN  GPIO_PIN_0

#define KEY0_GPIO_PORT   GPIOH
#define KEY0_GPIO_PIN    GPIO_PIN_3

#define KEY1_GPIO_PORT   GPIOH
#define KEY1_GPIO_PIN    GPIO_PIN_2

#define KEY2_GPIO_PORT   GPIOC
#define KEY2_GPIO_PIN    GPIO_PIN_13

#define KEY_UP HAL_GPIO_ReadPin(KEY_UP_GPIO_PORT,KEY_UP_GPIO_PIN)
#define KEY0   HAL_GPIO_ReadPin(KEY0_GPIO_PORT,KEY0_GPIO_PIN)
#define KEY1   HAL_GPIO_ReadPin(KEY1_GPIO_PORT,KEY1_GPIO_PIN)
#define KEY2   HAL_GPIO_ReadPin(KEY2_GPIO_PORT,KEY2_GPIO_PIN)

#define KEY_UP_PRE 0X01
#define KEY0_PRE   0x02
#define KEY1_PRE   0x03
#define KEY2_PRE   0x04

void KEY_Init(void);
u8 KEY_Scan(void);

#endif

key.c

#include "key.h"
#include "delay.h"

void KEY_Init()
{
    GPIO_InitTypeDef KEY_InitStructure;
    
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOH_CLK_ENABLE();
    
    //KEY_UP
    KEY_InitStructure.Pin=KEY_UP_GPIO_PIN;
    KEY_InitStructure.Mode=GPIO_MODE_INPUT;
    KEY_InitStructure.Pull=GPIO_PULLDOWN;
    KEY_InitStructure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
    HAL_GPIO_Init(KEY_UP_GPIO_PORT,&KEY_InitStructure);
    
    //KEY0
    KEY_InitStructure.Pin=KEY0_GPIO_PIN;
    KEY_InitStructure.Pull=GPIO_PULLUP;
    HAL_GPIO_Init(KEY0_GPIO_PORT,&KEY_InitStructure);
    
    //KEY1
    KEY_InitStructure.Pin=KEY1_GPIO_PIN;
    HAL_GPIO_Init(KEY1_GPIO_PORT,&KEY_InitStructure);
    
    //KEY2
    KEY_InitStructure.Pin=KEY2_GPIO_PIN;
    HAL_GPIO_Init(KEY2_GPIO_PORT,&KEY_InitStructure);
}

u8 KEY_Scan(void)
{
    if((KEY_UP==1)|(KEY0==0)|(KEY1==0)|(KEY2==0))
    {
        delay_ms(10);
        if(KEY_UP==1) return KEY_UP_PRE;
        else if(KEY0==0) return KEY0_PRE;
        else if(KEY1==0) return KEY1_PRE;
        else if(KEY2==0) return KEY2_PRE;
    }
    
    return 0;
}

main

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"

int main(void)
{
    u8 key;
    HAL_Init();                     //³õʼ»¯HAL¿â   
    Stm32_Clock_Init(360,25,2,8);   //ÉèÖÃʱÖÓ,180Mhz
    delay_init(180);                //³õʼ»¯ÑÓʱº¯Êý
    LED_Init();                     //³õʼ»¯LED  
    KEY_Init();
    
    
    while(1)
    {
        key=KEY_Scan();
        switch(key)
        {
            case KEY_UP_PRE: LED_RED_ON;    break;
            case KEY0_PRE:   LED_RED_OFF;   break;
            case KEY1_PRE:   LED_GREEN_ON;  break;
            case KEY2_PRE:   LED_GREEN_OFF; break;
        }
    }
    
}
原文地址:https://www.cnblogs.com/CaiFengYuanXing/p/13624027.html