LED连接在P0口,按键连接在P3.4到P3.7。以下是一个按键控制流水灯的程序示例,
您可以根据实际的IO口配置进行调整。
```c
#include <reg51.h>
#define LED P0 // LED连接在P0口
#define KEY_PORT P3 // 按键连接在P3.4到P3.7
unsigned char scan_key() {
unsigned char key_value = 0xFF;
KEY_PORT = 0xF0; // 设置P3.4到P3.7为高电平
_nop_(); // 延时,确保稳定
key_value = KEY_PORT; // 读取按键状态
KEY_PORT = 0xFF; // 恢复P3.4到P3.7为高电平
return key_value;
}
void delay(unsigned int ms) {
unsigned int i, j;
for (i = ms; i > 0; i--)
for (j = 110; j > 0; j--);
}
void main() {
unsigned char pattern = 0x01; // 初始LED模式
LED = 0xFF; // 初始LED全部关闭
while (1) {
unsigned char key = scan_key();
if (key != 0xFF) { // 如果有按键被按下
delay(20); // 消抖
key = scan_key(); // 再次读取按键状态
if (key != 0xFF) { // 确认按键确实被按下
pattern = pattern << 1; // 左移LED模式
if (pattern == 0x00) pattern = 0x01; // 如果所有LED都亮过了,重新开始
LED = ~pattern; // 更新LED状态
while (key != 0xFF); // 等待按键释放
}
}
}
}
```
### 程序说明:
1. **定义LED和按键**:LED连接在P0口,按键连接在P3.4到P3.7。
2. **按键扫描函数**:`scan_key`函数用于扫描按键状态。
3. **延迟函数**:用于按键消抖和LED闪烁的延迟。
4. **主函数**:
- 初始化LED全部关闭。
- 循环检测按键状态,如果按键被按下,则左移LED模式。
- 使用位操作来控制LED的亮灭。
- 等待按键释放,避免重复触发。
|