以下是使用 C 语言实现上述功能的示例代码: ```c #include <reg51.h> // 包含 51 单片机的头文件 unsigned char count = 0; // 记录按键触发次数 unsigned char mode = 0; // 模式标志 void delay(unsigned int t) // 延时函数 { unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 125; j++); } void main() { P1 = 0xFF; // 初始时所有 LED 熄灭 TMOD = 0x01; // 定时器 0 工作在模式 1 TH0 = (65536 - 50000) / 256; // 50ms 定时 TL0 = (65536 - 50000) % 256; TR0 = 1; // 启动定时器 0 while (1) { if (TF0 == 1) // 定时时间到 { TF0 = 0; TH0 = (65536 - 50000) / 256; TL0 = (65536 - 50000) % 256; if (P3_4 == 0) // 检测按键按下 { delay(10); // 消抖 if (P3_4 == 0) { count++; if (count == 5) // 触发 5 次 { count = 0; mode++; if (mode == 3) // 循环 3 种模式 mode = 0; } } } switch (mode) { case 0: // 从右到左流水 P1 = _crol_(P1, 1); break; case 1: // 从左到右流水 P1 = _cror_(P1, 1); break; case 2: // 两侧向内再流回外侧 if (P1 == 0x7F) // 两侧向内 P1 = 0xFE; else if (P1 == 0xFE) // 流回外侧 P1 = 0x7F; else P1 = (P1 << 1) | (P1 >> 1); break; } } } } ``` 额外需要注意的逻辑点: 1. 注意定时器的初值设置,以保证定时精度。 2. 消抖处理时,延时时间要适当,避免误触发。 3. 代码中的模式切换逻辑要清晰,确保各种模式的正常切换。 [2025-04-03 10:56:05 | AI写代码神器 | 692点数解答]