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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.