Laboratorium UCiSM
Transkrypt
Laboratorium UCiSM
INSTYTUT AUTOMATYKI
Politechniki Łódzkiej
MAREK DZIKOWSKI
HENRYK MROCZEK
PROGRAMOWANIE I URUCHAMIANIE
SYSTEMÓW Z MIKROPROCESORAMI
RODZINY INTEL 8051
ŁÓDŹ - 1997
1
Spis treści
1.Wstęp
2.Mikrokomputer dydaktyczny MKD-51
2.1. Opis budowy
2.2. Wejścia, wyjścia
2.3. Adresy wejść, wyjść i układów wejściowo-wyjściowych
2.4. Obsługa mikrokomputera
3.Program uruchomieniowy MONITOR MKD-51
3.1. Uwagi ogólne
3.2. Opis poleceń programu MONITOR
4.Program tłumaczący - asembler XA51
4.1. Uwagi ogólne
4.2. Format programu źródłowego dla XA51
4.3. Elementy języka asemblera XA51
4.4. Dyrektywy asemblera XA51
4.5. Błędy sygnalizowane przez asembler
4.6. Zgodność z innymi asemblerami
5.Ćwiczenia z programowania i uruchamiania systemów z mikroprocesorami 8051
5.1. Ćwiczenie 1. Tworzenie i uruchamianie programu użytkowego
5.2. Ćwiczenie 2. Obsługa wejść i wyjść binarnych
5.3. Ćwiczenie 3. Programowanie liczników wewnętrznych mikroprocesora
5.4. Ćwiczenie 4. Procedury arytmetyczne
5.5. Ćwiczenie 5. Konwersja dwójkowo-dziesiętna
5.6. Ćwiczenie 6. Wyświetlacz numeryczny LED
5.7. Ćwiczenie 7. Wyświetlacz alfanumeryczny LCD
5.8. Ćwiczenie 8. Obsługa klawiatury
Załączniki
Z.1. Wyświetlacz ciekłokrystaliczny (W_LCD)
Z.2. Przetwornik analogowo-cyfrowy PTAC
Z.3. Symbole graficzne schematów blokowych programów
Z.4. Tablica kodów ASCII
Z.5. Format zapisu zbiorów - Intel HEX
2
3
4
4
6
7
8
9
9
9
15
15
15
17
19
24
25
27
27
37
40
44
53
59
66
74
86
86
91
93
94
95
1. Wstęp
Podręcznik zawiera opis systemu projektowo-uruchomieniowego wraz z ćwiczeniami i
przykładami programów - do nauki programowania i uruchamiania systemów z mikroprocesorami
(mikrokontrolerami) rodziny Intel 8051. System składa się z następujących elementów :
1- mikrokomputera dydaktycznego MKD-51, współpracującego z mikrokomputerem klasy
PC
2 - oprogramowania systemu, złożonego z :
! - programu sterującego (plik dyskowy mkd 51.exe)
!! - programu uruchomieniowego MONITOR MKD-51 (rezydującego w pamięci
EPROM mikrokomputera MKD-51)
!!! - programu tłumaczącego - asemblera XA51 (plik dyskowy xa51.exe)
!!!! - zbioru ćwiczeń zawierających programy przykładowe i zadania do wykonania
(pliki dyskowe C01_*.*,..., C8_*.*).
Mikrokomputer MKD-51 (rozdz.2) jest specjalizowanym systemem mikroprocesorowym,
zbudowanym w oparciu o mikroprocesor (mikrokontroler) typu 8031 (z rodziny Intel 8051) i
wyposażonym w wiele typowych układów wejściowo-wyjściowych spotykanych w praktycznych
systemach, przystosowanym do celów dydaktycznych. Zamieszczone w podręczniku szczegółowe
schematy logiczne mikrokomputera są ilustracją praktycznych rozwiązań hardwareowych.
Mikrokomputer MKD-51 ma konstrukcję jednopłytową, umieszczony jest w otwartej
płaskiej obudowie metalowej, nakrytej przezroczystą płytą, na której naniesiono kontury
widocznych pod nimi zespołów i napisy identyfikujące te zespoły.
MKD-51 wymaga sprzężenia (przez łącze szeregowe w standardzie RS-232) z typowym
mikrokomputerem klasy PC. Komputer ten pełni rolę konsoli operatorskiej systemu MKD-51 oraz
środowiska, w którym tworzy się i przechowuje programy użytkownika systemu. Komunikację
między obu mikrokomputerami zapewnia program sterujący wywoływany w mikrokomputerze PC
z pliku dyskowego mkd51.exe.
Program MONITOR MKD-51 (rozdz. 3) jest programem uruchomieniowym (typu
monitor/debugger), dysponującym czternastoma poleceniami umożliwiającymi prowadzenie
badań uruchomieniowych programu użytkowego na poziomie kodu wynikowego, załadowanego
do pamięci RAM mikrokomputera MKD-51.
Asembler skrośny (ang. Cross-Assembler) XA51 (rozdz. 4) jest prostym programem
tłumaczącym programy źródłowe użytkownika, napisane w języku asemblerowym procesorów
Intel 8051.
W rozdziale 5 podano 8 ćwiczeń zawierających przykładowe programy użytkowe o
zróżnicowanym poziomie zaawansowania, stanowiących pomoc w nauce programowania oraz
ilustrujące sposoby obsługi programowej różnych układów wejściowo-wyjściowych systemów
mikroprocesorowych. W ćwiczeniach podano zadania do wykonania, obejmujące: uruchamianie
gotowych programów, ich modyfikację oraz tworzenie i uruchamianie własnych programów. W
ćwiczeniach wykorzystuje się zasoby sprzętowe i programowe systemu MKD-51.
System MKD-51 (mikrokomputer MKD-51 i oprogramowanie) został opracowany i
wykonany w Instytucie Automatyki Politechniki Łódzkiej.
3
2. Mikrokomputer dydaktyczny MKD-51
2.1 Opis budowy.
Mikrokomputer MKD-51 został wykonany w postaci jednej płyty o wymiarach 225 x 300
mm, umieszczonej w płaskiej obudowie metalowej, nakrytej płytą przezroczystą, dzięki czemu
wszystkie układy scalone i inne elementy składowe mikrokomputera są dobrze widoczne.
Strukturę logiczną mikrokomputera MKD-51 przedstawiono na schemacie uproszczonym
(rys.2.1).
W skład mikrokomputera wchodzą następujące ważniejsze elementy :
- mikroprocesor 80C31,
- pamięć stała EPROM (27C64) o pojemności 8 KB, zawierająca program MONITOR MKD-51,
- pamięć RAM-1 (6264) o pojemności 8 KB, przeznaczona do umieszczenia w niej programu
użytkownika, może być traktowana jako pamięć programu i jako zewnętrzna pamięć danych,
- pamięć RAM-2 (6264) o pojemności 8 KB, przeznaczona do wykorzystania w programach
użytkownika jako zewnętrzna pamięć danych,
- sterownik transmisji szeregowej STS (8251), służący do sprzężenia mikrokomputera MKD-51
z mikrokomputerem PC, łączem szeregowym w standardzie RS-232,
- przetwornik analogowo-cyfrowy PTAC (ADCO809) 8-bitowy, o ośmiu multipleksowanych
wejściach pomiarowych, z których 3 połączone są na stałe z wbudowanymi potencjometrami
POT0, POT1, POT2, a 2 - są dostępne dla użytkownika ( zaciski U0, U1 ), ( patrz załącznik
Z2 ),
- zespół wyświetlacza numerycznego 4-cyfrowego W-LED, złożonego ze wskaźników
7-segmentowych LED, bufora sygnałów segmentowych (PTSEG), wzmacniaczy
segmentowych (ULN 2803) oraz tranzystorów T0, T1, T2, T3 sterujących anodami
wskaźników odpowiednio do sygnałów dostarczanych z dekodera LS 145,
- wyświetlacz przystosowany jest do sterowania dynamicznego ( sekwencyjnego),
- wyświetlacz alfanumeryczny, ciekłokrystaliczny W-LCD (LN 162551),
umożliwiający
wyświetlanie napisów lub danych liczbowych w dwóch wierszach po 16 znaków w każdym
( patrz załącznik Z2 ),
- klawiatura stykowa złożona z 16 klawiszy ( 4 wiersze x 4 kolumny). Kolumny klawiatury
wybierane są sygnałami z dekodera LS145, wspólnie z anodami wyświetlacza W-LED,
natomiast wiersze czytane są przez port P1 mikroprocesora,
- buforowane wyjście (2 x HC245 ) szyny systemowej, umożliwiające dołączenie przez
użytkownika do 32 zewnętrznych układów wejścia/wyjścia ( patrz p. 2.5.),
- podstawka dla pamięci stałej elektrycznie kasowalnej i
programowalnej
EAROM
(EEPROM, E2PROM ), przewidziana do wykorzystania w ćwiczeniu z programowania
pamięci EAROM,
- bufor wejść cyfrowych PTWE (LS254 ) dla sygnałów cyfrowych X0...X7 ( patrz p. 2.2 ),
- bufor wyjść sygnalizacyjnych i stykowych PTWY (HC 574, ULN 2803), sterujących
lampkami LED : L0..L7 i przekaźnikami : P0, P1, P2,
- lampka sygnalizacyjna L8-dioda LED sterowana z portu P1 (bit P1.6),
4
Rys.2.2. Uproszczony schemat ideowy mikrokomputera MKD-51
5
-
-
-
sygnał akustyczny (buczek) BU, sterowany z portu P1 (bit P1.7)
klawisz (przycisk) RESET, służy do kasowania mikrokomputera i jednocześnie
uruchamiania programu MONITOR - przy wyciśniętym klawiszu PR.UŻYTK., lub
programu użytkownika - przy wciśniętym klawiszu PR.UŻYTK.
klawisz (przełącznik) PR.UŻYTK., służy do wybierania pamięci, z której będzie
realizowany program po sygnale RESET : przy wciśniętym klawiszu wybierana jest
pamięć RAM-1 i program użytkownika, przy wyciśniętym pamięć EPROM i program
MONITOR
klawisz (przełącznik) BL.RAM, służy do blokowania operacji zapisu do pamięci RAM-1,
a także RAM-2, ale tylko wtedy gdy pamięć ta została sprzętowo zdefiniowana jako
pamięć programu
złącze D-SUB 9M „RS-232 PC” , służące do dołączenia mikrokomputera PC
złącze D-SUB 9M „RS-232 UŻYTK.”, służące do zorganizowania przez użytkownika
transmisji szeregowej z innym użytkownikiem (np. z innym mikrokomputerem PC
lub MKD-51), z wykorzystaniem wewnętrznego układu transmisji szeregowej
mikroprocesora 8031. Sygnały RxD (P3.0) i TxD (P3.1) wyprowadzono na złącze
D- SUB poprzez bufor linii MAX 232.
zespół dekoderów adresów (HC138, HC139)
zespół generatora częstotliwości wzorcowych ( 12MHz - dla procesora, 2MHz i
2/13MHz - dla układu transmisji szeregowej STS - 8251 oraz 500kHz - dla
przetwornika PTAC).
2.2. Wejścia, wyjścia
Mikrokomputer MKD-51 wyposażony jest w następujące wejścia i wyjścia:
X0...X3 - wejścia stykowe, buforowane (bufor PTWE), z przełączników
klawiszowych stabilnych
X4, X5 - wejścia stykowe, buforowane (bufor PTWE), z przełączników klawiszowych
niestabilnych (przycisków)
X6, X7 - wejścia cyfrowe, buforowane (bufor PTWE), z optoizolacją, ze złączy
zaciskowych
X8, X9 - wejścia cyfrowe z optoizolacją doprowadzone bezpośrednio do wejść procesora
P3.2 ( INT0 ) i P3.4(T0), ze złączy zaciskowych
U0, U1 - wejścia analogowe, doprowadzone do wejść I0, I1 przetwornika PTAC, ze złączy
zaciskowych
POT0, POT1, POT2 - wejścia potencjometryczne, doprowadzone do wejść I5, I6, I7
przetwornika PTAC, z potencjometrów dostępnych dla użytkownika
L0...L7 - wyjścia sygnalizacyjne, sterujące wbudowanymi lampkami LED
P0, P1, P2 - wyjścia stykowe z przekaźników elektromagnetycznych, sterowanych
równolegle z lampkami L0, L1, L2, wyprowadzone na złącza zaciskowe
L8 - wyjście cyfrowe sygnalizacyjne, sterujące lampką LED z wyjścia P1.6
BU - wyjście cyfrowe sygnalizacyjne, sterujące buczkiem z wyjścia P1.7.
Parametry sygnałów:
1) dla wejść cyfrowych z optoizolacją (X6...X9):
Uwe = 2...12V lub Iwe = 2...25mA, (Rwewn = 510Ω, ∆Uwewn = 1V )
2) dla wejść analogowych (U0, U1):
Uwe = 0...5V ( 5V odpowiada pełnemu zakresowi 255 przetwornika PTAC)
3) dla wejść potencjometrycznych (POT0..POT2) zakres regulacji (między skrajnymi
położeniami pokrętła) - 0..5V
4) dla wyjść cyfrowych stykowych (P0, P1, P2),
6
obciążalność zestyków :
- przy obciążeniu rezystancyjnym
250 V, 3 A - dla prądu przemiennego
30 V, 3 A - dla prądu stałego
- przy obciążeniu indukcyjnym
(cosϕ = 0,4 , L/R = 7 ms)
250 V , 1 A - dla prądu przemiennego
30 V , 1 A - dla prądu stałego.
2. 3. Adresy wejść, wyjść i układów wejściowo-wyjściowych.
T A B L I C A 2.1. Adresy wejść, wyjść i układów wejściowo-wyjściowych
Lp.
1
2
3
4
5
6
7
8
9
Układ
STS
(8251)
PTAC
(ADC0809)
PTWE
(LS245)
Wejścia
cyfrowe
Mikroprocesor
PTWY
(HC574)
PTSEG
(HC574)
W-LCD
(LM162551)
Bufor szyny
systemowej
Rejestr wewn./
wejście / wyjście
CTRL51
DAT51
Do .. D7
I0 = U0
I1 = U1
I5 = POT0
I6 = POT1
I7 = POT2
X0 .. X7
X8
X9
L8 (P1.6)
BU(P1.7)
L0 .. L7,P0 .. P2
bity : 0,1 .. ,7 =
= a, b,...,g, p
CTRLW
DATW
CTRLR
DATR
Ao.. A4; Do..D7,
WR , RD , CS 5
Adres
hex
6001
6000
8000
8000
8001
8005
8006
8007
8008
(odczyt)
B3 (bit)
B4 (bit)
96 (bit)
97 (bit)
8008
(zapis)
8018
8010
8011
8012
8013
A000..A01F
7
Uwagi
sterowanie
dane
wynik pomiaru
zacisk U0
zacisk U1
potencjometr
potencjometr
potencjometr
klawisze
X0 .. X7
zacisk X8
zacisk X9
lampka LED
buczek
lampki LED
zestyki P0, P1, P2
segmenty wskaźników
W-LED
rej. instr., zapis
rej. danych, zapis
rej. instr. , odczyt
rej. danych, odczyt
dodatkowe zewnętrzne
układy we/wy
2.4. Obsługa mikrokomputera
W celu przygotowania systemu do pracy należy wykonać następujące wstępne czynności :
1. Połączyć MKD-51 z mikrokomputerem PC kablem do transmisji szeregowej w standardzie
RS-232 (połączyć gniazdo „RS-232 PC” w MKD-51 z gniazdem COM1 lub COM2 w PC).
Oznaczenie zacisków w gnieździe „RS-232 PC” :
- styk 2 - RxD (odbiór danych)
- styk 3 - TxD (nadawanie danych)
- styk 5 - GND (masa).
2. Włączyć mikrokomputer PC
3. Włożyć wtyk zasilania zasilacza zewnętrznego (12 V =, 500 mA) do gniazdka zasilania w
MKD-51, a następnie włączyć zasilacz do sieci 220 V/50 Hz
4. Dyskietkę systemową MKD-51 skopiować do własnego katalogu roboczego w
mikrokomputerze PC
5. Poleceniem DOS wywołać program mkd51.exe - przy korzystaniu z COM1,
lub mkd51.exe/2 - przy korzystaniu z COM2
6. Po zgłoszeniu się systemu MKD-51 nacisnąć klawisz RESET w MKD-51
7. Po zgłoszeniu się programu MONITOR system oczekuje na podanie polecenia (znak
kropki wskazuje
gotowość systemu). Listę poleceń można przejrzeć po naciśnięciu
klawisza F1 w mikrokomputerze PC. Opis programu MONITOR znajduje się w rozdz.3
8. Przystąpić do realizacji wybranego ćwiczenia (rozdz.5).
8
3. Program uruchomieniowy MONITOR MKD-51
3.1. Uwagi ogólne
Program MONITOR MKD-511)
jest prostym i łatwym w obsłudze programem
uruchomieniowym dla systemów z mikroprocesorami rodziny Intel 8051. Umożliwia śledzenie
wykonywania oraz poprawiania programów użytkowych na poziomie kodu maszynowego,
zapisanego do pamięci RAM systemu badanego.
MONITOR umieszczony jest w pamięci EPROM systemu MKD-51, natomiast program
uruchamiany ładowany jest do pamięci RAM-1, pełniącej rolę pamięci programu. Po załączeniu
systemu MONITOR przejmuje pełną kontrolę nad jego pracą.
Działanie programu polega na wykonywaniu poleceń operatora (użytkownika), wywoływanych z
poziomu mikrokomputera PC, sprzężonego łączem szeregowym z MKD-51. Komunikację
między obu mikrokomputerami zapewnia program sterujący typu konwersacyjnego (ang.Talker) :
mkd51.exe.
Program MONITOR MKD-51 zajmuje ok. 8 KB pamięci EPROM, od adresu 4000H i
korzysta z 3 bajtów wewnętrznej pamięci danych mikroprocesora (7DH..7FH) oraz 148 bajtów
zewnętrznej pamięci danych RAM-2 (3F6CH..3FFFH).
MONITOR MKD-51 udostępnia użytkownikowi następujące polecenia :
L - ładowanie programu użytkownika
G - wykonanie programu użytkownika
T - wykonanie programu użytkownika krokowo, ze śladowaniem (wyświetlaniem
informacji o stanie programu i procesora)
B - wyświetlanie zawartości wewnętrznej pamięci danych mikroprocesora i rejestrów SFR
D - wyświetlanie zawartości obszarów pamięci zewnętrznych
Z - zmiana zawartości komórek wewnętrznej pamięci danych
S - zmiana zawartości komórek zewnętrznej pamięci danych
X - wyświetlanie i zmiana zawartości rejestrów
M - przesuwanie obszarów pamięci
C - porównywanie danych z dwóch obszarów pamięci
F - wypełnianie obszaru pamięci zewnętrznej stałą
I - wstawianie danych we wskazane miejsce pamięci zewnętrznej
F1- wyświetlanie listy poleceń
F10- wyjście do programu DOS.
3.2. Opis poleceń programu MONITOR MKD-51
Polecenia są procedurami (funkcjami) programu, inicjującymi odpowiednie działania
programu użytkownika, zwracającymi określone informacje o aktualnym stanie programu,
procesora i pamięci systemu, lub zmieniającymi te stany. Polecenia wywołuje się przez wypisanie
na monitorze mikrokomputera PC nazwy i ewentualnie parametrów polecenia.
_________________________________________________________________________
1) program opracowany w Instytucie Automatyki PŁ przez mgr inż. L. Pobiegę, przy współudziale autorów
9
Składnia poleceń :
nazwa[< parametr > ] [ , < parametr > ] [ , < parametr > ] ENTER [[SP] [ESC] ENTER]
gdzie : nazwa
- litera duża
parametr - liczba heksadecymalna (bez H), liczba dziesiętna, litera A, nazwa
rejestru lub nazwa pliku dyskowego
< >
- nawiasy ograniczające parametr, których nie wypisuje się
[
]
- znak opcjonalności
ENTER - znak (klawisz) końca linii (powrotu karetki CR)
SP
- znak (klawisz) odstępu (spacji)
ESC
- znak (klawisz) ESC.
Uwaga: Znaki przecinka można zastępować znakiem spacji.
Przykłady poleceń:
B - polecenie bez parametru (także bez ENTER)
D2000, 200F ENTER - polecenie z dwoma parametrami.
Każde polecenie (oprócz B) kończy się znakiem ENTER, przy czym w niektórych
poleceniach po tym znaku używa się znaku spacji ( dla powtórzenia lub kontynuacji operacji) i
wtedy polecenie można zakończyć znakiem ESC lub ENTER. Znak ESC można użyć także do
przerwania wykonywania polecenia. Wykonanie polecenia (także przerwanie) sygnalizowane jest
na ekranie mikrokomputera PC znakiem kropki. Znak ten jest równocześnie sygnałem gotowości
MONITORa do przyjęcia nowego polecenia. Nie pojawienie się kropki w odpowiedzi na
polecenie oznacza brak możliwości jego wykonania (błąd w programie). W takiej sytuacji trzeba
wyjść z MONITORa - wywołując polecenie F10 lub dokonać „restartu” mikrokomputera PC, a
następnie ponownie wywołać program MONITOR.
Wszystkie dane liczbowe w programie MONITOR, wprowadzane jako parametry poleceń
lub wyświetlane przez polecenia, są liczbami szesnastkowymi (heksadecymalnymi). Wyjątek
stanowi argument polecenia T< n >, gdzie n- jest liczbą dziesiętną. Przy wprowadzaniu
parametrów 1- bajtowych monitor akceptuje dwie ostatnio wprowadzone cyfry, a przy
parametrach 2- bajtowych - cztery ostatnio wprowadzone cyfry, co upraszcza poprawianie błędów
wypisywania parametrów. Błędy formalne (składniowe), przy zapisie poleceń, sygnalizowane są
znakiem pytajnika (?).
Opis poleceń:
1) Polecenie L - ładowanie programu użytkowego do pamięci RAM-1.
Składnia polecenia:
L < nazwa_ pliku > ENTER
gdzie: nazwa_ pliku - jest nazwą pliku dyskowego programu użytkowego typu .hex
( ewentualnie ze ścieżką dostępu )
10
2) Polecenie G - uruchamianie programu użytkowego
Składnia polecenia:
a) G ENTER
b) G < adr > ENTER
c) G < adr > , < p1 > ENTER
d) G < adr > , < p1 > , < p2 > ENTER
gdzie : < adr >
- adres startowy programu
< p1 > i < p2 > - adresy zatrzymania (pułapek, ang. Break Points)
adr, p1, p2
- są liczbami szesnastkowymi 2 - bajtowymi
W przypadku (a) program startuje od adresu ostatniego zatrzymania (adres wskazywany
przez rejestr PC).
W przypadku (b), ( c ) i ( d ) program startuje od adresu < adr > i wykonywany jest
swobodnie ( b ), lub zatrzymuje się na adresach pułapek < p1 > lub < p2 > (c i d) .
U w a g a : zatrzymanie na pułapce powoduje zablokowanie przerwań w procesorze
3)
Polecenie T - wykonywanie programu krokowo z wyświetlaniem informacji o stanie
programu i procesora (śladowanie).
Składnia polecenia :
a) T ENTER SP [ SP ] ESC
b) T < n > ENTER [ ESC ]
c) TA ENTER [ ESC ]
gdzie : n - liczba (dziesiętna) kroków (max.9999).
W przypadku ( a ) wykonywany jest jeden krok, przy czym klawiszem spacji ( SP ) można
polecić wykonanie następnego kroku.
W przypadku ( b ) wykonywanych jest n - kroków, przy czym przy dużych wartościach n,
po zapełnieniu ekranu proces jest wstrzymywany i wtedy klawiszem spacji (SP) wznawia się
dalszą pracę (kontynuacja).
W przypadku ( c ) liczba kroków jest nieograniczona. Funkcja klawisza SP - jak w
przypadku ( b ).
Uwaga : wywołanie polecenia T powoduje zablokowanie przerwań w procesorze.
4) Polecenie B - wyświetlanie pełnej zawartości pamięci wewnętrznej RAM (0...7FH) i
rejestrów SFR.
Składnia polecenia :
B
5) Polecenie D - wyświetlanie zawartości obszaru pamięci zewnętrznej : RAM-1, RAM-2,
EPROM.
11
Składnia polecenia :
D < adr - 1 >, < adr - 2 > ENTER
gdzie : < adr - 1 > - adres 2-bajtowy początku obszaru
< adr - 2 > - adres 2-bajtowy końca obszaru.
6) Polecenie Z - zmiana zawartości komórki wewnętrznej pamięci danych procesora
(0...7FH).
Składnia polecenia :
Z < adr > ENTER [ SP ] [ dana ] [ SP ] ENTER
gdzie : < adr > - adres modyfikowanej komórki (adres 1-bajtowy z zakresu
0...7FH).
dana - nowa wartość zastępująca dotychczasową.
Po wypisaniu polecenia MONITOR wyświetli adres komórki, jej zawartość i znak minus (-),
oznaczający oczekiwanie na nową wartość. Po wpisaniu nowej wartości można nacisnąć albo
klawisz ENTER - kończąc proces modyfikacji, albo klawisz SP - sygnalizując monitorowi
powtórzenie polecenia dla następnego adresu. Jeżeli po znaku (-) zamiast wpisania nowej wartości
naciśnie się klawisz SP, to wskazywana zawartość komórki pozostanie nie zmieniona natomiast
zostanie wyświetlona zawartość następnej komórki oraz znak minus. Po wyświetleniu 8 komórek
następuje samoczynna zmiana linii.
Przykład pokazuje przebieg sprawdzenia zawartości trzech komórek o adresach : 20H..22H
i zmiany zawartości komórki o adresie 21H (nowa wartość : 47H) :
. Z 20 ENTER
20 7A - 3E - 47
.
2A -
ENTER
7) Polecenie S- zmiana zawartości komórki pamięci zewnętrznej RAM (RAM - 1, RAM-2).
Składnia polecenia :
S < adr > ENTER [ SP ] [ dana ] [ SP ] ENTER
gdzie : < adr > - adres komórki pamięci zewnętrznej RAM (RAM-1, RAM-2)
(adres 2-bajtowy z zakresu : 0..1FFFH - dla RAM - 1
2000H..3F6BH - dla RAM - 2)
dana - nowa wartość, zastępująca dotychczasową.
Uwaga : adresy 3F6CH..3FFFH - zarezerwowane dla programu MONITOR
- nie mogą być zmieniane.
Polecenie S wykonywane jest identycznie jak polecenie Z.
8) Polecenie X - wyświetlanie i modyfikacja zawartości rejestrów procesora
12
Składnia polecenia :
a) X ENTER
b) X < r > ENTER [ dana ] ENTER
gdzie : < r > - symbol rejestru procesora
(r = A,B,R0..R7,PC,SP,DL,DH,PSW, przy czym DH_DL=DPTR, a słowo
stanu PSW wyświetlane jest jako słowo 8-bitowe :CAFRR-P,
w którym C - przeniesienie, A=AC przeniesienie pomocnicze, F- flaga,
RR-kod banku rejestrów, P-parzystość),
dana - nowa wartość zmieniająca dotychczasową.
W przypadku ( a ) wyświetlane są stany wszystkich rejestrów.
W przypadku ( b ) wyświetlany jest stan wskazanego rejestru i znak minus. Stan ten
można zmienić - wpisując nową wartość i nacisnąć klawisz ENTER lub pozostawić bez zmiany naciskając klawisz ENTER.
Rejestry R0..R7 odnoszą się do aktualnie wybranego banku. Numer banku można zmieniać
ustawiając bity (RR) w słowie PSW (korzystając z polecenia X PSW ENTER).
9) Polecenie M - przesuwanie wskazanego obszaru pamięci zewnętrznej (RAM-1, RAM-2,
EPROM).
Składnia polecenia :
M < adr -1 >, < adr - 2 >, < adr - 3 > ENTER
gdzie : < adr - 1 >
- adres początku przesuwanego obszaru (RAM-1, RAM-2,
EPROM)
< adr - 2 >
- adres końca przesuwanego obszaru (RAM-1, RAM-2,
EPROM)
< adr - 3 >
- adres początku obszaru po przesunięciu (RAM-1, RAM-2)
(adresy 1,2 i 3 - odpowiadają warunkom wymienionym w opisie
polecenia S).
10) Polecenie C - porównywanie zawartości dwóch obszarów pamięci zewnętrznej
(RAM-1, RAM-2, EPROM).
Składnia polecenia :
C < adr - 1 >, < adr - 2 >, < adr - 3 > ENTER
gdzie : < adr - 1 > i < adr - 2 > - adresy początku i końca obszaru „ pierwszego”
< adr - 3 > - adres początku obszaru „ drugiego”
( zakresy wartości adresów - jak w poleceniu S ).
11) Polecenie F - wypełnianie wskazanego obszaru pamięci zewnętrznej RAM
( RAM - 1, RAM - 2 ) - stałą 1- bajtową ( 0..FFH ).
13
Składnia polecenia :
F < adr - 1 >, < adr - 2 >, < stała > ENTER
gdzie: < adr - 1 > i < adr - 2 > - adresy początku i końca wypełnianego obszaru
< stała > - liczba szesnastkowa 0..FFH.
12) Polecenie I - wstawianie ciągu danych szesnastkowych 1- bajtowych do komórek
pamięci zewnętrznej RAM (RAM - 1, RAM - 2) od wskazanego adresu
początkowego
Składnia polecenia :
I < adr > ENTER dane ESC
gdzie : < adr > - adres początkowy zewnętrznej pamięci RAM
(adres szesnastkowy, 2- bajtowy )
dane - wprowadzane dane.
Po wypisaniu polecenia (zakończonego znakiem ENTER) można wprowadzić dowolnie
długi ciąg 1- bajtowych liczb szesnastkowych (dopuszcza się rozdzielanie liczb spacjami). Koniec
wprowadzania sygnalizuje się klawiszem ESC. Każda wprowadzona dana umieszczana jest w
kolejnych komórkach pamięci, zastępując (niszcząc) dane istniejące.
Przykład pokazuje sposób zapisania pięciu danych : 01 02 03 04 05 w komórkach o
adresach 3E43H..3E47H :
. I3E43 ENTER
01 02 03 04 05 ESC
.
13) Polecenie F1 - wyświetlenie listy poleceń MONITORa MKD-51
Składnia polecenia :
F1,
gdzie : F1 - jest klawiszem funkcyjnym klawiatury PC.
14) Polecenie F10 - wyjście z programu MONITOR do programu DOS
Składnia polecenia :
F10,
gdzie : F10 - jest klawiszem funkcyjnym klawiatury PC.
14
4. Program asembler XA51
4.1. Uwagi ogólne
Asembler XA51 1) jest prostym dwuprzebiegowym asemblerem skrośnym 2) ( ang. CrossAssembler), przeznaczonym do tłumaczenia jednomodułowych programów źródłowych
napisanych w języku adresów symbolicznych ( języku asemblerowym) dla procesorów 8
bitowych rodziny Intel 8051. Tworzy dwa programy wynikowe:
-
wykonywalny w standardzie INTEL-HEX, zapisywany w pliku dyskowym
programu źródłowego z rozszerzeniem HEX ( p. załącznik Z6)
o nazwie
-
dokumentacyjny (listing),
zapisywany
źródłowego z rozszerzeniem LST.
programu
w
Program tłumaczony (źródłowy) musi być
rozszerzeniu .ASM.
pliku
dyskowym o
nazwie
dostępny jako plik dyskowy z nazwą o
W celu przetłumaczenia programu źródłowego nazwa_pliku.asm
program asemblera xa51.exe z nazwą pliku źródłowego, jako parametrem:
należy
wywołać
xa51.exe nazwa_pliku.asm
Rozszerzenie nazwy można pominąć, przyjmowany jest domyślnie typ .ASM. Nazwa pliku może
być poprzedzona symbolem napędu dyskowego lub ścieżki dostępu do pliku
( zgodnie z
wymaganiami systemu DOS ).
4.2. Format programu źródłowego dla XA51
Program źródłowy jest ciągiem instrukcji określonego języka programowania.
W językach asemblerowych występują trzy rodzaje instrukcji:
- instrukcje procesora (rozkazy)
- pseudoinstrukcje - dyrektywy asemblera
- instrukcje sterujące asemblera.
Instrukcje procesora są zakodowanymi rozkazami procesora, które asembler tłumaczy na
kody maszynowe.
Dyrektywy są instrukcjami programisty dla asemblera określającymi sposób tłumaczenia
programu, umożliwiającymi nadawanie nazw symbolicznych stałym, rezerwującym pamięć dla
zmiennych itp.
Instrukcje sterujące (niekiedy zaliczane do grupy dyrektyw ) określają parametry lub
warunki generowania plików dokumentacyjnych, a w przypadku makroasemblerów 3) - także
dodatkowych plików: relokowalnych ( typu REL lub OBJ ), z wykazami symboli (ang.: CrossReference ) itp.
W języku asemblera XA51 każdą instrukcję zapisuje się w jednej linii programu
źródłowego. Każda linia musi być zakończona znakiem ENTER (CR). Długość linii nie
______________________________________________________________________
1) program XA51 został opracowany w Instytucie Automatyki PŁ przez mgr inż. L. Pobiegę.
2) programy skrośne są programami tworzonymi w środowisku komputerowym innym niż docelowe
3) makroasemblerami nazywa się silne programy tłumaczące dla wielomodułowych programów źródłowych,
umożliwiające korzystanie z programów bibliotecznych oraz oferujące większą liczbą dyrektyw, w tym
tzw.makrodyrektyw.
15
może przekraczać 127 znaków, przy czym ze względu na format pliku dokumentacyjnego zaleca
się aby linia mieściła się w jednym wierszu wydruku lub wierszu monitora ekranowego (do 80
znaków ).
Składnia linii programu:
[ etykieta:] [ kod operacji ] [ argument (y) ] [ ; komentarz ]
lub
[ symbol] [ kod operacji ] [ argument (y) ] [ ; komentarz ]
przy czym:
etykieta
- jest nazwą symboliczną (symbolem) zakończoną
dwukropkiem,
reprezentującą adres linii (instrukcji). Etykieta może być użyta w
dowolnym miejscu programu jako argument lub element argumentu
( w wyrażeniu arytmetycznym) w innej instrukcji
symbol
- jest nazwą symboliczną reprezentującą ( zastępującą) stałą lub inny
symbol (przedefiniowanie )
kod operacji - jest skrótem mnemonicznym (mnemonikiem) nazwy rozkazu procesora
lub mnemonikiem pseudoinstrukcji (dyrektywą) asemblera
argument (y) - stała, adres lub rejestr - obiekty na których procesor lub asembler
dokonuje operacji wyrażonej mnemonikiem. Argumenty mogą być
zapisane w postaci wyrażenia arytmetyczno-logicznego, którego wartość
oblicza asembler w czasie asemblacji. Wyrażenia mogą zawierać nazwy
symboliczne
komentarz
- jest dowolnym napisem, poprzedzonym znakiem średnika (;) służy do
objaśniania funkcji programu. W komentarzu wolno używać dowolnych
znaków alfanumerycznych występujących w kodzie ASCII. Komentarz
można umieszczać od początku linii programu i może zajmować
dowolną liczbę linii (zawsze zaczynających się średnikiem)
Linie programu mogą zawierać tylko niektóre jej elementy ( [ ] - znak opcjonalności). W
szczególności linia może być pusta. Elementy linii muszą być rozdzielone co najmniej jednym
znakiem odstępu (spacji) lub tabulatora poziomego. Linie można rozpocząć w dowolnym miejscu
wiersza. Zaleca się umieszczanie poszczególnych elementów linii w stałych miejscach wierszy,
wyznaczanych kolejnymi położeniami tabulatora.
Przykład fragmentu programu :
DWA
EQU
2
; linia nr 1
START:
ORG
MOV
Q
A, # 3EH
; linia nr 3
; linia nr 4
W przykładzie występują 4 linie programowe, linia nr 2 jest pusta (zawiera jedynie
niewidoczny znak ENTER).
16
Poszczególne elementy linii mają następujące znaczenia :
DWA
START
EQU, ORG
MOV
2,0,A, # 3EH
2, 0, 3EH
A
#
- symbol (nazwa stałej)
- etykieta
- mnemoniki dyrektyw
- kod operacji procesora (mnemonik rozkazu)
- argumenty dyrektyw lub rozkazów
- stałe
- symbol rejestru
- przedrostek (prefix) identyfikujący stałą 3EH jako tzw.daną
natychmiastową.
Do zapisu linii programu wolno używać znaków, symboli i innych konstrukcji
składniowych zgodnych z definicją zastosowanego języka programowania. Szczegółowe
wymagania w tym zakresie określa program tłumaczący ( asembler ), który zostanie wykorzystany
do tłumaczenia zapisanego programu.
4.3. Elementy języka asemblera XA51
Elementami języka XA51 są: znaki, symbole ( nazwy symboliczne), symbole zastrzeżone (
słowa kluczowe ), stałe i wyrażenia arytmetyczno- logiczne.
Znakami legalnymi są następujące znaki należące do zbioru znaków ASCII:
- litery A...Z, a...z ( litery małe asembler zmienia na duże ),
- cyfry 0...9,
- wszystkie znaki pomocnicze „widoczne” ( . , ; , # , ? itp. )
- następujące znaki sterujące, „niewidoczne” : ENTER, SPacja, TABulator,
Symbol (nazwa symboliczna ) jest ciągiem znaków, z których pierwszy jest literą lub
jednym ze znaków ? @ a następne literą , cyfrą lub znakiem podkreślenia ( _ ). Długość symbolu
nie może przekraczać 12 znaków.
Symbolami zastrzeżonymi są symbole o określonym przez asembler przeznaczeniu, które
nie mogą być użyte w innym celu. Do symboli zastrzeżonych należą:
- mnemoniki rozkazów procesora 8051 ( MOV, ADD, LCALL itp.)
- mnemoniki dyrektyw asemblera ( ORG, EQU, BIT, DB itp. )
- symbole wyróżnionych bitów rejestrów SFR ( C, EA, E0, P1.3 itp. )
- symbole operatorów wyrażeń arytmetyczno- logicznych ( AND, XOR, SHR, MOD itp.)
- znak dolara ($), wskazujący bieżącą wartość tzw. licznika lokacji tj. licznika, którego
stan jest równy adresowi przypisywanemu przez
asembler instrukcji w danej linii
programu. Licznik lokacji pełni taką samą rolę dla asemblera jak licznik programu (PC)
dla procesora. Znak $ zastępuje adres instrukcji, w której został użyty, np. instrukcja
SJMP $ + 1AH
oznacza ominięcie 26 bajtów znajdujących się za instrukcją ( „skocz 26 bajtów dalej”).
Stałe są wielkościami znanymi i niezmiennymi w czasie asemblacji. Rozróżnia się stałe
numeryczne i stałe alfa-numeryczne (znakowe i łańcuchowe).
Stałe numeryczne są liczbami 16-bitowymi bez znaku (z zakresu 0..65535) zapisywanymi
w
jednym
z
czterech
systemów
liczbowych:
dwójkowym
(binarnym),
17
ósemkowym, dziesiętnym i szesnastkowym (heksadecymalnym), przy czym bezpośrednio za
liczbą musi być umieszczony następujący literowy identyfikator systemu :
B, np. 10110101B dla stałych dwójkowych
Q, np.
265Q dla stałych ósemkowych
D, np.
181D dla stałych dziesiętnych
H, np.
0B5H dla stałych szesnastkowych.
W stałych dziesiętnych identyfikator (D) może być pominięty (zapisy 181 i 181D są równoważne).
Stałe szesnastkowe, w których pierwszym znakiem jest jedna z liter A..F, muszą być poprzedzone
zerem (0). Wszystkie stałe tłumaczone są przez asembler na liczby binarne.
Uwaga: Liczby BCD (reprezentujące liczby dziesiętne) trzeba zapisywać jako stałe szesnastkowe,
np. godzinę 17-tą trzeba zapisać jako 17H (po przetłumaczeniu : 0001 0111B, gdyż zapisanie tej
danej jako 17D zostanie przetłumaczone na liczbę binarną o wartości 17 czyli : 0001 0001B).
Stałą znakową nazywa się ciąg 0,1 lub 2 znaków ASCII ujętych w apostrofy. Wartość
stałej znakowej jest równa wartości liczby utworzonej z kodów ASCII znaków występujących w
stałej (tablicę kodów ASCII podano w załączniku Z5), np.
′ ′
ma wartość 20H=32 ( znak spacji )
′A′
ma wartość 41H=65
′AZ′ ma wartość 415AH=16740.
Stałą łańcuchową (łańcuchem znaków) nazywa się ciąg 0 lub większej liczby znaków
ASCII ujętych w apostrofy. Jeżeli wewnątrz łańcucha trzeba użyć ogranicznika
łańcucha (′), to
ogranicznik ten musi być powtórzony, np. :
′ NAPISZ ZNAK ″ A″ LUB ″B″′ .
Jeżeli między ogranicznikami nie ma znaków, to łańcuch taki jest łańcuchem zerowym.
Łańcuchy tłumaczone są przez asembler na ciągi kodów ASCII znaków łańcucha, np. : łańcuch
′START′ tłumaczony jest na ciąg liczb heksadecymalnych: 53 54 41 52 54.
Wyrażenia arytmetyczno-logiczne stosuje się do obliczania wartości argumentów w
instrukcjach programu (asembler wyręcza programistę w obliczeniach). Operacje występujące w
wyrażeniach są wykonywane przez asembler w czasie tłumaczenia programu źródłowego i nie
mają związku z operacjami wykonywanymi przez program (mikroprocesor). W wyrażeniach
wolno używać następujących operatorów (wymienionych w kolejności malejących priorytetów):
1) *, I, MOD, SHR, SHL
2) 3) +, 4) NOT
5) AND
6) OR, XOR
(mnożenie i dzielenie całkowitoliczbowe, moduł = reszta z
dzielenia, przesuwanie w prawo, w lewo)
(znak minus)
(arytmetyczne : dodawanie, odejmowanie)
(negacja logiczna)
(iloczyn logiczny)
(suma logiczna, suma modulo 2).
Działania w wyrażeniach wykonywane są od strony lewej do prawej w kolejności
wynikającej z priorytetów. Nawiasów używać nie wolno. Wszystkie argumenty w wyrażeniach
asembler traktuje jako stałe 16-bitowe.
18
Przykłady :
3EH * 10H
23/5
23 MOD 5
7 SHR 1
7 SHL 1
-1
2FH - 0AH
NOT 1
0FEH AND 3
0FEH OR 3
0AAAAH XOR 0FFFFH
po przetłumaczeniu:
po przetłumaczeniu:
po przetłumaczeniu:
po przetłumaczeniu:
po przetłumaczeniu:
po przetłumaczeniu:
po przetłumaczeniu:
po przetłumaczeniu:
po przetłumaczeniu:
po przetłumaczeniu:
po przetłumaczeniu:
3E0H = 992
4
3 (reszta z 23/5)
3
EH = 14
FFFFH = 65535
25H = 37
FFFEH
2
FFH
5555H.
4.4. Dyrektywy asemblera XA51
Dyrektywy (pseudoinstrukcje) asemblera ułatwiają pisanie oszczędnych programów
źródłowych. Są instrukcjami dla programu tłumaczącego ( asemblera ).
Asembler XA51 akceptuje następujące dyrektywy :
ORG
END
EQU
SET
BIT
DB
DW
DS
PAGE
XLIST
LIST
- określa adres początkowy dla programu lub danych (ustawia licznik lokacji)
- wskazuje koniec programu źródłowego
- definiuje stałą (przypisuje stałej symbol), bez możliwości przedefiniowania
- jak EQU, z możliwością przedefiniowania
- definiuje adres bitowy
- definiuje bajty danych
- definiuje słowa (dwubajtowe) danych
- rezerwuje bajty pamięci
- określa liczbę wierszy jednej strony wydruku
- wyłącza listowanie programu za dyrektywą
- przywraca listowanie programu.
Opis dyrektyw.
1. Dyrektywa ORG - ustaw adres początkowy.
Składnia dyrektywy :
ORG wyrażenie,
gdzie : wyrażenie - wyrażenie arytmetyczne o wartości 16-bitowej lub mniejszej,
może zawierać symbole wcześniej zdefiniowane.
Argument dyrektywy (wyrażenie) określa adres instrukcji lub danych występujących za
dyrektywą. Dyrektywa ORG może być użyta wielokrotnie w różnych miejscach programu.
19
Przykłady :
ORG 0
ORG START
; adres początkowy 0, $ = 0
; symbol START musi być
; wcześniej zdefiniowany
2. Dyrektywa END - koniec programu źródłowego
Składnia dyrektywy :
END
Dyrektywa bezargumentowa, określa koniec programu
umieszczone za dyrektywą END są ignorowane przez asembler.
źródłowego.
Instrukcje
3. Dyrektywa EQU - definiuj stałą.
Składnia dyrektywy :
symbol
EQU wyrażenie,
gdzie : symbol
- nazwa symboliczna przypisywana stałej
wyrażenie - wyrażenie arytmetyczne określające stałą; może zawierać symbole
wcześniej zdefiniowane.
Dyrektywa przypisuje stałej symbol. Symbol ten nie może się powtórzyć w polu etykiety w
całym programie ( nie może być przedefiniowany). Dyrektywę można zapisać w dowolnym
miejscu programu.
Przykłady :
ENTER
SPAC
START
RAM-2
DLUG
SZER
POLE
EQU
EQU
EQU
EQU
EQU
EQU
EQU
13
``
0
2000H
12
DLUG/2
DLUG*SZER
;
;
;
;
kod ASCII znaku ENTER (CR)
kod ASCII spacji (20H)
START ma wartość 0
adres początkowy pamięci RAM-2
; POLE = 72
4. Dyrektywa SET - definiuj stałą (wielokrotnie).
Dyrektywa SET jest równoważna EQU, z tą różnicą, że możliwe jest wielokrotne
definiowanie tego samego symbolu.
Przykłady :
WSP SET 08 ; WSP = 8
-----------------------------------------WSP SET 12
; od tego miejsca WSP = 12
20
5. Dyrektywa BIT - definiuj adres bitowy.
Składnia dyrektywy :
symbol BIT wyrażenie,
gdzie : symbol - dowolna nazwa symboliczna
wyrażenie - wyrażenie o wartości 0..F7H, określające adres komórki
bitowej w wewnętrznej pamięci danych (20H..2FH), lub w
adresowalnych bitowo rejestrach SFR (80H..F0H), może
zawierać symbole wcześniej zdefiniowane.
Wyrażenie może mieć postać :
adres _ bajtu . numer _ bitu,
gdzie : adres _ bajtu - adres bajtu z komórkami adresowanymi bitowo
numer _ bitu - numer (0..7) bitu wewnątrz bajtu.
Dyrektywa BIT przypisuje adresowi komórki bitowej symbol. Symbol ten nie może się
powtórzyć w polu etykiety w całym programie. Dyrektywę można zapisać w dowolnym miejscu
programu.
Przykłady :
ALARM
EQU 20H
; bajt o adresie 20H
SYRENA
LAMPA_Z
LAMPA_C
LAMPA_B
BUCZEK
BIT
BIT
BIT
BIT
BIT
ALARM . 2
SYRENA + 1
20H.4
5
P1.7
PRZER
BIT
EA
;
;
;
;
;
;
;
;
;
bit o adresie 2
bit o adresie 3
bit o adresie 4
bit o adresie 5
bit nr 7 w rejestrze P1
(adres bitu 97H)
bit nr 7 o nazwie EA
w rejestrze IE (adres
bitu AFH)
6. Dyrektywa DB - definiuj bajty danych.
Składnia dyrektywy :
lub
lub
[ etykieta : ] DB wyrażenie [ , wyrażenie ... ]
[ etykieta : ] DB łańcuch [ , łańcuch ...... ]
[ etykieta : ] DB wyrażenie [ , łańcuch ...... ],
gdzie : wyrażenie - wyrażenie o wartości 8-bitowej; reprezentujące daną 1-bajtową
łańcuch - stała łańcuchowa.
Dyrektywa DB oblicza wartość wyrażeń i umieszcza je w kolejnych komórkach (bajtach)
pamięci, poczynając od adresu linii, w której znajduje się dyrektywa. Ten sam adres przypisuje
etykiecie, jeżeli występuje przed dyrektywą. Etykieta jest nieobowiązkowa (opcjonalna).
21
W przypadku argumentów łańcuchowych, kolejne znaki łańcucha zamieniane są na
odpowiadające im kody ASCII i umieszczone w kolejnych komórkach pamięci.
Przykłady :
ORG
TABL: DB
TEKS: DB
DANE: DB
2000H
0,7, 0FH, 17H, 1EH
′NAPIS_D0_WYŚWIETLENIA′ , 10, 13, ′$′
3 * 2, TEKST- TABL
Po przetłumaczeniu w pamięci znajdą się następujące dane (w zapisie szesnastkowym) :
2000H : 00 07 0F 17 1E 4E 41 50 49 53 5F 44 4F 5F 57 59
2010H : 53 57 49 45 54 4C 45 4E 49 41 0A 0D 24 06 05
a etykiety otrzymują następujące wartości :
TABL - 2000H
TEKST- 2005
DANE - 201DH.
7. Dyrektywa DW - definiuj słowa danych
Składnia dyrektywy :
[ etykieta : ] DW wyrażenie [ , wyrażenie ... ],
gdzie : wyrażenie - wyrażenie arytmetyczne o wartości 16-bitowej, reprezentujące
daną typu słowa 2-bajtowego
Dyrektywa DW oblicza wartości wyrażeń i umieszcza je w kolejnych parach komórek
(bajtów) pamięci, poczynając od adresu przypisanego linii, w której znajduje się dyrektywa. Ten
sam adres nadawany jest etykiecie, jeżeli występuje. Etykieta jest opcjonalna. Dane umieszczane
są w pamięci w ten sposób, że najpierw ładowany jest starszy bajt (pod adresem m) a następnie
młodszy bajt (pod adresem m + 1). Dopuszcza się aby wyrażenia były stałymi 1 - lub 2 znakowymi.
Przykłady:
STALA
BAZA
TAB_ADR:
DANE:
ST_ZNAK:
EQU
EQU
ORG
DW
DW
DW
128
;128 = 80H
1A00H
2F00H
BAZA, BAZA+5, BAZA+10
30BBH, 2* STALA, 3SHL8
’A’ , ’AB’;
; ’A’ = 41H, ’B’ = 42H
Po przetłumaczeniu w pamięci znajdą się następujące dane ( w zapisie szesnastkowym ):
2F00H: 1A00 1A05 1A0A 30BB 0100 0030 0041 4142,
a etykiety otrzymają następujące adresy:
22
TAB_ADR
DANE
ST_ZNAK
- 2F00H
- 2F06H
- 2F0CH.
8. Dyrektywa DS - rezerwuj pamięć.
Składnia dyrektywy:
[ etykieta: ] DS wyrażenie,
gdzie : wyrażenie - wyrażenie arytmetyczne, o wartości 0...65535, określające liczbę
rezerwowanych bajtów pamięci.
Działanie dyrektywy DS polega na rezerwowaniu określonej wyrażeniem liczby bajtów
pamięci przed programem lub danymi następującymi za dyrektywą. Pierwsza instrukcja programu
lub danych za dyrektywą otrzyma adres o tę liczbę większy od adresu linii z dyrektywą.
Zarezerwowane bajty wypełniane są stałą 00.
Przykłady:
ZMIEN:
STOS:
REZ:
BUF1:
GODZ:
ZM1:
ZM2:
ORG
DS
DS
DS
DS
DS
DS
DS
0
1FH
10H
50H-$
3
6
1
2
;
;
;
;
;
;
;
adres
adres
adres
adres
adres
adres
adres
0
1FH
2FH, ($=2FH )
50H
53H
59H
5AH
W powyższym przykładzie między adresami REZ i BUF1 zarezerwowano 50H- 2FH =
21H = 33 bajty pamięci.
Dyrektywy DB, DW i DS generują kody (inicjują pamięć), tzn. umieszczają dane w
komórkach pamięci o adresach wynikających z miejsca występowania dyrektywy i liczby jej
argumentów. Oznacza to, że dyrektywy te nie mogą przedzielać ciągu instrukcji programu, a
więc można je umieszczać tylko za programem, między niezależnymi fragmentami programu
( np. między podprogramami ), albo muszą być omijane przez program ( za pomocą instrukcji
skoku ). Przykładem może być następujący typowy fragment początku programu użytkowego:
INT_T0:
ORG
LJMP
DS
LJMP
DB
NAPIS:
P_PROG:
0, 1, 2, 3, 4
DB
MOV
0
P_PROG
0BH-$
PRZERW
; skok omijający dyrektywy
; rezerwa na wektor przerwań
; adres 0BH, wejście (wektor)
; przerwania od licznika T0,
; skok do podprogramu PRZERW
; stałe numeryczne
; stała znakowa
; początek programu.
’TEKST’
A,# 0
23
TAB:
9. Dyrektywa PAGE - ustaw liczbę linii strony wydruku
Składnia dyrektywy:
PAGE n
gdzie: n - liczba dziesiętna wierszy strony wydruku.
Dyrektywę PAGE umieszcza się na początku programu źródłowego. Brak dyrektywy
oznacza przyjęcie domyślnej wartości n=66.
10. Dyrektywa XLIST - wyłącz listowanie programu
Składnia dyrektywy:
XLIST
11. Dyrektywa LIST - przywróć listowanie programu
Składnia dyrektywy:
LIST
Dyrektywy XLIST i LIST stosuje się parami, gdy chce się wyłączyć fragmenty programu
lub duże zbiory danych (tablice funkcji itp.) z drukowania w pliku dokumentacyjnym (listingu ).
4.5. Błędy sygnalizowane przez asembler.
Po zakończeniu tłumaczenia programu źródłowego asembler XA51 wypisuje komunikat
informujący o liczbie linii programu oraz o liczbie błędów (errors) i ostrzeżeń (warnings), np. :
Lines:
78
Errors:
2
Warnings: 0
Liczba błędów równa zeru oznacza, że program źródłowy został prawidłowo
przetłumaczony i na dysku zostały zapisane dwa pliki wynikowe :
nazwa. HEX
nazwa. LST.
W przeciwnym przypadku plik typu HEX nie zostanie utworzony, a plik dokumentacyjny
(typu LST) będzie zawierał informacje o błędach. Linia z błędem zostanie podkreślona, błędne
miejsce w linii zostanie wskazane „daszkiem”, a w następnej linii zostanie wydrukowany
komunikat podający kod literowy błędu i numer błędnej linii, np. :
ET1: MOV A, # STALA ; ładuj stałą
^
−−−−−−−−−−−−−−−−−−−−−−−
Error N at line 29
Numer linii jest przydatny na etapie poprawiania programu źródłowego. Edytory
automatycznie numerują linie tekstu.
24
Asembler XA51 wykrywa następujące rodzaje błędów :
D - powtórzona nazwa
E - brak dyrektywy END
I - nielegalna nazwa
N - niezdefiniowana nazwa
O - błędne wyrażenie (kolejność operacji)
P - błędny parametr
R - zbyt odległy adres skoku
W - ostrzeżenie (np. zbędny znak)
X - błędny kod operacji
0 - błąd dzielenia przez 0 .
4.6. Zgodność z innymi asemblerami.
Programy źródłowe napisane zgodnie z wymaganiami asemblera XA51 są akceptowane i
skutecznie tłumaczone przez znane na polskim rynku asemblery : A51 (Keil Elektronik), ASM51
(Intel), XASM51 (Avocet Systems), CASM52 (Instytut Maszyn Matematycznych) - przy
przestrzeganiu mało istotnych następujących ograniczeń :
- dla A51:
1) nie używać znaku @ w nazwach (symbolach)
2) nie używać dyrektyw : XLIST i LIST, lub zastąpić je dyrektywami :
$NOLIST i $LIST
- dla ASM51:
3) jak 1)
4) nie używać dyrektyw : XLIST i LIST lub zastąpić dyrektywami
$LIST (zapisanymi na początku linii)
:
$NOLIST i
- dla XASM51:
5) jak 1)
6) nie używać znaku podkreślenia (_) w nazwach
7) długość nazw (symboli) nie większa od 8
8) nie używać dyrektywy BIT lub zastąpić ją dyrektywą EQU
9) nie używać dyrektyw: XLIST i LIST lub zastąpić je dyrektywami : NOLIST i LIST
- dla CASM52:
10) jak 1)
11) nie używać dyrektywy BIT lub zastąpić ją dyrektywą REG
12) nie używać dyrektyw: XLIST i LIST lub zastąpić je dyrektywami LIST OFF i LIST
ON, w linii wywołania asemblera podać parametry DL, DD ( listing zapisywany na
dysk ) i na początku programu umieścić dyrektywę LIST ON ( włączenie listowania ).
25
Asemblery XA51 i XASM51 tworzą pliki wykonywalne typu .HEX i zbędny jest etap
łączenia (konsolidacji, linkowania ). Natomiast asemblery ASM51, A51 i CASM52 tworzą pliki
wynikowe relokowalne, typu .OBJ, które następnie muszą być poddane łączeniu, za pomocą
programów łączących ( linkerów ) o nazwach: RL51 - dla ASM51, L51 - dla A51 i LINK2 - dla
CASM52.
26
5. Ćwiczenia z programowania i uruchamiania systemów z
mikroprocesorami 8051
5.1. Ćwiczenie 1. Tworzenie i uruchamianie programu użytkowego
5.1.1. Cel ćwiczenia
Celem ćwiczenia jest poznanie procesu tworzenia i uruchamiania programu użytkowego na
przykładzie oprogramowania prostego problemu , do opisu którego wymagana jest znajomość
kilkunastu prostych rozkazów mikroprocesora 8051. Pokazane zostaną typowe etapy tworzenia
programu takie jak: analiza problemu, sposób wykorzystania zasobów sprzętowych systemu
( przypisywanie zmiennych, nazw tablic itp. - komórkom pamięci ), sporządzanie schematu
blokowego programu, edycja programu źródłowego, tłumaczenie tego programu na kod
wykonywalny oraz uruchomienie programu. Na etapie uruchamiania zostanie wykorzystana
większość narzędzi softwareowych programu uruchomieniowego MONITOR MKD-51.
5.1.2. Program przykładowy WPRO (plik dyskowy C01_WPRO)
A. Opis i analiza zadania
Zadaniem programu jest wypełnienie 16- bajtowego obszaru (bufora) BUF1 pamięci
wewnętrznej kolejnymi liczbami rosnącymi, jeżeli zmienna KIER = 0, lub malejącymi, jeżeli
zmienna ta nie równa się 0, począwszy od wartości określonej zmienną WPOCZ, a następnie
skopiowanie tego obszaru do innego obszaru BUF2, o takim samym rozmiarze. Wartości
zmiennych KIER i WPOCZ będą zadawane za pomocą odpowiedniego polecenia programu
MONITOR, przed uruchomieniem programu WPRO.
B. Koncepcja rozwiązania
Zmiennym KIER i WPOCZ oraz buforom BUF1 i BUF2 przypisano komórki pamięci
wewnętrznej procesora, jak to pokazano na rys. 5.1.1.
Sposób realizacji zadania pokazuje uproszczony schemat blokowy programu
przedstawiony na rys. 5.1.2. oraz szczegółowy schemat przedstawiony na rys. 5.1.3.
Dwa fragmenty programu - jako bardzo ogólne, przyjęto zrealizować w formie
podprogramów z myślą o wykorzystaniu ich w innych programach. Są to:
ZERPAM - podprogram zerowania obszaru pamięci
KOPIUJ - podprogram kopiowania bloku ( bufora) pamięci w inne miejsce.
Przy wywoływaniu podprogramów mikroprocesor korzysta ze stosu. Aby było to możliwe,
w pamięci RAM trzeba zarezerwować pewną liczbę komórek na stos, a w programie ustawić
rejestr wskaźnika stosu (SP) na adres wskazujący „dno stosu”. Jeżeli tę czynność się pominie, to
adres ten będzie narzucony przez procesor (w czasie kasowania systemu sygnałem RESET
wskaźnik stosu ustawiony będzie na wartość SP=7 ).
W programie wykorzystano trzy rejestry robocze R0, R1 i R2, przy czym w różnych
miejscach programu ich przeznaczenie jest różne. W opisywanym przypadku nie powoduje to
błędów, jednak zadaniem programisty jest dbanie o ochronę rejestrów przed niezamierzonym
zniszczeniem ich zawartości. Sytuacje takie mogą mieć miejsce wtedy, gdy podprogramy i
program główny korzystają z tych samych rejestrów. Stosuje się wówczas programową czasową
ochronę rejestrów przez odkładanie na stos, lub korzystanie z różnych banków rejestrów.
27
Rys.5.1.1. Organizacja (mapa) wewnętrznej pamięci RAM do programu WPRO
Rys.5.1.2. Uproszczony schemat blokowy programu WPRO
28
Rys. 5.1.3. Szczegółowy schemat blokowy programu WPRO.
29
Do konstrukcji schematów blokowych stosuje się znormalizowane symbole graficzne
operacji, zestawione w załączniku Z4.
Przy zapisie operacji przesłań danych, (X:=Y oznacza przesłanie / podstawienie Y do X)
wewnątrz symboli graficznych schematu blokowego skorzystano z systemu przedrostków ( ang.
prefix), stosowanego w liście rozkazów mikroprocesora 8051, w którym:
X: = # N - oznacza podstawienie do X danej tzw. natychmiastowej ( N - jest daną),
X: = N
- oznacza podstawienie do X danej adresowanej bezpośrednio ( N - jest
adresem danej )
X: = R i - oznacza podstawienie do X danej adresowanej rejestrowo (R i - zawiera daną )
X: = @ R i - oznacza podstawienie do X danej adresowanej pośrednio przez rejestr (R i zawiera adres danej ).
C. Edycja programu źródłowego
W oparciu o schemat blokowy z rys. 5.1.3. pisze się tzw. program źródłowy, w którym
poszczególne działania zapisuje się w postaci jednej lub kilku instrukcji języka programowania.
Pisząc program źródłowy trzeba mieć na względzie szczegółowe wymagania narzucane
przez program tłumaczący ( asembler ). W ćwiczeniu wykorzystywany będzie asembler XA51
(rozdz. 4 ).
W treści programu źródłowego można wyróżnić następujące typowe części:
- definicje stałych
- definicje zmiennych
- program właściwy (główny )
- podprogramy.
Definiowanie stałych i zmiennych polega na przypisaniu nazw symbolicznych (symboli)
stałym ( liczbom, adresom, tekstom ) i zmiennym ( adresom komórek pamięci ). Do tego celu
wykorzystuje się dyrektywy asemblera ( p.4.4.).
W części inicjalizacyjnej zapisuje się instrukcje służące do wykonania niezbędnych
czynności wstępnych, związanych z przygotowaniem systemu do wykonania programu, jak np.
ustawienie wskaźnika stosu, wyzerowanie określonych komórek pamięci (zmiennych),
zaprogramowanie programowalnych układów wejściowo/wyjściowych, ustawienie trybów pracy
liczników, zorganizowanie systemu przerwań itp.
Program główny wraz z podprogramami realizuje założony algorytm działania systemu.
Program źródłowy powinien być czytelny i dlatego powinien zawierać odpowiednie
komentarze.
Program źródłowy pisze się przy użyciu dowolnego edytora tekstowego i zapisuje jako plik
dyskowy, nadając mu nazwę z rozszerzeniem .ASM, np.: C01_WPRO.ASM (p. wydruk).
D. Tłumaczenie programu źródłowego
Program źródłowy poddaje się tłumaczeniu ( asemblacji ) za pomocą właściwego
programu tłumaczącego, tutaj asemblera XA51. W wyniku tłumaczenia otrzymuje się dwa pliki
wynikowe :
- wykonywalny C01_WPRO.HEX, w standardzie INTEL - HEX (rys.5.1.4)
- dokumentacyjny ( listing ) C01_WPRO_LST (p. wydruk).
30
WYDRUK KODU ŹRÓDŁOWEGO PROGRAMU „WPRO”
(c01_wpro.asm)
;******************************************************
;*
PIERWSZY PROGRAM
*
;*
(plik zrodlowy: C01_WPRO.ASM)
*
;******************************************************
;DEFINICJE STALYCH
;(przypisanie nazw symbolicznych stalym)
STOS
RAMW
EQU
EQU
67H
0
RAMP
EQU
0
DLBUF
EQU
16
;adres dna stosu
;adres poczatku wewn.
;pamieci danych RAM
;adres poczatku pam.
;programu (RAM-1)
;dlugosc buforow
;DEFINICJE ZMIENNYCH
;(rezerwacja komorek pamieci RAMW na zmienne)
WPOCZ:
KIER:
BUF1:
BUF2:
ORG
RAMW
DS
DS
DS
DS
DS
20H
1
1
10H
DLBUF
;4 banki rej.R0..R7
;wartosc pocz. liczb
;kierunek zmian liczb
;bufor 1, (10H=16)
;bufor 2, (DLBUF=16)
RAMP
;poczatek programu
;INICJALIZACJA
ORG
MOV
SP,#STOS
;Zerowanie buforow BUF1 i BUF2
MOV
R1,#BUF1
MOV
R0,#2*DLBUF
LCALL
ZER_PAM
;ustaw wskaznik stosu
;poczatek obszaru
;dlugosc obszru
;wywolanie podprogr.
;zerowania pamieci.
;PROGRAM GLOWNY
MOV
MOV
MOV
MOV
PETLA:
MOV
CJNE
INC
SJMP
MINUS:
DEC
DALEJ:
INC
DJNZ
;Kopiowanie BUF1 do
MOV
MOV
MOV
LCALL
A,WPOCZ
R2,KIER
R1,#BUF1
R0,#DLBUF
@R1,A
R2,#0,MINUS
A
DALEJ
A
R1
R0,PETLA
BUF2
R0,#BUF1
R1,#BUF2
R2,#DLBUF
KOPIUJ
;zmienna WPOCZ do A
;zmienna KIER do R2
;adres bufora 1 do R1
;liczba petli do R0
;zalad.liczbe do BUF1
;skocz, gdy l.malejace
;l.rosnace - powieksz
;przeskocz
;l.malejace - zmniejsz
;nastepny bajt
;wroc, jesli nie kon.
STOP:
STOP
;albo:
SJMP
;($=STOP)
;adres bufora 1
;adres bufora 2
;dlugosc buforow
;wywolanie podprogr.
;kopiowania pamieci.
;Koniec progr. W tym miejscu trzeba zatrzymac proces
;wykonywania programu przez mikroproc. (pusta petla).
SJMP
31
$
;PODPROGRAMY
;ZER_PAM - Procedura zerowania obszru pamieci
;Parametry we.: R0-dlugosc obszaru
;
R1-adres poczatku obszaru
ZER_PAM:MOV
@R1,#0
;laduj zero do pam.
INC
R1
;nastepny bajt
DJNZ
R0,ZER_PAM
;wroc,jesli nie kon.
RET
;powrot do pr.wywol.
;KOPIUJ - Proc. kopiowannia obszaru pamieci do innego
;obszaru o takiej samej dlugosci (obszary rozlaczne).
;Parametry we.: R0-adres pocz. pierwszego obszaru
;
R1-adres pocz. drugiego obszaru
;
R2-dlugosc obszarow
;Procedura niszczy zawartosc rejestru A
KOPIUJ:
MOV
A,@R0
;wez bajt z 1 obszaru
MOV
@R1,A
;i zaladuj do 2 obsz.
INC
R0
;nast. adr. 1 obszaru
INC
R1
;nast. adr. 2 obszaru
DJNZ
R2,KOPIUJ
;wroc, jesli nie kon.
RET
;powrot do pr.wywol.
;Koniec tresci programu zrodlowego. Dyrektywa END
;informuje o tym program tlumaczacy (asembler).
END
32
WYDRUK PLIKU DOKUMENTACYJNEGO PROGRAMU „WPRO”
(c01_wpro.lst)
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c01_wpro.asm
Page
1
0000
0000
0000
0000
;******************************************************
;*
PIERWSZY PROGRAM
*
;*
(plik zrodlowy: C01_WPRO.ASM)
*
;******************************************************
0000
0000
;DEFINICJE STALYCH
;(przypisanie nazw symbolicznych stalym)
0067
0000
0000
0000
0000
0010
=
=
STOS
RAMW
EQU
EQU
67H
0
=
RAMP
EQU
0
=
DLBUF
EQU
16
0000
0000
;DEFINICJE ZMIENNYCH
;(rezerwacja komorek pamieci RAMW na zmienne)
0000
ORG
RAMW
DS
DS
DS
DS
DS
20H
1
1
10H
DLBUF
;4 banki rej.R0..R7
;wartosc pocz. liczb
;kierunek zmian liczb
;bufor 1, (10H=16)
;bufor 2, (DLBUF=16)
RAMP
;poczatek programu
0000
0020
0021
0022
0032
WPOCZ:
KIER:
BUF1:
BUF2:
0042
;INICJALIZACJA
0000
0000
0003
0003
0005
0007
000A
ORG
758167
7922
7820
120028
000A
000A
000C
000E
0010
0012
0013
0016
0017
0019
001A
001B
001D
001D
001F
0021
0023
0026
0026
0026
0026
0028
;adres dna stosu
;adres poczatku wewn.
;pamieci danych RAM
;adres poczatku pam.
;programu (RAM-1)
;dlugosc buforow
MOV
SP,#STOS
;Zerowanie buforow BUF1 i BUF2
MOV
R1,#BUF1
MOV
R0,#2*DLBUF
LCALL
ZER_PAM
;ustaw wskaznik stosu
;poczatek obszaru
;dlugosc obszru
;wywolanie podprogr.
;zerowania pamieci.
;PROGRAM GLOWNY
E520
AA21
7922
7810
F7
BA0003
04
8001
14
09
D8F5
7822
7932
7A10
12002E
80FE
MOV
A,WPOCZ
MOV
R2,KIER
MOV
R1,#BUF1
MOV
R0,#DLBUF
PETLA: MOV
@R1,A
CJNE
R2,#0,MINUS
INC
A
SJMP
DALEJ
MINUS: DEC
A
DALEJ: INC
R1
DJNZ
R0,PETLA
;Kopiowanie BUF1 do BUF2
MOV
R0,#BUF1
MOV
R1,#BUF2
MOV
R2,#DLBUF
LCALL
KOPIUJ
;zmienna WPOCZ do A
;zmienna KIER do R2
;adres bufora 1 do R1
;liczba petli do R0
;zalad.liczbe do BUF1
;skocz, gdy l.malejace
;l.rosnace - powieksz
;przeskocz
;l.malejace - zmniejsz
;nastepny bajt
;wroc, jesli nie kon.
;adres bufora 1
;adres bufora 2
;dlugosc buforow
;wywolanie podprogr.
;kopiowania pamieci.
;Koniec progr. W tym miejscu trzeba zatrzymac proces
;wykonywania programu przez mikroproc. (pusta petla).
STOP:
SJMP
STOP
;albo:
SJMP
$
;($=STOP)
33
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c01_wpro.asm
Page
0028
;PODPROGRAMY
0028
0028
0028
0028
002A
002B
002D
7700
09
D8FB
22
;ZER_PAM - Procedura zerowania obszru pamieci
;Parametry we.: R0-dlugosc obszaru
;
R1-adres poczatku obszaru
ZER_PAM:MOV
@R1,#0
;laduj zero do pam.
INC
R1
;nastepny bajt
DJNZ
R0,ZER_PAM
;wroc,jesli nie kon.
RET
;powrot do pr.wywol.
E6
F7
08
09
DAFA
22
;KOPIUJ - Proc. kopiowannia obszaru pamieci do innego
;obszaru o takiej samej dlugosci (obszary rozlaczne).
;Parametry we.: R0-adres pocz. pierwszego obszaru
;
R1-adres pocz. drugiego obszaru
;
R2-dlugosc obszarow
;Procedura niszczy zawartosc rejestru A
KOPIUJ: MOV
A,@R0
;wez bajt z 1 obszaru
MOV
@R1,A
;i zaladuj do 2 obsz.
INC
R0
;nast. adr. 1 obszaru
INC
R1
;nast. adr. 2 obszaru
DJNZ
R2,KOPIUJ
;wroc, jesli nie kon.
RET
;powrot do pr.wywol.
002E
002E
002E
002E
002E
002E
002E
002F
0030
0031
0032
0034
0035
0035
;Koniec tresci programu zrodlowego. Dyrektywa END
;informuje o tym program tlumaczacy (asembler).
END
BUF1
KIER
RAMP
WPOCZ
0022
0021
0000
0020
BUF2
KOPIUJ
RAMW
ZER_PAM
Symbol Table
0032
DALEJ
002E
MINUS
0000
STOP
0028
Lines : 90
Errors : 0
Warnings : 0
34
001A
0019
0026
DLBUF
PETLA
STOS
0010
0012
0067
2
E. Uruchamianie programu
W systemie projektowo-uruchomieniowym jakim jest mikrokomputer MKD-51, aby
wykonać zaprojektowany program należy załadować plik C01_WPRO.HEX do pamięci RAM-1
systemu poleceniem „L” programu MONITOR ( p. 3.2 ). W czasie ładowania plik typu HEX jest
zamieniany na kod binarny. Na rys. 5.1.5 pokazano tę postać programu, otrzymaną przez
przetworzenie kodu Intel-Hex za pomocą programu ihexbin.exe ( na dyskietce systemowej) ( kody
binarne odczytuje się w zapisie szesnastkowym ).
:1000000000000000000000000000000000000000F0
:1000100000000000000000000000000000000000E0
:1000200000000000000000000000000000000000D0
:1000300000000000000000000000000000000000C0
:020040000000BE
:1000000075816779227820120028E520AA217922BB
:100010007810F7BA00030480011409D8F578227922
:10002000327A1012002E80FE770009D8FB22E6F704
:050030000809DAFA22C4
:00000001FF
Rys.5.1.4. Kod Intel HEX programu WPRO ( p. załącznik Z6)
0000
0010
0020
0030
0040
75
78
32
08
00
81
10
7A
09
00
67
F7
10
DA
79
BA
12
FA
22
00
00
22
78
03
2E
00
20
04
80
00
12
80
FE
00
00
01
77
00
28
14
00
00
E5
09
09
00
20
D8
D8
00
AA
F5
FB
00
21
78
22
00
79
22
E6
00
22
79
F7
00
Rys.5.1.5. Kod binarny programu WPRO
Załadowany program można poddać próbie wykonania pod kontrolą programu MONITOR
( poleceniem „G” ). Próba da wynik pozytywny tylko wtedy, gdy program nie zawiera błędów (
koncepcyjnych, logicznych, formalnych, edycyjnych itp.) oraz gdy sprawny jest sprzęt ( hardware
). Programy niesprawdzone zwykle mają wiele błędów. W celu wykrycia i usunięcia tych błędów
prowadzi się badania uruchomieniowe. Jednym ze sposobów uruchamiania programów jest
wykorzystanie specjalizowanych mikrokomputerów, takich jak MKD-51, wyposażonych w
program uruchomieniowy MONITOR.
Zbiór poleceń programu MONITOR MKD-51 (p.3.2.) umożliwia obserwację wykonania
programu fragmentami (stosując pułapki programowe), śledzenie pracy programu krok po kroku
(praca krokowa), wyświetlanie stanów rejestrów i komórek pamięci, poprawianie zawartości
rejestrów i pamięci, porównywanie obszarów pamięci itp.
Prowadzenie prac uruchomieniowych jest przedmiotem ćwiczenia.
35
5.1.3. Zadania do wykonania.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Zainicjować system MKD-51 z poziomu komputera PC - poleceniem
mkd 51. exe.
Załączyć mikrokomputer MKD-51 i wywołać program MONITOR MKD-51
klawiszem RESET w MKD-51.
Przejrzeć listę poleceń MONITORA ( naciskając klawisz F1 w mikrokomputerze
PC lista zostanie wyświetlona ).
Załadować program C01_WPRO.HEX ( poleceniem „L” MONITORA ).
Wykonać program WPRO ( poleceniem „G0” ). Sprawdzić zawartości
buforów BUF1 i BUF2 korzystając z odpowiednich poleceń MONITORA.
Poleceniem „Z” wpisać założone wartości zmiennych KIER i WPOCZ, a
następnie powtórzyć p.5.
Sprawdzić działanie wszystkich poleceń MONITORA ( opis poleceń znajduje
się w p. 3.2 ).
Wyjść z programu MONITOR do DOS ( klawisz F10 ).
Korzystając z edytora NE ( klawisz F4 ) przepisać ręcznie program źródłowy
C01_WPRO. ASM i zapisać pod zmienioną nazwą, np. MOJPR. ASM.
Dokonać asemblacji programu MOJPR. ASM , korzystając z programu
xa51.exe.
Powtórzyć punkty 1 i 2.
Załadować program MOJPR. HEX do pamięci MKD-51
Uruchomić program. Prowadzący ćwiczenia wprowadzi do programu błędy,
które trzeba będzie wykryć.
36
5.2. Ćwiczenie 2. Obsługa wejść i wyjść binarnych.
5.2.1. Cel ćwiczenia
Celem ćwiczenia jest poznanie sposobów przesyłania informacji zero-jedynkowej
(binarnej) do i z systemu mikroprocesorowego. Celem dodatkowym jest poznanie programowej
realizacji opóźnień czasowych.
W ćwiczeniu wykorzystano następujące wejścia i wyjścia mikrokomputera MKD-51
(p.2.2, rys.2.2) :
- wejścia :
a) stykowe stabilne : X0, X1, X2, X3
b) stykowe niestabilne : X4, X5
Sygnały wejściowe doprowadzone są do systemu MKD-51 przez bufor wejściowy PTWE,
( wciśnięcie klawisza zmienia stan sygnału z „1” na „0” )
- wyjścia :
a) sygnalizacyjne ( lampki - diody świecące ) L0...L7 - sterowane przez bufor wyjściowy
PTWY
b) lampka L8 sterowana bezpośrednio sygnałem P1.6 mikroprocesora
c) buczek BU sterowany bezpośrednio sygnałem P1.7 mikroprocesora
d) stykowe ( przekaźniki ) P0, P1, P2 sterowane wspólnie z lampkami L0,
L1, L2 przez bufor PTWY ;
Sygnał „1” wysyłany z procesora powoduje zapalenie odpowiedniej lampki, włączenie
cewki przekaźnika lub włączenie buczka.
5.2.2. Program przykładowy WEWY (C02_WEWY)
Program realizuje następujące funkcje :
1) Załączenie i wyłączenie przełączników klawiszowych X0, X1, X2, X3
powoduje zapalenie i wygaszenie lampek odpowiednio : L0, L1, L2, L3
2) Krótkotrwałe wciśnięcie przycisku X4 powoduje włączenie buczka BU i zapalenie
lampki L8
3) Krótkotrwałe wciśnięcie przycisku X5 powoduje wyłączenie buczka i zgaszenie
lampki. Wyjście z programu odbywa się przez naciśnięcie przycisku RESET.
Schemat blokowy programu WEWY przedstawiono na rys. 5.2.1.
5.2.3. Zadania do wykonania
Należy napisać i uruchomić programy realizujące następujące funkcje :
1) Krótkotrwałe wciśnięcie przycisku X4 powoduje włączenie buczka na czas ok. 100 ms
(„ kliknięcie” ).
2) Krótkotrwałe wciśnięcie przycisku X5 rozpoczyna migotanie lampki L8 z częstotliwością ok.
1 Hz, a krótkotrwałe wciśnięcie X4 powoduje „kliknięcie” i wyłączenie migotania lampki.
3) Wciśnięcie klawisza stabilnego X0 inicjuje proces zapalania na czas ok. 0,5 sek. kolejnych
lampek L0..L7,L0..L7..z wygaszeniem poprzedniej („wędrujące światełko”). Naciśnięcie
przycisku X5 zatrzymuje „wędrówkę”, wszystkie lampki zostają wygaszone a zwolnienie X5
przywraca tę „wędrówkę”. Wyciśnięcie klawisza stabilnego X0 przerywa proces.
37
Rys. 5.2.1. Schemat blokowy programu WEWY.
38
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c02_wewy.asm
Page
1
0000
0000
0000
0000
;******************************************************
;*
OBSLUGA WEJSC I WYJSC BINARNYCH
*
;*
(plik zrodlowy: C02_WEWY.ASM)
*
;******************************************************
0000
0000
;DEFINICJE STALYCH
;(przypisanie nazw symbolicznych stalym)
0000
8008
8008
=
=
=
RAMP
PTWE
PTWY
EQU
EQU
EQU
0
8008H
8008H
;adr. portu wejsc.
;adr. portu wyjsc.
0000
;POCZATEK PROGRAMU
0000
ORG
RAMP
MOV
MOVX
CPL
MOV
ANL
MOV
MOVX
DPTR,#PTWE
A,@DPTR
A
R2,A
A,#0FH
DPTR,#PTWY
@DPTR,A
MOV
JNB
SETB
SETB
A,R2
ACC.4,WEWY1
P1.6
P1.7
;jesli X4 wcisniety,
;to zalacz L8
;i BU
JNB
CLR
CLR
LJMP
ACC.5,WEWY
P1.6
P1.7
WEWY
;jesli X5 wcisniety,
;to wylacz L8
;i BU
;kontroluj dalej PTWE
0000
0003
0004
0005
0006
0008
000B
908008
E0
F4
FA
540F
908008
F0
000C
000D
0010
0012
EA
30E404
D296
D297
0014
0017
0019
001B
30E5E9
C296
C297
020000
WEWY:
WEWY1:
;wczytaj PTWE
;zaneguj i umiesc
;w R2
;mlodsze 4 bity
;wyslij na PTWY
END
PTWE
WEWY1
8008
0014
PTWY
Symbol Table
8008
RAMP
Lines : 36
Errors : 0
Warnings : 0
39
0000
WEWY
0000
5.3. Ćwiczenie 3. Programowanie liczników wewnętrznych mikroprocesora.
5.3.1. Cel ćwiczenia.
Celem ćwiczenia jest poznanie sposobu programowania liczników wewnętrznych
procesora T0 i T1 oraz wykorzystanie ich do odmierzania czasu i generowania przerwań.
5.3.2. Program przykładowy LICZ (C03_LICZ)
Program LICZ powoduje zapalanie i gaszenie lampki L8 z częstotliwością ok. 1 Hz oraz
zapalanie lampek L7..L0 zgodnie z kolejnymi kombinacjami 8-bitowego kodu naturalnego ( stany
: 0, 1, ...255, 0, 1 ...). Pracę programu kończy naciśnięcie przycisku RESET. Schematy blokowe
programu przedstawiono na rys. 5.3.1 . Program LICZ składa się z programu głównego
rozpoczynającego się od etykiety INIC i programu IRT obsługującego przerwanie zgłaszane co 5
ms na skutek kolejnych przepełnień licznika T0.
W programie LICZ wykorzystywane są dwie komórki robocze :
L100
KPTWY
- licznik modulo 100
- kopia portu wyjściowego PTWY.
Komórki te umieszczone są w wewnętrznej pamięci RAM procesora pod adresami 20H i 21H. Są
one zerowane na początku programu głównego, w którym także zostają zaprogramowane rejestry
: TMOD, TCON, IE tak, aby licznik T0 pracował w trybie 1 i mógł zgłaszać przerwania przy
jego przepełnieniu. Następnie do licznika tego wpisywana jest wartość początkowa taka, aby
pierwsze zgłoszenie przerwania nastąpiło po zliczeniu 5000 impulsów zegarowych ( 1 MHz ). Jest
to więc liczba : x = 10000H - 5000D = 0EC78H ( por. listing ). Po załadowaniu tej wartości
zostają odblokowane przerwania i program główny wchodzi w pustą pętlę oznaczoną przez PETL.
Z pętli tej procesor wyprowadzany jest co 5 ms na skutek przerwań zgłaszanych przepełnieniem
licznika. Wywołany jest wtedy podprogram IRT, po wykonaniu którego następuje powrót do
programu głównego pracującego w martwej pętli PETL. W podprogramie IRT wykonywane są
następujące czynności :
1) załadowanie licznika T0 taką wartością, aby następne przerwanie nastąpiło znów po
5ms (- 5000D = 0EC78H )
2) powiększanie licznika L100 modulo 100 a przy każdym jego zerowaniu (co zachodzi
co 500 ms) następuje zmiana stanu lampki L8
3) przy każdym zapaleniu się lampki L8 następuje zwiększenie o 1 binarnej zawartości
komórki KPTWY, której stan wyprowadzany jest wtedy na port wyjściowy PTWY
4) na końcu podprogramu IRT umieszczona jest instrukcja RETI zapewniająca powrót
do programu głównego czyli do pętli oznaczonej PETL.
5.3.3. Zadania do wykonania.
1) Zmodyfikować program LICZ tak, aby przy wciśniętym przycisku X5
przełączanie lampek X7..X0 zachodziło z 2-krotnie wyższą częstotliwością.
2) Zmodyfikować program z p. 1) w ten sposób, aby przy wciśniętym klawiszu
stabilnym X0 „licznik binarny” L7..L0 działał wstecz, a przy nie wciśniętym - w przód.
40
a)
c)
d)
b)
Rys. 5.3.1. Schematy blokowe programu LICZ:
a) program główny
b) podprogram obsługi przerwań
c) zawartości rejestrów TMOD, TCON, IE
d) komórki robocze
41
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c03_licz.asm
Page
1
0000
0000
0000
0000
;******************************************************
;*
PROGRAMOWANIE LICZNIKOW WEWN. MIKROPROCESORA
*
;*
(plik zrodlowy: C03_LICZ.ASM)
*
;******************************************************
0000
0000
;DEFINICJE STALYCH
;(przypisanie nazw symbolicznych stalym)
005F
0000
0000
0000
8008
0096
=
=
STOS
RAMW
EQU
EQU
5FH
0
=
=
=
RAMP
PTWY
L8
EQU
EQU
BIT
0
8008H
P1.6
0000
0000
;adres dna stosu
;adr. pocz. wewn.
;pam. danych RAM
;adr. pocz. pam.
;adr.PTWY
;adr. lamp. L8
;DEFINICJE ZMIENNYCH
;(rezerwacja komorek pamieci RAMW na zmienne)
0000
ORG
RAMW
0000
DS
20H
;4 banki rej. R0..R7
DS
DS
1
1
;licznik MOD 100
;kopia PTWY
ORG
RAMP
;poczatek programu
LJMP
INIC
DS
0BH - $
;skocz do pierwszej
;instr. programu
LJMP
IRT
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
SP,#STOS
TMOD,#01
TCON,#10H
IE,#02
L100,#0
KPTWY,#0
DPTR,#-5000
TL0,DPL
TH0,DPH
SETB
IE.7
;odblokuj przerwania
LJMP
PETL
;wykonuj martwa petle
0020
0021
L100:
KPTWY:
0022
;INICJALIZACJA
0000
0000
0000
0003
0003
02000E
000B
000E
000E
0011
0014
0017
001A
001D
0020
0023
0026
02002E
0029
D2AF
002B
02002B
75815F
758901
758810
75A802
752000
752100
90EC78
85828A
85838C
INIC:
PETL:
002E
002E
0031
0034
0037
0039
003B
003E
0041
0043
0046
;skocz do podpr.
;obslugi przerwan
;ustaw wskaznik stosu
;progr. TMOD, TCON, IE
;wyzeruj kom. robocze
;wpisz wart. poczatk.
;do liczn. T0
;PODPROGRAM OBSLUGI PRZERWAN
90EC78
85828A
85838C
0520
E520
B46410
752000
B296
309608
0521
IRT:
MOV
MOV
MOV
INC
MOV
CJNE
MOV
CPL
JNB
INC
DPTR,#-5000
TL0,DPL
TH0,DPH
L100
A,L100
A,#100,IRT1
L100,#0
L8
L8,IRT1
KPTWY
42
;pocz. ppr.obslugi
;przerwan
;laduj liczn. T0
;powieksz kom. LM100
;MOD100
;przy kazdym zerowaniu
;zmian stan L8
;przy zapalaniu L8
;powieksz stan KPTWY
0048
004B
004D
004E
908008
E521
F0
32
IRT1:
MOV
MOV
MOVX
RETI
DPTR,#PTWY
A,KPTWY
@DPTR,A
;i wyslij na PTWY
;powrot z przerwania
END
INIC
L100
RAMP
000E
0020
0000
IRT
L8
RAMW
Symbol Table
002E
IRT1
0096
PETL
0000
STOS
Lines : 69
Errors : 0
Warnings : 0
43
004E
002B
005F
KPTWY
PTWY
0021
8008
5.4. Ćwiczenie 4. Procedury arytmetyczne.
5.4.1. Cel ćwiczenia
Celem .ćwiczenia jest poznanie procedur arytmetycznych obejmujących dodawanie,
odejmowanie, mnożenie oraz dzielenie liczb dwójkowych i dziesiętnych przedstawionych w
kodzie BCD - 8421.
5.4.2. Program przykładowy ARYT (C04_ARYT)
Przykładowe procedury arytmetyczne zestawiono w programie ARYT. Program ten
zawiera następujące podprogramy :
1)
2)
3)
4)
5)
6)
7)
DODB
ODJB
DODD
DOPD
ODJBCD
MNB
DZIEL
-
dodawanie binarne liczb 24-bitowych
odejmowanie binarne liczb 24-bitowych
dodawanie dziesiętne liczb 6-cyfrowych
utworzenie dopełnienia dziesiątkowego liczb 6-cyfrowych
odejmowanie dziesiętne liczb 6-cyfrowych
mnożenie liczb binarnych 16 x 8 bitów
dzielenie liczb binarnych 24bity/16 bitów.
Dla każdego z tych podprogramów podano warunki wywołania ( źródło zmiennych wejściowych
oraz miejsce przeznaczenia wyniku ).
W celu sprawdzenia poprawności działania podprogramów można postąpić dwojako :
1) Wykorzystać polecenie monitora : G < adr 1 >, < p1 > ENTER, gdzie < adr 1 >
należy ustawić jako adres początku podprogramu a < p1 > jest adresem pułapki, którą należy
ustawić na adres, pod którym znajduje się instrukcja : RET. Dla przykładu, w celu sprawdzenia
podprogramu MNB należy załadować rejestry : DPTR i R1 oraz wykonać polecenie :
G69, 8A ENTER
Wynik uzyska się w komórkach BAR, BAR + 1,
umieszczony jest pod najmłodszym adresem.
BAR + 2 przy czym najmłodszy bajt
2) Napisać fragment programu, który wywołuje badany podprogram instrukcją LCALL i
także wykorzystać polecenie G < adr 1 >, < p1 > ENTER, gdzie < adr 1 > oznacza adres
początku programu a < p1 > adres pułapki ustawionej bezpośrednio po instrukcji LCALL
wywołującej badany podprogram.
Dla przykładu w celu sprawdzenia procedury DODD można wykorzystać program DODBCD. W
tym celu należy w komórkach BAR, BAR + 1, BAR + 2 umieścić dodajną 6-cyfrową, w
komórce ARG, ARG + 1, ARG + 2 - dodajnik 6-cyfrowy, w rejestrze R1 adres komórki ARG (
tzn. 25H ) i wykonać polecenie :
G10,15 ENTER
Na rys. 5.4.1., ... , 5.4.3. zestawiono schematy blokowe poszczególnych procedur.
44
5.4.3 Zadania do wykonania.
1) Sprawdzić poprawność działania programów ARYT dla wybranych wartości
liczbowych.
2) Zmodyfikować MNB tak, aby mnożna i mnożnik były 16-bitowe,
np. DPTR - liczba 16-bitowa, R1 - adres argumentu 16-bitowego.
3) Napisać podprogram dzielenia binarnego 16 bitów / 16 bitów z ilorazem
16-bitowym, przy czym DZIELNA < DZIELNIK.
4) Opracować podprogram mnożenia 6-cyfrowych liczb BCD.
5) Opracować podprogram dzielenia 6-cyfrowych liczb BCD
( DZIELNA < DZIELNIK ), iloraz 6- cyfrowy.
45
WE:
WY:
WE:
WY:
BAR 0..2
R1
BAR0..2
- dodajna 3-bajtowa
- adres dodajnika 3-bajtowego (ARG)
- wynik 3-bajtowy
24 B3 C8
+0A 0C 1B
2E BF E3
BAR 0..2
R1
BAR0..2
- odjemna 3-bajtowa
- adres odjemnika 3-bajtowego (ARG)
- wynik 3-bajtowy
24 B3 C8
-0A 0C 1B
1A A7 AD
Rys. 5.4.1. Schematy blokowe podprogramów DODB, ODJB
46
WE:
WY:
BAR 0..2
R1
BAR0..2
- dodajna 6-cyfrowa
- adres dodajnika 6-cyfr
- wynik 6-cyfrowy
WE:
WY:
R1
- adres kom 3-bajt
M(R1) - dopełn. dzies.
36 48 56
+21 45 29
57 93 85
WE:
WY:
BAR 0..2
R1
BAR0..2
36 48 56
- 12 34 56
24 14 00
- odjemna 6-cyfrowa
- adres odjemnika
- wynik 6-cyfrowy
36 48 56
+87 65 44 (DOPD)
24 14 00
CY=1 - wynik dodatni
Rys. 5.4.2. Schematy blokowe podprogramów : DODD, DOPD, ODJBCD
47
WE:
WY:
DPTR
R1
BAR0..2
- mnożna 16-bitowa
- mnożnik 8-bitowy
- wynik 24-bitowy
C7A2
x 49
38ED32
WE:
WY:
BAR 0..2
DPTR
BAR0..2
- dzielna 24-bitowa
- dzielnik 16-bitowy (max 7FFF)
- wynik 24-bitowy
Rys. 5.4.3. Schematy blokowe podprogramów : MNB i DZIEL
48
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c04_aryt.asm
Page
1
0000
0000
0000
0000
;******************************************************
;*
PROCEDURY ARYTMETYCZNE
*
;*
(plik zrodlowy: C04_ARYT.ASM)
*
;******************************************************
0000
0000
;DEFINICJE STALYCH
;(przypisanie nazw symbolicznych stalym)
0000
0000
0000
=
RAMW
EQU
0
=
RAMP
EQU
0
0000
0000
;adr. pocz. wewn.
;pam. danych RAM
;adr. pocz. pam.
;DEFINICJE ZMIENNYCH
;(rezerwacja komorek pamieci RAMW na zmienne)
0000
ORG
RAMW
0000
DS
20H
;4 banki rej. R0..R7
DS
DS
5
3
;bufor arytmet.
;argument
ORG
RAMP
;poczatek programu
0020
0025
BAR:
ARG:
0000
0000
0000
0002
0005
0006
0007
7925
120025
00
00
00
DODBIN: MOV
LCALL
NOP
NOP
NOP
R1,#ARG
DODB
;dodawanie liczb bin.
;3-bajt. umieszczonych
;w BAR i ARG
0008
000A
000D
000E
000F
7925
120032
00
00
00
ODJBIN: MOV
LCALL
NOP
NOP
NOP
R1,#ARG
ODJB
;odejmow. liczb bin.
;3-bajt. umieszczonych
;w BAR i ARG
0010
0012
0015
0016
0017
7925
12003F
00
00
00
DODBCD: MOV
LCALL
NOP
NOP
NOP
R1,#ARG
DODD
;dodawanie liczb dzies.
;6-cyfr. umieszczonych
;w BAR i ARG
0018
001A
001D
001F
0022
0023
0024
7925
12004D
7925
12003F
00
00
00
ODJBCD: MOV
LCALL
MOV
LCALL
NOP
NOP
NOP
R1,#ARG
DOPD
R1,#ARG
DODD
;odejmowanie liczb
;dzies.6-cyfr.umieszcz.
;w BAR i ARG
0025
0025
0025
0025
0025
0025
0027
;PODPROGRAMY
DODB:
7A03
C3
;Dodawanie 3-bajt. liczb binarnych
;WE:BAR0..2 - dodajna
;
R1 - adres dodajnika
;WY:BAR0..2 - wynik
MOV
R2,#3
CLR
C
49
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c04_aryt.asm
0028
002A
002B
002C
002D
002E
002F
0031
0032
0032
0032
0032
0032
0034
0035
0037
0038
0039
003A
003B
003C
003E
003F
003F
003F
003F
0041
0042
0044
0045
0046
0047
0048
0049
004A
004C
004D
004D
004D
004D
004E
004F
0051
0052
0054
0055
0056
0057
0059
005A
005B
005D
005E
005F
0061
7820
E6
37
F6
08
09
DAF9
22
DODB1:
ODJB:
7A03
C3
7820
E6
97
F6
08
09
DAF9
22
ODJB1:
DODD:
7A03
C3
7820
E6
37
D4
F6
08
09
DAF8
22
DODD1:
DOPD:
E9
FB
7A03
C3
7499
97
F7
09
DAF9
EB
F9
7A03
D3
E7
3400
D4
DOPD1:
DOPD2:
MOV
MOV
ADDC
MOV
INC
INC
DJNZ
RET
Page
R0,#BAR
A,@R0
A,@R1
@R0,A
R0
R1
R2,DODB1
;Odejmowanie 3-bajt. liczb binarnych
;WE:BAR0..2 - odjemna
;
R1 - adres odjemnika
;WY:BAR0..2 - wynik
MOV
R2,#3
CLR
C
MOV
R0,#BAR
MOV
A,@R0
SUBB
A,@R1
MOV
@R0,A
INC
R0
INC
R1
DJNZ
R2,ODJB1
RET
;Dodawanie 6-cyfr. liczb dziesietnych
;WE: BAR0..2 - dodajna
;
R1 - adres dodajnika
MOV
R2,#3
CLR
C
MOV
R0,#BAR
MOV
A,@R0
ADDC
A,@R1
DA
A
MOV
@R0,A
INC
R0
INC
R1
DJNZ
R2,DODD1
RET
;Dopelnienie dzies.
;WE: R1 - adres arg.3-bajt. (6 cyfr BCD)
;WY: dopeln. dzies. arg. pod tym samym adr.
MOV
A,R1
MOV
R3,A
MOV
R2,#3
CLR
C
MOV
A,#99H
;utworz dop. dziewiat.
SUBB
A,@R1
MOV
@R1,A
INC
R1
DJNZ
R2,DOPD1
MOV
A,R3
MOV
R1,A
MOV
R2,#3
SETB
C
MOV
A,@R1
;i dodaj 1 dziesietnie
ADDC
A,#0
DA
A
50
2
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c04_aryt.asm
0062
0063
0064
0066
0067
0068
F7
09
DAF8
EB
F9
22
MOV
INC
DJNZ
MOV
MOV
RET
@R1,A
R1
R2,DOPD2
A,R3
R1,A
0069
0069
0069
0069
0069
006B
006D
006F
7400
F520
F521
F522
;Mnozenie liczb binarnych 16b*8b
;WE: DPTR - MNA 16-bitowa
;
R1 - MNIK 8-bitowy
;WY: BAR0..2 - wynik 24-bitowy
MOV
A,#0
MOV
BAR,A
MOV
BAR+1,A
MOV
BAR+2,A
0071
0072
0075
0076
0078
E9
8582F0
A4
F520
85F021
MOV
MOV
MUL
MOV
MOV
A,R1
B,DPL
AB
BAR,A
BAR+1,B
007B
007C
007F
0080
0082
0084
0086
0088
008A
008B
008C
008D
E9
8583F0
A4
2521
F521
E5F0
3522
F522
22
00
00
00
MOV
MOV
MUL
ADD
MOV
MOV
ADDC
MOV
RET
NOP
NOP
NOP
A,R1
B,DPH
AB
A,BAR+1
BAR+1,A
A,B
A,BAR+2
BAR+2,A
008E
008E
008E
008E
008E
0091
0094
0096
0099
009C
009E
00A1
00A4
00A7
00A9
00AA
00AB
00AC
00AD
00AE
00B0
00B2
00B3
00B4
00B5
00B6
MNB:
DZIEL:
752300
752400
7A18
1200AD
1200B9
5006
1200C7
0200A7
432001
DAED
22
00
00
00
C3
7B05
7820
E6
33
F6
08
DBFA
DZIEL1:
DZIEL2:
DZIEL3:
PRZESB:
PRZSB1:
Page
;Dzielenie liczb binarnych 24b/16b
;WE: BAR0..2 - liczba 24-bitowa
;
DPTR - liczba 16-bitowa (max.7FFFh)
;WY: BAR0..2 - wynik 24-bitowy
MOV
BAR+3,#0
MOV
BAR+4,#0
MOV
R2,#24
LCALL
PRZESB
LCALL
ODJDZ
JNC
DZIEL2
LCALL
DODDZ
LJMP
DZIEL3
ORL
BAR,#1
DJNZ
R2,DZIEL1
RET
NOP
NOP
NOP
CLR
C
MOV
R3,#5
MOV
R0,#BAR
MOV
A,@R0
RLC
A
MOV
@R0,A
INC
R0
DJNZ
R3,PRZSB1
51
3
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c04_aryt.asm
00B8
00B9
00BA
00BC
00BE
00C0
00C2
00C4
00C6
00C7
00C9
00CB
00CD
00CF
00D1
00D3
22
C3
E523
9582
F523
E524
9583
F524
22
E523
2582
F523
E524
3583
F524
22
ODJDZ:
DODDZ:
RET
CLR
MOV
SUBB
MOV
MOV
SUBB
MOV
RET
MOV
ADD
MOV
MOV
ADDC
MOV
RET
Page
C
A,BAR+3
A,DPL
BAR+3,A
A,BAR+4
A,DPH
BAR+4,A
A,BAR+3
A,DPL
BAR+3,A
A,BAR+4
A,DPH
BAR+4,A
END
ARG
DODBCD
DODDZ
DZIEL
MNB
ODJBIN
RAMP
0025
0010
00C7
008E
0069
0008
0000
BAR
DODBIN
DOPD
DZIEL1
ODJB
ODJDZ
RAMW
Symbol Table
0020
DODB
0000
DODD
004D
DOPD1
0096
DZIEL2
0032
ODJB1
00B9
PRZESB
0000
Lines : 201
Errors : 0
Warnings : 0
52
0025
003F
0052
00A4
0037
00AD
DODB1
DODD1
DOPD2
DZIEL3
ODJBCD
PRZSB1
002A
0044
005E
00A7
0018
00B2
4
5. 5. Ćwiczenie 5. Konwersja dwójkowo - dziesiętna.
5.5.1. Cel ćwiczenia
Ćwiczenie umożliwia poznanie sposobów programowej zamiany liczb binarnych na
dziesiętne i dziesiętnych na binarne oraz wyszukiwanie w zbiorze liczb liczby największej lub
najmniejszej.
5.5.2. Program przykładowy KONW (C05_KONW)
W programie KONW zawarte są następujące podprogramy :
CVBDS
CVBD
CVDBS
CVDB
ZMAX
- konwersja liczb dwójkowych na dziesiętne z zakr. 0 ... 255
„
„
„
„
„
z zakr. 0 .. 9999
- konwersja liczb dziesiętnych na dwójkowe z zakr. 0 .. 99
„
„
„
„
„
z zakr. 0 ... 9999
- poszukiwanie liczby największej w zbiorze liczb 8-bitowych.
Dla każdego z tych podprogramów podano warunki wywołania i miejsce zgromadzenia
wyniku.
Sposób sprawdzenia poprawności działania tych podprogramów można przeprowadzić
podobnie jak przy sprawdzeniu procedur arytmetycznych w ćw. 4, tzn. przy wykorzystaniu
polecenia G monitora i pułapki ustawionej na instrukcji RET.
Na rys. 5.5.1. i 5.5.2. zestawiono schematy blokowe ww. podprogramów.
5.5.3. Zadania do wykonania.
1) Sprawdzić programy przykładowe dla wybranych danych liczbowych.
2) Napisać i uruchomić podprogram zamiany liczb dwójkowych 16-bitowych na 5-cyfrowe
liczby BCD.
3) Opracować program LMIN przeznaczony do wyszukiwania liczby najmniejszej.
4) Opracować program SORT służący do sortowania liczb z zadanego obszaru zewnętrznej
pamięci RAM w ten sposób, aby liczby te zostały ułożone w kolejności od największej
do najmniejszej. Jako obszar sortowany można wykorzystać fragment pamięci EPROM
przepisany do pamięci RAM-2.
53
WE:
WY:
A
- liczba binarna 8-bitowa
BAR0,1 - liczba BCD
WE:
WY:
A
A
WE:
WY:
- liczba BCD =0..99
- liczba binarna
BAR0,1- liczba binarna 0...9999
BAR2,3 - liczba BCD
WE:
WY:
BAR0,1- liczba BCD= 0...9999
BAR2,3 - liczba binarna
Rys. 5.5.1. Schematy blokowe podprogramów : CVBDS, CVBD, oraz CVDBS, CVDB.
54
WE:
WY:
R1
- adres bufora, R2- liczba bajtów
BAR0 - adr. wart. max, BAR1- wart. max.
Rys. 5.5.2. Schemat blokowy podprogramu ZMAX.
55
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c05_konw.asm
Page
1
0000
0000
0000
0000
;******************************************************
;*
KONWERSJA B-BCD i BCD-B
*
;*
(plik zrodlowy: C05_KONW.ASM)
*
;******************************************************
0000
0000
;DEFINICJE STALYCH
;(przypisanie nazw symbolicznych stalym)
0000
0000
0000
=
RAMW
EQU
0
=
RAMP
EQU
0
0000
0000
;adr. pocz. wewn.
;pam. danych RAM
;adr. pocz. pam.
;DEFINICJE ZMIENNYCH
;(rezerwacja komorek pamieci RAMW na zmienne)
0000
ORG
RAMW
0000
DS
20H
;4 banki rej. R0..R7
DS
4
;bufor arytmet.
ORG
RAMP
;poczatek programu
0020
BAR:
0000
0000
0000
0000
0000
0003
0004
0006
0008
000B
000C
000D
000F
0011
0012
0013
0014
CVBDS:
;Konwersja liczby bin. 8-bitowej na BCD
;WE: A-wart.bin.
;WY: BAR0..1 - wart. BCD
MOV
B,#100
DIV
AB
MOV
BAR+1,A
MOV
A,B
MOV
B,#10
DIV
AB
SWAP
A
ORL
A,B
MOV
BAR,A
RET
NOP
NOP
NOP
CVBD:
;Konwersja liczby bin. (0..9999) na BCD
;WE: BAR0..1 - wart.bin. (0..9999)
;WY: BAR2..3 - wart.BCD (0..9999)
MOV
BAR+2,#0
MOV
BAR+3,#0
MOV
R2,#16
MOV
A,BAR+2
ADD
A,BAR+2
DA
A
MOV
BAR+2,A
MOV
A,BAR+3
ADDC
A,BAR+3
DA
A
MOV
BAR+3,A
75F064
84
F521
E5F0
75F00A
84
C4
45F0
F520
22
00
00
00
0015
0015
0015
0015
0018
001B
001D
001F
0021
0022
0024
0026
0028
0029
752200
752300
7A10
E522
2522
D4
F522
E523
3523
D4
F523
002B
002D
002F
E520
2520
F520
CVBD1:
MOV
ADD
MOV
A,BAR
A,BAR
BAR,A
56
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c05_konw.asm
0031
0033
0035
E521
3521
F521
MOV
ADDC
MOV
A,BAR+1
A,BAR+1
BAR+1,A
0037
0039
003B
003C
003E
0040
0042
0043
E522
3400
D4
F522
E523
3400
D4
F523
MOV
ADDC
DA
MOV
MOV
ADDC
DA
MOV
A,BAR+2
A,#0
A
BAR+2,A
A,BAR+3
A,#0
A
BAR+3,A
0045
0047
DAD6
22
DJNZ
RET
R2,CVBD1
0048
0049
004A
00
00
00
NOP
NOP
NOP
004B
004B
004B
004B
004C
004E
004F
0050
0051
0053
0056
0057
0058
0059
005A
005B
005C
005C
005C
005C
005E
0061
0064
0065
0067
006A
006C
006F
0071
0073
0075
0077
0079
007A
007B
007C
007D
007D
007D
Page
CVDBS:
;Konwersja liczby BCD (0..99) na bin.
;WE: A - licz.BCD o wart. 0..99
;WY: A - licz.bin.
MOV
R0,A
ANL
A,#0FH
MOV
R1,A
MOV
A,R0
SWAP
A
ANL
A,#0FH
MOV
B,#10
MUL
AB
ADD
A,R1
RET
NOP
NOP
NOP
CVDB:
;Konwersja liczby BCD 4-cyfr.na binarna
;WE: BAR0..1 - licz.BCD o wart. 0.9999
;WY: BAR2..3 - licz.bin.
MOV
A,BAR+1
LCALL
CVDBS
MOV
B,#100
MUL
AB
MOV
BAR+2,A
MOV
BAR+3,B
MOV
A,BAR
LCALL
CVDBS
ADD
A,BAR+2
MOV
BAR+2,A
MOV
A,#0
ADDC
A,BAR+3
MOV
BAR+3,A
RET
NOP
NOP
NOP
ZMAX:
;Znajdz wart. maksymalna i jej adres
;WE: R1 - adr.buf., R2 - liczba bajtow
;WY: BAR0 - wart.max. BAR1 - jej adres
F8
540F
F9
E8
C4
540F
75F00A
A4
29
22
00
00
00
E521
12004B
75F064
A4
F522
85F023
E520
12004B
2522
F522
7400
3523
F523
22
00
00
00
57
2
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c05_konw.asm
007D
007F
0081
0082
0085
0087
0089
008B
008D
008E
0090
0091
0092
0093
8920
8721
E7
B52102
8006
4004
8721
8920
09
DAF1
22
00
00
00
ZMAX1:
ZMAX3:
ZMAX2:
MOV
MOV
MOV
CJNE
SJMP
JC
MOV
MOV
INC
DJNZ
RET
NOP
NOP
NOP
Page
BAR,R1
BAR+1,@R1
A,@R1
A,BAR+1,ZMAX3
ZMAX2
ZMAX2
BAR+1,@R1
BAR,R1
R1
R2,ZMAX1
END
BAR
CVDB
ZMAX
0020
005C
007D
CVBD
CVDBS
ZMAX1
Symbol Table
0015
CVBD1
004B
RAMP
0081
ZMAX2
Lines : 138
Errors : 0
Warnings : 0
58
001D
0000
008D
CVBDS
RAMW
ZMAX3
0000
0000
0087
3
5.6. Ćwiczenie 6. Wyświetlacz numeryczny LED.
5.6.1. Cel ćwiczenia
Celem ćwiczenia jest pokazanie sposobu wyświetlania danych cyfrowych na wskaźnikach
7-segmentowych metodą „dynamiczną”.
Pokazany też będzie sposób wykorzystania systemu przerwań w procesorze 8051.
5.6.2. Program przykładowy WLED (C06_WLED)
Program wyświetla na wskaźnikach WLED liczbę 1234. Składa się on z programu
głównego rozpoczynającego się od etykiety INIC a zakończonego pustą pętlą oraz podprogramu
IRT, obsługującego przerwania czasowe generowane przez licznik T0.
W programie głównym najpierw ustawiany jest wskaźnik stosu na adres 5FH a następnie
wywoływany jest podprogram PRINI, w którym wykonywane są następujące czynności :
- zerowane są porty PTWY i PTSEG oraz wyłączane są lampka L8 i buczek BU
- ustawiane są rejestry TMOD, TCON, IE na takie same wartości jak w ćw. 3
- licznik T0 ładowany jest taką wartością, aby pierwsze zgłoszenie przerwania nastąpiło po
5 milisekundach
- zerowany jest obszar pamięci wewnętrznej RAM o adresach : 20H ... 5FH
- do komórek KWYS wpisywany jest kod 10H zapewniający wygaszenie wskaźników
(blank w tablicy na rys. 5. 6. 1 ).
Po wywołaniu podprogramu PRINI do 4-bajtowej komórki KWYS wpisywana jest liczba : 1234,
po czym odblokowane zostają przerwania i program główny rozpoczyna wykonywanie martwej
pętli PETLA. Podprogram PRINI wpisuje kod 10H do komórek KWYS tylko ze względu na
wymagania programów w innych ćwiczeniach wykorzystujących procedurę PRINI.
W podprogramie obsługi przerwań IRT wywoływany jest podprogram WIRT
( wykorzystywany także w innych ćwiczeniach ) po czym kod wskaźnika 7-segmentowego,
przygotowany w akumulatorze, zostaje wysłany na port PTSEG i następuje powrót do martwej
pętli programu głównego.
W podprogramie WIRT wykonywane są następujące operacje :
1) licznik T0 zostaje załadowany wartością : - 5000 tak, aby następne przerwanie
zostało zgłoszone po 5 milisekundach - problem ten przedyskutowano w opisie ćw. 3
2) zawartość komórki roboczej POZ określająca numer cyfry wyświetlacza LED zostaje
powiększona o 1 modulo 4
3) na port PTSEG zostają wysłane same zera w celu chwilowego wygaszenia wskaźników
na czas komutacji
4) odpowiednio do zawartości komórki POZ zostaje załączony jeden spośród
tranzystorów T0 .. T3 ( rys. 2. 2 ) sterujących anodami wskaźników LED oraz
znaleziony adres jednej spośród czterech cyfr w komórce KWYS
5) zawartość komórki KWYS zostaje zamieniona na kod 7-segm. i umieszczona w
akumulatorze.
Na rys. 5.6.1. zamieszczono schematy blokowe programu WLED oraz mapę komórek roboczych i
tablicę kodu 7-segmentowego a na rys. 5.6.2 pozostałe podprogramy.
59
5.6.3. Zadania do wykonania.
1. Zmodyfikować program WLED tak, aby wyświetlana była inna liczba czterocyfrowa np. 6428.
2. Zmodyfikować ten program tak, aby wyświetlana była liczba z kropką na odpowiedniej
pozycji np.279. 1
3. Zrealizować licznik programowy, który powiększa swój stan co 0,5 sek. i wyświetlać ten stan
na wskaźnikach LED.
4. Zrealizować licznik rewersyjny, który zmienia swą zawartość co 0,5 sek. lecz pracuje w przód
lub wstecz zależnie od stanu klawisza X0.
5. Zrealizować licznik, który zlicza impulsy generowane przez naciśnięcie klawisza X5, a X0 tak
jak poprzednio umożliwia pracę w przód lub wstecz.
60
a)
b)
c)
d)
Adr. hex
w tablicy
TK7SG
Znak
g f e
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
0
1
2
3
4
5
6
7
8
9
A
b
C
d
E
F
blank
0
0
1
1
1
1
1
0
1
1
1
1
0
1
1
1
0
1
0
0
0
1
1
1
0
1
1
1
1
1
0
1
1
0
1
0
1
0
0
0
1
0
1
0
1
1
1
1
1
1
0
d c b a
1
0
1
1
0
1
1
0
1
1
0
1
1
1
1
0
0
1
1
0
1
1
1
1
1
1
1
1
1
0
1
0
0
0
1 1
1 0
1 1
1 1
1 0
0 1
0 1
1 1
1 1
1 1
1 1
00
0 1
1 0
0 1
0 1
0 0
Kod
znaku
(HEX)
3F
06
5B
4F
66
6D
7D
07
7F
6F
77
7C
39
5E
79
71
00
Rys. 5.6.1. Program WLED: a) mapa pamięci, b) rejestry specjalne, c) połączenie
wskaźnika LED, d) tablica kodu 7-segm.
61
WE: WY: A - kod 7-segm. do wysłania na PTSEG
Rys. 5.6.2. Program WLED - schematy blokowe.
62
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Page
1
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c06_wled.asm
0000
;******************************************************
0000
;*
WYSWIETLANIE DANYCH NA WSKAZNIKU 7-SEGM. LED
*
0000
;*
(plik zrodlowy: C06_WLED.ASM)
*
0000
;******************************************************
0000
0000
;DEFINICJE STALYCH
;(przypisanie nazw symbolicznych stalym)
005F
0000
0000
0000
8008
=
=
STOS
RAMW
EQU
EQU
5FH
0
=
=
RAMP
PTWY
EQU
EQU
0
8008H
;adres dna stosu
;adr. pocz. wewn.
;pam. danych RAM
;adr. pocz. pam.
;adr.PTWY
8018
0096
0097
=
=
=
PTSEG
L8
BU
EQU
BIT
BIT
8018H
P1.6
P1.7
;adr.PTSEG
;adr. lamp. L8
;adr .sygn. akust. BU
0000
0000
;DEFINICJE ZMIENNYCH
;(rezerwacja komorek pamieci RAMW na zmienne)
0000
ORG
RAMW
0000
DS
20H
;4 banki rej. R0..R7
DS
DS
DS
1
4
1
;rez
;bufor wyswietlacza LED
;nr. cyfry
ORG
RAMP
;poczatek programu
LJMP
INIC
DS
0BH - $
;skocz do pierwszej
;instr. programu
LJMP
IRT
MOV
SP,#STOS
0020
0021
0025
FLAG:
KWYS:
POZ:
0026
;INICJALIZACJA
0000
0000
0000
0003
0003
02000E
000B
000E
000E
020025
0011
0014
0014
0014
0017
001A
001D
12002D
LCALL
PRINI
752104
752203
752302
752401
MOV
MOV
MOV
MOV
KWYS,#4
KWYS+1,#3
KWYS+2,#2
KWYS+3,#1
0020
0022
D2AF
020022
SETB
LJMP
IE.7
PETLA
LCALL
WIRT
MOV
DPTR,#PTSEG
0025
0025
0028
0028
0028
0028
0028
75815F
120062
908018
INIC:
PETLA:
IRT:
63
;skocz do podpr.
;obslugi przerwan
;ustaw wskaznik stosu
;ustaw rej.SFR, zer.RAM
;wyzeruj porty,laduj T0
;wygas wskazniki LED
;zaladuj liczbe 1234
;do KWYS
;odblokuj przerwania
;wykonuj petle pusta
;podpr. obsl. przerw.5ms
;lad.liczn.T0, powieksz
;zaw.kom.POZ, zalacz
;odpow. klucz T0..3,
;umiesc w ACC kod 7-seg.
;cyfry wysw. LED
;wyslij zawart. ACC
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c06_wled.asm
002B
F0
MOVX
002C
32
RETI
002D
002D
002D
002D
002D
002F
0031
0033
0036
0037
003A
003B
003E
0041
0044
0047
004A
004D
004F
0051
0053
0054
0055
0057
0059
005B
005D
005F
0061
@DPTR,A
Page
2
;na port PTWY
; powrot z przerwania
;PODPROGRAMY
PRINI:
C296
C297
7400
908008
F0
908018
F0
758901
75A802
758810
90EC78
85838C
85828A
7820
7400
7A40
F6
08
DAFC
7410
F521
F522
F523
F524
22
0062
0062
0062
0062
;Zeruj porty PTWY, PTSEG, kas.L8, BU
;zeruj RAM: 20H..5FH,ustaw TMOD,TCON,IE
;zalad. liczn.T0=#-5000, zabl.wsk.LED
CLR
P1.6
;wyzeruj wyjscia
CLR
P1.7
;L8 i BU
MOV
A,#0
MOV
DPTR,#PTWY
;wyslij zera do portow
MOVX
@DPTR,A
;PTWY, PTSEG
MOV
DPTR,#PTSEG
MOVX
@DPTR,A
MOV
TMOD,#01
;ustaw rejestry
MOV
IE,#02
;TMOD, IE, TCON
MOV
TCON,#10H
MOV
DPTR,#-5000
;zaladuj liczn. T0 wart.
MOV
TH0,DPH
;odpowiadajaca 5 ms
MOV
TL0,DPL
MOV
R0,#FLAG
MOV
A,#0
;zeruj 64 kom. RAM
MOV
R2,#40H
;o adr.20H..5FH
PRINI1: MOV
@R0,A
INC
R0
DJNZ
R2,PRINI1
MOV
A,#10H
;wygas wskazniki LED
MOV
KWYS,A
MOV
KWYS+1,A
MOV
KWYS+2,A
MOV
KWYS+3,A
RET
WIRT:
0062
0065
0068
006B
006D
006F
0072
0075
0077
007A
90EC78
85828A
85838C
0525
E525
B40403
752500
7400
908018
F0
007B
007D
007F
0081
0083
0085
0087
;Zalad.liczn.T0=#-5000, powieksz nr. cyfry
;i wyslij go na port P1, znajdz w kom. KWYS
;wartosc do wyswietlenia, zamien ja na kod
;7-segm. i umiesc w ACC
MOV
MOV
MOV
INC
MOV
CJNE
MOV
MOV
MOV
MOVX
DPTR,#-5000
TL0,DPL
TH0,DPH
POZ
A,POZ
A,#4,WIRT1
POZ,#0
A,#0
DPTR,#PTSEG
@DPTR,A
;zaladuj liczn.nr.0 taka
;wart.,aby zglosic nast.
;przerwanie 5 ms
;powieksz POZ o 1 MOD4
E590
54FC
4525
443C
F590
MOV
ANL
ORL
ORL
MOV
A,P1
A,#0FCH
A,POZ
A,#3CH
P1,A
;wyslij na port P1
;nowy nr. cyfry
E525
2421
MOV
ADD
A,POZ
A,#KWYS
;znajdz adres do jednej
;sposrod 4 cyfr w KWYS
WIRT1:
64
; zablokuj wysw. LED
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c06_wled.asm
0089
008A
008B
008E
008F
F8
E6
900090
93
22
MOV
MOV
MOV
MOVC
RET
0090
0090
0090
0094
0098
009C
00A0
Page
R0,A
A,@R0
DPTR,#TK7SG
A,@A+DPTR
;zamien zawart.tej kom.
;na kod 7-segm. w ACC
;TABLICE
3F065B4F
666D7D07
7F6F777C
395E7971
00
TK7SG:
;Tabl.kodu 7-segm.
DB
3FH,06H,5BH,4FH
DB
66H,6DH,7DH,07H
DB
7FH,6FH,77H,7CH
DB
39H,5EH,79H,71H
DB
00
;
;
;
;
;
0,1,2,3
4,5,6,7
8,9,A,b
c,d,E,F
blank
END
BU
KWYS
PRINI
RAMP
WIRT
0097
0021
002D
0000
0062
FLAG
L8
PRINI1
RAMW
WIRT1
Symbol Table
0020
INIC
0096
PETLA
0053
PTSEG
0000
STOS
0075
Lines : 138
Errors : 0
Warnings : 0
65
3
000E
0022
8018
005F
IRT
POZ
PTWY
TK7SG
0025
0025
8008
0090
5.7. Ćwiczenie 7. Wyświetlacz alfanumeryczny LCD.
5.7.1. Cel ćwiczenia
Celem ćwiczenia jest zapoznanie się ze sposobem programowania sterownika wskaźnika
ciekłokrystalicznego LCD oraz wyświetlanie danych na tym wskaźniku.
5.7.2. Program przykładowy WLCD (C07_WLCD)
Program wyświetla na wskaźniku LCD napis :
_ _ OTO _ PIERWSZY _ _
_ _ __ _ _ TEKST_ _ _ _ _ _ _
1)
2)
3)
4)
5)
Program WLCD zawiera tylko program główny, nie korzysta z przerwań ( rys. 5.7.1.).
Program ten rozpoczyna się od etykiety INIC i wykonuje następujące operacje:
zdefiniowanie początku stosu użytkownika
wygaszenie lampki L8, wyłączenie buczka BU oraz wyzerowanie portów PTWY
i PTSEG
zaprogramowanie sterownika wskaźnika LCD - podprogram PRGLCD
wysłanie napisu z pamięci programu na wskaźnik LCD - podprogram DISPTXT
wejście w pustą pętlę.
Schematy blokowe programu głównego i podprogramów przedstawiono na rys. 5.7.1. do
5.7.3.
5.7.3. Zadania do wykonania
1) Zmodyfikować program WLCD tak, aby wyświetlić inny napis z tablicy TBLCW w tym także
zawierający litery polskie.
2) Napisać i uruchomić program zliczający liczbę NNNN naciśnięć klawisza X5 (por. zadanie 5
w ćw. 6), przy czym stan licznika wyświetlany jest na wskaźniku LCD w formacie :
_ STAN _ LICZNIKA _ _
_ _ _ _ _ NNNN _ _ _ _ _ _
3) Napisać i uruchomić program wyświetlania napisu poruszającego się w lewo w cyklu
zamkniętym :
WĘDRUJĄCY_ TEKST_ PRZYKŁADOWY_ WĘDR ...
66
WE: WY:- czekaj aż sterownik wsk LCD
nie będzie zajęty
Rys. 5.7.1. Schematy blokowe programu WLCD, cz. 1
67
WE:
WY:
DPTR - adres tekstu w pam. prog.
tekst wyświetlony na wsk. LCD
WE: A-adres danej na ekranie LCD
WY:-adres został zapisany w ster. LCD
Rys. 5.7.2. Schematy blokowe programu WLCD, cz. 2
68
WE:WY: zaprogramowany sterownik LCD
Rys. 5.7.3. Schematy blokowe programu WLCD, cz. 3
69
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c07_wlcd.asm
Page
1
0000
0000
0000
0000
;******************************************************
;*
WYSWIETLANIE DANYCH NA WSKAZNIKU LCD
*
;*
(plik zrodlowy: C07_WLCD.ASM)
*
;******************************************************
0000
0000
;DEFINICJE STALYCH
;(przypisanie nazw symbolicznych stalym)
005F
0000
0000
0000
=
=
STOS
RAMW
EQU
EQU
5FH
0
=
RAMP
EQU
0
8011
8010
8013
8012
8008
8018
0096
0097
=
=
=
=
=
=
=
=
DATW
CTRLW
DATR
CTRLR
PTWY
PTSEG
L8
BU
EQU
EQU
EQU
EQU
EQU
EQU
BIT
BIT
8011H
8010H
8013H
8012H
8008H
8018H
P1.6
P1.7
ORG
RAMP
;poczatek programu
MOV
CLR
CLR
MOV
MOV
MOVX
MOV
MOVX
SP,#5FH
L8
BU
A,#0
DPTR,#PTWY
@DPTR,A
DPTR,#PTSEG
@DPTR,A
;ustaw wskazn. stosu
;wygas L8
;wylacz BU
0000
INIC:
;adres dna stosu
;adr. pocz. wewn.
;pam. danych RAM
;adr. pocz. pam.
;adres rej. danych zapis. w LCD
;adr.rej.slowa ster.zapis.w LCD
;adr. rej. danych odczyt. z LCD
;adr.rej.slowa ster.odczyt.z LCD
;adr.PTWY
;adr.PTSEG
;adr. lamp. L8
;adr .sygn. akust. BU
0000
0003
0005
0007
0009
000C
000D
0010
75815F
C296
C297
7400
908008
F0
908018
F0
0011
12002D
LCALL
PRGLCD
;zaprogr. wsk. LCD
0014
0017
9000DA
1200AA
MOV
LCALL
DPTR,#TBLCW
DISPTXT
;wyslij tekst przyklad.
;na wsk. LCD
001A
02001A
LJMP
PETLA
;wykonuj pusta petle
PETLA:
001D
001D
001D
001D
001D
001E
0020
0022
0024
0025
0025
0025
0025
0028
0029
002C
;wyzeruj PTWY, PTSEG
;PODPROGRAMY
OPZ:
A3
E583
4582
70F9
22
908012
E0
20E7F9
22
;Opozn progr. do 390 ms
;WE: DPTR = -x
;WY: OPOZN.= 6*x w mikrosek.
INC
DPTR
MOV
A,DPH
ORL
A,DPL
JNZ
OPZ
RET
BUSYLCD:;BUSYLCD - Badanie zajetosci sterown. wsk. LCD
; WE: ; WY: jezeli sterownik LCD zajety, to czekaj
MOV
DPTR,#CTRLR
MOVX
A,@DPTR
JB
ACC.7,BUSYLCD
RET
70
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c07_wlcd.asm
Page
2
002D
002D
PRGLCD: ;Programowanie sterownika wskazn.LCD
002D
0030
90F63C
12001D
MOV
LCALL
DPTR,#-2500
OPZ
0033
0035
0038
7438
908010
F0
MOV
MOV
MOVX
A,#38H
DPTR,#CTRLW
@DPTR,A
0039
003C
90FD44
12001D
MOV
LCALL
DPTR,#-700
OPZ
003F
0041
0044
7438
908010
F0
MOV
MOV
MOVX
A,#38H
DPTR,#CTRLW
@DPTR,A
0045
0048
90FFEC
12001D
MOV
LCALL
DPTR,#-20
OPZ
004B
004D
0050
7438
908010
F0
MOV
MOV
MOVX
A,#38H
DPTR,#CTRLW
@DPTR,A
0051
120025
LCALL
BUSYLCD
;koniec resetu program.
0054
0056
0059
7438
908010
F0
MOV
MOV
MOVX
A,#38H
DPTR,#CTRLW
@DPTR,A
;8 bitow, 2 linie, 5x7
005A
120025
LCALL
BUSYLCD
005D
005F
0062
740C
908010
F0
MOV
MOV
MOVX
A,#0CH
DPTR,#CTRLW
@DPTR,A
0063
120025
LCALL
BUSYLCD
0066
0068
006B
7401
908010
F0
MOV
MOV
MOVX
A,#1
DPTR,#CTRLW
@DPTR,A
006C
120025
LCALL
BUSYLCD
006F
0071
0074
7406
908010
F0
MOV
MOV
MOVX
A,#6
DPTR,#CTRLW
@DPTR,A
0075
120025
LCALL
BUSYLCD
0078
007A
007D
7440
908010
F0
MOV
MOV
MOVX
A,#40H
DPTR,#CTRLW
@DPTR,A
007E
120025
LCALL
BUSYLCD
0081
0083
0084
0087
7A00
EA
900162
93
MOV
PRGLC1: MOV
MOV
MOVC
R2,#0
A,R2
DPTR,#TBLLCD
A,@A+DPTR
71
;opz.15 ms
;4.2 ms
;120 mikrosek.
;wyswietl.zalacz
;kursor wylacz.
;czysz. ekranu
;tryb wprowadz. danych
;z inkrementacja
;adr.CGRAM
;progr.znakow polskich
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c07_wlcd.asm
0088
008B
008C
008F
0090
908011
F0
120025
0A
BA40F0
MOV
MOVX
LCALL
INC
CJNE
DPTR,#DATW
@DPTR,A
BUSYLCD
R2
R2,#64,PRGLC1
0093
120025
LCALL
BUSYLCD
0096
0098
009B
009C
009F
7480
908010
F0
120025
22
MOV
MOV
MOVX
LCALL
RET
A,#80H
DPTR,#CTRLW
@DPTR,A
BUSYLCD
00A0
00A0
00A0
00A0
00A2
00A5
00A6
00A9
00AA
00AA
00AA
00AA
00AC
00AE
00B0
00B3
00B5
00B6
00B8
00BA
00BB
00BD
00BF
00C2
00C3
00C6
00C7
00CA
00CC
00CF
00D2
00D5
00D7
00D9
;adr. DD RAM
4480
908010
F0
120025
22
ADRLCD: ;ADRLCD - Ustaw adr. w LCD
;WE: A - Adr. danej w ster.LCD
;WY: adr.wyslany do ster.LCD
ORL
A,#80H
MOV
DPTR,#CTRLW
MOVX
@DPTR,A
LCALL
BUSYLCD
RET
C083
C082
7400
1200A0
7A00
EA
D082
D083
93
C083
C082
908011
F0
120025
0A
BA1008
7440
1200A0
0200B5
BA20E0
D082
D083
22
DISPTXT:;DISPTXT - Wyslij tekst z RAMP do LCD
;WE: DPTR - adr.tekstu w pam.progr.
;WY: 32 znaki tekstu wyslane do wsk.LCD
PUSH
DPH
PUSH
DPL
MOV
A,#0
LCALL
ADRLCD
MOV
R2,#0
DISTX1: MOV
A,R2
POP
DPL
POP
DPH
MOVC
A,@A+DPTR
PUSH
DPH
PUSH
DPL
MOV
DPTR,#DATW
MOVX
@DPTR,A
LCALL
BUSYLCD
INC
R2
CJNE
R2,#16,DISTX2
MOV
A,#40H
LCALL
ADRLCD
LJMP
DISTX1
DISTX2: CJNE
R2,#32,DISTX1
POP
DPL
POP
DPH
RET
00DA
00DA
00DA
00DE
00E2
00E6
00EA
00EE
00F2
Page
;TABLICE
20204F54
4F205049
45525753
5A592020
20202020
54454B53
54202020
TBLCW:
;TBLCW - Teksty przykladowe
DB
' OTO PIERWSZY '
DB
'
72
TEKST
'
3
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c07_wlcd.asm
00F6
00FA
00FE
0102
0106
010A
010E
0112
0116
011A
011E
0122
0126
012A
012E
0130
0134
0138
013C
0140
0144
0148
014A
014E
0152
0156
015A
015E
20202020
70726F67
72616D20
50524731
2E41534D
00010203
04050607
31323334
35363738
41424344
45464748
494A4B4C
4D4E4F50
51525354
5556
61626364
65666768
696A6B6C
6D6E6F70
71727374
75767778
797A
07024405
2031352E
30352E39
35207465
6D702E20
3237DF43
0162
0162
0166
016A
016E
0172
0176
017A
017E
0182
0186
018A
018E
0192
0196
019A
019E
1F10101E
10121F00
0E131511
11110E00
0E151010
10110E00
0E11111F
11111300
0F12100E
01011E00
1F050204
08101F00
15111915
13111100
10101418
10101F00
Page
DB
'program PRG1.ASM'
DB
0,1,2,3,4,5,6,7
DB
'12345678ABCDEFGH'
DB
'IJKLMNOPQRSTUV'
DB
'abcdefghijklmnopqrstuvwxyz'
DB
7,2,'D',5,' 15.05.95 temp. 27',0DFH,'C'
TBLLCD: ;TBLLCD - Znaki polskie
DB
1FH,10H,10H,1EH,10H,12H,1FH,00H ; E
DB
0EH,13H,15H,11H,11H,11H,0EH,00H ; O
DB
0EH,15H,10H,10H,10H,11H,0EH,00H ; C
DB
0EH,11H,11H,1FH,11H,11H,13H,00H ; A
DB
0FH,12H,10H,0EH,01H,01H,1EH,00H ; S
DB
1FH,05H,02H,04H,08H,10H,1FH,00H ; Z
DB
15H,11H,19H,15H,13H,11H,11H,00H ; N
DB
10H,10H,14H,18H,10H,10H,1FH,00H ; L
END
ADRLCD
CTRLW
DISTX1
OPZ
PTSEG
STOS
00A0
8010
00B5
001D
8018
005F
BU
DATR
DISTX2
PETLA
PTWY
TBLCW
4
Symbol Table
0097
BUSYLCD
8013
DATW
00D2
INIC
001A
PRGLC1
8008
RAMP
00DA
TBLLCD
Lines : 196
Errors : 0
Warnings : 0
73
0025
8011
0000
0083
0000
0162
CTRLR
DISPTXT
L8
PRGLCD
RAMW
8012
00AA
0096
002D
0000
5.8. Ćwiczenie 8. Obsługa klawiatury.
5.8.1. Cel ćwiczenia
Ćwiczenie pokazuje sposób programowego rozpoznawania kodu wciśniętego klawisza
klawiatury.
5.8.2. Program przykładowy KLAW (C08_KLAW)
Program rozpoznaje wciśnięty klawisz, powoduje krótkotrwałe „kliknięcie”, a jego symbol
i kod wyświetla na wskaźniku LCD.
Program KLAW składa się z programu głównego oraz kilku podprogramów. W programie
głównym rozpoczynającym się od etykiety INIC ustawiany jest wskaźnik stosu SP, wywoływany
jest podprogram PRINI ( jak w ćw. 6 ), następnie wywoływany jest podprogram PRGLCD ( jak w
ćw. 7 ), wyświetlany jest napis zachęcający do naciśnięcia dowolnego klawisza a następnie zostają
odblokowane przerwania i program główny wchodzi w pętlę rozpoczynającą się od etykiety PG.
W pętli tej występuje oczekiwanie na naciśnięcie dowolnego klawisza ( jednego spośród 16-tu
zestawionych w tablicy na rys. 5.8.1.) i wyświetlenie jego symbolu oraz kodu na wskaźniku LCD.
W pętli tej wykorzystywane są trzy podprogramy.
CZYTKL
DS1CH
-
NASC
-
oczekujący na naciśnięcie klawisza
wyświetlający na wskaźniku LCD znak ASCII zawarty w
akumulatorze
zamieniający zawartość komórki 1-bajtowej na dwa znaki ASCII.
Oprócz programu głównego w programie KLAW występuje podprogram obsługi przerwań
5 ms. nazwany IRTK. W podprogramie tym wywoływane są dwa inne podprogramy :
WIRT
TSTKL
-
znany z ćwiczenia nr 6
podprogram testujący klawiaturę i sygnalizujący naciśnięcie dowolnego
klawisza przez ustawienie do stanu „1” flagi FKLA, z której korzysta
podprogram CZYTKL.
Schematy blokowe programu KLAW wraz z podprogramami zestawiono na rys.5.8.1 do 5.8.5.
Po przeanalizowaniu programu KLAW można sformułować następujący wniosek :
Jeśli w dalszych ćwiczeniach będzie zachodzić potrzeba korzystania z klawiatury, to
programy powinny być budowane z uwzględnieniem następujących zasad :
1) W programie należy przewidzieć flagę FKLA stanowiącą łącznik pomiędzy podprogramami
TSTKL i CZYTKL, należy też przewidzieć komórkę KODKL oraz tablicę TABKK ( patrz
listing ) zawierającą kody klawiszy,
2) W programie obsługi przerwań 5 ms ( IRTK ) musi występować podprogram WIRT
(przeglądający klawiaturę) a po nim podprogram TSTKL (wykrywający naciśnięcie klawisza
i ustawiający flagę FKLA = 1 )
3) W programie głównym musi występować podprogram CZYTKL, który oczekuje na ustawienie
flagi FKLA. Po wykonaniu tego podprogramu w komórce KODKL znajduje się kod
naciśniętego klawisza. Flaga FKLA zerowana jest w podprogramie CZYTKL z opóźnieniem
180 ms.
5.8.3. Zadania do wykonania
74
1) Opracować program wykorzystujący trzy klawisze :
F1 - zapala lampkę L8
F2 - gasi lampkę L8
F3 - przełącza lampkę L8 w stan przeciwny.
2) Opracować program wsuwający do wskaźnika LED ( w kierunku od prawej strony do lewej)
kody kolejno naciskanych klawiszy.
4) Opracować podobny ( jak w p. 2 ) program wykorzystujący wskaźnik LCD, przy czym klawisz
ENT ma powodować wygaszanie wskaźnika LCD.
75
Zależność kodu klawisza ( KODKL ) od numeru klawisza ( N )
Nr klaw.
N
Symbol
klawisza
Nr kolumny
Ki
Nr wiersza
Wi
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0
4
8
F3
1
5
9
F4
2
6
F1
ENT
3
7
F2
-
0
0
0
0
1
1
1
1
2
2
2
2
3
3
3
3
0
1
2
3
0
1
2
3
0
1
2
3
0
1
2
3
Kod klawisza
KODKL
(HEX)
0
4
8
C
1
5
9
D
2
6
A
E
3
7
B
F
1) Ki, Wi - jak na rys. 2.2
2) N = 4 * Ki + Wi
Rys. 5.8.1. Schematy blokowe programu KLAW, cz. 1
76
Rys. 5.8.2. Schematy blokowe programu KLAW, cz. 2
77
WE:
WY:
jeżeli wciśnięty klawisz, to ustaw FKLA na „1’,
zapisz kod klawisza w KODKL i załącz BU
WE:
WY:
czekaj na wciśnięcie klawisza wyłącz BU
Rys. 5.8.3. Schematy blokowe programu KLAW, cz. 3
78
WE:
WY:
R1
-adres komórki 1-bajtowej
BAR0,1- dwa znaki ASCII
CYFRA
HEX
ASCII
HEX
0
1
.
.
9
A
B
.
.
F
30
31
.
.
39
41
42
.
.
46
Rys. 5.8.4. Schematy blokowe programu KLAW, cz. 4
79
WE:
WY:
A- znak ASCII
znaki wysłany do LCD
WE:
WY:
wyzerowany wskaźnik LCD
Rys. 5.8.5. Schematy blokowe programu KLAW, cz. 5
80
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Page
1
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c08_klaw.asm
0000
;******************************************************
0000
;*
OBSLUGA KLAWIATURY
*
0000
;*
(plik zrodlowy: C08_KLAW.ASM)
*
0000
;******************************************************
0000
0000
;DEFINICJE STALYCH
;(przypisanie nazw symbolicznych stalym)
005F
0000
0000
0000
=
=
STOS
RAMW
EQU
EQU
5FH
0
=
RAMP
EQU
0
8011
8010
8013
8012
8008
8018
0096
0097
0000
=
=
=
=
=
=
=
=
=
DATW
CTRLW
DATR
CTRLR
PTWY
PTSEG
L8
BU
FKLA
EQU
EQU
EQU
EQU
EQU
EQU
BIT
BIT
BIT
8011H
8010H
8013H
8012H
8008H
8018H
P1.6
P1.7
0
0000
0000
;adres dna stosu
;adr. pocz. wewn.
;pam. danych RAM
;adr. pocz. pam.
;adres rej. danych zapis. w LCD
;adr.rej.slowa ster.zapis.w LCD
;adr. rej. danych odczyt. z LCD
;adr.rej.slowa ster.odczyt.z LCD
;adr.PTWY
;adr.PTSEG
;adr. lamp. L8
;adr .sygn. akust. BU
;DEFINICJE ZMIENNYCH
;(rezerwacja komorek pamieci RAMW na zmienne)
0000
ORG
RAMW
0000
DS
14H - $
DS
DS
1
1
DS
20H - $
DS
DS
DS
DS
DS
1
4
1
1
2
;kom. flag
;bufor wysw. LED
;nr. cyfry LED
;kod klawisza
;buf. arytm.
ORG
RAMP
;poczatek programu
LJMP
INIC
DS
0BH - $
;skocz do pierwszej
;instr. programu
LJMP
IRTK
MOV
SP,#STOS
LCALL
LCALL
MOV
LCALL
SETB
PRINI
PRGLCD
DPTR,#NAPIS
DISPTXT
IE.7
0014
0015
REG42:
REG52:
0016
0020
0021
0025
0026
0027
FLAG:
KWYS:
POZ:
KODKL:
BAR:
0029
;INICJALIZACJA
0000
0000
0000
0003
0003
02000E
000B
000E
000E
020074
0011
0014
0017
001A
001D
1200FB
12016E
90024B
1201EB
D2AF
75815F
INIC:
81
;do ochrony rej.
;PSW i ACC
;skocz do podpr.
;obslugi przerwan
;ustaw wskaznik stosu
;ustaw rej.SFR,zer.RAM..
;progr. ster.wsk. LCD
;wyslij napis
;odbl.przerw.
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c08_klaw.asm
001F
0022
0025
0027
002A
002C
002F
0031
0034
0036
1200B4
1200F1
7400
1201E1
744B
1200C8
744C
1200C8
7420
1200C8
0039
003B
003D
003E
0041
0042
0044
0046
0049
004A
004B
004D
004F
0050
PG:
Page
2
LCALL
LCALL
MOV
LCALL
MOV
LCALL
MOV
LCALL
MOV
LCALL
CZYTKL
ZERLCD
A,#0
ADRLCD
A,#'K'
DS1CH
A,#'L'
DS1CH
A,#' '
DS1CH
;czekaj na nacisn.klaw.
;zer.wsk.LCD
;adr.danych = 0
E526
25E0
F9
90022B
93
C083
C082
1200C8
E9
04
D082
D083
93
1200C8
MOV
ADD
MOV
MOV
MOVC
PUSH
PUSH
LCALL
MOV
INC
POP
POP
MOVC
LCALL
A,KODKL
A,ACC
R1,A
DPTR,#TBNKL
A,@A+DPTR
DPH
DPL
DS1CH
A,R1
A
DPL
DPH
A,@A+DPTR
DS1CH
;ustal, jaki jest
;symbol klawisza i
;wyslij go na wsk. LCD
0053
0055
0058
005A
005D
005F
0062
0064
0067
0069
006C
006E
0071
0074
7420
1200C8
743D
1200C8
7420
1200C8
7926
1200D0
E528
1200C8
E527
1200C8
02001F
MOV
LCALL
MOV
LCALL
MOV
LCALL
MOV
LCALL
MOV
LCALL
MOV
LCALL
LJMP
A,#' '
DS1CH
A,#'='
DS1CH
A,#' '
DS1CH
R1,#KODKL
NASC
A,BAR+1
DS1CH
A,BAR
DS1CH
PG
;wyslij na wsk.LCD
;trzy znaki: ' = '
;tzn. spacja,znak rown.
;i spacja
0074
0077
007A
007C
007E
0081
0084
0087
0089
008B
008E
0091
85D014
85E015
C083
C082
75D008
120130
120092
D082
D083
8515E0
8514D0
32
MOV
MOV
PUSH
PUSH
MOV
LCALL
LCALL
POP
POP
MOV
MOV
RETI
REG42,PSW
REG52,ACC
DPH
DPL
PSW,#08
WIRT
TSTKL
DPL
DPH
ACC,REG52
PSW,REG42
;ochron rej.
;PSW,ACC,DPTR
IRTK:
0092
0092
0092
;wyslij na wsk.LCD:'KL '
;zamien kod klaw. na
;dwa znaki ASCII i
;wyslij na wsk.LCD
;oczekuj na wcisn.nast.
;klawisza
;RB1
;przegl.klaw.
;test klaw.
;przywr.stany rej.
;PSW,ACC,DPTR
;PODPROGRAMY
20001E
TSTKL:
; Ustawia FKLA=1 po nacisn. klaw.
JB
FKLA,TSTKL3
82
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c08_klaw.asm
0095
0097
0099
009A
009B
009C
009E
00A0
00A3
00A4
00A6
00A7
00A8
00A9
00AC
00AD
00AF
00B1
00B3
00B4
00B4
00B4
00B4
00B7
00BA
00BC
00BF
00C2
00C5
00C7
00C8
00C8
00C8
00CB
00CC
00CF
00D0
00D0
00D0
00D0
00D1
00D3
00D5
00D6
00D7
00D9
00DB
00DD
00DF
00E0
00E0
00E1
00E3
00E4
00E6
A,P1
R6,#4
A
A
A
TSTKL2
R6,TSTKL1
TSTKL3
R6
A,POZ
A
A
A,R6
DPTR,#TABKK
A,@A+DPTR
KODKL,A
FKLA
BU
Page
E590
7E04
23
23
33
5005
DEFB
0200B3
1E
E525
23
23
2E
90021B
93
F526
D200
D297
22
MOV
MOV
RL
RL
TSTKL1: RLC
JNC
DJNZ
LJMP
TSTKL2: DEC
MOV
RL
RL
ADD
MOV
MOVC
MOV
SETB
SETB
TSTKL3: RET
908AD0
12015E
C200
3000FD
90F060
12015E
C297
22
CZYTKL: ;Odczekaj 180ms i sprawdz, czy nacisn. klaw.
;Jesli nie nacisn.,to czekaj
;Jesli nacisn., to skasuj FKLA i powr.
MOV
DPTR,#-30000
LCALL
OPZ
CLR
FKLA
CZTKL1: JNB
FKLA,CZTKL1
MOV
DPTR,#-4000
LCALL
OPZ
CLR
BU
RET
;wczytaj P1
;przesun 2x w lewo
;zbadaj czy ktorykolw.
;sposrod sygn. W3..W0
;jest zerem
;jesli tak, to jego
;indeks znajduje sie w
;rej.R6
;obl. N=4*Ki+Wi
;odczyt.kod klaw.z TABKK
;i umiesc w KODKL, ustaw
;flage FKLA=1, zalacz BU
;powrot
DS1CH:
;WE: A - znak ASCII
;WY: znak wyslany DO wsk.LCD
MOV
DPTR,#DATW
MOVX
@DPTR,A
LCALL
BUSYLCD
RET
NASC:
E7
540F
F527
E7
C4
540F
F528
;Zamiana kom.1bajt. na 2 znaki ASCII
; WE: R1 - ADR. KOM. 1BAJT
; WY: BAR 0..1 - 2 ZNAKI ASCII
MOV
A,@R1
;rozpakuj kom. 1-bajt.
ANL
A,#0FH
;na dwie cyfry HEX
MOV
BAR,A
;i umiesc je w dwoch
MOV
A,@R1
;kolejnych bajtach BAR
SWAP
A
ANL
A,#0FH
MOV
BAR+1,A
7827
7A02
E6
MOV
MOV
MOV
R0,#BAR
R2,#2
A,@R0
CLR
SUBB
MOV
JNC
ADD
C
A,#10
A,@R0
NASC2
A,#30H
908011
F0
120166
22
C3
940A
E6
5004
2430
NASC1:
83
3
;wykonaj 2 petle progr.
;i w kazdej z nich
;zamien cyfre HEX na
;znak ASCII,
;postepuje sie n-co:
;jesli cyfra HEX jest
;z zakr.0..9 to dodaj
;do niej 30H,a jesli nie
;jest,to dodaj 37H
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c08_klaw.asm
00E8
00EA
00EC
00ED
00EE
00F0
8002
2437
F6
08
DAEF
22
00F1
00F1
00F3
00F6
00F7
00FA
7401
908010
F0
120166
22
00FB
00FB
00FB
00FB
00FB
0130
0130
0130
0130
0130
0130
0130
015E
015E
015E
015E
015E
015E
0166
0166
0166
0166
0166
0166
016E
016E
016E
016E
01E1
01E1
01E1
01E1
01E1
01E1
01EB
01EB
01EB
01EB
01EB
01EB
021B
NASC2:
NASC3:
NASC3
A,#37H
@R0,A
R0
R2,NASC1
ZERLCD: ;Wyzeruj wsk.LCD
MOV
A,#1
MOV
DPTR,#CTRLW
MOVX
@DPTR,A
LCALL
BUSYLCD
RET
PRINI:
;(C06_WLED)
;Zeruj porty PTWY, PTSEG, kas.L8, BU
;zeruj RAM: 20H..5FH,ustaw TMOD,TCON,IE
;zalad. liczn.T0=#-5000, zabl.wsk.LED
xlist
list
WIRT:
;(C06_WLED)
;Zalad.liczn.T0=#-5000, powieksz nr. cyfry
;i wyslij go na port P1, znajdz w kom. KWYS
;wartosc do wyswietlenia, zamien ja na kod
;7-segm. i umiesc w ACC
xlist
list
OPZ:
;(C07.WLCD)
;Opozn progr. do 390 ms
;WE: DPTR = -x
;WY: OPOZN.= 6*x w mikrosek.
xlist
list
BUSYLCD:;(C07.WLCD)
;BUSYLCD - Badanie zajetosci sterown. wsk. LCD
; WE: ; WY: jezeli sterownik LCD zajety, to czekaj
xlist
list
PRGLCD: ;(C07.WLCD)
;Programowanie sterownika wskazn.LCD
xlist
list
ADRLCD: ;(C07.WLCD)
;ADRLCD - Ustaw adr. w LCD
;WE: A - Adr. danej w ster.LCD
;WY: adr.wyslany do ster.LCD
xlist
list
DISPTXT:;(C07.WLCD)
;DISPTXT - Wyslij tekst z RAMP do LCD
;WE: DPTR - adr.tekstu w pam.progr.
;WY: 32 znaki tekstu wyslane do wsk.LCD
xlist
list
021B
021B
021B
SJMP
ADD
MOV
INC
DJNZ
RET
Page
;TABLICE
0004080C
TABKK:
;Tabl.kodow klawiatury
DB
0,4, 8, 0CH
84
4
XA51 // 8051 CROSS-ASSEMBLER <VER. 1/96>
Copyright (C) by Instytut Automatyki PL [LP]
Source file: c08_klaw.asm
021F
0223
0227
0105090D
02060A0E
03070B0F
022B
022B
022F
0233
0237
023B
023F
0243
0247
20302031
20322033
20342035
20362037
20382039
46314632
46334634
2045202D
024B
024F
0253
0257
025B
025F
0263
0267
42414441
4E494520
4B4C4157
4941542E
4E414349
534E494A
20444F57
2E4B4C2E
026B
026B
026B
027C
027C
027C
027C
02BC
DB
DB
DB
TBNKL:
NAPIS:
Page
1,5, 9, 0DH
2,6,0AH,0EH
3,7,0BH,0FH
;Tabl.nazw klawiszy
DB
' 0 1 2 3 4 5 6 7 8 9'
DB
'F1F2F3F4 E -'
DB
'BADANIE KLAWIAT.'
DB
'NACISNIJ DOW.KL.'
TK7SG:
;(C06.WLED)
;Tabl.kodu 7-segm.
xlist
list
TBLLCD: ;(C07.WLCD)
;TBLLCD - Znaki polskie
xlist
list
END
ADRLCD
CTRLR
DATR
DISTX2
INIC
L8
NASC2
POZ
PRINI1
RAMW
TABKK
TSTKL
WIRT
01E1
8012
8013
0213
000E
0096
00EA
0025
0121
0000
021B
0092
0130
BAR
CTRLW
DATW
DS1CH
IRTK
NAPIS
NASC3
PRGLC1
PTSEG
REG42
TBLLCD
TSTKL1
WIRT1
Symbol Table
0027
BU
8010
CZTKL1
8011
DISPTXT
00C8
FKLA
0074
KODKL
024B
NASC
00EC
OPZ
01C4
PRGLCD
8018
PTWY
0014
REG52
027C
TBNKL
009B
TSTKL2
0143
ZERLCD
Lines : 439
Errors : 0
Warnings : 0
85
0097
00BC
01EB
0000
0026
00D0
015E
016E
8008
0015
022B
00A3
00F1
BUSYLCD
CZYTKL
DISTX1
FLAG
KWYS
NASC1
PG
PRINI
RAMP
STOS
TK7SG
TSTKL3
0166
00B4
01F6
0020
0021
00DF
001F
00FB
0000
005F
026B
00B3
5
ZAŁĄCZNIKI
Z.1. Wyświetlacz ciekłokrystaliczny ( W-LCD )
Wyświetlacz ciekłokrystaliczny ( ang. LCD - Liquid Crystal Display ) typu LM 162551
(firmy Sharp ) umożliwia wyświetlanie znaków alfanumerycznych na ekranie mieszczącym 32
znaki ( w dwóch liniach po 16 znaków ). Znaki generowane są punktowo w polach 5 x 7 pikseli.
Wyświetlacz ma wbudowany sterownik typu HD 44780 ( firmy Hitachi ), który umożliwia
wyświetlanie wszystkich znaków kodu ASCII ( Załącznik Z4 ) oraz ośmiu znaków definiowanych
przez użytkownika. Sterownik ma własną listę instrukcji ( Tablica Z1.1 ). Instrukcje te są dwóch
rodzajów :
- zapis / odczyt słowa sterującego ( ustawianie parametrów; trybów pracy wyświetlacza,
kasowanie wyświetlacza, przesuwanie kursora, przesuwanie zawartości ekranu, ustawienie
adresów znaku i kursora na ekranie itp),
- zapis / odczyt słowa danych ( kodu wyświetlanego znaku ).
Do sterownika doprowadza się następujące sygnały ( por.rys. 2. 1 ) :
D7..... 0 - dane ( słowa sterujące i kody znaków )
RS
- sygnał rodzaju instrukcji : ( 1 - zapis / odczyt danych, 0 - zapis / odczyt słowa
sterującego
R/ W - sygnał wyboru operacji : 1 - odczyt, 0 - zapis
E
- impuls zapisu / odczytu ( „krótka 1” - przy stabilnych pozostałych sygnałach ).
Tablica Z.1.1. Lista instrukcji sterownika HD 44780
Kod instrukcji/kod znaku/
Ozn Instrukcja
/bajt definiowanego znaku
D7 D6 D5 D4 D3 D2 D1
Ustawianie
I 1 parametrów
wyświetlacza
Ustawianie trybu
I2
wprowadzania znaków
Załączanie/ wyłączanie
I3
wyświetlania
I 4 Czyszczenie ekranu
I5
I6
I7
I8
I9
I 10
I 11
Ustawianie kursora na
pozycji 0 i ekranu na
pozycji przed
przesuwaniem
Przesuwanie kursora i
ekranu
Ustawianie adresu
CGRAM
Ustawianie adresu
DDRAM
Odczyt flagi zajętości
i adresu pamięci
Zapis danej do
CGRAM lub DDRAM
Odczyt danej z
CGRAM lub DDRAM
D0
Warunki
Czas
sterowania
wyk.
RS
µs
R/ W
0
0
1
DL
N
F
-
-
0
0
120
0
0
0
0
0
1
I/D
S
0
0
120
0
0
0
0
1
D
C
B
0
0
120
0
0
0
0
0
0
0
1
0
0
1204900
0
0
0
0
0
0
1
-
0
0
1204800
0
0
0
1
-
-
0
0
120
0
1
0
0
120
S/C R/L
Adres CGRAM
1
Adres DDRAM
0
0
120
BF
Stan licznika adresu ( AC )
0
1
1
Dana zapisywana
1
0
120
Dana odczytywana
1
1
120
86
Objaśnienia do Tablicy Z.1.1.
DL
N
F
- długość słowa danych ( DL = 0 - 4 bity, DL = 1 - 8 bitów )
- liczba linii ekranu ( N = 0 - 1 linia, N = 1 - 2 linie )
- liczba punktów ( pikseli ) matrycy znaków ( F = 0 - 5x7 punktów,
F = 1 - 5x10 punktów )
I/D
- zwiększanie ( I / D = 1 ) / zmniejszanie ( I / D = 0 ) adresu pamięci DDRAM lub
CGRAM przy zapisie lub odczycie z jednoczesnym przesuwaniem w prawo
( I / D = 1 ) / w lewo ( I / D = 0 ) kursora lub migocącego znaku
S
- przy S = 1 przesuwanie całego ekranu w czasie zapisu w kierunku zgodnym
z I / D ( scrolling poziomy ). Przy odczycie z DDRAM ekran nie przesuwa się
D
- załączanie ( D = 1 ) lub wyłączenie ( D = 0 ) wyświetlania całego ekranu, bez
naruszania informacji w DDRAM
C
- załączenie ( C = 1 ) lub wyłączenie ( C = 0 ) kursora ( kursor ma kształt
podkreślenia, 5 punktów w 8-ej linii matrycy znaku )
B
- załączenie ( B = 1 ) lub wyłączenie ( B = 0 ) migotania znaku na pozycji kursora
( S / C ), ( R / L ) - 00 - przesunięcie kursora w lewo, licznik adresów ( AC ) dekrementowany o 1
01 - przesunięcie kursora w prawo, licznik AC - inkrementowany o 1
(kursor przechodzi do 2-giej linii ekranu po przejściu na adres 40H)
10 - przesunięcie wyświetlanego ekranu w obu liniach w lewo,
kursor podąża za ekranem, licznik AC - nie zmienia się ( linia 2
nie jest wsuwana do 1-ej )
11 - przesunięcie wyświetlanego ekranu w obu liniach w prawo,
kursor podąża za ekranem, licznik AC - nie zmienia się,
BF
- flaga zajętości sterownika ( BF = 1 - trwa proces wewnętrzny,
BF = 0 - zezwolenie na przyjęcie następnej instrukcji )
AC
- stan licznika adresu pamięci DDRAM lub CGRAM - po ostatnio wykonywanej
instrukcji.
Sterownik zawiera pamięć ROM - jako generator znaków alfanumerycznych ASCII oraz
dwie pamięci RAM :
DDRAM - pamięć danych wyświetlanych ( pamięć ekranu ) o pojemności 128 bajtów
(adresy 0.. 7FH, przy czym dla ekranów o organizacji 2 linie po 16 znaków
wykorzystywane są adresy 0.. FH - dla pierwszej linii oraz 40.. 4FH – dla drugiej
linii )
CGRAM - pamięć konfigurowalna ( generator znaków definiowanych ) o pojemności 64 bajtów
( adresy 0.. 3FH ), w której użytkownik może zapisać osiem własnych znaków
( np. liter zmiękczonych : Ą, Ł itp ).
W pamięci CGRAM zarezerwowanych jest po 8 bajtów dla każdego definiowanego znaku.
Znakom tym przypisuje się domyślne numery 0.. 7 - jako kody tych znaków, które wykorzystuje
się tak samo jako kody ASCII znaków standardowych. Znak o kodzie n zapisuje się w pamięci
CGRAM pod adresami 8n.. ( 8n + 7 ).
87
W celu zdefiniowania własnego znaku, np. litery Ł - jako znaku nr 7, należy do pamięci
CGRAM pod adresami 56.. 63 ( 38H.. 3FH ) zapisać osiem bajtów o wartościach
odpowiadających kombinacjom bitów reprezentujących punkty ( piksele ) wierszy matrycy ( 6 x 8
punktów ), w której odwzorowany jest znak o wymiarach 5 x 7 punktów, jak to pokazano na rys.
Z.1. 1.
Rys. Z.1.1. Sposób zdefiniowania litery Ł jako znaku o kodzie 7 w pamięci CGRAM
(kwadraty zakreskowane odpowiadają punktom świecącym i bitom o wartości 1).
Sterownik udostępnia kilka możliwości korzystania z wyświetlacza LCD ( por. Tablica
Z.1. 1 ), jak np. wpisywanie znaków na kolejne pozycje ekranu ( bit I / D w instrukcji I 2 ),
wpisywanie znaków z przesuwaniem całego wiersza - scrolling ( S w I 2 ), korzystanie z kursora
lub / i migoczącego znaku ( C, B w I 3 ), przewijanie poziome ekranu lub kursora (I 6), ustawianie
kursora na pozycji 0 - „home” ( I 5 ), wygaszanie ekranu, kursora lub migotania ( bez utraty
informacji - możliwość przywrócenia stanu poprzedniego ) ( I 3 ), czyszczenie ekranu ( I 4).
Obsługa wyświetlacza polega na wysyłaniu do sterownika kodów instrukcji sterujących lub
kodów wyświetlanych znaków. Wysłanie instrukcji sterującej oznacza zapis kodu instrukcji
według Tablicy Z.1.1 pod adres wewnętrznego rejestru instrukcji ( RS = 0, R/ W = 0). Wysłanie
znaku wymaga najpierw zapisu adresu pamięci DDRAM ( ekranu ) instrukcją I8 pod adresem
rejestru instrukcji ( jw. ), a następnie kodu wyświetlanego znaku - pod adresem rejestru danych
( RS = 1, R/ W = 0). Przy wysyłaniu ciągu znaków nie potrzeba ustawiać kolejnych adresów, jeżeli
wcześniej ustawiono automatyczną inkrementację adresów instrukcją I 2.
Przed wysłaniem każdej instrukcji trzeba kontrolować stan gotowości sterownika, czytając
instrukcję I 9 ( RS = 0, R/ W = 1 ) i sprawdzając czy flaga BF = 0. Zamiast kontroli flagi BF
można stosować zwłokę czasową ( oczekiwanie ) przed wysłaniem następnej instrukcji nie krótszą
od czasu wykonania poprzedniej instrukcji (p.Tablica Z.1.1).
88
Po włączeniu wyświetlacza LCD jego sterownik wymaga wstępnego zaprogramowania
( inicjalizacji ). Zgodnie z wymaganiami producenta inicjalizacja taka jest ciągiem następujących
operacji :
1. - czekaj 15 ms
2. - wyślij słowo 38H - pod adres rejestru instrukcji ( RS = 0, R/ W = 0
3. - czekaj 4,1 ms.
4. - powtórz p. 2
5. - czekaj 100 µ s
6. - powtórz p. 2
7. - czytaj rejestr instrukcji ( RS = 0, R/ W = 1 ) i czekaj aż flaga BF = 0
8. - ustaw parametry wyświetlacza, wysyłając instrukcję I 1 pod adres rejestru instrukcji
(RS = 0, R / W = 0 )
9. - powtórz p. 7
10. - załącz wyświetlanie ekranu i ewentualnie kursora - instrukcją I 3
11. - powtórz p. 7
12. - wyczyść ekran - instrukcją I 4
13. - powtórz p. 7
14. - ustaw tryb wprowadzania - instrukcją I 2
15. - powtórz p. 7
Jeżeli używane będą znaki zdefiniowane przez użytkownika, to
16. - ustaw adres początkowy ( 0 ) pamięci CGRAM instrukcją I 7
17. - powtórz p. 7
18. - załaduj pamięć CGRAM 64-bajtami definiującymi 8 znaków „własnych”, wysyłając
te bajty pod adres rejestru danych sterownika ( RS = 1, R/ W = 0 ). Adres CGRAM
będzie automatycznie inkrementowany, jeżeli taki tryb ustawiono w p. 14
19. - powtórz p. 7.
Koniec programowania. Teraz przygotuj ekran do wyświetlania :
20. - ustaw adres początkowy ( 0 ) pamięci ekranu ( DDRAM ) wysyłając instrukcję I 8 pod
adres rejestru instrukcji
21. - powtórz p. 7.
W mikrokomputerze MKD-51 wejścia RS i R/ W wyświetlacza LCD ( rys.2.1.) dołączono
do linii adresowych odpowiednio : A0 i A1, natomiast do wejścia E doprowadzono, poprzez
bramkę NAND, sygnały RD 42 i WR 42 - aktywne podczas operacji odczytu i zapisu z/do
zewnętrznej pamięci danych o adresie 8010H ( sygnały RD i WR są iloczynowane z sygnałami
dekoderów ). Dzięki temu adresy rejestru instrukcji i rejestru danych sterownika „widziane” są
przez system MKD-51 jako cztery komórki zewnętrznej pamięci danych, jak to pokazano w
Tablicy Z.1.1.
89
Tablica Z.1.2 Adresy rejestrów instrukcji i danych sterownika HD44780 w MKD-51.
Rejestr
Instrukcji dla
zapisu
Danych dla
zapisu
Instrukcji dla
odczytu
Danych dla
odczytu
A1
A0
Adres w MKD-51
R/W
RS
hex
symboliczny
0
0
8010
CTRLW
0
1
8011
DATW
1
0
8012
CTRLR
1
1
8013
DATR
90
Z.2. Przetwornik analogowo-cyfrowy PTAC.
Przetwornik analogowo-cyfrowy typu ADC-0809 ( firmy National Semiconductors ) jest
przetwornikiem 8-bitowym o ośmiu multipleksowanych wejściach pomiarowych. Taktowany jest
zegarem o częstotliwości ok. 500 kHz. Zakresowi napięć wejściowych
0. ... 5 V odpowiadają wartości liczbowe wyniku 0. . 255. Czas przetwarzania wynosi
ok. 120 µs.
Przetwornik ma następując wejścia i wyjścia ( rys. 2.1. ) :
D7.. 0
I7. . 0
A,B,C ALE
START CLK
OE
EOC
-
wyjścia danych ( wyniku )
wejścia pomiarowe
wejścia adresujące kanały wejściowe
wejście sygnału zatrzaskującego numer kanału
wejście sygnału startu przetwarzania
wejście sygnału zegarowego
wejście sygnału odczytu wyniku
wyjście sygnału końca przetwarzania.
Na rys. Z.2.1.
przetwarzania.
pokazano przebiegi sygnałów przetwornika dla jednego cyklu
Rys. Z.2.1. Przebiegi czasowe sygnałów w przetworniku ADC-0809 dla jednego cyklu
przetwarzania.
91
Programowa obsługa przetwornika dla pomiaru napięcia z jednego wejścia wymaga
wykonania następujących operacji :
-
na wejścia ABC podać kod binarny adresu ( numeru ) wejścia pomiarowego
wygenerować sygnał ALE zatrzaskujący adres wejścia
wygenerować sygnał START
czekać aż sygnał EOC zmieni stan z 0 na 1, albo czekać aż upłynie czas dłuższy od czasu
przetwarzania ( ponad 120 µ s )
odczytać wynik przetwarzania poprzez szynę danych.
W mikrokomputerze MKD-51 nie wykorzystano wyjścia EOC. Do wejść A, B, C
dołączono linie A0, A1, A2 szyny adresowej a do połączonych wejść START i ALE
doprowadzono sygnał zapisu WR 40. Sygnał ten generowany jest pod wpływem sygnału zapisu
WR z procesora do zewnętrznej pamięci danych o adresie 8000H ( rys.2.1). Dzięki temu każda
operacja zapisu do pamięci o jednym z adresów 8000H. . . 8007H oznacza zatrzaśnięcie numeru
jednego z kanałów pomiarowych o adresach 0. . 7 ( wejścia I0. . I7 ) i uruchomienie przetwarzania.
Po upływie ok.150µs można dokonać odczytu wyniku pomiaru, przez odczytanie pamięci
zewnętrznej o adresie 8000H ( co spowoduje wygenerowanie sygnału RD 40 a więc i sygnału OE
odczytu przetwornika ).
Poniższy przykładowy ciąg instrukcji procesora 8051
wejścia numer 5 ( I5 - POT0 ), ( rys. 2.1. ) :
PTAC EQU
I5
EQU
POT0 EQU
MOV
MOVX
8000H
5
PTAC + I5
DPTR, # POT0
@DPTR, A
LCALL OPZ
MOV
DPTR,# PTAC
MOVX A, @DPTR
dokonuje pomiaru napięcia z
; adres bazowy przetwornika
; numer wejścia
; adres wejścia I5 ( 8005H )
;
;
;
;
;
zapis pod adres
8005H ( zawartość A nie ma znaczenia )
podprogram opóźnienia ( 150 µ s )
adres dla odczytu ( 8000H )
wynik w A.
92
Z.3. Symbole graficzne schematów blokowych programów
93
Z.4. Tablica kodów ASCII
b6
b5
b4
b3 b2 b1 b0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1)
2)
3)
4)
5)
6)
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
Hex
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
0
0
0
NUL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
HT
LF
VT
FF
CR
SO
SI
0
0
1
1
DLE
DC1
DC2
DC3
STOP
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
US
0
1
0
2
0
1
1
3
SPACE
!
”
#
$
%
&
’ 2)
(
)
*
+
, 3)
- 4)
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
1
0
0
4
@1)
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
1
0
1
5
P
Q
R
S
T
U
V
W
X
Y
Z
[1)
\1)
]1)
∧1)
_ 5)
1
1
0
6
`1,6)
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
1
1
1
7
p
q
r
s
t
u
v
w
x
y
z
{1)
| 1)
}1)
∼
DEL
wymienne ze znakami narodowymi,
apostrof,
przecinek,
minus,
podkreślenie,
akcent.
Objaśnienia:
NUL
SIH
STX
ETX
EOT
ENQ
ACK
BEL
BS
HT
LF
VT
FF
CR
SO
SI
- bez informacji
- początek nagłówka
- początek tekstu
- koniec tekstu
- koniec transmisji
- zapytanie
- odpowiedź pozytywna
- dzwonek
- ruch powrotny, cofanie
- tabulacja pozioma
- zmiana wiersza
- tabulacja pionowa
- zmiana formularza
- powrót wózka
- poza kodem
- w kodzie
DLE
DC1
DC2
DC3
STOP
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
US
DEL
- zmiana znaczenia ciągu znaków
- sterowanie urządzeniem 1
- sterowanie urządzeniem 2
- sterowanie urządzeniem 3
- stop
- odpowiedź negatywna
- synchronizacja
- koniec transmisji bloku danych
- nieważny, anulowanie
- koniec zapisu, koniec nośnika informacji
- zastąpienie podstawienie
- przełączenie, zmiana zestawu znaków
- oddzielenie plików
- oddzielenie grupy
- oddzielenie rekordów
- oddzielenie elementów
- kasowanie (znak ignorowany)
94
Z.6. Format zapisu zbiorów - Intel HEX.
Format Intel HEX stosowany jest do zapisu kodów maszynowych programów na trwałych
nośnikach informacji ( pamięć dyskowa, taśma papierowa itp. ).
Dane przed zapisem ( w postaci zbioru jednobajtowych liczb heksadecymalnych ) dzielone
są na bloki (rekordy) o długości do 127 bajtów, każdy rekord zaopatruje się w nagłówek i kończy
bajtem kontrolnym. Za rekordami danych zapisuje się rekord końca zbioru (ang. EOF-End of
File).
Format rekordu :
: LLAAAATTDD . . . . DDCC
w którym :
:
- znak dwukropka - rozpoczyna każdy rekord
LL
- 2 cyfry hex - reprezentują długość danych ( DD. . . . DD ), w rekordzie danych
zwykle LL = 10 H, w rekordzie EOF zawsze LL=00
AAAA- 4 cyfry hex- reprezentują adres ładowania rekordu,
w rekordzie E0F : AAAA = 0000
TT
- 2 cyfry hex - oznaczają typ rekordu :
- 00 - rekord danych
- 01 - rekord końca zbioru ( EOF )
DD
- bajty hex danych - tylko w rekordach danych
CC
- 2 cyfry hex - reprezentują sumę kontrolną ( ang. Checksum ) rekordu, obliczaną
jako uzupełnienie dwójkowe ( U2 ) sumy arytmetycznej modulo 256 wszystkich
bajtów rekordu :
CC = U2 (SS) = NOT (SS) + 01,
gdzie :
SS = LL+AA+AA+TT+DD+...+DD.
Rekord końca E0F nie zawiera danych i zawsze ma następującą postać :
00000001FF.
W czasie zapisu informacji na nośniku zewnętrznym wszystkie znaki rekordów zamieniane
są na równoważne im kody ASCII ( informacja po zapisaniu zajmuje dwukrotnie większą liczbę
bajtów ).
Przykład:
- Dane do zapisania : 7EH, 01H, 4EH
- Adres ładowania : 4000H
- Format Intel HEX przed zapisaniem ( postać HEX ) :
: 03 40 00 00 7E 01 4E F4 - rekord danych
: 00 00 00 01 FF
- rekord EOF
- Format Intel HEX po zapisaniu ( postać ASCII ) :
3A 30 33 34 30 30 30 30 30 37 45 30 31 34 45 46 34
3A 30 30 30 30 30 30 30 31 46 46.
Przy odczycie informacji z nośników zewnętrznych postać ASCII zamieniana jest na
postać HEX.
95