1.Cubmx配置
设置PD2为GPIO_OUTPUT
PC8~PC15对应led1~8,设为GPIO_OUTPUT
2.代码编写
新建led.c文件和led.h文件,分别保存至Src和Inc中,并将.c文件在Keil加入到Application/User中
在led.c中编写自定义点灯函数
#include "led.h"
void led_control(u8 led_ctrl)
{
//先熄灭所有的灯
HAL_GPIO_WritePin(GPIOC,0xff00,GPIO_PIN_SET); //让PC8~15输出高电平,熄灭LED
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//打开锁存器
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关闭锁存器
//根据led_ctrl点亮对应的灯
HAL_GPIO_WritePin(GPIOC,led_ctrl<<8,GPIO_PIN_RESET); //让对应引脚输出低电平,点亮LED
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); //打开锁存器
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); //关闭锁存器
}
在led.h中声明函数
#ifndef __LED_H
#define __LED_H
#include "main.h
void led_control(u8 led_ctrl);
#endif
注意要在main.c中引用led.h
#include "led.h"
3. 代码调用以及注意事项
在编写函数前,往往在主函数中先定义一个led_ctrl;并调用led_control(led_ctrl);
u8 led_ctrl;
若想点亮led1则
led_ctrl |= 0x01;
若想熄灭led1,则
led_ctrl &= ~0x01;
4.点亮某个灯与八位数的关系
LED: 8 7 6 5 4 3 2 1
led_ctrl: 0 0 0 0 0 0 0 0
若想点亮某个灯,则下面对应的数为1
比如点亮led5,则led_ctrl为0001 0000,即0x10;
点亮led5和led3,则led_ctrl为0001 0100,即0x14;
5.闪烁灯 流水灯
闪烁灯(亮灭时间相同)
u32 ledTick;
void led_process()
{
if(uwTick-ledTick<1000) return ;
ledTick=uwTick;
led_ctrl ^= 0x01;
led_control(led_ctrl);
}
在while(1)中调用led_process()即可。该函数中用滴答定时器进行闪烁的延时控制。
闪烁灯(亮灭时间不同)
u32 ledTick;
u8 led_cnt;
void led_process()
{
if(uwTick-ledTick<1000) return ;
ledTick=uwTick;
led_cnt++;
if(led_cnt>5)
led_cnt=0;
if(led_cnt<3) //led_cnt是0,1,2时点亮
led_ctrl |= 0x01;
if(led_cnt>2) //led_cnt是3,4时熄灭
led_ctrl &= ~0x01;
led_control(led_ctrl);
}
通过led_cnt来计时,通过对led_cnt的值的判断来控制亮灭时间,亮3秒,灭2秒。
流水灯
u8 i=0;
void led_process2()
{
if(i>3)
i=0;
switch (i)
{
case 0:
led_ctrl |= 0x01;//点亮1
led_ctrl &= ~0x08;//熄灭4
break;
case 1:
led_ctrl |= 0x02;//点亮2
led_ctrl &= ~0x01;//熄灭1
break;
case 2:
led_ctrl |= 0x04;
led_ctrl &= ~0x02;
break;
case 3:
led_ctrl |= 0x08;
led_ctrl &= ~0x04;
break;
}
if(uwTick-ledTick<1000) return ;
ledTick=uwTick;
i++;
led_control(led_ctrl);
}
该函数使用滴答定时器,能够能流畅运行,同时对流水灯以外的其他灯不会产生影响