#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define LED_PORT PORTB
#define LED_DDR DDRB
#define BUTTON_PIN PIND
#define BUTTON_DDR DDRD
#define BUTTON_PORT PORTD
#define BUTTON PD2
volatile uint8_t speed = 100; // 初始速度
// 外部中断0服务程序
ISR(INT0_vect) {
// 每次按下按钮,速度增加50ms,最大不超过500ms
speed += 50;
if (speed > 500) {
speed = 100;
}
}
void init_interrupt() {
EICRA |= (1 << ISC01); // 设置INT0为下降沿触发
EIMSK |= (1 << INT0); // 使能INT0中断
sei(); // 使能全局中断
}
void init_ports() {
LED_DDR = 0xFF; // 设置PORTB为输出
LED_PORT = 0x00; // 初始关闭所有LED
BUTTON_DDR &= ~(1 << BUTTON); // 设置PD2为输入
BUTTON_PORT |= (1 << BUTTON); // 使能PD2上拉电阻
}
void flow_led() {
while (1) {
for (uint8_t i = 0; i < 8; i++) {
LED_PORT = (1 << i); // 点亮第i个LED
_delay_ms(speed); // 延时
}
}
}
int main(void) {
init_ports();
init_interrupt();
flow_led();
return 0;
}
|