Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;---------------------------------------------------------------------
- P5 EQU 0F8h ; adres P5 w obszarze SFR
- P7 EQU 0DBh ; adres P7 w obszarze SFR
- ;---------------------------------------------------------------------
- ROWS EQU P5 ; wiersze na P5.7-4
- COLS EQU P7 ; kolumny na P7.3-0
- ;---------------------------------------------------------------------
- LEDS EQU P1 ; diody LED na P1 (0=ON)
- ;---------------------------------------------------------------------
- ORG 0
- mov LEDS, #11111111b ;wylaczenie ledΓ³w
- main_loop:
- lcall kbd_read
- lcall kbd_display
- sjmp main_loop
- ;---------------------------------------------------------------------
- ; Uaktywnienie wybranego wiersza klawiatury
- ;
- ; Wejscie: A - numer wiersza (0 .. 3)
- ;---------------------------------------------------------------------
- kbd_select_row:
- orl ROWS, #11110000b ;ustawienie stanu niskiego
- cjne A, #4, check_carry ;sprawdzenie czy A jest niewieksze niz 3
- check_carry:
- jc set_row ;jest wieksze niz 3 -> nie wystepuje carry, w przeciwnym razie jest
- ret
- set_row:
- mov DPTR, #k_code ;tutaj powinien byc kod wiersza (od 0 do 3)
- movc A, @A+DPTR ;wpisanie do akumulatora wartosci z adresu A+DPTR
- anl ROWS, A ;dajemy "sygnal", ktory klawisz jest poprawny
- ret
- ;---------------------------------------------------------------------
- ; Odczyt wybranego wiersza klawiatury
- ;
- ; Wejscie: A - numer wiersza (0 .. 3)
- ; Wyjscie: CY - stan wiersza (0 - brak klawisza, 1 - wcisniety klawisz)
- ; A - kod klawisza (0 .. 3)
- ;---------------------------------------------------------------------
- kbd_read_row:
- lcall kbd_select_row ;uaktywnienie wybranego wiersza
- mov A, COLS ;przekazanie
- orl A, #11110000b
- jz kbd_read_row_none
- mov R1, #0
- mov A, #00001000b ;wartosc do odczytow aktywnych klawiszy
- kbd_read_row_loop:
- push ACC
- anl A, COLS ;sprawdzenie klawiszy
- jz kbd_read_row_exist ;jezeli sie zgadza -> przeskok do etykiety
- pop ACC
- rr A ;bedzie sprawdzana kolejna wartosc (przesunieta o 1 w prawo)
- anl A, #00001111b ;wyzerowanie pierwszych 4 bitΓ³w akumulatora
- inc R1 ;inkrementacja R1 - sprawdzanie nastepnego klawisza
- jnz kbd_read_row_loop ;powtorzenie petli
- kbd_read_row_none:
- clr C
- ret
- kbd_read_row_exist:
- pop ACC
- mov A, R1 ;akumulator przechowuje numer klawisza
- setb C ;ustawienie wartosci carry na 1
- ret
- ;---------------------------------------------------------------------
- ; Odczyt calej klawiatury
- ;
- ; Wyjscie: CY - stan klawiatury (0 - brak klawisza, 1 - wcisniety klawisz)
- ; A - kod klawisza (0 .. 15)
- ;---------------------------------------------------------------------
- kbd_read:
- mov R0, #0 ;przechowujemy numer wiersza
- kbd_read_loop:
- mov A, R0
- lcall kbd_read_row
- jc kbd_read_found
- inc R0
- cjne R0, #4, kbd_check
- kbd_check:
- jc kbd_read_loop
- clr C
- ret
- kbd_read_found:
- mov R1, A
- mov A, R0
- rl A ;pomnozenie wiersza x2
- rl A ;pomnozenie wiersza x2 (x4 calkowicie)
- add A, R1 ;nr wiersza *4 + nr kolumny
- setb C
- ret
- ;---------------------------------------------------------------------
- ; Wyswietlenie stanu klawiatury
- ;
- ; Wejscie: CY - stanu klawiatury (0 - brak klawisza, 1 - wcisniety klawisz)
- ; A - kod klawisza (0 .. 15)
- ;---------------------------------------------------------------------
- kbd_display:
- jc leds_on ;klawisz wcisniety = uruchomienie etykiety
- mov LEDS, #11111111b ;wylaczenie wszystkich diod
- ret
- leds_on:
- cpl A
- clr ACC.7 ;wlaczenie najstarszej diody
- mov LEDS, A
- ret
- ;---------------------------------------------------------------------
- ; Kody wierszy
- ;---------------------------------------------------------------------
- k_code:
- db 01111111b
- db 10111111b
- db 11011111b
- db 11101111b
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement