Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 29 sty 2025, o 06:52


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 1 ] 
Autor Wiadomość
PostNapisane: 15 maja 2014, o 16:38 
Offline
Nowy

Dołączył(a): 05 paź 2013
Posty: 7
Pomógł: 0

Witam,
mam problem z podłączeniem klawiatury PS/2 do 8051 i wyświetlenie na LCD 2x16 odebranych znaków. Póki co odebrane kody nie są zamieniane na kody ASCII ponieważ i tak nic nie wyświetla się na LCD (LCD działa, wyświetla napis "Znaki:" Który wyświetlam mu na początku). Obstawiam, że nie rozumiem do końca obsługi klawiatury. Pisząc kod wzorowałem się na: Link i został przeze mnie zrozumiany jednak wydaje mi się, że coś jest nie tak z ustawianiem stanów na DATA i CLOCK. Proszę o pomoc, żeby cokolwiek wyświetliło mi się na LCD przy wciskaniu klawiszy(cokolwiek bo jak piszę wcześniej nie dekoduje jeszcze kodów klawiszy). Linie CLOCK i DATA podciągnięte do VCC przez R=4.4k. Poniżej zamieszczam kod programu. Robię obowiązkowy projekt do szkoły. Pozdrawiam i proszę o jakąkolwiek pomoc.
Kod:
;=============================================================================
;                     DEFINICJE I INFORMACJE
;=============================================================================
;Port szyny danych LCD
   D_PORT   EQU   P2   ;Port do ktorego podlaczylismie linie danych LCD

;Uzyte piny uC
   RS   EQU   P1.0   ;Pin RS LCD
   RW   EQU   P1.1   ;Pin RW LCD
   ENABLED   EQU P1.2   ;Pin ENABLED LCD
   D4   EQU   P2.4   ;Pin D4 LCD
   D5   EQU   P2.5   ;Pin D5 LCD
   D6   EQU   P2.6   ;Pin D6 LCD
   D7   EQU   P2.7   ;Pin D7 LCD
   K_DATA   EQU   P3.3   ;Pin DATA klawiatury
   K_CLOCK   EQU   P3.2   ;Pin CLOCK (INT0 lub INT1) klawiatury

;Uzyte Rejesry
   ;R0 - Bajt wysylany do LCD
   ;R1 - Wykorzystywany w DElAY
   ;R2 - Wykorzystywany w DELAY
   ;R3 - Bajt odebrany z klawiatury
   ;R4 - Zawiera numer odbieranego bitu podczas odbioru z klawiatury

;Uzyte Bity
   ;B.0 - zapamietuje LCD RS
   ;B.1 - zapamietuje LCD RW
   ;B.2 - Informuje o odebraniu bajtu z klawiatury
   ;B.3 - Zawiera bit parzystosci
   ;B.6 - Inicjalizacja LCD
   ;B.7 - informuje o LCD Busy
;Uzyte Peryferie
   ;INT0 - Przerwanie powodujace odczyt bitu
   ;T1 - Przerwanie od T1 zabezpiecza przed utknieciem programu
       ;Podczas odczytywania bajtu

;=============================================================================
;                           MAIN
;=============================================================================
;Start Programu
   LJMP   INIT
   
   ORG   0ABh
   LJMP   intT1
   ORG 0A8h
   LJMP   intINT0
   
   ORG   100h
INIT:
   LCALL   KEYBOARD_INIT
   
   LCALL   LCD_INIT   ;Inicjalizacja LCD
   LCALL   LCD_CLR   ;Czysc LCD
   LCAlL   LCD_START   ;Zacznij wpisywac znaki
   
MAIN_LOOP:
   MOV   A,   R3
   JZ MAIN_LOOP
   SETB B.0
   CLR B.1
   MOV R0, A
   LCALL LCD_BUSY
   MOV R3, #0
   SJMP   MAIN_LOOP

;=============================================================================
;                           LCD
;=============================================================================
TEXT_LINE_1:
   DB   'Znaki:',   0   ;Tekst do wyswietlenia w 1 linii

