- #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;
- }
|