依据人体视觉暂留效应,利用简单的延时函数形成一个PWM周期,输出不同占空比的LED灯亮灭状态,视觉上达到呼吸灯的效果,逐渐暗-逐渐亮-逐渐暗…。
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
void LED_Init(void);
int main(void)
{
u8 MENU;
u16 t,i;
//初始化程序
LED_Init(); //初始化GPE5引脚
delay_init(); //注意:延时函数不初始化,下面的delay_us用不了
//设置变量的初始值
MENU = 0;
t = 1;
while(1)
{
//菜单0,逐渐变暗
if(MENU == 0)
{
for(i = 0; i < 10; i++)
{
GPIO_SetBits(GPIOE,GPIO_Pin_5); //LED接口输出高电平1,灯灭
delay_us(t); //延时
GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED接口输出低电平0,灯亮
delay_us(501-t); //延时
}
t++;
if(t==500)
{
MENU = 1;
}
}
//菜单1,逐渐变亮
if(MENU == 1)
{ //变暗循环
for(i = 0; i < 10; i++)
{
GPIO_SetBits(GPIOE,GPIO_Pin_5); //LED接口输出高电平1
delay_us(t); //延时
GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED接口输出低电平0
delay_us(501-t); //延时
}
t--;
if(t==1)
{
MENU = 0;
}
}
}
}
注意:调试代码时,忘记了初始化延时函数delay_init(),结果导致一直无法使用延时微秒函数。
系统上电,在调用main函数之前,先调用了SystemInit函数,在该函数内默认设置好了系统时钟为72MHz。因此可以不去配置RCC了。
STM32为了节约功耗,默认把外设的时钟都关闭了,因此在使用到某一外设时,必须手动打开该外设的时钟。
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PE.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE.5
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高,灯灭
}