一、序言:下面我们来给大家介绍一下这个流水灯,流水灯如何来实现?我们依然使用这个工程来完成它。
1、那要使用实现这个流水灯,那我们只需要让D1到D8逐个的点亮,那同样要实现它足够的点亮,也会涉及到延时,那么这个延时的实现呢,我们这里就不再重复。
2、那么要实现这个循环,点亮呢,可以最容易理解的方法就是点亮D1,把D2到D8熄灭,然后延时一段时间再点亮D2,把D1,D3到D8熄灭,以此来类推,以此类推,那么这样就可以很简单的去实现LED流水灯。
3、当然,我们不推荐这种方法,在前面呢,我们学习了C语言相关的这个基础知识,我们知道里面有一个移位以及循环语句的操作,那么根据流水灯实现的原理,也就是I口,是由D,我们看到连接的D1是连接在P2.0,D8是连接在P2.7,那么他的要逐个的点亮,是不是相当于我们的管脚,P20,P21,P22,P23。这个管脚相当于它是由低到高进行逐个的输出,低电平的特点。那么我们可以将移位操作以及循环操作结合,因为它要一个一个这样的操作,就相当于循环八次对吗?那怎么来实现这么一个代码呢。
4、首先,我们先来介绍我们的移位和for语句的一个使用来让这个指示灯进行循环,那么我们要让这个八个灯循环的一个点亮,那我这里是不是要对这八个I口都要进行操作,那为了方便,我这里是通过一个宏定义,宏定义的方式,我就不单独定义广角号,我就通过define,那么在定义的这个宏的时候,使用的这个C语言的一个语句呢,是通过一个井号再加define,这是关键字。
5、通常我们在定义宏定义的时候,都会使用大写字母,那我现在要定义控制八个灯,那这八个灯,是连接在PR端口的,所以我这里是LED命名为LED端口。在哪里,P2。这里是使用宏定义的方式将我们的P2端口定义,定义P2端口是连接我们的LED,所以这里,直接可以代替P2来使用,如果说我们客户自己使用别的开发板,你可能连接到P0或者P1,那你只需要改这个端口名称就可以了,把这个2改成0或者1。那这样我们后续的代码都是用这个,就不需要再改了,这样就提高了我们的代码的一个移植性,移植性和兼容性。
4、接下来,我们再来进行一个循环的一个操作,如何来让它进行一个循环点亮。LED要实现一个跑马灯,是不是要在不断地循环,不断的循环呢?那我们的代码依然是要放在while循环里面,不断的让它在这里反复的进行操作。
5、那要进行一个循环,我们就要一个一个的点亮,那这里就要用到for循环,for循环它的条件是我们就要用一个变量来u8类型,因为这个条件,我只要循环8次,所以定一个字节的变量就足够了,我们定一个i吧,定义个i,那么这个i呢,我们起到一个次数的,一个累加到for循环里面
6、首先for语句,我们前面说过,第一个是它的一个初始条件,我们i=0,I就是它的一个循环条件,循环一个条件I小于8,说明等一下,我们后面是i++。就是说我们每一次这个加了一次,又要跳到这个条件来对比,如果是满足它进行,就会进入到我们的for语句里面,执行它的循环体,这相当于我们要执行8次,每一次是只加1的i+1,那么就相当于循环8次了。
7、那么这循环体里面怎么实现呢?我们看一下,首先让D1指示灯点亮,D1指示灯点亮,是不是P20输出一个低电平,那么接着延迟一段时间,让D2指示灯点亮,D2指示灯是不是让这个P21输出低电平,其他的输出高电平。这里我们可以写一下,首先我们让其输出低电平,其他的输出高电平,延迟一段时间之后,D2指示灯点亮,D2输出低电平,其他的输出高电平。以此类推,相当于这个0,是不是一直往下,一直往下的移位。
8、通过发现的这个规律,我们知道了其实就是将这个P2端口,P2端口一直由低到高进行移位,那么由低到高我们P2端口最低位是P2.0,然后最高位就是P2.7,所以我们要让这个零,一直往前移,那就相当于左移。
9、我们再回到这个PPt,我们单片机的管脚是P2.7,是高位。P2.6要一直到P2.0,这是对应的低位,我们相当于我们的一个字节,这是7位是最高的6543210,这是低位,所以我们由低到高位进行零相移动的话,是不是从低位往高,相当于左移。那么零往左移是不是就是这样零左移,左移多少,左移i这个i是跟着我们的这个循环的一个次数来的,当i=0的时候,满足这个条件,那进入循环体,i是等于0,这个0是不是相当于我们的i口所有的都是0,因为它是8位,如果只写一个0,相当于8位都是0,那这是不符合我们的一个功能要求,我们只希望第一个P2.0为零,其他的为1。
二、代码: