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

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

domininLatex 25 Sty 2006 17:14 7178 8
REKLAMA
  • #1 2218204
    domininLatex
    Poziom 11  
    Posty: 13
    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
  • REKLAMA
  • #2 2218801
    jacobsek
    Poziom 22  
    Posty: 419
    Pomógł: 61
    Ocena: 24
    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
  • REKLAMA
  • #3 2219086
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Jeszcze zasugerowałbym klawisze podłączyć przez diody aby uniknąć różnych nieprzyjemnych efektów kiedy wciśnie się więcej niż jeden klawisz.
  • REKLAMA
  • #4 2219202
    domininLatex
    Poziom 11  
    Posty: 13
    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
  • Pomocny post
    #5 2220262
    jacobsek
    Poziom 22  
    Posty: 419
    Pomógł: 61
    Ocena: 24
    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.
    Załączniki:
    • [DSM-51] Klawiatura sekwencyjna, a wyswietlacz 7-segmentowy klaw.matrycowa.jpg (78.74 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #6 2220562
    maxiu25
    Poziom 16  
    Posty: 190
    Pomógł: 16
    Ocena: 3
    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
  • #7 2222173
    domininLatex
    Poziom 11  
    Posty: 13
    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:
    
    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
    
  • REKLAMA
  • #8 2225162
    domininLatex
    Poziom 11  
    Posty: 13
    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.
  • #9 2260060
    domininLatex
    Poziom 11  
    Posty: 13
    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 ; ) :
    
    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 
    

Podsumowanie tematu

✨ Dyskusja dotyczy programowania mikrokontrolera 8051 w celu obsługi klawiatury sekwencyjnej matrycowej (np. 4x4) oraz sterowania wyświetlaczem 7-segmentowym. Kluczową metodą jest sekwencyjne podawanie stanu niskiego na linie klawiatury (linie) i odczytywanie stanu na wierszach, co pozwala zidentyfikować konkretny wciśnięty klawisz. Zaleca się eliminację drgań styków przez wielokrotne sprawdzanie stanu klawisza w odstępach 20-25 ms. Dodatkowo sugerowano stosowanie diod przy klawiszach, aby uniknąć problemów przy jednoczesnym wciśnięciu wielu klawiszy. Wskazano, że linie klawiatury można powiązać z katodami diod wyświetlacza, co pozwala na oszczędność portów mikrokontrolera i synchronizację z multipleksowaniem wyświetlacza. Przykłady kodu w asemblerze 8051 pokazują odczyt stanu portów i identyfikację klawiszy poprzez sumowanie stanów linii i wierszy. Autorowi przedstawiono prostą koncepcję pętli sprawdzającej stan klawiszy i uruchamiającej odpowiednie fragmenty kodu sterujące segmentami wyświetlacza. Podano również link do przykładowego kodu źródłowego rozwiązującego problem rozpoznawania klawiszy i sterowania wyświetlaczem. Dyskusja zawiera fragmenty kodu asemblerowego oraz wskazówki dotyczące implementacji w Bascomie i asemblerze, podkreślając znaczenie sekwencyjnego skanowania klawiatury i obsługi przerwań lub pętli głównej do sterowania wyświetlaczem 7-segmentowym.
Wygenerowane przez model językowy.
REKLAMA