В моем коде есть два прерывания, одно происходит из-за переполнения 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;
}
}
}
то, что я пытаюсь достичь с помощью своего кода, показано на следующем рисунке:
Когда я нажимаю одну из кнопок, начинается обратный отсчет, и светодиод загорается до тех пор, пока обратный отсчет не закончится, и если пользователь нажал кнопку, когда обратный отсчет еще не достиг 0, он начнется сначала, пока обратный отсчет снова не достигнет 0, затем светодиод должен погаснуть.
С чем я тут столкнулся, так это с тем, что прерывание от RBIE срабатывает только один раз, при втором нажатии на кнопку ничего не происходит.
Я не уверен, имеет ли TMR0F какое-то отношение к этому или нет, пробовал много вещей, но не смог заставить его работать.
Я надеюсь, что вы могли видеть то, что я не заметил, и помочь мне.
volatile
, поэтому ваш основной цикл не удосуживается их перезагрузить. - person user58697   schedule 21.01.2019