条条大路通罗马---流水灯的多种实现方法

       学习单片机,流水灯项目必做的一个项目,可以说是I/O输出控制的一个非常典型的例子。流水灯一般是指控制单片机的I/O口的电平状态使开发板上的8个小灯依次一个接一个的点亮,流动起来。今天我们总结一下单片机的流水灯的实现方法。

一、流水灯控制的原理

       首先来看8个LED的核心电路,如图所示,8个LED灯的通过限流电阻接到了P1口对应的8个引脚上。通过程序向P1口写入一个8位二进制数来改变每个引脚的输出状态,从而控制8个发光二极管的亮灭。当P1=0x7F,将P1口的8位设置为01111111输出,点亮P1.7引脚连接的发光二极管。当P1=0xBF,将P1口的8位设置为10111111输出,点亮P1.6引脚连接的发光二极管。当P1=0xDF,将P1口的8位设置为110111111输出,点亮P1.5引脚连接的发光二极管。当P1=0xEF,将P1口的8位设置为11101111输出,点亮P1.4引脚连接的发光二极管。当P1=0xF7,将P1口的8位设置为11110111输出,点亮P1.3引脚连接的发光二极管。当P1=0xFB,将P1口的8位设置为11111011输出,点亮P1.2引脚连接的发光二极管。当P1=0xFD,将P1口的8位设置为11111101输出,点亮P1.1引脚连接的发光二极管。当P1=0xFE,将P1口的8位设置为11111110输出,点亮P1.0引脚连接的发光二极管。

      所以通过以上分析,要想让单片机流水灯流动起来,只需要依次给P1的赋值为0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F即可。

db19df63ca4475565e45023c6f970857.png

二、流水灯程序实现方法

      通过上面的分析,要实现流水灯效果,关键就是通程序按照0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F顺序改变P1口的状态。他的实现方法有以下几种:

1.通过C语言数据的数组实现

     数组(Array)是有序的元素序列。这里P1口的状态总共有8个,属于有限个类型相同的变量,用数组存放这些状态恰到好处。用数组实现的方法如下:

07431eb88d598e847ec63993828d2ce2.png

2.通过C语言移位操作实现

    P1端口的状态0xFE、0xFD…0x7F转化为二进制就是11111110、11111101…01111111,也就是0位即低电平是向左移动,状态没变化一次即0位往左移动一次。这样就可以用左移操作,其操作符为<<。大家需要注意,移位操作是针对二进制移位,针对本例来如果11111110左移一就变成11111100,第1位0移到了第2位,移动完了低位是补零的,这样就亮起了两个灯。只用一个移位操作还不行,这里还需要用到取反操作,取反操作也是针对二进制数的,取反操作符位~。比如11111110取反之后就是00000001。

     所以在采用移位操作实现流水灯时,我们先对00000001进行移位,以为之后再取反即可。移位操作实现流水灯的代码如下:

ea75577ecbf85e41d8572a0b73baeb14.png

3.通过内部库函数实现

     可以通过内部函数_cror_()实现循环右移功能,使P1端口在01111111、10111111…11111110之间变化,并且通过while循环语句重复执行,实现状态循环右移和延时,从而实现流水灯效果,流水灯实际运行效果:

ad9f8874c18e4cae7c149a53d35a24a3.png

      以上是我学习的时候,通过以上三种方式实现了流水灯,你还有别的方法吗?欢迎留言给出你的不一样的方法。最后欣赏一下流水灯的运行效果吧!条条大路通罗马---流水灯的多种实现方法 (qq.com)

 

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值