4个LED采用共阳极接法,其阴极接在STM32F103芯片的PB8,PB9,PB10和PB11引脚上
如图所示
下面是代码的实现,和数学一样实现一个目的代码可以有很多种编程方法,下面列举3个
第一种方法
#include "stm32f10x.h"
uint16_t temp,i;
void Delay(unsigned int count) //延时函数
{
unsigned int i;
for(;count!=0;count--)
{
i=5000;
while(i--);
}
}
void main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; //PB8-PB11引脚配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置引脚为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIOB速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB8-PB11
while(1)
{
temp=0x0100; //设置初始控制码
for(i=0;i<4;i++)
{
GPIO_Write(GPIOB,~temp); //向GPIOB口写点亮LED的控制码
Delay(100);
temp=temp<<1; //上一位控制码左移一位,获得下一个控制码
}
}
}
代码说明:“GPIO_Write(GPIOB,~temp);”语句将初始控制码取反后,从GPIOB口输出,使得PB8为低电平,点亮D1,其他点位为高电平;然后延时一段时间;让控制码左移一位,获取下一个控制码;以此类推,就实现了LED循环点亮的效果了
第二种方法
//这一段程序与上面的while(1)实现的效果是一样的
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_8); //PB8输出低电平,D1点亮
Delay(100);
GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_9); //PB9输出低电平,D2点亮
Delay(100);
GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_10); //PB10输出低电平,D3点亮
Delay(100);
GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_11); //PB11输出低电平,D4点亮
Delay(100);
}
代码说明:GPIO_SetBits()函数可以同时对多个I/O口进行置位,这样也可以实现LED循环点亮
第三种方法
//这一段程序与上面的while(1)实现的效果是一样的
while(1)
{
temp=0x0100; //设置初始控制码
for(i=0;i<4;i++)
{
GPIO_SetBits(GPIOB,0x0FFFF); //GPIOB口输出高电平,4个LED熄灭
GPIO_ResetBits(GPIOB,temp); //控制码对应的GPIOB口引脚上的LED点亮
Delay(100);
temp=temp<<1; //上一位控制码左移一位,获得下一个控制码
}
}
代码说明:使用for语句 ,比较简单,控制几个LED灯就让for循环几次即可