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

[DSM-51] Klawiatura sekwencyjna, a wyswietlacz 7-segmentowy

domininLatex 25 Sty 2006 17:14 5252 8
  • #1 25 Sty 2006 17:14
    domininLatex
    Poziom 10  

    Witam, próbuje napisać mały program, który reagowałby na wciśnięcie poszczególnych klawiszy na klawiaturze sekwencyjnej a następnie podejmował akcje na wyświetlaczu 7-segmentowym, jednak nie wiem jak odwoływać się do poszczególnych klawiszy, tzn. potrafie jedynie napisać program, który reaguje na jakiekolwiek naciśnięcie, lecz nie rozróżnia, który klawisz został wciśnięty, docelowo chciałbym napisać program, dzięki któremu mógłbym przesuwać zapalony segment na wyświetlaczu za pomocą strzałek. Korzystam z książki Gałki „Podstawy programowania mikrokontrolera 8051” jednak po 3 prostych przykładach z diodą następuje skomplikowany według mnie przykład, który ciężko ogarnąć początkującemu adeptowi. Gdyby ktoś mógł mi w jakiś sposób przybliżyć to zagadnienie to byłbym bardzo wdzięczny, może macie jakiś nieskomplikowany przykład, którym moglibyście się podzielić to też nie pogardze.
    PS. Szukałem na googlach, oraz na P2P, przejrzałem też kilka ebooków, ale nie znalazłem nic w tym temacie. Natknąłem się jedynie na jakieś wzmianki, że istnieje coś takiego jak klawiatura sekwencyjna, ale bez przykładów jej użycia. Pozdrawiam

    0 8
  • #2 25 Sty 2006 19:53
    jacobsek
    Poziom 22  

    Witam.
    Jeśli chodzi o klawiaturę połączoną w matrycę, np.4x4 to sposób jest prosty.
    Należy na cztery linie wyprowadzone z klawiatury (nazwijmy je liniami) podawać po kolei niski stan logiczny i odczytywać cały czas stan pozostałych czterech wyprowadzeń (nazwijmy je wiersze).
    Procedura jest prosta, jeśli wykrywamy stan niski na wierszu np.2 a w tym czasie w sekwencji panuje stan niski na linii np.1 to musi być wciśnięty jeden z klawiszy linii 1 i wiersza 2, w programie przypisujemy wtedy jego wartość do jakiejś zmiennej i działa.
    Zalecane jest dwukrotne zbadanie stanu wciśnięcia klawisza w odstępi ok.20-25 ms aby wyeliminować ewentualne drgania styków.
    Powodzenia.
    A, jeszcze jedno, celowe jest powiązanie podawania stanu niskiego na linie w powiązaniu z podawaniem stanu niskiego na katody ledów, wtedy zaoszczędzamy porty procka bo podpinamy się z liniami pod katody ledów.
    Powodzenia

    1
  • #3 25 Sty 2006 21:00
    GienekS
    Poziom 32  

    Jeszcze zasugerowałbym klawisze podłączyć przez diody aby uniknąć różnych nieprzyjemnych efektów kiedy wciśnie się więcej niż jeden klawisz.

    0
  • #4 25 Sty 2006 21:24
    domininLatex
    Poziom 10  

    Dzięki za odpowiedź muszę jednak przyznać, że niewiele mi to mówi : ( może dodam, że korzystam z symulatora takowego systemu, w którym znajduje się klawiatura sekwencyjna oraz wyświetlacz 7-segmentowy i „jagoda” się zowie. Chodzi mi bardziej o stronę asseblerowską tego zagadnienia, a najlepiej do mnie przemawiają fragmenty kodów ; D Nie mniej jednak dziękuje za odzew i licze na więcej ; D

    0
  • Pomocny post
    #5 26 Sty 2006 08:18
    jacobsek
    Poziom 22  

    W załączniku jest sposób połączenia klawiatury matycowej którą zapeane posiadasz.
    Zadanie polega na tym aby sekwencyjnie czyli po kolei podawać stan niski począwszy od L1 a skończywszy na L3, i tak w kółko, na raz tylko jedna linia powinna być w stanie niskim.W1-W3 trzeba przy tym kontrolować cały czas,jeśli teraz wykryty zostanie stan niski np. na W2 w czasie gdy linia L1 jest w stanie niskim to oznacza że wciśnięty został przycisk drugi od góry po lewj stronie( w przypadku tego schematu).
    Liczba linii i wierszy jest zależna od konstrukcji klawiaturki.
    Jeśli teraz L1-L3 podłaczysz do katod wyświetlaczy(poprzez diody, jak słusznie kolega zauważył) to uzyskasz "przemiatanie" stanem niskim linii L1-L3 samoistnie z częstotliwością multipleksowania wyświetlaczy, no chyba że jest tylko jeden wtedy trzeba to przemiatanie zrobić programowo na procku.
    W asm nie pomogę bo piszę na razie tylko w bascomie, stawiam pierwsze kroki.

    0
  • Pomocny post
    #6 26 Sty 2006 10:20
    maxiu25
    Poziom 16  

    zaluzmy ze klawiatura jest podlaczona pod p1 w1-w2-w3-w4 pod p1.0 do p1.3 a l1-l4 pod p1.4-p1.7
    ja ustawil bym
    mov p1,0xf0;
    mov r0,p1;
    mov p1,0x0f;
    mov r1,p1;
    add r0,r1; dodaj r0+r1
    w r0 masz teraz kod przycisnietego przycisku jezeli beda same 11111111 to nic nie bylo wcisniete
    wyeliminuj drgania styków np przez kilku krotne sprawdzenie wcisnietego przycisku
    zera wskarza kod przycisku np. 11011101
    nie pamietam czy add to dodawanie bo teraz pisze programy w c

    0
  • #7 26 Sty 2006 17:36
    domininLatex
    Poziom 10  

    Zamieszczam tutaj kod zrodlowy programu z ksiazki, gdzie wyswietlacz 7-segmentowy obslugiwany jest za pomoca klawiatury sekwencyjnej. Jak dla mnie jest on za bardzo skomplikowany tzn. rozumiem ogolna zasade dzialania jednak nie jestem w stanie na tej podstawie napisac wlasnego programu obslugujacego poszczegolne klawisze klawiatury sekwencyjnej. Moze ktos z was bylby w stanie utworzyc najprostszy program obslugujacy 2 klawisze ktore po nacisnieciu zapalaja 2 rozne segmenty na wyswietlaczu bym w ten sposob mogl pojac zasade dzialania, a o to wspomniany kod zrodlowy:

    Code:

    SEG_ON       EQU P1.6 ;wlaczenie wyswietlacza 7-segm.
    LED      EQU P1.7
    KEY      EQU 0B5h ;odczyt klawiatury

    ;Pamiec wewnetrzna RAM
    DISPLAY    EQU 30H
    KEY_LAST   EQU DISPLAY+6

    LJMP    START
    ORG    100H

    START:
       CLR   A      
       MOV    DISPLAY,A   ;wpisz 0 do pamieci
       MOV    DISPLAY+1,A   ;danych wszystkich
       MOV   DISPLAY+2,A   ;wskaznikow
       MOV    DISPLAY+3,A
       MOV    DISPLAY+4,A
       MOV    DISPLAY+5,A
       MOV    DISPLAY+6,A

    LOOP_DISP:         ;ustaw dane do wyswietlania
                ;na wskazniku 1
       MOV   R0,#DISPLAY   ;adres pobierania kodow
       MOV   R2,#7      ;licznik - liczba wskaz.
       MOV   R3,#00000001B   ;wybor wskaznika
                ; - kod 1 z 8

    LOOP:
       SETB    SEG_ON      ;wylacz poprzedni
                ;wskaznik
       MOV   R1,#CSDS   ;adres wyboru wskaznika
       MOV   A,R3      ;nr wskaznika (1 z 8)
       MOVX   @R1,A      ;wpisz wybrany wskaznik

       MOV   R1,#CSDB   ;adres danych wskaznika
       MOV   A,@R0      ;dane wskaznika
       CJNE   R3,#01000000B,SEG   ;czy 7 wskaznik
       SJMP    LEDS      ;tak - diody swiecace
                ; nie ma zamiany na kod
    SEG:   
       LCALL   GET_COD7   ;zamiana cyfr na kod
    LEDS:
       MOVX   @R1,A      ;wpisanie kodu zapalanych




                ;segmentow do buforu
                ;danych wskaznika

       CLR   SEG_ON      ;wlaczenie wskaznika

       MOV   C,KEY      ;wstepny odczyt klawisza
       MOV   A,#1      ;odczekanie 1ms - swiecenie
       LCALL   DELAY_MS   ;jednego wskaznika

       JC   KEY_ON      ;kontrola jednoznacznosci
       JB   KEY,KEY_END   ;odczytu klawisza

    KEY_OFF:
       MOV    A,R3      ;klawisz zwolniony
       CPL   A
       ANL   KEY_LAST,A   ;zeruj odpowiedni bit
       SJMP   KEY_END

    KEY_ON:
       JNB   KEY,KEY_END
       MOV   A,R3      ;klawisz nacisniety
       ANL   A,KEY_LAST
       JNZ   KEY_END      ;klawisz byl nacisniety
                ;bez reakcji

       MOV   A,R3      ;klawisz byl zwolniony
       ORL   KEY_LAST,A   ;ustaw odpowiedni bit
       INC   @R0      ;zwieksz licznik
                ;nacisniec - liczbe na
                ;odpowiednim wskazniku
    KEY_END:
       MOV   A,R3
       RL   A      ;numer nastepnego
       MOV   R3,A      ;wskaznika (kod 1 z 8)
       INC   R0      ;adres danych nastepnego
                ;wskaznika
       DJNZ   R2,LOOP      ;kolejne swiecenie
                ;siedmiu wskaznikow
       SJMP    LOOP_DISP   ;zacznij od wskaznika 1

    ;Podprogram zamienia cyfre na kod 7-segmentowy
    GET_COD7:
       ANL   A,#0FH   ;tabela kodow 0..15
       INC   A   ;pomin rozkaz RET
       MOVC   A,@A+PC   ;pobierz kod
       RET

    COD_7SEG:
       DB   03FH   ;kod znaku 0
       DB   006H   ;kod znaku 1
       DB   05BH   ;kod znaku 2
       DB   04FH   ;kod znaku 3
       DB   066H   ;kod znaku 4
       DB   06DH   ;kod znaku 5
       DB   07DH   ;kod znaku 6
       DB   007H   ;kod znaku 7
       DB   07FH   ;kod znaku 8
       DB   06FH   ;kod znaku 9
       DB   077H   ;kod znaku A
       DB   07CH   ;kod znaku b
       DB   039H   ;kod znaku C
       DB   05EH   ;kod znaku d
       DB   079H   ;kod znaku E
       DB   071H   ;kod znaku F

    0
  • #8 27 Sty 2006 13:05
    domininLatex
    Poziom 10  

    W koncu wymyslilem cos takiego i chyba to mi probowaliscie przekazac, a ja w swojej ignorancji nie zrozumialem ; D ze powinienem sekwencyjnie, w jakiejs petli sprawdzac stan klawiszy i w zaleznosci od tego, na ktorym klawiszu zostla wykryta 'akcja' to powinien sie uruchomic odpowiedni kawalek kodu np. ze swieceniem odpowiednich wskaznikow na wyswietlaczu 7 segmentowym. Teraz tylko musze to jakos zastosowac, dzieki za pomoc.

    0
  • #9 04 Lut 2006 21:51
    domininLatex
    Poziom 10  

    Mysle ze przyklad podany przez kolege No Comprende, ktory mozna znalezc pod tym https://www.elektroda.pl/rtvforum/topic441327.html adresem doskonale odzwierciedla rozwiazanie powyzszego problemu, dla leniwych podaje kod zrodlowy ; ) :

    Code:

    org 0h
       ljmp start
    org 100h
    start:   
       mov r0,#csds   ;adres bufora sterujacego
       mov a,#01h   ;sprawdzanie entera
       movx @r0,a
       jb 0b5h,dioda   ;jesli klawisz ent jest wcisniety to teraz na pinie 3.5 (adr 0b5h) jest 1
       mov a,#02h   ;jesli nie jest wcisniety to sprawdzam esc
       movx @r0,a
       jnb 0b5h,start   ;jesli esc rowniez nie jest wcisniety to wracam do poczatku
       
    buzz:          cpl p1.5        ;skoro tu jestem to wciesniety esc - zmieniam stan buzzera
    buzz_czekaj:   jb 0b5h,buzz_czekaj   ;teraz czekam na puszczenie klawisza zeby zapobiec mogotaniu
                sjmp start     ;gdy klawisz puszczony to ide do poczatku

    dioda:           cpl p1.7         ;analogicznie j.w.
    dioda_czekaj:   jb 0b5h,dioda_czekaj
                 sjmp start

    0
  Szukaj w 5mln produktów