W trzeciej czÍúci kursu autor pokazuje jak
część 3
w wygodny i przejrzysty sposÛb budowaÊ programy
sk³adaj¹ce siÍ z wielu fragmentÛw, ktÛre spe³niaj¹ rolÍ biblioteki
najczÍúciej stosowanych funkcji.
Budujemy program z klocków, czyli co to jest „project file”
W†poprzedniej czÍúci artyku³u
go rodzaju ³¹cznikiem pomiÍdzy pro-
wspomina³em o†zbiorach nag³Ûwko-
gramem g³Ûwnym a†bibliotek¹. Nasz
wych oraz tak zwanych project file.
zbiÛr LCD4B.H moøe mieÊ postaÊ, jak
MyúlÍ, øe zarÛwno jedne, jak i†dru-
poniøej:
gie bÍd¹ dla nas bardzo uøyteczne
#include <reg51.h>
pod nazw¹ LCD4B.H. Bardziej w³aú-
i†wymagaj¹ kilku s³Ûw wyjaúnienia.
// port, do którego podłączono
ciwym wydaje siÍ jednak pozostawie-
Co to jest zatem project file?
// wyświetlacz LCD
nie tylko tych funkcji i†procedur,
Pod t¹ tajemnicz¹ nazw¹ kryje siÍ
#define PORT
P2
ktÛre bÍd¹ nam potrzebne.
po prostu lista zbiorÛw sk³adaj¹cych
// bity sterujące LCD
Teraz kolej na w³aúciw¹ imple-
siÍ na nasz program. Wracaj¹c do
#define ENABLE
PORT^0
mentacjÍ LCD4B.C. Na pocz¹tku mo-
przyk³adu z†poprzedniego odcinka -
#define READ
PORT^3
du³u umieszczamy dyrektywÍ #inclu-
jeúli na podstawie programu do ob-
#define REGISTER
PORT^2
de LCD4B.H. W†ten sposÛb wszystkie
s³ugi wyúwietlacza LCD utworzymy
// opóźnienie wielokrotności około
definicje z†pliku nag³Ûwkowego do-
bibliotekÍ, to musimy j¹ w†jakiú spo-
// 1 milisekundy dla kwarcu
stÍpne bÍd¹ rÛwnieø w†pliku ürÛd³o-
sÛb do³¹czyÊ do programu g³Ûwnego.
// 7,3728MHz
wym. W†kolejnym kroku usuwamy
Ten zbiÛr zawieraj¹cy listÍ wspÛ³pra-
void Delay (unsigned int k);
segment main(). W†zasadzie bibliote-cuj¹cych ze sob¹ modu³Ûw, poddawa-
// zapis bajtu do LCD
ka jest juø gotowa. Naleøy jeszcze
nych dzia³aniu kompilatora i†linkera,
void WriteByteToLcd(char X);
sprÛbowaÊ skompilowaÊ LCD4B.C, aby
stanowi tak zwany projekt (z angiel-
// zapis bajtu do rejestru
sprawdziÊ, czy ktÛreú z†definicji nie
skiego project). Czyli project file to
// kontrolnego LCD
powtarzaj¹ siÍ i†czy nie ma w†nich
po prostu lista zbiorÛw uwzglÍdnia-
void WriteToLcdCtrlRegister(char X);
b³ÍdÛw.
nych przez kompilator i†linker przy
// zapis bajtu do pamięci obrazu
translacji kodu ürÛd³owego na kod
void LcdWrite(char X);
£¹czymy bibliotekÍ
wynikowy. Na tej liúcie mog¹ siÍ
// czyszczenie ekranu LCD
z†programem g³Ûwnym
znaleüÊ nie tylko programy w†jÍzyku
void LcdClrScr(void);
Program g³Ûwny to program w†jÍ-
C, ale rÛwnieø w†jÍzyku asemblera.
// inicjalizacja wyświetlacza LCD
zyku C. Stanowi on jeden ze sk³ad-
Dla nas jest to bardzo uøyteczna in-
// w trybie 4 bity
nikÛw projektu. Podobnie, sk³adni-
formacja. Jest to sygna³, øe nasz pro-
void LcdInitialize(void);
kiem projektu musi byÊ postaÊ ürÛd-
gram nie musi byÊ przygotowany wy-
// ustawia kursor na współrzędnych
³owa biblioteki funkcji wyúwietlacza
³¹cznie w†jÍzyku C. Po utworzeniu
// x, y
oraz plik nag³Ûwka. Pos³uømy siÍ
nowego projektu warto jest zajrzeÊ
void GotoXY(char x, char y);
przyk³adem z†poprzedniego odcinka
do zak³adki menu Project Options.
// wyświetla tekst na współrzędnych
i†napiszmy ten sam program, ale ko-
Moøna tam znaleüÊ szereg opcji kom-
// x, y
rzystaj¹c z†utworzonej biblioteki.
pilatorÛw C†i†asemblera, ktÛre mog¹
void WriteTextXY(char x, char y,
Po uruchomieniu RIDE, w†pasku
wymagaÊ ustawienia. Na przyk³ad,
char *S);
menu na gÛrze ekranu odnajdziemy
j e ø e l i s t o s u j e m y m i k r o k o n t r o l e r
// wyświetla tekst od rozpoczynając
Project. Wybierzmy tÍ opcjÍ, a†nastÍp-AT89S8252, to moøna w³¹czyÊ opcjÍ
// od pozycji kursora
nie New. UtwÛrzmy nowy zbiÛr pro-
Dual DPTR. Pomaga ona przy pew-
void WriteText(char *S);
jektu i†nazwijmy go Pierwszy. Pro-nych operacjach 16-bitowych. Podob-
// definiowanie znaków z tablicy
gram sam nada mu domyúlne rozsze-
nie moøna post¹piÊ z†definicj¹ rejes-
// wskazywanej przez ptr
rzenie. PRJ, a†na dole ekranu zostanie trÛw 8051 dla modu³Ûw jÍzyka asem-void DefineSpecialCharacters(char
otwarte okienko projektu. NastÍpnie
bler tak, øe nie trzeba bÍdzie ich do-
*ptr);
wybierzmy File New i†utwÛrzmy
³¹czaÊ.
Jak ³atwo zauwaøyÊ, jest to do-
zbiÛr o†rozszerzeniu. C - to bÍdzie k³adne powtÛrzenie definicji nag³Ûw-nasz program g³Ûwny. Jego treúÊ po-
Budujemy pierwsz¹ bibliotekÍ
kÛw funkcji oraz sta³ych i†zmiennych,
winna byÊ nastÍpuj¹ca:
LCD4B.H
ktÛre maj¹ byÊ dostÍpne rÛwnieø
#include “lcd4b.h”
StwÛrzmy na podstawie programu
w†innych modu³ach tego samego pro-
// program główny
do obs³ugi wyúwietlacza nasz¹ pierw-
gramu. Plik nag³Ûwkowy naj³atwiej
void main(void)
sz¹ bibliotekÍ funkcji dla jÍzyka C.
jest w†tym przypadku utworzyÊ, ot-
{
Po pierwsze, musimy zdefiniowaÊ
wieraj¹c zbiÛr LCD4B.C i†kasuj¹c
char ix = 1, iy = 1, x, y, i = 0;
zbiÛr nag³Ûwka, ktÛry bÍdzie zawie-
wszystkie cia³a funkcji, zostawiaj¹c
ra³ wszystkie istotne dla pracy mo-
tylko ich nag³Ûwki. PozostawiÊ lub
LcdInitialize();
du³u parametry tak, aby nie trzeba
d o p i s a Ê m o ø e m y r Û w n i e ø r Û ø n e DefineSpecialCharacters(&CGRom);
by³o ich szukaÊ w†kodzie ürÛd³owym
zmienne i†sta³e, ktÛrych bÍdziemy
LcdClrScr();
biblioteki. Ten zbiÛr bÍdzie teø swe-
uøywaÊ. ZbiÛr po edycji zapisujemy
while (1)
Elektronika Praktyczna 8/2002
85
{
Tabela 2. Lokalizacja parametrów przekazywanych do funkcji WriteTextXY(x, y, “ “);
Numer
char lub wskaźnik
int lub wskaźnik
long lub
wskaźnik typu
if (ix == 1) x++; else x-;
argumentu
1−bajtowy
2−bajtowy
float
generic
if (iy == 1) y++; else y-;
1
R7
R6:R7
R4:R5:R6:R7
R1:R2:R3
if (x == 19) ix = 0;
if (x == 0) ix = 1;
2
R5
R4:R5
R4:R5:R6:R7
R1:R2:R3
if (y == 3) iy = 0;
3
R3
R2:R3
R1:R2:R3
if (y == 0) iy = 1;
WriteTextXY(x, y, 0x01);
ci liczb szesnastkowych w†pliku ürÛd-
mentÛw przez bank rejestrÛw jest do-
Delay(50);
³owym programu. Znajdzie siÍ on pod
myúln¹ dla kompilatora. Moøna j¹ jed-
}
adresem wynikaj¹cym z†bieø¹cego sta-
nak zmieniÊ, stosuj¹c polecenie #prag-
}
nu kodu. Spodziewane s¹ wartoúci
ma NOREGPARMS. WÛwczas argu-
jednobajtowe obiektÛw, za wyj¹tkiem
menty funkcji przekazywane s¹ przez
Uwaga: wybranie File Open lub Fi-adresÛw zmiennych zewnÍtrznych ( co-
stos lub zapamiÍtywane w†segmencie
le New nie powoduje dodania otwar-
de lub xdata), ktÛre wymagaj¹ 2 baj-zmiennych pseudostatycznych. Po³oøe-
tego lub nowego zbioru do projektu.
tÛw. Nie jest to metoda zbyt wygod-
nie tego segmentu zaleøy od wybra-
Po wpisaniu tych kilku linijek in-
na. Sami musimy bowiem spe³niÊ ro-
nego modelu pamiÍci (jeúli wybrany
strukcji, zapisujemy program g³Ûwny
lÍ asemblera t³umacz¹c mnemoniki na
zosta³ model SMALL, LARGE lub
poprzez File Save As pod nazw¹
kody szesnastkowe.
COMPACT, wÛwczas znajduje siÍ on
TEST.C . ZapamiÍtaliúmy program
2. Za pomoc¹ dyrektywy #pragma
odpowiednio w†obszarze DATA, XDA-
g³Ûwny, teraz musi siÍ on staÊ czÍú-
ASM.
TA lub PDATA). Nie polecam jednak
ci¹ projektu. W†tym celu naciskamy
Dyrektywa ta pozwala na umiesz-
uøywania tego polecenia, poniewaø
k l a w i s z e s k r Û t u A L T + I N S E R T
czenie kodu w†postaci mnemonikÛw
wÛwczas lokalizacja argumentÛw mo-
i†w†otwartym okienku wskazujemy
asemblera w†pliku ürÛd³owym progra-
øe byÊ dosyÊ trudna.
zbiÛr TEST.C. ZbiÛr powinien siÍ po-
mu. Blok ten powinien siÍ zaczynaÊ
jawiÊ w†okienku Project na dole ek-
od #pragma ASM i†koÒczyÊ #pragma Nazwy funkcji jÍzyka C
ranu. BÍdzie on widoczny po wska-
ENDASM. Metoda ta, podobnie jak
a†asembler
zaniu symbolu ì+î. W†ten sam spo-
powyøsza, polecana jest jednak do
W†celu u³atwienia analizy progra-
sÛb musimy do³¹czyÊ zbiÛr LCD4B.C,
niewielkich procedur.
mu w†jÍzyku asembler oraz unikniÍ-
poniewaø musi on byÊ kompilowany
3. Za pomoc¹ modu³u w†jÍzyku
cia b³ÍdÛw tak zwanych runtime, na-
rÛwnoczeúnie z†programem g³Ûwnym.
asmeblera.
zwy funkcji podczas kompilowania
Zbioru LCD4B.H nie trzeba do³¹czaÊ.
Moim zdaniem jest to najlepsza
programu s¹ nieco modyfikowane.
Zostanie on do³¹czony automatycznie
i†najbardziej efektywna metoda zarÛwno
- void func1(void) wygeneruje symbol
w†czasie kompilacji, poniewaø jest
do ma³ych, jak i†duøych procedur
FUNC1. Nazwa funkcji bez para-
wymieniony jak parametr dyrektywy
w†jÍzyku asembler. Pozbawiona jest
metrÛw lub z†parametrami nieprze-
#include. Po naciúniÍciu klawisza F9, wad poprzednikÛw -†wymaga jednak
kazywanymi przez rejestry jest
co odpowiada wywo³aniu Make All,
opanowania kilku podstawowych regu³
przenoszona do zbioru. OBJ bez
nasz projekt powinien skompilowaÊ
przekazywania parametrÛw. MetodÍ tÍ
zmian. Ma³e litery w†nazwie funk-
siÍ bezb³Ídnie, a†rezultat w†postaci
omÛwimy najszerzej. BÍdziemy teø
cji zamieniane s¹ na duøe.
zbioru wynikowego ìPierwszy.hexî
stosowaÊ j¹ we wszystkich przyk³adach
- void func2(char) wygeneruje symbol
powinien zostaÊ zapisany na dysku.
³¹czenia modu³Ûw asemblera z†modu-
_FUNC2. Dla funkcji z†argumentami
³ami w†jÍzyku C.
przekazywanymi w†rejestrach, na
£¹czymy modu³ jÍzyka C
pocz¹tku nazwy dodawany jest
z†asemblerem
Jak przekazywane s¹
znak podkreúlenia. Znak ten jest
Podobnir jak ³¹czyliúmy modu³y
parametry funkcji?
identyfikatorem funkcji pobieraj¹-
napisane w†jÍzyku C, moøemy do³¹-
Parametry funkcji moøemy podzie-
cych argumenty z†rejestrÛw. Ma³e
czyÊ do programu g³Ûwnego w†C†mo-
liÊ na dwie grupy. Pierwsz¹ z†nich
litery w†nazwie funkcji zamieniane
du³y napisane w†jÍzyku asembler.
bÍd¹ stanowiÊ parametry zwracane ja-
s¹ na duøe.
Kompilator RC-51 oferuje nam 3†spo-
ko rezultat dzia³ania funkcji, drug¹
- void func3 (void) reentrant wyge-soby do³¹czania funkcji napisanych
pobierane przez ni¹ z†zewn¹trz (argu-
neruje symbol ?FUNC3. Funkcje ty-
w†jÍzyku asembler:
menty). Oba rodzaje parametrÛw prze-
pu reentrant (to znaczy takie, ktÛ-
1. Za pomoc¹ instrukcji ASM.
kazywane s¹ przez bank rejestrÛw.
re mog¹ byÊ wywo³ywane jedno-
Instrukcja asm pozwala na umiesz-
Trzeba byÊ wiÍc ostroønym, wyko-
czeúnie przez wiele innych funkcji)
czenie kodu jÍzyka asembler w†posta-
rzystuj¹c go do innych celÛw.
maj¹ nazwÍ poprzedzon¹ znakiem
W†przypadku wartoúci zwracanych
zapytania. Okreúla on funkcjÍ typu
Tabela 1. Lokalizacja wartości
przez funkcjÍ sytuacja jest bardzo
reentrant.
zwracanych przez funkcje
prosta, poniewaø funkcja moøe zwra-
Na dysku powstaje co najmniej
Rozmiar
Lokalizacja
caÊ tylko jedn¹ wartoúÊ. Wystarczy
trzy rodzaje zbiorÛw. Pierwszy z†nich
(typ parametru)
wiÍc znajomoúÊ tab. 1. Chyba øe
to przet³umaczony na jÍzyk asemble-
wartoúÊ zwracana nie mieúci siÍ
ra program ürÛd³owy (.LST), drugi to
bit (1 bit)
flaga Carry
w†banku rejestrÛw. WÛwczas jest ona
mapa zmiennych i†sta³ych (adresy ich
char (1 byte)
R7
umieszczana na stosie mikrokontrole-
rozmieszczenia w†pamiÍci 'M51), trze-
int (2 bajty)
R6:R7
ra. Inaczej jest w†przypadku, gdy za-
ci to zbiÛr wynikowy.HEX lub.BIN
generic pointer
R1:R2:R3
chodzi koniecznoúÊ przekazania argu-
(albo oba te zbiory). Jeúli mamy w¹t-
(3 bajty)
mentÛw do funkcji.
pliwoúci co do sposobu, w†jaki wy-
float (4 bajty)
R4:R5:R6:R7
Przez bank rejestrÛw moøe byÊ
konany zostanie nasz program napi-
double (6 bajtów)
R2:R3:R4:R5:R6:R7
przekazane do trzech argumentÛw. Jeú-
sany w†jÍzyku C, to wÛwczas analiza
long double
R1:R2:R3:R4:R5:R6:R7
li jest ich wiÍcej, wÛwczas uøywany
kodu wynikowego w†jÍzyku asembler
(7 bajtów)
jest stos. Metoda przekazywania argu-
moøe je wyjaúniÊ.
86
Elektronika Praktyczna 8/2002
Nareszcie coú dla praktykÛw
deklarujÍ w†programie g³Ûwnym w†jÍ-
najpierw przetworzy zbiÛr PCKBD.C
Spoøytkujmy nowo zdobyt¹ wiedzÍ.
zyku C. Czasami zmiennych moøna
i†utworzy z†niego zbiÛr PCKBD.AOF, Przyda nam siÍ zarÛwno ta o†tworze-uøywaÊ zamiennie albo w†asemblerze,
a†nastÍpnie to samo zrobi ze zbiorem
niu zbiorÛw nag³Ûwkowych typu . H, albo w†C. OszczÍdzamy w†ten sposÛb
PCKBD.A51. Nietrudno zauwaøyÊ, øe jak i†o†³¹czeniu modu³Ûw i†przekazywa-pamiÍÊ mikrokontrolera, ktÛrej i†tak
ostatni kompilowany zbiÛr na³oøy siÍ
niu argumentÛw do funkcji w†jÍzyku
nie ma zbyt wiele.
na juø istniej¹cy. Linker prÛbuj¹c zbu-
C†oraz pobieraniu rezultatÛw ich dzia-
Aby poinformowaÊ kompilator jÍ-
dowaÊ z†obiektÛw zbiÛr wynikowy,
³ania. Za przyk³ad niech pos³uøy nam
zyka C, øe dana funkcja jest zewnÍ-
nie znajdzie potrzebnych danych i†wy-
program do odczytywania standardowej
trzn¹, czyli pochodzi z†innego modu-
úwietli komunikat o†brakuj¹cych funk-
klawiatury PC. Jeszcze drobna uwaga.
³u, uøywa siÍ s³owa kluczowego ex-
cjach czy zmiennych, mimo iø teore-
Bez wdawania siÍ w†szczegÛ³y funkcjo-
tern. Oto przyk³adowe deklaracje fun-tycznie wszystko jest w†porz¹dku.
nowania kompilatora jÍzyka asembler,
kcji zewnÍtrznych:
modu³ z†tego przyk³adu moøna potrak-
extern void TX_byte(char x);
Program do odczytu
towaÊ jako pewnego rodzaju szablon.
extern char RX_byte(void);
klawiatury PC
W†skrÛcie struktura takiego pliku jest
Kaøda funkcja i†zmienna w†jÍzyku
Program sk³ada siÍ z†dwÛch czÍú-
nastÍpuj¹ca:
C, jeøeli nie jest poprzedzona s³o-
ci. G³Ûwny napisany jest w†jÍzyku C,
<nazwa segmentu> SEGMENT CODE
wem static, ma zasiÍg globalny, to a†funkcje do komunikacji z†klawiatu-EXTRN DATA (<nazwa zmiennej> ) znaczy moøe byÊ wykorzystywana
r¹ napisane s¹ w†asemblerze. S¹ to
EXTRN CODE (<nazwa funkcji w C> ) przez inne modu³y. Upraszcza to ko-d w a o d r Í b n e m o d u ³ y . P i e r w s z y PUBLIC <nazwa udostępnianej funkcji rzystanie z†nich z†poziomu modu³u
z†nich nazywa siÍ PCKBD-C.C, a†dru-
w asemblerze>
przygotowanego w†jÍzyku asembler.
gi PCKBD-ASM.A51. Oba pliki sk³a-RSEG <nazwa segmentu >
Wystarczy bowiem tylko poinformo-
daj¹ siÍ na projekt o†nazwie PCKBD
.....implementacja....
waÊ kompilator, øe dana funkcja czy
( .PRJ). Do projektu do³¹czy³em rÛw-END
zmienna jest zewnÍtrzna. Inaczej jest
nieø wczeúniej utworzon¹ przez nas
Kiedy warto stosowaÊ modu³y napi-
w†przypadku modu³Ûw w†asemblerze.
bibliotekÍ zawieraj¹c¹ funkcje obs³ugi
sane w†asemblerze? Po pierwsze wtedy,
Kaøda funkcja musi zostaÊ zadeklaro-
wyúwietlacza LCD. MyúlÍ, øe przyda
gdy zaleøy nam na szybkoúci dzia³ania.
wana jako dostÍpna z†zewnÍtrz. S³u-
nam siÍ jeszcze niejednokrotnie.
Drugi powÛd moøe zaprzeczyÊ idei sto-
øy do tego s³owo PUBLIC. Do pobra-
Oczywiúcie program g³Ûwny jest
sowania jÍzykÛw wysokiego poziomu,
nia natomiast danych z†modu³Ûw
tylko przyk³adowym. Wyúwietla kody
do ktÛrych naleøy rÛwnieø C, jednak
w†jÍzyku C, s³owo EXTRN. Oto przy-
naciúniÍtych klawiszy, podczas gdy
niektÛre funkcje jest znacznie ³atwiej
k³ady deklaracji dostÍpu na poziomie
w†praktyce moøna je wykorzystaÊ
zaimplementowaÊ w†asemblerze niø
modu³u napisanego w†asmeblerze:
w†zupe³nie inny sposÛb do wprowa-
w†C. Tak jest na przyk³ad z†odczytywa-
- zmienna pobierana z†modu³u napi-
dzania danych czy sterowania w³as-
niem klawiatury PC. Dane z†niej wpro-
sanego w†jÍzyku C:
nym urz¹dzeniem. Funkcja main() za-
wadzane s¹ szeregowo, wiÍc konieczne
EXTRN DATA (temp)
wiera dosyÊ rozbudowany warunek
jest uøycie instrukcji przesuwania za-
- deklaracja dostÍpu do funkcji zaim-
switch. Jest to po³¹czenie tej instruk-wartoúci rejestru roboczego w†prawo lub
plementowanej w†module w†jÍzyku
cji z†konstrukcj¹ if....else.
w†lewo. Najproúciej jest to zrobiÊ, za-
C, niezbÍdne jest przekazanie para-
ZwrÛÊmy uwagÍ na wywo³anie
pamiÍtuj¹c wartoúÊ bitu portu, do ktÛ-
metrÛw do funkcji, st¹d teø kompi-
funkcji _Delay w†module w†jÍzyku
rego pod³¹czone jest wejúcie/wyjúcie da-
lator jÍzyka C†dodaje znak podkreú-
asembler. Jako argument funkcji wy-
nych klawiatury w†fladze przeniesienia
lenia przed jej nazw¹ zgodnie
magana jest liczba typu unsigned int.
C (na przyk³ad C†= P1^0 lub w†asem-
z†wczeúniej opisywanymi regu³ami:
Jest ona wpisywana do rejestrÛw
blerze MOV C,P1.0). PÛüniej wystarczy
EXTRN CODE (_Delay)
R6:R7 tuø przed poleceniem ACALL
juø tylko instrukcja przesuniÍcia w†pr-
- deklaracje funkcji udostÍpnianych
_Delay. Funkcjami wymieniaj¹cymi
awo lub w†lewo danych w†rejestrze A
przez modu³ w†jÍzyku asembler -
dane z†modu³em w†jÍzyku C s¹ rÛw-
z†uwzglÍdnieniem flagi C - wykonana
zwrÛÊmy uwagÍ na zmianÍ nazw
nieø RX_byte i† TX_byte. Poniewaø za-oúmiokrotnie - aby odczytaÊ ca³y bajt
w † s t o s u n k u d o t y c h , u ø y t y c h rÛwno argument dla TX_byte, jak
danych. W†jÍzyku C pojawia siÍ pe-
w†C†(podobnie jak _Delay):
i†liczba zwracana przez RX_byte s¹
wien problem. OtÛø zmienne bez zna-
PUBLIC _TX_byte
typu char, przekazywane s¹ one
ku (unsigned) i†ze znakiem (signed) s¹
PUBLIC RX_byte
przez rejestr R7 (patrz tab. 1†i†2).
rÛønie przez kompilator przesuwane.
Deklaracja obiektÛw zewnÍtrznych
Uk³ad elektryczny jest bardzo
RÛønica polega na uwzglÍdnianiu flagi
sk³ada siÍ z†trzech cz³onÛw: s³owa
prosty. Wystarczy w†zasadzie dowol-
przeniesienia w†przypadku zmiennych
kluczowego EXTRN, okreúlenia miejsca ny p³ytka testowa z†mikroprocesorem
typu signed. Co innego w†asemblerze,
w†obszarze adresowym mikrokontrole-
z†rodziny 8051. Klawiatura wymaga
mamy pe³n¹ kontrolÍ nad postaci¹
ra, gdzie umieszczony jest obiekt ( CO-
rezystorÛw pull-up o†wartoúci oko³o ürÛd³ow¹ programu i†sposobem jego wy-DE, DATA itp.) oraz nazwy obiektu 5,1kΩ. W†uk³adzie modelowym uøy-konywania, niezaleønie od typu dekla-
w†nawiasach. Deklaracja obiektÛw udo-
wa³em AVR Starter Kit firmy Atmel
rowanych zmiennych.
stÍpnianych na zewn¹trz zawiera tyl-
Corp. z†mikrokontrolerem AT89S8252.
£¹cz¹c modu³ napisany w†jÍzyku
ko s³owo kluczowe PUBLIC.
Program po skompilowaniu zajmuje
C†z†modu³em w†asemblerze, staram siÍ
Na koniec bardzo waøna uwaga.
nieco wiÍcej niø 1,5kB. Z†powodze-
zachowaÊ pewien styl programowania.
Modu³ napisany w†jÍzyku C musi
niem moøna go wiÍc zmieúciÊ rÛw-
Oczywiúcie moøesz sobie wybraÊ
mieÊ inn¹ nazwÍ niø napisany w†jÍ-
nieø w†malutkim AT89C2051.
w³asny. Moja propozycja jest jednak
zyku asembler. Dlaczego? Podczas
Jacek Bogusz, AVT
nastÍpuj¹ca:
kompilowania tworzone s¹ rÛøne zbio-
jacek.bogusz@ep.com.pl
1. Program g³Ûwny zawsze napi-
ry tymczasowe. Maj¹ one tak¹ sam¹
sany jest w†jÍzyku C†i†do niego do³¹-
nazwÍ jak zbiÛr ürÛd³owy, lecz inne
Dodatkowe informacje
czane s¹ modu³y w†jÍzyku asembler.
rozszerzenie (na przyk³ad. AOF). Gdy Ewaluacyjn¹ wersjê pakietu firmy Raisonance
2. Kaød¹ zmienn¹ (kaød¹ komÛr-
oba modu³y, w†C†i†asemblerze, bÍd¹
oraz postaæ Ÿród³ow¹ programu prezentowanego kÍ pamiÍci uøywan¹ przez asembler)
mia³y tÍ sam¹ nazwÍ, to kompilator
w artykule zamieœciliœmy na CD-EP8/2002B.
Elektronika Praktyczna 8/2002
87