Skocz do zawartości

[C] Nie rozumiem kodu z kursu


l3cho

Pomocna odpowiedź

Witam

Mam problem ze zrozumieniem kodu z kursu C, poniżej zamieszczam cały kod wraz z komentarzami dotyczącymi fragmentu kodu, którego nie rozumiem:

/* przykład 2.6 "leds6.c */
/* 8 diod LED przłączonych do portu D */
/* 2 przycisk przyłączone do PC0,PC1 */
/* Buzzer z generatorem przyłączony do PB1*/
/* ATmega 1MHz */

#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
 /* Wszystkie linie portu D będą wyjściami */
 DDRD = 0xff;
 /* PB1 wyjście - buzzer z generatorem */
 DDRB = 0x02;
 /* PC0,PC1 będą wejściami z podciągnięciem do VCC */
 DDRC  = 0x00;
 PORTC = 0x03;

 /* Początek nieskończonej pętli */
 while(1)
 {
   /* Jeśli pierwszy przycisk wciśnięty */
   if(!(PINC & 0x01))
   {
     /*!!!!!!!!!!!!!!!!!!!!!!!!! PROSZĘ O WYTŁUMACZENIE TEGO FRAGMENU */
     if(!PORTD)
     {
       PORTB |= 0x02;
       _delay_ms(100);
       PORTB &= ~0x02;[/b]
     }
     else
       PORTD >>= 1;
    /*!!!!!!!!!!!!!!!!!!!!!!!!!  KONIEC FRAGMENTU */

     /* Opóżnienie, aż drgania na stykach przycisku ustaną */
      _delay_ms(80);
     /* Oczekiwanie na zwolnienie przycisku */
     while(!(PINC & 0x01)) {}
     /* Opóżnienie, aż drgania na stykach przycisku ustaną */
      _delay_ms(80);
   }
   /* Jeśli drugi przycisk wciśnięty */
   if(!(PINC & 0x02))
   {
     / *!!!!!!!!!!!!!!!!!!!!!!!!! PROSZĘ O WYTŁUMACZENIE TEGO FRAGMENU */
     if(PORTD & 0X80)
     {
       PORTB |= 0x02;
       _delay_ms(100);
       PORTB &= ~0x02;
     }
     else
     {
       PORTD <<= 1;
       PORTD |= 1;
     }
    /* !!!!!!!!!!!!!!!!!!!!!!!!! KONIEC FRAGMENTU */
     /* Opóźnienie, aż drgania na stykach przycisku ustaną */
     _delay_ms(80);
     /* Oczekiwanie na zwolnienie przycisku */
     while(!(PINC & 0x02)) {}
     /* Opóżnienie, aż drgania na stykach przycisku ustaną */
     _delay_ms(80);
   }
 }
}

Pozdrawiam.

Link do komentarza
Share on other sites

Myśle że chodzi ci o te if'y bo na pierwszy rzut oka mogą być dezorientujące.

if(!PORTD) 
     { 
       PORTB |= 0x02; 
       _delay_ms(100); 
       PORTB &= ~0x02;[/b] 
     } 
     else 
       PORTD >>= 1;

chodzi tu oto, że jeśli PORTD ma wartość 0 (żadna dioda się nie świeci) i wykona się kod w klamrze jeśli co najmiej jedna dioda będzie zapalona wykona się instrukcja po else

If działa na tej zasadzie że jeśli jest spełniony warunek to wykona daną instrukcje(ciąg instrukcji). W jezyku C niema rozróżnienia na zmienne liczbowe i zmienne logiczne (np bool w pascalu) i jeśli zmienna przyjmuje wartość 0 to jest traktowana jako fałsz/nieprawda (w przypadku instrukcji warunkowych) natomiast jeśli zmienna przyjmuje wartość zmiennej jest różna od zera to jest traktowana jako prawda

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.