51单片机入门3--花式点灯和由此引出的学习方法

在上一个文章中,我们已经能够将一个灯点亮了,那我们这一次,要实现的操作就是花式点灯,那我们就直接开始吧
关于工程的建立我就不在这里多说了,做好准备之后就开始

#include<reg51.h>
#include<intrins.h>//这里面声明了我们之后将会使用到的函数

typedef unsigned int uint16_t;
typedef unsigned char uint8_t;

void delay(uint16_t i);

void main(void)
{
      P1=0x01;//P1在这里代表了我们单片机中的P1^0到P1^7的整个端口,具体为什么可以去看头文件和关于sfr的解释
      while(1)
      {
            P1=_crol_(P1,1);//这个操作叫做循环左移,是将第一个参数进行循环左移,具体会在下面说,第二个参数是左移的位数
            delay(1000);//这个数字你可以自己调整看结果
      }
}

void delay(uint16_t i)//让程序空跑,这是一个简单的延时函数,后续会说到别的延时方法
{
      while(i--);
}

 这样,我们就达到了流水灯的效果,接下来我来解释一下这个简单的程序
 在这一次,我新增加了一个头文件叫做intrins.h,不仅仅是这里,在之后的学习中,我们经常会用到这个的,这一次我们是使用到了_crol_()这个函数

 接下来我们说主函数,我们将P1赋值(这样的做法等价于将P1^0设置为1而将P1^1到P1^7都设置为0),这时候我们的P1的二进制就是00000001(忘了进制转换的看我之前的文章),然后我们就要进行循环左移的操作了,那么什么是循环左移呢,我举一个例子就明白了

 如果一个数是0x81,那么换成二进制就是10000001,我们进行循环左移一位的操作,那么执行一次之后的结果就是00000011,和左移不一样,我们发现这里本应该在左移中被移除的位出现在了最低位,这就是循环左移的意思

 然后我们反过来看这里的00000001,在while(1)的无限循环中就是00000001->00000010->00000100->00001000->00010000->00100000->01000000->10000000->00000001
也就是我们的P1的8个io口会以这样的方式分别为高电平,然后我们使用delay函数让这个状态保持一段时间(不保持的话眼睛看不出来流水的效果),delay的参数可以自己改变大小看效果

 这样,我们流水灯的操作就完成了,其实是很简单的,但是这个其实不是重点,最重要的是在上一次点一个灯到这一次的流水灯,你自己能不能向外扩展,从点一个灯,到点亮一个数码管,从流水灯,到别的花样的点灯,到数码管显示一个字符,你已经可以做到了,所以你需要的是自己的想法的扩展,当自己能想到的时候,就去做,这才是最重要的,记住,有想法了就去写,就去看结果,不要怕想错,最可怕的是不去想,单纯的靠我的文章,是不可能教完所有的知识的,而我没有说到的部分,要靠自己,下一次我会将这一次所说的点灯和点数码管进行讲解,但是自己一定要去想如何去实现,自己肯想肯做,这才是真正的学习

posted @ 2020-05-07 14:12  时_光  阅读(351)  评论(0编辑  收藏  举报