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.