LCD_INIT:
   SETB   B.6
   MOV   R0, #00110000b   ;Sterowanie 8bit, 2linie, format 5x7px
   MOV   R1, #250
   MOV   R2, #59
   LCALL   DELAY   ;Czekaj ~15ms
   LCALL   LCD_WR_INSTR

   MOV   R1, #100
   MOV   R2, #16
   LCALL   DELAY   ;Czekaj ~4,1ms
   LCALL   LCD_WR_INSTR
   
   MOV   R1, #100
   MOV   R2, #0
   LCALL   DELAY   ;Czekaj ~100us
   LCALL   LCD_WR_INSTR
   
   MOV   R0,   #00100000b   ;Sterowanie 4-Bit
   LCALL   LCD_WR_INSTR
   CLR   B.6
   
   MOV   R0,   #00101000b   ;Sterowanie 4-Bit
   LCALL   LCD_WR_INSTR
   
   MOV   R0, #00001111b   ;Wyswietlacz ON, Kursor ON, Mruganie Kursora OFF
   LCALL   LCD_WR_INSTR
   RET
   
LCD_CLR:
   MOV   R0, #00000001b   ;Czysci LCD
   LCALL   LCD_WR_INSTR
   MOV   R0, #00000011b   ;Ustawia kursor   na pozycji poczatkowej
   LCALL   LCD_WR_INSTR
   RET
   
LCD_START:
   MOV R0,   #10000000b   ;Zapis DDRAM - Pierwsza linia
   LCALL   LCD_WR_INSTR
   MOV   DPTR,   #TEXT_LINE_1
   LCALL   LCD_WR_TEXT
   RET
   
LCD_WR_INSTR:
   CLR   B.0 ;RS
   CLR   B.1   ;RW
   LCALL   LCD_BUSY
   RET
   
LCD_WR_TEXT:
   SETB   B.0 ;RS
   CLR   B.1   ;RW
LCD_REPEAT:
   CLR   A
   MOVC   A,@A+DPTR
   JZ   LCD_WR_TEXT_END
   MOV   R0,   A
   INC   DPTR
   LCALL   LCD_BUSY
   SJMP   LCD_REPEAT
LCD_WR_TEXT_END:
   RET
   
LCD_BUSY:
   CLR   RS
   SETB   RW
   ORL   D_PORT,   #11110000b
   SETB   ENABLED
   MOV   C, D7
   CLR   ENABLED
   MOV   B.7, C
   SETB   ENABLED   ;Odczyt równiez mlodszych 4 bitów statusu
    CLR   ENABLED   ;Konieczne dla HD44780 w trybie 4-bit
   JB   B.7,   LCD_BUSY
LCD_WR:
   MOV   C, B.0
   MOV   RS,   C
   MOV   C,   B.1
   MOV   RW,   C
   MOV   A,   R0
   ANL   A,   #11110000b
   ANL   D_PORT,   #00001111b
   SETB   ENABLED
   ORL   D_PORT,   A
   CLR   ENABLED
   JB   B.6,   LCD_WR_SKIP
   MOV   A,   R0
   SWAP   A
   ANL   A,   #11110000b
   ANL   D_PORT,   #00001111b
   SETB   ENABLED
   ORL   D_PORT,   A
   CLR   ENABLED
LCD_WR_SKIP:
   RET
   
DELAY:
   DJNZ   R1,   DELAY   ;Opoznienie = R1 + (250*R2)
   MOV   R1, #250
   DJNZ   R2, DELAY
   RET

;=============================================================================
;                        KEYBOARD
;=============================================================================
KEYBOARD_INIT:
   ;Poczatkowe ustawienie zmiennych
   CLR   B.2
   CLR   B.3
   MOV   R4, #00h
   SETB   K_DATA
   SETB   K_CLOCK
   
   ;Ustawienie Przerwan
   SETB   IT0   ;Przerwanie INT0 przy zboczu opadajacym
   MOV   TMOD, #00100000b   ;T1 w trybie pierwszym - licznik 16-bitowy   
   MOV   IE,   #10001001b   ;Odblokowanie Przerwan T1 i INT0
   RET

BIT_START:
   INC   R4   ;Zwiekszenie nr odczytywanego bitu
   CLR   B.2   ;Usuwa informacje o odbiorze bajtu - przychodzi nowy
   
   MOV   TH1, #00h   ;Ustawianie licznika T1
   MOV   TL1, #00h   ;Odlicza 65.35ms
   SETB   TR1   ;Wlaczenie licznika T1
   SJMP   BIT_READ_END   ;Zakoncz odczytywanie bitu
   
