logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Matryca 4x4 na ATMEGA8. W klawiaturze działa tylko jeden wiersz.

jarekz90 09 Sie 2011 15:38 1032 2
REKLAMA
  • #1 9807387
    jarekz90
    Poziom 13  
    Witam ostatnio postanowiłem wykonać prototyp klawiaturki 4x4 i mam problem z programem. Dzieją się dziwne rzeczy oto kod:
    uint16_t klawiatura(void)
    {
    	volatile uint16_t klaw=0;
    
    	CLEAR_W1;  			//stan niski na wierszy pierwszym i odczytujemy po kolei kolumny
    	asm volatile("nop");
    	klaw=(STAN_A?0:1) + (STAN_B?0:2) + (STAN_C?0:4) + (STAN_D?0:8);
    	SET_W1;
    
    	CLEAR_W2;
    	asm volatile("nop");
    	klaw=(STAN_A?0:16) + (STAN_B?0:32) + (STAN_C?0:64) + (STAN_D?0:128);
    	SET_W2;
    
    	CLEAR_W3;
    	asm volatile("nop");
    	klaw=(STAN_A?0:256) + (STAN_B?0:512) + (STAN_C?0:1024) + (STAN_D?0:2048);
    	SET_W3;
    
    	CLEAR_W4;
    	asm volatile("nop");
    	klaw=(STAN_A?0:4096) + (STAN_B?0:8192) + (STAN_C?0:16384) + (STAN_D?0:32768);
    	SET_W4;
    	return klaw;
    }



    Klawiatura ma 4 wiersze W1,W2,W3,W4 oraz 4 kolumny A,B,C,D.
    Problem polega na tym, że działa tylko 4 wiersz (W4) , jak go wy komentuje to działa tylko wiersz 3 itd, więc działa tylko to co jest na końcu programu, nie rozumiem dlaczego tak się dzieje. Proszę o jakieś wskazówki.
  • REKLAMA
  • Pomocny post
    #2 9807446
    piotrva
    VIP Zasłużony dla elektroda
    Bo cały czas dajesz klaw=, co powoduje nadpisanie wartości zmiennej i jeśli wszystko jest w ostatnim wierszu na 0 to zmienna niezależnie od tego co się dzieje wcześniej ma wartość zero.
    Poza tym nie musi być ona opatrzona atrybutem volatile. Wystarczy, że dasz jej na początek wartość 0, a potem zamienisz klaw= na klaw +=
  • #3 9807465
    jarekz90
    Poziom 13  
    Ah :) racja! dziękuje problem rozwiązany.
REKLAMA