首先,什么是流水灯无非就是1号灯亮,其他灭,2号灯亮其他灭......循环到尾返回头。这里我假设用P2口接的LED灯,你们根据自己LED接的IO口,自己注意修改
开始写程序,前面不再细说写入一个1MS延时程序在#include
在主函数内,写入P2=0xfe;while(1)内,写入P2=_cror_(P2,1);//是逗号不是小数点delay(5);OK,这样的程序烧录进去,你就会看到循环右移的流水灯效果了如果你们的P2是共阴极的话,那应该改为P2=0x01;
这里说明下_cror_(P2,1)这个指令的意思_cror_(P2,1)是循环右移指令,后面的1表示右移多少位比如P2是0xfe也就是1111 1110那么循环右移1位后,就是0111 1111再循环右移就是1011 1111 再来就是1101 1111 一直循环下去那显示的效果,不就是1个亮过1个吗?如果你想循环左移呢?那就把_cror_ 改为_crol_就可以了_crol_就是循环左移指令
那假如你想一次亮2个,移动2个呢那把P2赋值为0xfc也就是1111 1100当然,你不一定要16进制,你也可以直接P2=11111100;这样也是可以的然后循环左移_crol_(P2,2);这样就可以实现循环移动2位了
那如果你不想用循环左移呢?那也是可以的,用普通左移指令“<<”左移指令和循环左移有一些区别,在这里说下比方P2=0xfe>>1;那么,结果P2是等于0111 1111再左移,P2=0011 1111 再左移 0001 1111左移指令,是直接把最高位补0,把最低位扔掉这样说应该明白吧?右移指令>>也是同个道理
那么怎么做成流水灯效果呢?如下图,我相信聪明的朋友能看明白的不明白的,也用着急学习这个,慢慢来,先照上面的循环左移测试
应该研究 左移跟循环左移的区别