一、简单代码
其实这个现象主要用的就是电平翻转函数
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
#include "led.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#define DELAY_TIME 500 //延时1000ms 也就是1秒
/* USER CODE END Includes */
延时1000ms也就是1秒
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/* LD1~LD8轮流亮灭,实现跑马灯 */
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);
HAL_Delay(DELAY_TIME);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_9);
HAL_Delay(DELAY_TIME);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_10);
HAL_Delay(DELAY_TIME);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_11);
HAL_Delay(DELAY_TIME);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_12);
HAL_Delay(DELAY_TIME);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
HAL_Delay(DELAY_TIME);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_14);
HAL_Delay(DELAY_TIME);
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_15);
HAL_Delay(DELAY_TIME);
}
二、模块化代码
(1)LED.c的代码
/* led.c */
#include "led.h"
/* 点亮LED */
void LED_ON(uint16_t LED_Pin)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, LED_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}
/* 熄灭LED */
void LED_OFF(uint16_t LED_Pin)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, LED_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}
/* 翻转LED */
void LED_Toggle(uint16_t LED_Pin)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_TogglePin(GPIOC, LED_Pin);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}
(2)LED.h的代码
/* led.h */
#ifndef __LED_H
#define __LED_H
#include "main.h"
#define LED1 GPIO_PIN_8
#define LED2 GPIO_PIN_9
#define LED3 GPIO_PIN_10
#define LED4 GPIO_PIN_11
#define LED5 GPIO_PIN_12
#define LED6 GPIO_PIN_13
#define LED7 GPIO_PIN_14
#define LED8 GPIO_PIN_15
#define LED_None 0x0000
#define LED_All 0xFF00
void LED_ON(uint16_t LED_Pin);
void LED_OFF(uint16_t LED_Pin);
void LED_Toggle(uint16_t LED_Pin);
#endif /* __LED_H */
(3)main.c的代码
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/* LD1~LD8轮流亮灭,实现跑马灯 */
LED_Toggle(LED1);
HAL_Delay (500);
LED_Toggle(LED2);
HAL_Delay (500);
LED_Toggle(LED3);
HAL_Delay (500);
LED_Toggle(LED4);
HAL_Delay (500);
LED_Toggle(LED5);
HAL_Delay (500);
LED_Toggle(LED6);
HAL_Delay (500);
LED_Toggle(LED7);
HAL_Delay (500);
LED_Toggle(LED8);
HAL_Delay (500);
}
三、附加知识二进制(不太懂)
FF就是全亮了灯,因为是1111 1111 0000 0000 其实相当于把0xFF左移八位变成0xFF00
上面那个0x00 相当于是 0000 0000 0000 0000 左边八位赋值给PIN15-8了
这是普遍的写法,15-0一共16个端口,就对应16位