PODSTAWY TECHNIK MIKROPROCESOROWYCH
Laboratorium
Temat: Porty równoległe. Obsługa klawiatury matrycowej zestawu ZD537.
Zadania do wykonania
Zadanie 1.
Program odczytu z klawiatury metodą skaningową(numery kolumny i wiersza klawisza wyświetlić na LED)
Zadanie 2.
Podprogram zwracający (w Akumulatorze i na LED) numer/od naciśnietego klawisza.
Zadanie 3.
Program realizujący funkcję kalkulatora( np. dodawania dwu liczb wpisanych z klawiatury).
REALIZACJA ZADAŃ
Ad.1
$NOMOD51
$INCLUDE (REG517.INC)
CSEG AT 0000h
PETLA:
MOV R3,#4 ; licznik wierszy, przesyłanie do R3 liczby 4
MOV R1,#07Fh ; ustawienie wiersza początkowego
JZ PETLA1
PETLA1:
MOV P5,R1
MOV A,P7 ; wysłanie stanu z portu P7 do akumulatora
XRL A,#0FFh
JZ PETLA2
MOV A,P7 ; wysłanie stanu z portu P7 do akumulatora
ANL A,R1 ; maska zerująca 4 najstarsze bity akumulatora
MOV P1,A ; wysłanie zawartości akumulatora na port P1
PETLA2:
MOV A,R1
RR A
MOV R1,A
DJNZ R3,PETLA1
SJMP PETLA ; pętla powrotu na początek programu
JMP $
END
Ad.2
$NOMOD51
$INCLUDE(REG517.INC)
CSEG AT 0
MOV R2,#0 ; numer sprawdzanego klawisza
MOV R3,#4 ; licznik petli, przesyłanie do R3 liczby 4
MOV P5,#0EFH ; wysterowanie portu P5
MOV A,P7 ; wysłanie stanu z portu P7 do akumulatora
ety1:
RRC A ; przesuniecie bitowe w prawo
JNC WYJSCIE ; skok na koniec, gdy flaga C=0
INC R2
DJNZ R3,ety1 ; R3=R3-1, jeśli R3!=0 to skok do ety1
MOV R3,#4
MOV P5,#0DFH
MOV A,P7
SETB C ; ustawienie C=1
CPL C ; zmiana stanu C (wyzerowanie)
ety2:
RRC A ; przesuniecie bitowe w prawo
JNC WYJSCIE ; skok na koniec, gdy flaga C=0
INC R2 ; skok na koniec, gdy flaga C=0
DJNZ R3,ety2 ; R3=R3-1, jeśli R3!=0 to skok do ety2
MOV R3,#4
MOV P5,#0BFH
MOV A,P7
SETB C
CPL C
ety3:
RRC A ; przesuniecie bitowe w prawo
JNC WYJSCIE ; skok na koniec, gdy flaga C=0
INC R2 ; skok na koniec, gdy flaga C=0
DJNZ R3,ety3 ; R3=R3-1, jeśli R3!=0 to skok do ety3
MOV R3,#4
MOV P5,#07FH
MOV A,P7
SETB C
CPL C
ety4:
RRC A ; przesuniecie bitowe w prawo
JNC WYJSCIE ; skok na koniec, gdy flaga C=0
INC R2 ; skok na koniec, gdy flaga C=0
DJNZ R3, ety4 ; R3=R3-1, jeśli R3!=0 to skok do ety4
WYJSCIE:
MOV A,R2 ; przepisanie numeru klawisza do akumulatora
CPL A
MOV P1,A ; wyświetlenie na diodach LED numeru w kodzie NKB
JMP $
END
Ad.3
Start:
MOV SCON,11010000B
MOV TMOD,00100000B
MOV TH1,#243D
MOV TL1,#243D
SETB TR1 ; włącz taktowanie
SETB REN ; włącz odbiornik
ELO:
JNB RI,$ ; czekaj na 1 znak z klawiatury
MOV A,SBUF ; przepisz znak do akumulatora
CLR RI ;kasuj flagę odbioru
MOV SBUF,A ; wyślij znak na ekran
JNB TI,$ ; czekaj aż skończy wysyłać
CLRTI ; kasuj flagę nadania
SUBB A,#'0' ; zamień z ASCII na DEC
MOV B,#10D ; pomnóż wprowadzoną przez 10
MUL AB
MOV R1,A ; zapamiętaj w R1 liczbę (dziesiątki)
JNB RI,$ ; czekaj na 2 znak z klawiatury
MOV A,SBUF ; przepisz znak do akumulatora
CLR RI ; kasuj flagę odbioru
MOV SBUF,A ; wyślij znak na ekran
JNB TI,$ ; czekaj aż skończy wysyłać
CLRTI ; kasuj flagę nadania
SUBB A,#'0' ; zamień z ASCII na DEC
ADD A,R1 ; sumuj dziesiątki i jedności pierwszej liczby
MOV R1,A ; zapamiętaj pierwszą liczbę W R1
MOV SBUF,#'+' ; wyświetl +
JNB TI,$ ; czekaj aż skończy wysyłać
CLRTI ; kasuj flagę nadania
JNB RI,$ ; czekaj na 3 znak z klawiatury
MOV A,SBUF ; przepisz znak do akumulatora
CLR RI ; kasuj flagę odbioru
MOV SBUF,A ; wyślij znak na ekran
JNB TI,$ ; czekaj aż skończy wysyłać
CLRTI ; kasuj flagę nadania
SUBB A,#'0' ; zamień z ASCII na DEC
MOV B,#10D ; pomnóż wprowadzoną przez 10
MUL AB
MOV R2,A ; zapamiętaj w R2 liczbę (dziesiątki)
JNB RI,$ ; czekaj na 2 znak z klawiatury
MOV A,SBUF ; przepisz znak do akumulatora
CLR RI ; kasuj flagę odbioru
MOV SBUF,A ; wyślij znak na ekran
JNB TI,$ ; czekaj aż skończy wysyłać
CLRTI ; kasuj flagę nadania
SUBB A,#'0' ; zamień z ASCII na DEC
ADD A,R2 ; sumuj dziesiątki i jedności drugiej liczby
MOV SBUF,#'=' ; wyświetl =
JNB TI,$ ;czekaj aż skończy wysyłać
CLRTI ; kasuj flagę nadania
ADD A,R1 ; sumuj zapamiętane liczby
MOV B,#100 ; wyodrębnij cyfrę setek
DIV AB
ADD A,#'0' ; zamień na ASCII
MOV SBUF,A ; wyślij pierwszy znak wyniku na ekran
JNB TI,$ ; czekaj aż skończy wysyłać
CLRTI ; kasuj flagę nadania
MOV A,B ; reszta z dzielenia do A
MOV B,#10 ; wyodrębnij cyfrę dziesiątek
DIV AB
ADD A,#'0' ; zamień na ASCII
MOV SBUF,A ; wyślij drugi znak wyniku na ekran
JNB TI,$ ; czekaj aż skończy wysyłać
CLRTI ; kasuj flagę nadania
MOV A,B ; reszta z dzielenia do A (cyfra jedności)
ADD A,#'0' ; zamień na ASCII
MOV SBUF,A ; wyślij trzeci znak wyniku na ekran
JNB TI,$ ; czekaj aż skończy wysyłać
CLRTI ; kasuj flagę nadania
MOV SBUF,#' ' ; wprowadź odstęp (dla estetyki) na ekran
JNB TI,$ ; czekaj aż skończy wysyłać
CLRTI ; kasuj flagę nadania
LJMP ELO ; POWTARZAJ PROGRAM
END
Uwagi końcowe
Podczas zajęć laboratoryjnych udało się wykonać pierwszy podpunkt z przewidzianych trzech. Wykonany został poprawnie, co sprawdzić można było na zestawie ćwiczeniowym. Podpunkt drugi został rozpoczęty, jednak stopień zaawansowania prac nie pozwolił na przetestowanie jego działania. Ćwiczenie to zostało dokończone w domu, jednak ze względu na brak zestawu ćwiczeniowego nie mogło zostać w pełni przetestowane.
Podpunkt trzeci został jednak podobnie jak w przypadku podpunktu drugiego ze względu na brak zestawu ćwiczeniowego nie mógł być dokładnie przeanalizowany.