主程序实现依次左移循环形式,开关K按下实现外部中断请求,中断服务程序的功能是让8个led同时闪烁2次,中断返回后,主程序回复现场,任然左移循环的代码
时间: 2024-10-09 16:14:01 浏览: 42
端口控制 跑马灯.rar_4个led循环闪烁_countypn_实现4个跑马灯_端口速度led_跑马灯p2端口
在传统的单片机系统中,比如使用51系列的MCU,要实现这样的功能,通常会按照以下步骤编写:
1. **主程序结构**:
- 首先,主程序会初始化LED、定时器以及外部中断相关的寄存器,设置定时器定时一定周期(比如每次左移一次所需的时间)。
```c
void main() {
init_GPIO(); // 初始化GPIO口
set_Timer(); // 设置定时器
while (1) { // 循环左移
left_shift(); // 执行左移操作
if (key_pressed(K)) { // 判断开关是否按下
enable_INT(); // 开启中断
}
}
}
```
2. **左移循环**:
- `left_shift()`函数负责LED的逐位左移,并处理定时中断。
```c
void left_shift() {
for (int i = 0; i < 8; ++i) {
// LED左移操作
shift_LED(i);
}
disable_INT(); // 中断结束后关闭中断
wait_for_Timer(); // 等待下一次中断
}
```
3. **中断服务程序(ISR)**:
- 当`K`键按下并触发中断时,会被ISR捕获。
```c
ISR(void) interrupt KEY_PIN { // KEY_PIN是按键对应的中断入口
led_flashing(8); // 调用函数让所有LED闪烁两次
disable_INT(); // 中断结束后关闭中断
resume_Main(); // 恢复主程序上下文
}
```
4. **相关辅助函数**:
- `init_GPIO()`用于配置GPIO口作为输入输出模式。
- `set_Timer()`设置定时器周期和中断标志。
- `key_pressed(K)`检查开关的状态。
- `enable_INT()`, `disable_INT()`控制中断的开启和关闭。
- `shift_LED()`, `led_flashing(8)`分别执行LED的单步移动和连续闪烁。
阅读全文