Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Klawiatura + LED edsim 8051 pytanie

MIedzlegnica 05 Nov 2009 23:30 4205 5
  • #1
    MIedzlegnica
    Level 2  
    Witam - mam pytanko - mam program który skanuje klawiaturę i zwraca liczbę w zależności jaki został wciśnięty klawisz a ja chcę na wyświetlaczu wyświetlić wciśniety klawisz pomijając * i #. Kod jaki otrzymuje klawisz po wciśnięciu wygląda następująco:

    KLAWIATURA (wartość R0 po zeskanowaniu)

    ; +----+----+----+
    ; | 11 | 10 | 9 | row3
    ; +----+----+----+
    ; | 8 | 7 | 6 | row2
    ; +----+----|----+
    ; | 5 | 4 | 3 | row1
    ; +----+----+----+
    ; | 2 | 1 | 0 | row0
    ; +----+----+----+
    ; col2 col1 col0


    Więc klawiszowi 1 odpowiada wartość 11
    klawiszowi 2 odpowiada wartość 10
    .................
    klawiszowi 0 odpowiada wartość 1
    klawiszowi hasz odpowiada wartość 0

    Wszystko udało mi się prawie dobrze bo prawidłowo wyświetlane są na LED cyfry 0,9,8,5,4,3,2

    natomiast zamiast:
    1 pojawia się 3
    7 pojawia się 9
    6 pojawia się 9

    moje pytanie dlaczego??

    Poniżej kod:

    
    
    	MOV 28h, #01000000B	; hasz
    	MOV 29h, #00000000B	; gwizadka
    	MOV 30h, #11000000B	; 0
    	MOV 31h, #11111001B	; 1
    	MOV 32h, #10100100B	; 2
    	MOV 33h, #10110000B	; 3
    	MOV 34h, #10011001B	; 4
    	MOV 35h, #10010010B	; 5
    	MOV 36h, #10000010B	; 6
    	MOV 37h, #11111000B	; 7
    	MOV 38h, #10000000B	; 8
    	MOV 39h, #10010000B	; 9
    
    start:
    
    	MOV R0, #0			
    
    	; scan row0
    	SETB P0.3			
    	CLR P0.0			
    	CALL colScan		
    	JB F0, finish		
    						
    	; scan row1
    	SETB P0.0			
    	CLR P0.1			
    	CALL colScan		
    	JB F0, finish		
    						
    
    	; scan row2
    	SETB P0.1			
    	CLR P0.2			
    	CALL colScan		
    	JB F0, finish		
    						
    
    	; scan row3
    	SETB P0.2			
    	CLR P0.3			
    	CALL colScan		
    	JB F0, finish		
    						
    
    
    	JMP start			
    
    colScan:
    	JNB P0.4, gotKey	; 
    	INC R0				
    
    	JNB P0.5, gotKey	; i
    	INC R0				
    
    	JNB P0.6, gotKey	; 
    	INC R0				
    
    	RET					
    gotKey:
    	SETB F0				
    	RET			
    
    finish:
    	MOV a, @R0				
    
    wypisz_hasz:
    CJNE a, 0, wypisz0
    clr p3.4
    clr p3.3
    mov p1, 28h
    jmp czekaj
    
    wypisz0:
    CJNE a, 1, wypisz_gwizadka
    clr p3.4
    clr p3.3
    mov p1, 30h
    jmp czekaj
    
    wypisz_gwizadka:
    CJNE a, 2, wypisz9
    clr p3.4
    clr p3.3
    mov p1, 29h
    jmp czekaj
    
    wypisz9:
    CJNE a, 3, wypisz8
    clr p3.4
    clr p3.3
    mov p1, 39h
    jmp czekaj
    
    wypisz8:
    CJNE a, 4, wypisz7
    clr p3.4
    clr p3.3
    mov p1, 38h
    jmp czekaj
    
    wypisz7:
    CJNE a, 5, wypisz6
    clr p3.4
    clr p3.3
    mov p1, 37h
    jmp czekaj
    
    wypisz6:
    CJNE a, 6, wypisz5
    clr p3.4
    clr p3.3
    mov p1, 36h
    jmp czekaj
    
    wypisz5:
    CJNE a, 7, wypisz4
    clr p3.4
    clr p3.3
    mov p1, 35h
    jmp czekaj
    
    wypisz4:
    CJNE a, 8, wypisz3
    clr p3.4
    clr p3.3
    mov p1, 34h
    jmp czekaj
    
    wypisz3:
    CJNE a, 9, wypisz2
    clr p3.4
    clr p3.3
    mov p1, 33h
    jmp czekaj
    
    wypisz2:
    CJNE a, 10, wypisz1
    clr p3.4
    clr p3.3
    mov p1, 32h
    jmp czekaj
    
    wypisz1:
    CJNE a, 11, wypisz0
    clr p3.4
    clr p3.3
    mov p1, 31h
    jmp czekaj
    
    czekaj:
    jmp $
    
    
    


    Za każdym razem jak śledziłem krok po kroku i liczyłem wartość R0 była prawidłowa jednak w przypadku gdy powinna byc petla:

    wypisz1 program wchodzi do petli wypisz3 pomimo że R0 wg mnie = 11 bo liczyłem
    wypisz7 program wchodzi do petli wypisz9 pomimo że R0 wg mnie = 5 bo liczyłem
    wypisz6 program wchodzi do petli wypisz9 pomimo że R0 wg mnie = 6 bo liczyłem

    Gdzie robię błąd - co jest nie tak??
  • #2
    Dr.Vee
    VIP Meritorious for electroda.pl
    Pokaż schemat podłączenia.

    Kilka uwag: najpierw deaktywuj starą linię, później aktywuj nową linię klawiatury.
    Pomiędzy zmianą aktywnej linii a testem na wciśnięty klawisz odczekaj chwilkę (kilkanaście uS?).

    Pozdrawiam,
    Dr.Vee
  • Helpful post
    #4
    Dr.Vee
    VIP Meritorious for electroda.pl
    Kolejność jest dobra, bo stan aktywny na liniach rzędów jest niski.
    Czekanie np tak:
    mov  R7, #10
    djnz R7, $


    Pozdrawiam,
    Dr.Vee
  • #5
    entangle85
    Level 1  
    Przy CJNE jak porównujesz akumulator z liczbą brakuje #
    Powinno być dla przykładu:
    CJNE a, #10, wypisz1

    Sprawdziłem i działa u mnie

    Ja mam inny problem dotyczący wyświetlacza LED. Mianowicie dodaje/odejmuje dwie liczby, które wcześniej są pobrane z klawiatury i wrzucone na stos. Wynik również jest na stosie. Jak teraz wyświetlić ten wynik na wyświetlaczu LED? Chodzi mi o to jak prze konwertować wynik działania na kod odpowiedni dla wyświetlacza LED.
    Dziękuje
  • #6
    stanka17
    Level 1  
    Ja muszę przyznać że też jestem w tym zielony, a mam do napisania program, który będzie wczytywał znak z klawiatury i wyświetlał go na wyświetlaczu. Następnie po wciśnięciu kolejnego klawisza przesunie znak już wcześniej wyświetlony na wyświetlacz obok, a nowy znak wyświetli na miejscu tamtego znaku. Wzorowałem się trochę na przykładzie który jest wyżej ale nie za bardzo mi to wychodzi. Proszę o pomoc.