66 7. Porty
Dzięki temu że można dokonywać operacji na wybranych bitach portów, różne linie tego samego portu mogą równocześnie pracować jako linie wejściowe i wyjściowe
Poniżej jest podany przykład zastosowania portu PI do odczytu klawiatury, rysunek 7-6. Klawiatura zawiera 16 przycisków oznaczonych od KO do K15. Na liniach P1.0 * PI.3 jest kolejno generowany stan 0. Naciśnięcie klawisza przenosi ten stan na linie PI.4 -r P1.7. Jeżeli żaden klawisz nie jest naciśnięty, to na liniach PI.4 + PI.7 jest stan 1 wymuszony źródłami prądowymi układów' wyjściowych portu. Program, który ma odczytać stan klawiatury, musi kolejno zadawać stany 0 na poszczególne linie P1.0 * PI.3, odczytywać stan linii PI.4 * PI.7 i na podstawcie tej informacji określić numer naciśniętego klawisza.
K3< |
K2<" |
Kl< |
KO r |
K7 r" |
K6^ |
K5^ |
K4 ' |
:<n ■ ' |
K10< |
K9< |
K8 ; |
KI5 r |
K14< |
K13< |
K12- |
— | |||
P1.0 Pl.l PI.2 51 P1.3
PI.4 PI.5 PI.6 PI.7
Rys. 7-6. Schemat połączenia klawiatury z portem PI.
******iM»**»»****»***#*******if***********************ł***********»****
Program odczytu klawiatur)'
Wykorzystane rejestry: R2 - numer klawisza R3 - licznik pętli
Po wyjściu z programu w rejestrze R2 znajduje się numer naciśniętego klawisza lub wrartość OFFh, jeżeli żaden klawisz nie został naciśnięty.
***#.»*»*inm-******#***if*******4*********>nł*ił***************»**********
MOV |
R2,#0 |
;zerowranie rejestru z numerem klawisza |
MOV |
R3,#4 |
;licznik pętli |
MOV |
Pl,#0FEh |
;ustawienie w stan zera linii P1.0 |
MOV |
A,PI |
;odczyt końcówek portu PI |
PĘTLA 1: |
;początek pętli w której kolejno są testowane stany ;linii P1.7 + P1.4 | |
RLC |
A |
; rotacja w lewo zawartości akumulatora. Przy ;pierwszym wejściu do pętli do znacznika C jest ;wpisywany stan linii PI.7 |
JNC |
WYJŚCIE |
;testowanie stanu znacznika C. Jeżeli C=0, tzn. że ;został naciśnięty któryś z klawiszy KO 4-K3 i |
Jeżeli C = l, tzn. testowany klawisz nie został ;naciśnięty, to jest zwiększana zawartość rejestru R2 ;(numer kolejnego klawisza)
INC |
R2 |
DJNZ |
R3,PETLA1 |
MOV |
R3,#4 |
MOV |
Pl,#0FDh |
MOV |
A,PI |
PETLA2: | |
RLC |
A |
JNC |
WYJŚCIE ^ |
DJNZ |
R3,PETLA2 |
MOV |
R3,#4 |
MOV |
Pl,#0FBh |
MOV |
A,PI |
PETLA3: | |
RLC |
A |
JNC |
WYJŚCIE < |
DJNZ |
R3,PETLA3 |
MOV |
R3,#4 |
MOV |
Pl,#0E7h |
MOV |
A,PI |
PETLA4: | |
RLC |
A |
JNC |
WYJŚCIE |
DJNZ |
R3,PETLA4 |
MOV |
R2,#0FFh |
WYJŚCIE: |
tML ĆT-
;zero na linii P1.2
;zero na linii PI.3
END
;odliczanie, czy zostały sprawdzone wszystkie linie ;P1.7 PI.4. Jeżeli nie, to następuje skok do etykiety ;PETLA1 - testowanie kolejnej linii, a jeżeli tak, to ;przejście do sprawdzania klawiszy K4 -i- K7. ;ponowne ustawienie licznika pętli ;zero na linii Pl.l
wc et
;żaden klawisz nie jest naciśnięty ;konicc programu