学习单片机都要学习流水灯,因为流水灯比较简单,易于实现,效果也比较好呈现。
这里我用的单片机型号为STM32F103VET
8个LED灯接在了PA口的低八位。
代码实现如下:
(注: 对于新手来说,暂时先不要分文件写代码,我们将功能都写在了main函数中,便于大家理解,后期要将程序模块化)
/*
作者:XiaoCaiDaYong
时间:2019.9.26
功能:流水灯
接线:PA0-PA7接在LED1-LED8上
实现步骤:
1.开启GPIOA时钟
2.设置GPIOA指定口的工作模式(推挽输出,速度为50MHz)
3.数据的输出
*/
#include "stm32f10x.h" // Device header
unsigned char led[]={0X80,0X40,0X20,0X10,0X08,0X04,0X02,0X01};
void delay(void); // 函数的声明
int main(void)
{
int n;
unsigned char temp = 0X01;
RCC_DeInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); // 开启时钟
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_DeInit(GPIOA); // 将外设GPIOA 寄存器重设置为缺省值
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All; // 选中所有管脚,其实只用了低八位管脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
while(1)
{
temp = 0X01;
for(n=0;n<8;n++)
{
GPIOA->ODR = temp; // 寄存器实现,也可以用 GPIO_Write()函数实现
temp = temp<<1;
delay();
}
}
}
void delay(void)
{
int i,j;
for(i=0;i<400;i++)
{
for(j=0;j<400;j++);
}
}
效果如下: