前言:封装函数控制锁存器和LED
一、CubeMX配置:
GPIO配置:
将控制LED的PC8-PC15以及锁存器控制端口PD2设置为推挽输出。
二、代码部分:
创建led.h和led.c文件用于写关于LED的代码
led.h代码:
#ifndef __LED_H
#define __LED_H
#include "main.h"
void LED_Control(u8 led_ctrl);
void LED_Shutdown(uint8_t LEDnum);
void LED_Lighten(uint8_t LEDnum);
void LED_Toggle(uint8_t LEDnum);
#endif
led.c代码:
#include "led.h"
uint8_t LEDstate=0;
void LED_Control(uint8_t LEDstate)
{
HAL_GPIO_WritePin(GPIOC,0xFF00,GPIO_PIN_SET); //0xFF00为PIN8-PIN15
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); //控制锁存器
HAL_GPIO_WritePin(GPIOC,LEDstate << 8,GPIO_PIN_RESET); //左移8位控制PIN8-PIN15
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); //控制锁存器
}
void LED_Shutdown(uint8_t LEDnum){
LEDstate &= (0xFF - (1 << (LEDnum-1)));
LED_Control(LEDstate);
}
void LED_Lighten(uint8_t LEDnum){
LEDstate |= (1 << (LEDnum-1));
LED_Control(LEDstate);
}
void LED_Toggle(uint8_t LEDnum){
ledstate ^= (1 << (LEDnum - 1));
LED_Control(ledstate);
}
解释:创建LEDstate变量,用于记录当前LED的状态。LED_Shutdown与LED_Lighten分别位与和位或LEDstate来改变LED状态,最后都进行LED_Control来进行GPIO控制。
主程序中:
#include "led.h"
extern uint8_t LEDstate;
LED_Shutdown(2); //关闭LED2
LED_Lighten(3); //打开LED3
LED_Toggle(4); //翻转LED4