第 2 篇流水灯——从 1 个 LED 到 8 个 LED上一篇你点亮了 1 个 LED。这篇来点好玩的——8 个 LED 排队跑起来。1. 硬件连接把 8 个 LED 的负极分别接到 P1.0 ~ P1.7每个 LED 的正极通过 220Ω 电阻接 VCC。VCC ── 220Ω ── LED0 ── P1.0 VCC ── 220Ω ── LED1 ── P1.1 VCC ── 220Ω ── LED2 ── P1.2 ... VCC ── 220Ω ── LED7 ── P1.72. 位操作——sbit 关键字sbit LED0P1^0;// 把 P1.0 这个引脚命名为 LED0sbit LED1P1^1;sbit LED2P1^2;// ... 以此类推// 现在你可以单独控制每个 LEDLED00;// P1.0 输出低电平 → LED0 亮LED01;// P1.0 输出高电平 → LED0 灭3. 单灯左移流水灯#includereg52.hvoiddelay(unsignedintms){unsignedinti,j;for(ims;i0;i--)for(j120;j0;j--);}voidmain(){unsignedcharled0xFE;// 1111 1110 → 只有 P1.0 亮while(1){P1led;delay(200);// 左移一位led(led1)|0x01;// 0xFE 1 0xFC → 1111 1100// 0xFC | 0x01 0xFD → 1111 1101// 效果亮的那个灯往左移动一个位置if(led0xFF)// 移到最左边了led0xFE;// 回到最右边重新开始}}4. 更多流水灯特效来回流水灯乒乓灯unsignedcharled0xFE;chardir1;// 1 左移, -1 右移while(1){P1led;delay(100);if(led0x7F)dir-1;// 碰到最左边回头if(led0xFE)dir1;// 碰到最右边回头if(dir1)led(led1)|0x01;// 左移elseled(led1)|0x80;// 右移}跑马灯4 个灯一起跑unsignedcharled0xF0;// 高 4 位亮低 4 位灭 → 1111 0000while(1){P1led;delay(200);led~led;// 取反 → 0000 1111 → 低 4 位亮高 4 位灭// 再取反 → 1111 0000 → ... 来回交替}5. 用数组存花样——更优雅的写法unsignedcharcode patterns[]{0xFE,0xFD,0xFB,0xF7,// 单灯右移0xEF,0xDF,0xBF,0x7F,0x7F,0xBF,0xDF,0xEF,// 单灯左移回0xF7,0xFB,0xFD,0xFE,0x00,0xFF,0x00,0xFF,// 全亮全灭 ×2};voidmain(){unsignedchari;while(1){for(i0;isizeof(patterns);i){P1patterns[i];delay(150);}}}code关键字把数组存到 Flash程序存储器不占用宝贵的 512 字节 RAM。6. 知识点总结sbit让一个引脚变成一个变量名操作更直观和是左移/右移运算符流水灯的核心~是按位取反0 变 1、1 变 0code关键字把常量存 Flash省 RAM用数组存花样代码简洁漂亮下一篇按键——让单片机听话下一篇按键——让单片机听话