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.

Klawiatura matrycowa 4x4 ARM

10 Mar 2008 22:04 2174 5
  • Poziom 12  
    Witam,

    Czy może ktoś napisał jakieś biblioteki pod STR912 obsługi takiej klawiatury lub podobnej??

    Z góry dziękuje za pomoc.
  • Specjalista - Mikrokontrolery
  • Poziom 22  
    no nie powiem ciut to dziwne, kiedys mialem taki kod na C51 jak znajde to wkleje

    dobra znalazlem ale niestety jest w asmie na C51 i pisalem to daaaawno temu wiec nie wypowiadamy sie na temat jego jakosci :p
    Code:
    Port  EQU P3            ;port przemiatania
    
       wynik  EQU R6            ;wynik
       Licz  EQU R5            ;licznik petli
       temp  EQU R4

    Stos SEGMENT IDATA              ;usunac po dolaczeniu do programu glownego !!!!!!!!
       RSEG Stos
       DS 8

    PUBLIC Start

    Klawiatura16 SEGMENT CODE
       RSEG Klawiatura16

    Start:                      ;zmienic po dolaczeniu do programu glownego !!!!!!!!
       MOV  SP,#Stos-1            ;dekrementacja stosu

    //   MOV   TMOD,#0001$0001b       ;licznik 1 w trybie tajmera odliczjacego 10ms
    tutu:
    ;-------- Przemiatanie klawiatury --------------------------------------
       MOV Licz,#4d
       MOV wynik,#0111$1111b       ;wedrujaca 0 = GND
    Tutaj:
       MOV A,wynik               ;przepisz do Acc
       RL A                  ;przesun w lewo
       MOV Port,A               ;wyslanie jedynki
       MOV wynik,A               ;zapamietaj kolumne
       NOP                     ;odczekaj chwilke ;-)
       NOP
       MOV A,Port               ;odczyt wartosci Portu
       ORL A,#0000$1111b         ;zanaskuj bity przemiatania = odczyt wiersza (moze nie konieczne)
       CJNE A,#255d,Out         ;jesli Acc <> 255 JMP Out
       DJNZ Licz,Tutaj

       MOV Wynik,#255            ;nie nacisnieto klawisza
       JMP Koniec
    ;-----------------------------------------------------------------------

    ;-------- Opracowanie wyniku -------------------------------------------
    Out:
       ANL A,wynik               ;wiersz OR kolumna(+wiersz?)
       MOV wynik,A               ;wynik  MSB = wiersz  LSB = kolumna
    ;-----------------------------------------------------------------------

    Koniec:
    MOV P1,wynik
    JMP tutu
       END
  • Poziom 12  
    Hmmm dopiero zaczynam z ARMem a jak kolega Freddie Chopin nie chce pomóc to niech zachowa uszczypliwe uwagi dla siebie. Wydaje mi się że ten portal powstał po to aby dzielić się wiedzą i doświadczeniem a nie wygłaszać bezsensowne docinki i dzięki temu powiększać sobie liczbę pkt na koncie. Jeżeli kolega Freddie Chopin chce sobie "ulżyć" to proponuję tą stronkę http://www.eit.coijak.pwr.wroc.pl/ <- chyba ją świetnie zna

    -----------------------------

    Dzięki za kod w asm ale mi bardziej chodzi o C.
  • Specjalista - Mikrokontrolery
    ice466 napisał:
    Hmmm dopiero zaczynam z ARMem a jak kolega Freddie Chopin nie chce pomóc to niech zachowa uszczypliwe uwagi dla siebie. Wydaje mi się że ten portal powstał po to aby dzielić się wiedzą i doświadczeniem a nie wygłaszać bezsensowne docinki i dzięki temu powiększać sobie liczbę pkt na koncie. Jeżeli kolega Freddie Chopin chce sobie "ulżyć" to proponuję tą stronkę http://www.eit.coijak.pwr.wroc.pl/ <- chyba ją świetnie zna

    to jest wlasnie przyklad uszczypliwego docinka, jestes w tym zdecydowanie lepszy odemnie. moze jak taki chojrak jestes, to sie na tamtym forum tez przedstawisz co? forum elektrody pewnie powstalo w celu pomocy, a nie wyreczania leni... jakbys zadal sobie troche trudu, to na pewno cos bys znalazl - kod na KAZDY procesor realizujacy odczyt z klawiatury matrycowej jest w 99% taki sam - roznia sie jedynie nazwy portow i rejestrow... zamiast tego - czekasz az ktos znajdzie go za ciebie. pozatym - co ty zaczales w ogole nauke uC od ARM9?

    http://www.google.com/

    chwila zabawy i kod sie znalazl:
    Code:

    #include <AT89X51.H>    //Include file for 8051
    #define keyport P2      //keypad connected to P2
    #define col1 P2_0       //column 1
    #define col2 P2_1       //column 2
    #define col3 P2_2       //column 3
    #define col4 P2_3       //column 4
    #define TRUE 1          //some defines
    #define FALSE 0

    /*
    +---------------------------------------+
    | Prototype: void key_init(void);       |
    | Return Type: void                     |
    | Arguments: None                       |
    | Description: Initialize ports and     |
    |              Keypad.                  |
    +---------------------------------------+
    */
    void key_init(){
            keyport &=0x0F; //make Rows as o/p and cols are i/p
    }

    /*
    +-----------------------------------------------+
    | Prototype: unsigned char get_key(void);       |
    | Return Type: unsigned char                    |
    | Arguments: None                               |
    | Description: To read key from the keypad      |
    +-----------------------------------------------+
    */
    unsigned char get_key(){
            unsigned char i,k,key=0;
            k=1;
            for(i=0;i<4;i++){               //loop for 4 rows
                    keyport &=~(0x80>>i);   //to make rows low 1 by 1
                            if(!col1){      //check if key1 is pressed
                                    key = k+0;      //set key number
                                    while(!col1);   //wait for release
                                    return key;     //return key number
                            }
                            if(!col2){      //check if key2 is pressed
                                    key = k+1;      //set key number
                                    while(!col2);   //wait for release
                                    return key;     //return key number
                            }
                            if(!col3){      //check if key3 is pressed
                                    key = k+2;      //set key number
                                    while(!col3);   //wait for release
                                    return key;     //return key number
                            }
                            if(!col4){      //check if key4 is pressed
                                    key = k+3;      //set key number
                                    while(!col4);   //wait for release
                                    return key;     //return key number
                            }
                    k+=4;                   //next row key number
                    keyport |= 0x80>>i;     //make the row high again
            }
            return FALSE;                   //return false if no key pressed
    }


    powyzszy kod jest beznadziejny, bo mozna wykorzystac proste petle zamiast takich dziwacznych warunkow - lepiej napisac to samemu. bedzie szybsze i krotsze...

    opis obslugi klawiatury matrycowej znajdziesz w 100 miejscach na tym forum i w 1000000 w necie. napisanie tego samemu to jest 10minut. no chyba ze nauke C tez zaczales od ARM9, ale wtedy to juz nic nie da sie zrobic.

    EDIT: punktow to ja mam tyle, ze jak chcesz, to moge ci dac troche, bo widac boli cie, ze masz malo. i tak nie sa mi do niczego potrzebne. ciekawa sprawa natomiast jest proporcja punktow do postow u mnie i u ciebie. pokazuje ona, kto bardziej dzieli sie wiedza i doswiadczeniem (nawet niewielkim!) a kto tylko bierze, a punkty ma tylko za ilosc postow.

    0x41 0x56 0x45!!
  • Poziom 12  
    Dzięki za kod miałeś racje sporo tego w necie jest. Widzę że się trochę zdenerwowałeś ale to i dobrze. Dobrze Ci to zrobi nie będziesz sie czuł za pewnie i człowiek który według Ciebie ma małe doświadczenie potrafi Ci powiedzieć parę szczerych słów. Mimo wszystko pozdrawiam serdecznie.