蓝桥杯嵌入式组开发——Systick实现正反流水灯
1.led引脚配置
led的初始化如下,D2为锁存器引脚,C8-C15位8个LED的引脚
led.c:
#include "led.h"
void led_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = led_all;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
led.h:
#ifndef __LED_H
#define __LED_H
//D2 C8-C15
#include "stm32f10x.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_all GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |GPIO_Pin_12 | GPIO_Pin_13 |GPIO_Pin_14 | GPIO_Pin_15
void led_init();
#endif
2.点亮一个LED
输入为9则,点亮第9个LED,输入范围8-15
GPIO_Write(GPIOC,~(1<<9));
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
3.实现流水灯
通过SysTick_Handler来定时 500ms切换一次led灯的状态,输入状态时left还是right切换流水灯方向
#define left 1
#define right 2
int main()
{
// ......
led_init();
while(1)
{
}
}
void led_water(char flag)
{
static int index_left = 7;
static int index_right = 16;
if(flag == left)
{
GPIO_Write(GPIOC,~(1<<index_left));
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
if(index_left >= 15)
index_left = 7;
index_left++;
}
if(flag == right)
{
GPIO_Write(GPIOC,~(1<<index_right));
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
if(index_right <= 8)
{
index_right = 16;
}
index_right--;
}
}
void SysTick_Handler(void)
{
static int led_num = 0 ;
TimingDelay--;
led_num++;
if(led_num >= 500)
{
led_num = 0;
led_water(right);
}
}