如果我们想要实现流水灯的效果,首先我们需要先让八个LED灯进入初始化状态,然后再让每一个灯按照规律依次亮起来,我们的初始化状态是0xfe,换算成二进制也就是(0为低电平点亮,1为高电平熄灭)先让最开始的一个灯亮起来,不然无法使用移位操作符。
接下来我们创建一个while循环,在循环里面让0xfe左移一位,以此类推,但是最终会发现不能实现流水灯的效果,因为这个左移操作符会持续向左把1变为0,但是第一个零和接下来的0都保持不变,依次循环一轮后全部都变成了0,也就是所有的灯都被点亮了,这个时候再左移也无济于事(如图所示,√为1,空格为0)
这个时候我们再次明确一下思路,我们需要做到的是:先让一个灯亮,然后按顺序依次点亮,点亮下一个的时候,把上一个熄灭,依次类推。那我们如何实现熄灭上一个呢?
我们采用逻辑门“或”,|的规则是有1为1,全0为0,(0xfd)和00000001(0x01)做比或门运算得到,你们可以试着在纸上写一下,很清楚。
这个时候可以发现,刚开始的LED一直会微微亮,这是因为左移操作符移位和“或”门时间会有差异,左移的时候为0,再被“或”为1,那么我们怎么解决这个?我们可以巧妙的用一个变量来代替P1,因为这些都只是对一串二进制数进行赋值,移位,逻辑门。并且移位和逻辑门目的都是为了变换,所以可以用变量达到效果(如图所示)。
根据上面的while循环,因为逻辑门的原因,最后会使所有的二进制数都变为1,移位不再起作用,我们就使用一个if判断语句来判断,如果P1等于全1,就跳出循环。
最后我们可以加上亿点适当的时间延迟,来让流水灯更加美观。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/4042.html