BIT_0:
   CJNE   A, #1, BIT_1   ;Proba odebrania Bitu 0
   MOV   A, 00h   ;Czysc odbierany bajt
   MOV   C, K_DATA   ;Odbierz Bit 0
   MOV   ACC.0, C
   SJMP   SAVE_BIT ;Zapisz Bit
   
BIT_1:
   CJNE   A, #2, BIT_2   ;Proba odebrania Bitu 1
   MOV   A,   R3
   MOV   C, K_DATA
   MOV   ACC.1, C
   SJMP   SAVE_BIT
   
BIT_2:
   CJNE   A, #3, BIT_3   ;Proba odebrania Bitu 2
   MOV   A,   R3
   MOV   C, K_DATA
   MOV   ACC.2, C
   SJMP   SAVE_BIT
   
BIT_3:
   CJNE   A, #4, BIT_4   ;Proba odebrania Bitu 3
   MOV   A,   R3
   MOV   C, K_DATA
   MOV   ACC.3, C
   SJMP   SAVE_BIT
   
BIT_4:
   CJNE   A, #5, BIT_5   ;Proba odebrania Bitu 4
   MOV   A,   R3
   MOV   C, K_DATA
   MOV   ACC.4, C
   SJMP   SAVE_BIT
   
BIT_5:
   CJNE   A, #6, BIT_6   ;Proba odebrania Bitu 5
   MOV   A,   R3
   MOV   C, K_DATA
   MOV   ACC.5, C
   SJMP   SAVE_BIT
   
BIT_6:
   CJNE   A, #7, BIT_7   ;Proba odebrania Bitu 6
   MOV   A,   R3
   MOV   C, K_DATA
   MOV   ACC.6, C
   SJMP   SAVE_BIT
   
BIT_7:
   CJNE   A, #8, BIT_PARITY    ;Proba odebrania Bitu 7
   MOV   A,   R3
   MOV   C, K_DATA
   MOV   ACC.7, C
   SJMP   SAVE_BIT
   
BIT_PARITY:
   CJNE   A, #9, BIT_STOP   ;Proba odebrania bit parzystosci
   INC   R4   ;Zwieksz nr odbieranego bitu
   MOV   C,   K_DATA
   MOV B.3, C   ;Zapisz bit parzystosci
   SJMP   BIT_READ_END
   
BIT_STOP:
   SETB   B.2   ;Poinformuj o zakonczeniu odbierania bajtu
   MOV   R4,   #00h   ;Czysc nr odbieranego bitu
   CLR   TR1   ;Zatrzymaj licznik TR1
   SJMP   BIT_READ_END

SAVE_BIT:
   MOV   R3,   A   ;Zapamietanie odebranych bitow w rejestrze R3
   INC   R4   ;Zwiekszenie nr odczytywanego bitu
   SJMP   BIT_READ_END   ;Zakoncz odczytywanie bitu
   
BIT_READ_END:
   POP   PSW   ;Pobranie stanu wykonykowanego programu ze stosu
   POP   ACC   ;Pobranie akumulatora ze stosu
   RETI   ;Powrot z przerwania

intINT0:   ;Obsluga przerwania INT0
   PUSH   ACC   ;Zapamietanie akumulatora na stosie
   PUSH   PSW   ;Zapamietanie stanu wykonykowanego programu na stosie
   
   MOV   A, R4      ;Jezeli   nr odbieranego bitu
   JZ   BIT_START   ;rowny 0, odczytaj BIT_STARTU
   
   SJMP   BIT_0   ;Jezeli   rozny od 0, sprobuj czytac BIT_0
      
intT1:   ;obsluga przerwania licznika T1
   CLR   TR1   ;Zatrzymanie licznika T1
   MOV   R4, 00h   ;Zakonczenie odczytywania kolejnych bitow
   RETI
   
;=============================================================================
;                           END
;=============================================================================
   END



A słyszałeś o znaczniku syntax? Różowo-zielony J.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 1 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 6 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO