在我的代码中,我有两次中断,一次是由于TMR0的溢出引起的,另一次是当按下按钮时发生的。
这是MikroC中的代码:
int compt = 0;
int seconds = 10 ;
int enable = 0;
void interrupt(){
if (INTCON.INTF) {
PORTD = 9;
enable = 1;
seconds = 10;
INTCON.INTF = 0;
}
if (INTCON.TMR0IF) {
compt++;
INTCON.TMR0IF = 0;
TMR0 = 0x06;
}
}
void main() {
TRISB = 0x01;
PORTB = 0;
PORTD = 0;
TRISD = 0x00;
INTCON = 0xB0;
OPTION_REG = 0x44;
TMR0 = 0x06;
while(1){
if (compt == 625){
if (enable) seconds--;
compt = 0;
}
if (seconds > 0 && enable == 1) {
PORTD = seconds;
PORTB.RB1 = 1;
} else {
enable = 0;
PORTB.RB1 = 0;
PORTD = 0;
}
}
}
我要用代码实现的目标如下图所示:
当我按下其中一个按钮时,倒数开始,并且LED亮起直到倒数结束;如果用户在倒数仍未达到0的情况下按下按钮,则它将重新开始,直到倒数达到0再次,然后指示灯应该熄灭。
我在这里面对的是,RBIE的中断只能运行一次,第二次按下按钮时,什么也没有发生。
我不确定TMR0F是否与此有关,尝试了许多尝试,但无法使其正常工作。
我希望你能看到我没注意到的东西,并帮助我。
答案 0 :(得分:0)
发布的代码在使用MikroC进行编译时不会发出警告或错误。
该代码使用MLPAB v8.92中的模拟器运行,并且当使用模拟器激励来声明INT0中断时,每次都会对其进行正确处理。
您的电路图看起来像是使用Proteus创建的,也许该模拟器的工作方式存在问题。
我能找到的唯一可疑的设置是为PORTB启用了弱上拉功能,但是您的电路图在INT0(RB0)引脚中有一个10K欧姆的下拉电阻。
我建议将OPTION_REG的第8位设置为1,以关闭PORTB上拉电阻。
抱歉,我的回答还不确定,但是我无法从发布的信息中重现您的问题。
似乎也有人在StackExchange上问过这个问题。
答案 1 :(得分:0)
您已启用内部弱上拉电阻并在引脚 RB0 上连接下拉电阻,不需要外部电阻,您还需要在按下按钮后提供一些延迟(约 300 毫秒)。