- 单片机C语言程序设计实训100例
- 彭伟编著
- 520字
- 2025-02-19 23:22:33
3.3 左右来回循环的流水灯
本例运行时,8只LED左右来回循环滚动点亮,产生来回走马灯效果。
本例电路如图3-3所示。

图3-3 左右来回循环的流水灯电路
程序设计调试与实训:
本例中的8只LED连接在P2端口,LED阳极连接P2,阴极通过限流电阻接地,对于P0端口,这样连接时任何LED都不会点亮,即使P0端口输出的是0xFF。
由于本例所有LED共阴连接,P2端口相应引脚输出1时,才会使相应LED点亮,为产生单个LED循环滚动效果,P2端口初值设为0x01(00000001),这会使第1只LED点亮,主程序中第1个for循环使其循环左移,依次为00000010,00000100,00001000,……直到变为10000000。第2个for循环使其循环右移,依次为01000000,00100000,00010000,……直到变为00000001如此重复。
另外,读者还要注意两个并列的for循环都只需要执行7次而不是8次。
调试本例后,读者可将LED改为共阳连接,重新修改程序,看能否实现同样的效果,同时,还可以在每次来回滚动显示后再添加全亮和全灭的闪烁效果。
源程序代码:
//----------------------------------------------------------------- // 名称: 8只LED左右来回点亮 //----------------------------------------------------------------- // 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动效果。 //----------------------------------------------------------------- #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int //----------------------------------------------------------------- // 延时 //----------------------------------------------------------------- void DelayMS(uint x) { uchar t; while(x--) { for(t = 0; t < 120; t++); } } //----------------------------------------------------------------- // 主程序 //----------------------------------------------------------------- void main() { uchar i; P2 = 0x01; while(1) { for (i = 0; i < 7; i++) { P2 = _crol_(P2,1); //P2端口向左循环移动1位 DelayMS(150); } for (i = 0; i < 7; i++) { P2 = _cror_(P2,1); //P2端口向右循环移动1位 DelayMS(150); } } }