Моделирование PIC16F877A с помощью порта сброса неисправности MPLAB XC8 с помощью кнопки pu sh - PullRequest
0 голосов
/ 05 мая 2020
void main(void) { 

    TRISB=0x07; 
    PORTB=0x00; 
    TRISD=0x00; 
    PORTD=0x00;  

    while(1) 
    { 
        if(RB0)  // when RB0 is high
        { 
            __delay_ms(100);
            PORTD++;    // PORTD increments, PORTD outputs to a LED
            __delay_ms(100); 
        } 

        if(RB2) //when RB2 is high
        {
            __delay_ms(100);
            PORTD = 0x00; // reset PORTD to 0
            break;
        } 
    } 

} 

Я использую приведенный выше код, пытаясь сбросить PORTD, когда RB2 становится высоким. Я установил свой стимул в MPLAB на отправку сигнала с высоким импульсом 20 мс на RD0 или RD2 при нажатии, и наблюдаю за значением SFR PORTD.

RD2 должен сбрасывать PORTD при установке высокого уровня, но когда я наблюдаю, как значение SFR PORTD, PORTD всегда сначала увеличивается, а затем переходит в 0 при втором щелчке.

Итак, предположим, что значение SFR PORTD равно 3, когда RB0 высокий, PORTD увеличивается до 4, когда RD2 высокий, он должен go вернуться к нулю, но вместо этого переходит к 5, а затем переходит к нулю, если RD2 снова становится высоким.

Как мне изменить свой код, чтобы RD2 сбрасывал PORTD немедленно?

1 Ответ

0 голосов
/ 09 июля 2020
if(RB0) // when RB0 is high 
{ 
   PORTD++; //Post increment 
}


if(RB2) //when RB2 is high
{
    
    PORTD = 0x00; 
    // Since ypu used post increment first PORTD will increment by 1 and then 
    it will be assigned 0
  
} 

Как мне изменить свой код так, чтобы RD2 немедленно сбрасывал PORTD?

решение: используйте предварительное приращение или PORTD = PORTD + 1;

...