跑马灯带
看到上图,在遐想到本篇文章的题目,就知道我本日就带领大家做个跑马灯的实验。那么大家说,这个实验难吗?学会了做个还能做其他项目吗?在这里我要见告大家,这个项目并不难,逻辑也非常地大略。
在编程之前我们首先要做确当然是先创建编程环境环境了。上次向大家推举了Ubuntu,但是之后想想Ubuntu学习周期有点长,不能让大家快速上手,以是我还是选择利用Keil来和大家一起学习。

Keil的安装和配置就不在这里讲了,
好了下面直接进入正题,在开始写程序之前,让我们先来捋一下这个项目的逻辑。假设我们有n个灯,要让他们依次点亮,那自然是从第一个开始亮,然后在点燃下一盏灯之前将这盏灯先熄灭,之后不断重复这样的过程直到点燃末了一盏灯。形象一点的举例如下:假设有编号为0~4的灯须要按跑马灯的逻辑运行,那么实行过程是:
第一步:0号灯亮并延时一段韶光;
第二步:0号灯灭1号灯亮并延时一段韶光;
第三步:1号灯灭2号灯亮并延时一段韶光;
第四步:2号灯灭3号灯亮并延时一段韶光;
第三步:3号灯灭4号灯亮并延时一段韶光;
第六步:4号灯灭1号灯亮并延时一段韶光;
正如上述步骤一个循环结束,然后让程序从第二步到第六步无限循环,给我们展现的便是一个跑马灯的程序了。设计运行逻辑是编程中最最主要的一步了,由于接下来编写的程序和实际运行的状态都是根据这个逻辑来实现的,假如这里出错,那么接下来就不要提了,肯定是麻烦一大堆,问题一大把。以是我们须要花70%的韶光来设计运行逻辑,韶光要花在刀刃上,光专一写程序是没用的,要会思考。当然了每个人的思考都是不同的,我们要学会创新,不断优化思维。例如上述逻辑,实际上可以用5步办理,而不须要6步。逻辑如下:
第一步:4号灯灭0号灯亮并延时一段韶光;
第二步:0号灯灭1号灯亮并延时一段韶光;
第三步:1号灯灭2号灯亮并延时一段韶光;
第四步:2号灯灭3号灯亮并延时一段韶光;
第三步:3号灯灭4号灯亮并延时一段韶光;
大家看看是不是只要5步,就和我前一章和大家讲的,程序没有最好,只有更好,关键是你要会去思考。那么我们本日就按照第二种方法来实现。当然你也可能会想到其他方法,但是要自己去动手验证,我们不能只会想而不会做。
好了,现在正是进入“写”的阶段。我们要点亮LED灯首先须要做什么呢?我们要掌握我们的手去按下开关,那么好了对付STM32来说,我们便是要掌握它的引脚去输出对应的高低电平(详细输出高电平还是低电平才能点亮灯要看详细的电路来剖断,我们这块板子上是输出低电平灯才会亮)。但是在利用引脚之前,我和大家讲过,STM32的引脚有很多功能,不单单是单一的输入输出那么大略,以是在利用之前,我们须要先设置对应的引脚为我们想要的那种模式(也便是“初始化”)。没办法功能太多就须要先区分好,要不然程序就不能正常实行啦。
详细的实行流程便是“初始化引脚 –>按照设计的逻辑掌握LED灯”,是不是很大略!
对我们来说逻辑设计已经完成了,目前要做的便是初始化我们所要利用的引脚了,那么我们就要根据电路图来看看我们利用了哪些引脚了,这个要详细而论,不是我们凭着想象随便写的哟。就像明明是这个引脚连着灯,你却去掌握其他的引脚,很显然灯不会亮,以是啊,我们也必须要学会看电路图,如果碰着看不懂的,那么就去向硬件工程师咨询吧!
我选的是STM32F4系列的芯片,他有A、B、C、D、E、F、G七组引脚,每组有16个引脚,编号从0~15,例如A组,称之为PA0~PA15。以是引脚资源还是非常丰富的,不是51可以与之比较的。这次的实验,我准备利用F组的5个引脚(PF6、PF 7、PF 8、PF 9、PF 10)。
管脚初始化程序如下(库函数版本):
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义管脚构造体
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;//LED0、 LED1、LED2、LED3、LED4对应的IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF, &GPIO_InitStructure); //初始化GPIO
GPIO_SetBits(GPIOF, GPIO_Pin_6 |GPIO_Pin_7 | GPIO_Pin_8 |GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭
}
上述代码便是初始化与LED相连的管脚,只要在main函数(主函数)先利用这个函数,之后我们就可以掌握LED灯了。接下来我么设计掌握灯亮灭的程序。
实在掌握也便是掌握引脚的高低电平了,也便是GPIO_SetBits和GPIO_ResetBits两个函数,可是这两个函数写起来有点冗长,那么我们就将他们封装一下,重新天生一个函数:
void LED(char Num,char status) //函数功能:点亮或熄灭编号为Num的灯
{
switch(Num) //switch选择语句
{
case 0: //如果Num为0实行接下来的语句
if(status == 0) //判断status,如果为0灭灯,如果为1亮灯
{
GPIO_SetBits(GPIOF,GPIO_Pin_6);
}
else
{
GPIO_ResetBits(GPIOF,GPIO_Pin_6);
}
break;
case 1: //同case0
if(status == 0)
{
GPIO_SetBits(GPIOF,GPIO_Pin_7);
}
else
{
GPIO_ResetBits(GPIOF,GPIO_Pin_7);
}
break;
case 2:
if(status == 0)
{
GPIO_SetBits(GPIOF,GPIO_Pin_8);
}
else
{
GPIO_ResetBits(GPIOF,GPIO_Pin_8);
}
break;
case 3:
if(status == 0)
{
GPIO_SetBits(GPIOF,GPIO_Pin_9);
}
else
{
GPIO_ResetBits(GPIOF,GPIO_Pin_9);
}
break;
case 4:
if(status == 0)
{
GPIO_SetBits(GPIOF,GPIO_Pin_10);
}
else
{
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
}
break;
default:
break;
}
}
经由这一封装,我们掌握灯只要通报灯的编号和状态就可以了,比掌握高低电平要方便很多。
末了还有便是延时函数,按照我平常的做法那便是要利用定时器了,可是这个我准备留到后面重点先容,本日就利用while循环做一个不标准的延时函数,向大家展示一下,当然这个延时是不标准的。
Void delay()
{
int time = 0;
while(time < 5000000) //循环5000000次,每次time加1
{
time++;
}
}
主函数如下:
int main(void)
{
LED_Init(); //初始化LED端口
int Num = 4;
while(1)
{
LED(Num++ ,0); //熄灭编号为Num的灯,之后Num加1;也便是变成下盏灯的编号
if(Num > 4) //判断Num是否大于4,如果大于则置0;
{
Num = 0;
}
LED( Num ,1); //点亮编号为Num的灯(这个Num是上一盏灯后面的一盏,由于Num已经加1了)
delay(); //延时,大家可以随意调度
}
}
实在我想大家一开始可能想的方法和我不太一样,有可能是下面这种方案:
主函数如下:
int main(void)
{
LED_Init(); //初始化LED端口
int Num = 4;
while(1)
{
LED( 4 ,0); //4号灯灭
LED( 0,1); //0号灯亮
delay(); //延时
LED( 0 ,0); //0号灯灭
LED( 1,1); //1号灯亮
delay(); //延时
LED( 1 ,0); //1号灯灭
LED( 2,1); //2号灯亮
delay(); //延时
LED( 2 ,0); //2号灯灭
LED( 3,1); //3号灯亮
delay(); //延时
LED( 3 ,0); //3号灯灭
LED( 4,1); //4号灯亮
delay(); //延时
}
}
大家比拟一下上述两种方法,我们写程序也要看重程序的可读性可排版,要在程序实行精确且稳定的情形下担保程序的而都雅和构造的紧凑,诚笃说我一开始也是用的第二种方法,可是之后溘然想到实在亮灯和灭灯也是有规律的,以是虽然运行逻辑相同,但是算法却可以再度进行优化。
跑马灯
好了本日就的学习就到这里,望大家一起努力。不要认为很大略就放松对自己的哀求,也不要由于太难而感到害怕,年轻就要敢拼敢想。
下面几个也是和跑马灯类似的实验项目,你看看你会做吗?要真的能够做哦。(本次的实验代码又想要的同学可以不才面评论处留言“代码+邮箱”。
“迁徙改变的风车”
“会飞的蝴蝶”
想要逆风飞行,就要拿出你的魄力,不要等到你老了再为无所作为而后悔!