Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega 8535][C] Klawiatura matrycowa 4x5.

26 Gru 2010 02:35 1585 9
  • Poziom 8  
    Znow ja :P ogarnalem juz czemu mi przyciski na prawdziwym procku nie dzialaly to chce sie zabrac za to co mialem na mysli. Zbudowalem sobie klawiaturke 4x5, zasada dzialania taka ze na kolumne / wiersz wysyla sie sygnal i w zaleznosci od tego ktora kolumna / wierszem wroci to mozna ustalic pozycje klawisza :P.

    Problem jest po stronie programistycznej bo nie wiem zbytnio jak to napisac, logicznie wydaje mi sie ze wiem jak to powinno wygladac

    -ustawiamy 1(0?) na kolumnie1
    -sprawdzamy wiersze
    -zerujemy 1(0?) na kolumnie1
    ...
    powtarzamy dla innych kolumn, chodzi mi o wersje bez przerwan zeby sprawdzalo stan klawiszy caly czas (chyba ze jest metoda na to inna zeby proek nie tyral sie sprawdzajac to caly czas ale bez przerwan)

    Wiem ze na necie jest duzo gotowych kodow ale potrzebowal bym nie caly kod ale po krotce wytlumaczone dzialanie takiej petli sprawdzajacej. Z gory dzieki.
  • Poziom 32  
    Ja bym rozpoczął od deklaracjido których pinów bedzie podłaczona klawiatura, gdyż będzie to rzutowało na kod programu skoro chcesz aby sprawdzanie wykonywało sie jak najszybciej.
    Podłączylbym pod jeden port "wiersz" klawiatury 5 przewodów a kolumny pod drugi port. (4)
  • Poziom 8  
    No to jest oczywiste, planuję 4 wyjscia i 5 wejsc, nie wiem tylko jak zrobić sprawdzanie tego który przycisk jest wciśnięty programistycznie, bo logicznie to się wydaje wysylanie 1 na wyjscie i odczyt z wejsc i tak w petli, a nie wiem wiem jak to zapisac ani co wysylac dokladnie.

    Proszę poprawić pisownię.
    Robak
  • Poziom 32  
    Coś musisz zacząc pisać nikt ci tu gotowca nie da tym bardziej że to banalny programik.
  • Poziom 8  
    No prosty ale nie wiem jak sie za to zabrac

    chodzi mi po glowie cos takiego

    Code:

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


    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))




    int main(void)
    {
      sbi(DDRB,0);
      sbi(DDRB,1);

      while(1)
      {
       
         sbi(PORTB,0);

         if bit_is_set(PINC,PC0)
         {
          ... 
         }

         else if bit_is_set(PINC,PC1)
         {
         ...
         }

         cbi(PORTB,0);

         sbi(PORTB,1);
       
         if bit_is_set(PINC,PC0)
         {
         ... 
         }
       
         else if bit_is_set(PINC,PC1)
         {
         ...
         }
         cbi(PORTB,1);

       }
       
       
    }




    przyklad dla 2x2 (tylko takie zeby zrozumiec dzialanie, PB0,1 wysylaja 1 na kolumne, wiersze PC0, 1 zczytuja) dobrze mysle ?
  • Poziom 27  
    Tak to skonsumujesz całą pamięć procesora na program dla większej ilości przycisków.
    Musisz zrobić ten układ w pętlach.
    Zadeklaruj sobie tablicę 2 wymiarową i zrób 2 pętle.
    Pierwsza pętla będzie przemiatać wiersze, druga kolumny.
    Wystarczy w środku dać jeden warunek i wpisywać wartości do tablicy.
  • Poziom 17  
    Idea jest zawsze taka sama, bez wzgledu na procesor. Jezeli Verengard nie uzywa zadnego OSa to moze zrobic to na przerwaniu od timera.
  • Poziom 27  
    Proponuje zrobić ci coś w ten deseń:
    Kolumny byłyby np na porcie A.
    Wiersze natomiast na porcie B.

    Code:
    DDRA=0xff;
    
    DDRB=0x00;
    PORTA=oxff;
    PORTB=0x00;
    char przycisk=0;
    char wcisnieto=0;

    for(kolumna=1;kolumna<6;kolumna++)
    for(wiersz=6;wiersz<6;wiersz++);
    {
    PORTA=0;
    PORTA|=(1<< kolumna);
    delay_ms(1);
    if PINB&(1<<wiersz)  {wcisnieto++; przycisk=10*kolumna+wiersz;}
    }

    ilość wciśniętych klawiszy masz w zmiennej "wciśnięto"
    Przycisk który został wciśnięty masz w zmiennej przycisk.
    Przykładowo :Przycisk = 45 => nacisnieto w 4 kolumnie 5 przycisk.
    Na liniach wierszy należałoby dać rezystory do masy powiedzmy około 1K .
    To jest kod napisany na sucho , bez sprawdzenia więc musisz go tylko oszlifować.
    Warto dodać if aby przy wciśnięciu więcej niż 1 przycisku nie czytać klawiatury.