跑马灯程序的设计思路与我前面发的LED循环点亮程序总体思路很像,就是跑马灯第一个灯亮完,接着是第一个和第二个灯一起亮,而循环点亮时每次是只能亮一个灯,明白了这些代码的设计也就手到拿来了。
程序也有两种编程方法
下面展示第一种
#include "stm32f10x.h"
uint16_t temp,i,j;
void Delay(unsigned int count) //延时函数
{
unsigned int i;
for(;count!=0;count--)
{
i=5000;
while(i--);
}
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = 0x03FF;
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 = 0x0FFFE; //设置初始控制码
for(i=0;i<4;i++)
{
GPIO_Write(GPIOB,temp); //向GPIOB口写点亮LED的控制码
Delay(100);
temp=temp<<1; //控制码左移一位,获得下一个控制码
}
temp = 0x0FE00; //设置初始控制码
for(j=0;j<4;j++)
{
GPIO_Write(GPIOB,temp);
Delay(100);
temp=(temp>>1)+ 0x8000; //右移一位加0x8000,获得下一个控制码
}
}
}
代码说明:“ temp=(temp>>1)+ 0x8000; ”语句为什么要加0x8000,因为temp右移一位时,最高位到此高位,最高位补0。temp右移一位后,加上0x8000使temp的最高位置1。
第二个编程方法
while(1)
{
GPIO_SetBits(GPIOB,0x0FFFF); //先熄灭所有LED
temp = 0x0001;
for(i=0;i<4;i++)
{
GPIO_ResetBits(GPIOB,temp); //向GPIOB口写控制码
Delay(100);
temp = (temp<<1)+1; //temp左移一位加1获得下一控住码
}
temp = 0x0FE00;
for(j=0;j<4;j++)
{
GPIO_SetBits(GPIOB,temp); //向GPIOB口写控制码
Delay(100);
temp = (temp>>1)+0x8000; //右移一位加0x8000获得下一控住码
}
}
代码说明:使用GPIO_SetBits()和GPIO_ResetBits()函数替代GPIO_Write()函数。(个人认为这样更简单更好理解)
GPIO_ResetBits()函数负责点亮LED,GPIO_SetBits()函数负责熄灭LED