打印
[应用相关]

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

[复制链接]
4245|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-4-8 10:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
学习单片机,流水灯项目必做的一个项目,可以说是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即可。



二、流水灯程序实现方法

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

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

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



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

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

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



3.通过内部库函数实现

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



      以上是我学习的时候,通过以上三种方式实现了流水灯,你还有别的方法吗?
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/chanchairen/article/details/127459795

使用特权

评论回复
沙发
EmmaTT| | 2024-4-8 15:10 | 只看该作者
我都是用for的,这些内置函数太多记不住

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1931

主题

15650

帖子

12

粉丝