用ICC编写的ATmega16的带中断的LED花样灯,用proteus仿真,按键不起作用

2025-04-30 09:11:25
推荐回答(2个)
回答1:

经运行实测:

原GICR  = 0x60;

改为

GICR  = 0x40;

运行成功。

不知是否解决你的问题,仔细核对查错,才能提高应用水平,没有捷径,祝你成功。

资料:摘自ATMEL数据手册

通用中断控制寄存器- GICR

• Bit 7 – INT1: 外部中断请求1 使能

当INT1 为'1’,而且状态寄存器SREG 的I 标志置位,相应的外部引脚中断就使能了。

MCU通用控制寄存器– MCUCR的中断敏感电平控制1位 1/0 (ISC11与ISC10)决定中断是

由上升沿、下降沿,还是INT1 电平触发的。只要使能,即使INT1 引脚被配置为输出,

只要引脚电平发生了相应的变化,中断将产生。

• Bit 6 – INT0: 外部中断请求 0 使能

当INT0 为'1’,而且状态寄存器SREG 的I 标志置位,相应的外部引脚中断就使能了。

MCU通用控制寄存器– MCUCR的中断敏感电平控制0位 1/0 (ISC01与ISC00)决定中断是

由上升沿、下降沿,还是INT0 电平触发的。只要使能,即使INT0 引脚被配置为输出

回答2:

许久没玩mega16了,也没装proteus。凭经验:楼主对照数据手册,检查以下内容:
1.port_init 端口初始化是否正确使能了GPIO功能,输入输出方向是否设对。
2.int0_init 这个中断初始化函数,请对照手册,看是否正确使能了PD2的IO口中断,有没有设置好触发方式,全局中断有没有打开,看门狗有没有关闭。
3.中断函数书写是否正确。
4.define button PIND2 这样定义后, if(button==0) 这种比较方式是不是正确的,看一下PIND2 在头文件中怎么定义的。
以上是我给你的查错思路。玩单片机,思路更重要。有什么问题再联系。