# C51单片机8个LED灯按键下移点亮程序 以下是使用C51单片机控制8个LED灯,通过按键每次向下移动点亮一位的完整程序: ```c #include <reg51.h> // 包含51单片机头文件 #define LED_PORT P1 // 定义LED连接的端口 #define KEY P3_2 // 定义按键连接的引脚(P3.2) unsigned char led_pattern = 0x01; // 初始点亮第一个LED(0000 0001) bit key_flag = 0; // 按键标志位 void delay_ms(unsigned int ms) { unsigned int i, j; for(i=0; i<ms; i++) for(j=0; j<120; j++); } void main() { LED_PORT = ~led_pattern; // 初始状态,点亮第一个LED(取反因为共阳) while(1) { if(KEY == 0) { // 检测按键是否按下 delay_ms(10); // 消抖延时 if(KEY == 0) { // 再次确认按键按下 key_flag = 1; // 设置按键标志 } while(!KEY); // 等待按键释放 delay_ms(10); // 消抖延时 } if(key_flag) { // 如果按键有效 key_flag = 0; // 清除按键标志 // LED模式向下移动一位 if(led_pattern == 0x80) { // 如果已经到最下面一个LED led_pattern = 0x01; // 回到第一个LED } else { led_pattern <<= 1; // 否则左移一位 } LED_PORT = ~led_pattern; // 更新LED显示 } } } ``` ## 程序说明 1. 硬件连接: - 8个LED连接到P1端口(共阳接法,低电平点亮) - 按键连接到P3.2引脚(按下为低电平) 2. 工作原理: - 初始状态点亮第一个LED(P1.0) - 每次按下按键,点亮位置向下移动一位 - 到达最后一个LED(P1.7)后,回到第一个LED 3. 按键处理: - 包含消抖处理(延时检测) - 使用标志位避免按键长按多次触发 4. LED控制: - 使用位操作实现LED位置移动 - 对P1端口取反输出(因为共阳接法) ## 注意事项 1. 如果使用共阴接法,需要去掉LED_PORT赋值时的取反操作(~) 2. 按键消抖时间可以根据实际硬件调整,10ms是常用值 3. 程序默认使用P1口控制LED,P3.2作为按键输入,可根据实际电路修改 [2025-04-26 10:42:50 | AI写代码神器 | 634点数解答]