Programowa
ni
e mik
rokontrolerów 80
51 w
jez
yku
C
-
czę
ść
1
Gdy
już
skompletujemy
nas
z
wars
zta
t
prog
ra
mis
t
yczny
i
sp
rz
ęto
wy
,
por
a
na
n
api
san
ie
p
i
e
rwszego
p
rogr
amu
w
języ
ku
C.
Najbar
dziej efekt
owne
s
ą p
rogr
amy,
który
ch
dzi
ał
an
ie
moz
na
odraz
u
zoba
c
z
y
c
n
a
w
ł
a
s
ne ocz
y.
Ja
zwy
kle, gdy
z
aczynam
p
racę
z
now
ym
m
ik
rokont
roler
m,
piszę
prog
ra
m,
który
z
apa
la
diode
LE
D.
W
ten
sp
osób
mo
żna
na
jszy
bci
ej
pr
zeko
nać s
i
ę
o
pop
rawnym
dzi
ał
an
iu
pro
gra
mu
.
Do
mik
rokont
role
ra
nale
ży
podł
ą
c
z
yc
8
d
iod
LED
w
spos
ób
pokaza
ny
na
rysunku
:
Wa
rtości
rezyst
orów
na
leży
dobrać
odpw
iedn
io
do
posiadanych
diod
LED.
Je
sl
i s
ą
to d
iod
y
sta
nd
ar
dow
e, to
r
ezys
ta
ncja r
ezystor
ów
po
win
na
mi
eć
wartość
ok. 330
O
hm.
Na
t
om
iast
g
d
y
dysp
onujemy
d
iodami
n
iskop
ądo
wy
mi, to
rezystancja
rezystor
ów
może m
ieć
wartośc
pona
d
1 k
Ohm
(n
ale
ż
y
zwrócić
takż
e uwagę
na
wy
dajn
ość
prą
dową
portów
m
ikr
okont
roler
a)
.
O
pera
tor pr
zypisa
nia
.
W
t
ym podtem
acie
za
pozamy
się
z
na
jczęście
j
uży
wanym
oper
atorem
-
operator
em
pr
z
y
p
is
an
ia.
Słu
ż
y
on,
jak
jego
n
azwa
wskazuje, do p
rzypisa
ni
a
do
dan
ej zm
ien
n
e
j
wartości i
nn
ej
zm
ien
nej,
badź
sta
łej.
/
/
doł
ączeni
e
plik
u na
główk
oweg
o
/
/
zawie
rajac
ego
d
efini
cj
e
rej
estrow
/
/
wewn
etrzny
ch pro
cesora
#
inclu
de
<805
1.h>
/
/
głó
wna fu
n
k
cja
progra
mu
v
oid
ma
in(v
oid)
{
/
/
zapisan
ie
do
portu
P0
li
czby
0
x55
P
0
=
0x55;
/
/
pusta
pęt
la
ni
eskonczona
-
zatrzym
anie
porgra
mu
wh
ile(
1);
}
N
a począt
ku
musi
m
y
dołączy
ć
pl
ik
n
ag
łó
wkow
y
z
defi
nicjami
r
eje
st
ró
w
procesora.
Gdy
b
yś
my
tego
nie
z
robili
,
to n
ie
mogl
ib
yśm
y
odwo
ły
wa
c
się do rejestrów
proces
ora
z
a
pomo
c
ą
naz
w sym
boli
c
zn
ych,
tylk
o
pr
zez
podawan
ie a
dres
u da
nego
reje
s
tru.
Tak
ie r
ozwiąza
ni
e
b
ył
ob
y
bardzo
niewy
go
d
n
e
. Ja
w
n
as
z
ym
pr
z
ykła
dzie
doł
ącz
yłem
pli
k
8051
.h
- "bezpieczny"
d
la
większ
ości
mik
roko
ntr
olerów
z
r
odzi
ny
8051.
W
przypa
dku,
g
d
yb
y
śm
y
ko
rzy
sta
li
z
rejestrów
specy
f
iczny
ch
dla
da
nego m
ikr
okont
role
ra,
nie
w
y
stę
pując
yc
h w
sta
nda
r
tow
ym
8
051,
to mu
simy
dołaczy
ć
odpow
iedni
dl
a
dan
ego
mi
kroko
ntro
ler
a
plik
nag
łówk
ow
y.
W
s
ytuacji, gdy
u
ż
ywam
y
tylko
typ
ow
y
ch
reje
st
rów
moż
na
sp
okojnie za
stoso
wac
pli
k
8051.
h
.
K
ażdy
p
rogr
am
pisany w
jęz
yku
C
mus
i
się
skła
dać
z
główne
j funkcji
mai
n
.
Funk
c
ja
ta
n
ie
zwra
ca
żadn
ej
wa
rtości
an
i
do fun
kcji
ni
e
j
est p
rzek
azy
wan
a
żad
na
wartość,
wi
ęc
fun
kcj
ę
tą
deklar
ujemy
jako
v
oid m
ai
n(void).
S
ł
owo
v
oid
pr
zed
na
zwą
fukcj
i m
ó
wi kompi
la
t
o
ro
w
i
,
że
funkcja n
ie
zwr
a
c
a w
artości, a
lbo
i
nac
zej
mów
i
ąc, że
zw
racan
a
wartośc
jest typu
v
oid (
pust
y, b
rak
ty
pu)
.
Słow
o
void
w
n
awias
a
c
h
okr
ągłych po
na
zwie
f
ukcji
mówi
komp
ila
torowi, że
do
funkcji n
ie
jest
prz
ekazywana
żad
n
a
war
toś
ć.
W za
leż
ności od tego, j
a
k
ą
funkcę
chcemy
n
ap
isa
c
i
jakie
par
ame
try m
a
ona
p
rzyjmo
wać
ora
z
jaką
wartość
może zw
racać,
dekla
racj
a fu
nkc
ji
może
p
rzyjmo
wać
na
jróż
nie
j
s
ze
po
st
aci :
v
oid
funkc
ja(c
har x)
-
funkcja
pr
zyjmuj
ąca
j
ede
n p
aramet
r
typu
ch
ar
(znak),
n
iezwrac
ająca
wartośc
i
v
oid
funkc
ja(c
har x,
char y
)
- funk
ca
pr
z
yjmu
jąca
dwa
parame
try
t
ypu
char
, n
iezwraca
jąca
w
artośc
i
c
har funkc
ja(vo
id)
-
funkc
ja
niep
r
z
yjmu
jąca
żadnych
param
etró
w,
zwraca
jąca
w
artość
ty
pu
char
Oczy
wiś
cie
mozliwy
ch
kombina
cji
jest
bard
zo
dużo
i
zal
eżą
one
o
d
t
e
g
o,
jakie
zad
an
ia
ma
s
pełni
ać
dan
a
fun
kcja.
Gdy
już
ma
m
y sz
kielet
prog
ra
mu,
to
na
le
z
y
wpisac
właś
ciwy
kod
prog
ra
mu
.
W n
as
z
ym
pierwszym
p
rogr
am
ie
w
z
asad
zie
dec
yd
ujące
dz
nac
zen
ia
m
a
jeden
w
iers
z p
rogr
amu
:
P0 =
0
x55;
.
Je
st
to
i
nst
ru
kcja p
rzypisująca do por
tu
P0
wartość
55
h.
O
bjawi
się
to
zap
al
eni
em
co
d
rug
iej
diod
y
LED
podłączon
e
j do
port
u
P0.
Liczb
y
w
sy
stemie
s
zesnast
o
wy
m
w
j
ę
z
yku
C
zap
isujemy
właśni
e w
podany
sposób
:
l
iczbę
szesnas
tko
wą (bez
zn
ak
u
'
h'
na
końcu)
n
al
ezy
popr
zedz
i
c
ciąg
i
e
m
zn
aków
'0x'
.
Po
za
pisa
ni
u
do
port
u
właści
wej
w
a
rtości na
le
ż
y
za
tr
zymać wy
ko
ny
wanie p
rogr
amu
.
Najł
atwiej
dokonać
tego
wy
korz
yst
ując
pętlę
while.
Pętla
ta
jes
t
w
yk
on
yw
ana
ta
k
długo,
aż
jej
w
a
run
ek
j
est p
rawdz
iw
y.
Poni
e
waz
w
n
as
z
ym
prog
ra
mie
waru
nek
pętl
i
j
est war
tością st
ałą
,
re
preze
nt
ującą
pr
awdę
logiczn
ą,
to
na
sza
pętla
będzie s
ię
wy
kon
y
wała
bez
końca.
Funkcje
logi
czne.
Wyz
erowanie
od
powi
edn
i
c
h
li
ni
i
portu
może
m
y
z
rea
lizować
tak
że
w
in
ny
sp
osó
b,
pr
zez
wy
ko
n
anie
iloczynu
log
icznego
port
u
ze s
tałą
.
Pr
zeds
ta
w
ia t
o
tabela
pr
awd
y
fun
k
c
ji
AND :
Jeśli
potr
aktujemy
z
mie
nn
ą
A jako n
asz
port,
a
zmi
en
ną
B
jako
mas
kę
określają
c
ą
któ
re
bity
na
leży
w
y
zerow
ać,
to będą
nas
i
nte
resowa
ć dwa ostat
nie
wiersze tej
tabeli.
Jak
wy
nika
z
tabel
i odpow
ieni
bit
reje
st
ru
zosta
nie
wy
zero
wany,
gdy
odp
owiadając
y
mu
bit
mas
ki
będzie
mi
ał
wa
rtość
0
.
W
pr
zeciwnym
przypadku
sta
n
bitu
r
eje
st
ru
sie n
ie
zm
ien
i.
Rz
eczą
waż
ną
jest
ab
y
p
amie
tać,
że
odp
owi
edn
ie
bity
rejestru
,
n
a
któ
r
ych
chcem
y
p
rze
rowadzić i
locz
yn m
usza
b
y
ć
w
s
tan
ie
1.
Kod
pro
gra
mu
real
iz
ującego
zerowan
ie l
in
ii
port
u P0
za
pomo
cą
i
locz
ynu log
iczn
eg
o jest
pr
zedst
awion
y
poniż
e
j
:
/
/
doł
ączeni
e
plik
u na
główk
oweg
o
/
/
zawie
rajac
ego
d
efini
cj
e
rej
estrow
/
/
wewn
etrzny
ch pro
cesora
#
inclu
de
<805
1.h>
/
/
głó
wna fu
n
k
cja
progra
mu
v
oid
ma
in(v
oid)
{
/
/
ilo
czyn
logi
czn
y
portu P
0
ze
stałą
55h
P
0
&=
0x
55;
/
/
pusta
pęt
la
ni
eskonczona
-
zatrzym
anie
porgra
mu
wh
ile(
1);
}
W
ieksz
ość
kodu
j
est t
aka
sama
jak w
prog
ra
mie
poprze
dni
m.
Wy
jaśnien
ia
w
y
maga
jed
e
n wiersz
kodu :
P
0
&=
0x
55;
Jest to
skrócon
y
z
api
s n
as
tepującego
w
yrażen
ia
:
P
0
=
P0
&
0x5
5
;
Języ
k
C
umoz
liwia
sto
sow
an
ie
sk
róc
ony
ch wyrażeń,
będąc
ych
połączeni
em
op
e
rator
a
pr
zypi
s
an
ia
z
ope
rator
ami
a
rytmety
cznymi,
badź
logicz
n
ymi.
Moż
li
we
są
nas
tępujące
skrócone
formy
zap
isu
w
yrażeń
:
Funkcja
Zapis
skró
c
ony
Zapis
nor
malny
doda
wa
nie
a
+=
b
a
=
a
+
b
od
ejmow
an
i
e
a
-=
b
a
=
a
- b
m
noż
enie
a
*=
b
a
=
a
*
b
dziele
nie
a
/=
b
a
=
a
/
b
ilocz
yn log
iczny
a
&=
b
a
=
a
& b
suma
l
giczn
a
a
|=
b
a
=
a
| b
p
rze
suni
ęcie
w
lewo
a
<
<=
b
a
=
a
<
<
b
pr
zesun
ięcie
w
prawo
a
>
>=
b
a
=
a
>
>
b
a
lte
rn
atywa
logiczn
a
a
^=
b
a
=
a
^
b
Po
zerowan
iu
li
ni
i
portu
n
ads
zedł
czas
na
ich
ustawia
nie
.
Służy
do tego funkcja
logiczn
a
OR. T
abela
pr
aw
dy
fun
kcji
OR
je
st p
rze
dstawiona
po
niżej :
Tym r
aze
m
in
te
resują
nas
z
dwa pi
erwsze
wi
e
rsze
tabel
i.
W
ynik
a z
n
ic
h,
że aby
ustawić odpo
wnied
ni
bit
rejestru
,
to odpowiadając
y
mu
bit
mas
ki
musi
mieć war
toś
ć 1
no
i
oc
zy
wiś
cie
bity
do
ustawie
nia
m
uszą
m
ieć wart
oś
ć
0.
P
rogra
m
p
rze
dstawiony
jest
poni
żej
:
/
/
doł
ączeni
e
plik
u na
główk
oweg
o
/
/
zawie
rajac
ego
d
efini
cj
e
rej
estrow
/
/
wewn
etrzny
ch pro
cesora
#
inclu
de
<805
1.h>
/
/
głó
wna fu
n
k
cja
progra
mu
v
oid
ma
in(v
oid)
{
/
/
ustawi
enie
wszystko
ch l
inii
portu P
0
w
stan ni
ski
P
0
=
0;
/
/
suma
logi
czna
portu
P0
z
e
stał
ą
F0h
P
0
|= 0
xF
0;
/
/
pusta
pęt
la
ni
eskończona
-
zatrzym
anie
porgra
mu
wh
ile(
1);
}
W
nas
zym
prog
ra
mie
pojawił
się dodat
ko
w
y
wi
e
rsz kodu
:
P
0
=
0;
Ustawia o
n wsz
ystkie
lin
ie
port
u
P0 w
stan
n
iski
.
Pon
i
ewa
ż
chcemy
li
nie
po
rtu
P0
ustawić
wię
c
mus
zą
b
yć
w
s
tan
ie
ni
ski
m.
J
ed
nak
z
ar
az
po
z
reseto
wan
iu
proces
or
a wsz
ystkie
por
y
są u
stawia
ne
w
sta
n
n
is
ki.
Musimy
więczar
az
p
rzed
ic
h
ust
a
wie
niem
je
wyz
ero
wać.
Samo
ustawn
i
e
nie
wy
branuc
h
lin
ii
w
stan
w
ys
oki
re
ali
zuje
po
niżs
z
y
kod
:
P
0
|= 0
xF
0;
Ponownie z
astoso
wałem skrócony
za
pis
łacz
ąc
y
op
er
ator
p
rzypisa
nia
z
operato
rem
sumy
logicz
nej.
Programowa
ni
e mik
rokontrolerów 80
51 w
jęz
yku
C
-
czę
ść
2
W
dru
giej części
ku
rsu
pro
gra
mowani
a
zapo
zn
amy
się z
ob
sług
ą k
lawiatu
ry.W
tym
c
e
l
u
musi
m
y
podłąc
z
yć
do
u
kładu
z
poprzed
niej
czę
ści k
ursu
,
do
portu
P3
,
8 p
rzycisk
ów
w
sposó
b
pokaz
any
na
pon
izszym rysunk
u
:
K
lawiat
ura
ta
d
zia
ła
w
na
stę
p
u
jąc
y
spos
ób
:
po
nac
iśn
ięciu
pr
z
ycisku wy
prow
adzeni
e
port
u,
do kt
órego
j
est
podł
ączony
pr
zy
cisk,
je
st
zwieran
e
do
masy,
co
wy
my
s
za n
a
w
y
prowa
dzen
iu
port
u
stan
ni
ski
.
Port
m
usi
z
awierać
we
wnętrz
ne
rezystor
y
pod
cią
gajęc
e
li
nie
por
tu
do
szy
ny
z
asil
ającej.
W
pr
zeciwnym
ra
zie
będziumy
m
usieli
doł
ą
czyć
zewnętr
zne
rezystor
y
podciągaj
ące
.
W
typ
ow
y
ch
m
ikr
okont
roler
ach
rodz
iny
805
1 r
ezy
story
te
s
ą wbu
do
wane
w
każ
d
y
port
,
za
w
yj
ątkiem por
tu
P0
a
tak
że w
bardzo
popula
rny
m AT
89C20
51 z
a
w
yj
ątkiem
l
in
ii
P1.0
i
P1.
1.
T
ak
wie
c
pr
zed
podłączen
iem
kla
wiatu
ry
n
al
ezy
się
upewnić,
że por
t
d
o k
tórego
chcemy
podł
acz
yc
kl
awiatu
rę
pos
a
da
rezystor
y
podciągaj
ąc
e.
P
ierwsz
y
p
rogr
am
w
yk
orz
ystują
cy
kl
awiatu
rę
jest
bard
zo
pros
t
y
i
z
ami
eszczony
pon
iżej :
/
/
doł
ączeni
e
plik
u na
główk
oweg
o
/
/
zawie
rajac
ego
d
efini
cj
e
rej
estrow
/
/
wewn
etrzny
ch pro
cesora
#
inclu
de
<805
1.h>
/
/
głó
wna fu
n
k
cja
progra
mu
v
oid
ma
in(v
oid)
{
/
/
pęt
la
ni
eskończona
wh
ile(
1)
/
/
przepis
anie
do
portu
P0
s
tanu
lin
ii
portu
P3
P
0
=
P3;
}
C
ały
p
rogr
am
opi
e
ra
się
w
zas
adz
ie n
a
nieu
sta
nnym
p
rze
pis
ywaniu
sta
nu
l
in
ii
portu
P3 do por
tu
P0.
Efektem
te
g
o jest
zap
al
an
ie
odpow
iedniej
diody
LED po n
aciś
nię
ciu dow
olnego
przycisku.
Zauważmy,
że n
ac
iśn
iecie
p
rzycisku
w
y
wo
łuj
e
w
ymusz
e
nie
na
odp
owi
edn
im
w
ypro
wadzeniu
p
o
rtu
P3
sta
nu
n
isk
iego, a
z
ap
alen
ie
diody
L
ED
jest
spo
wo
do
wane
ustawien
iem
na
odpow
iednim
wy
prowa
dzen
iu
portu
P0
równ
ież s
tan
u
ni
sk
i
e
go.
Dzi
ęki
te
mu
możemy
po
prostu
pr
zep
isać st
an
li
ni
i
por
tu
P3
do
p
o
rtu
P0,
bez
za
dnych
dodatkow
y
ch
zabiegów.
Jest to
z
rea
liz
o
wan
e p
rzez
ins
tr
ukcję
:
P
0
=
P3;
N
ie
są
w
ymagane
żad
ne
dodat
k
owe
zm
ien
ne
pośred
nic
zące
w
p
rzesyłan
iu
danych
z
port
u
P3 do por
tu
P0.
Instrukc
ja wa
r
unkowa if
Te
ra
z
poz
namy
bard
zo waż
ną
i
nst
ru
kcję
wa
run
ko
wą
if. S
łuży
on
a
do
wa
runk
o
weg
o
w
yk
onan
ia
frag
m
e
nt
u
p
rogr
am
u.
N
ajprostsza
wersja i
nst
ru
kcji if wyg
ląd
a
na
stę
pując
o
:
i
f(warune
k)
i
nstrukcja
;
Jesli
waru
nek
ma
wartość
true
(p
rawda
) to wy
ko
ny
wana
je
st i
ns
tru
kcja,
w
pr
zeciwny
m r
az
ie
in
st
ru
kcja n
ie
będzie wy
ko
na
na
.
P
rzykład
zas
t
osowania
in
st
ru
kcji wa
run
ko
we
if
je
st poka
zany pon
iżej :
/
/
doł
ączeni
e
plik
u na
główk
oweg
o
/
/
zawie
rajac
ego
d
efini
cj
e
rej
estrow
/
/
wewn
etrzny
ch pro
cesora
#
inclu
de
<805
1.h>
/
/
głó
wna fu
n
k
cja
progra
mu
v
oid
ma
in(v
oid)
{
/
/
Pę
tla
nieskoń
czona
wh
ile(
1)
{
/
/
jeś
li
P3
.0
je
st
w
stanie
n
iskim
i
f(P3_
0
==
0)
/
/
to
ustaw
na
P0.0
stan
niski
P
0_0
=
0;
/
/
jes
li
P3
.1
je
st
w
stanie
n
iskim
i
f(P3_
1
==
0)
/
/
to
ustaw
na
P0.0
stan
wysok
i
P
0_0
=
1;
}
}
Za
pis P3
_0 odpow
ia
d
a
z
apisowi
P3.0,
cz
yli
określa
pi
n
0 po
rtu
P3.
Pr
zy
jr
z
yjm
y
sie te
raz
dokładn
iej i
ns
tru
kcji
if
:
i
f(P3_
0
==
0)
W
nawi
asac
h
o
k
rąg
ł
ych
po
s
ło
wie
if u
mieszc
z
on
o
waru
ne
k .
Wa
ru
nki
em
mus
i
b
y
ć
w
yrażen
ie zw
racające
wa
rtość
log
iczną
,
c
z
yli
pra
wd
a
lub
fa
łsz .
W
nas
zy
m
pr
z
y
k
ł
adzi
e
dokonujem
y
sp
rawdze
nia
,
czy
w
ypro
wadzenie
P3
.0
je
st w
sta
nie
n
isk
im.
Jeśli
tak
,
to
ozn
acza
t
o, że
nac
iśn
ięty
zost
ał
pr
zy
cisk podłą
cz
o
ny
do
tego
wy
prow
adzeni
a.
Należy
podjąć
wte
dy
od
powi
edn
i
e
dzi
ała
n
ie,
cz
yli us
tawi
ć wy
prow
adzen
ie P0
.0
w
sta
n
nis
ki.
Początk
ując
ych
adeptó
w
prog
ra
mowani
a
w
jezy
ku
C
może za
dzi
w
i
ć
zna
k
"
==",
c
zyli opera
tor
porównan
ia
.
Jest
o
n i
nny
ni
ż
w
jęz
ykach
Ba
s
i
c l
u
b
Pascal
i
z
początk
u ba
rdzo ł
atwo
s
ię
myli
z
operato
rem
pr
zypi
s
an
ia
"
=".
I
nst
ruk
cja if m
oże
tak
że
w
yg
lądać n
as
tępująco:
i
f(warune
k)
i
nstrukcja
1;
e
lse
i
nstrukcja
2;
S
ł
owo
els
e (w
pr
zeciwny
m p
rzypad
k
u
) um
ieszczone
prz
ed
ins
tr
ukcj
a
2
mówi, ż
e
ins
t
ruk
cja2 zost
ani
e wyk
onana
tylko
wted
y,
gdy
warun
ek
in
st
ruk
cji
if będzie
ni
espeł
niony, czyli
będ
z
ie
wartości
fals
e.
W sytuac
ji,
gdy
w
p
rzypadk
u spełn
ien
ia
dan
ego
waru
nk
u
w
yk
onanych m
a
b
yć
k
ilka
in
str
ukcj
i,
to
nal
eży
bl
ok ty
c
h
in
st
ruk
cji ująć w
n
awia
s
y
k
lam
rowe
{}
:
i
f(warune
k)
{
i
nstrukcja
1;
i
nstrukcja
2;
i
nstrukcja
3;
}
Instruck
a it
er
acyj
na for
Za
p
oz
na
my
się
tera
z
z
kolejną
n
iezwy
kle
u
ż
yteczna
ins
tr
ukcją
- z
ins
tr
ukcją
for.
Służy
on
a
do
rea
lizowan
ia
wszelkiego
r
odzaju
pętl
i.
Ogól
na
postać i
ns
tru
kcji
f
or wy
gląda
na
stę
p
u
jac
o
:
f
or(inicj
ali
zac
ja
zmie
nnej
l
iczn
ikowe
j;
warune
k; mo
dyf
ikac
ja
z
minnej
l
iczni
kowe
j)
i
nicj
ali
zacja
zmi
en
nej
liczn
ikowej
- jest to p
rzypisa
nie
do
zm
ien
nej
licz
ni
ko
wej
jej
wartości początk
o
we
j
wa
rune
k -
war
unek
,
który
ok
reśla
kied
y
pętla
m
a
b
yć
wy
kon
y
wana
modyf
ikacja
zm
ien
nej
licz
nikowe
j
-
odp
owi
ednie
zmody
fiko
wanie z
mie
nn
ej l
i
c
zn
ikowe
j
(i
nk
re
men
ta
c
j
a,
dek
remen
tacja
lub cokol
wie
k i
nn
ego)
W
przykła
do
wy
m
p
rogr
am
ie
w
y
korz
ys
t
amy
pętlę for do wy
genero
wani
a
pewneg
o opóźnie
ni
a.
F
unkcja
ge
neruj
ąca
op
óźnie
ni
e (a
racz
ej
prz
erwę
w
wy
kon
y
waniu
prog
ra
mu
)
j
est ba
rdzo
przydat
na
pr
z
y wsp
ółp
rac
y
m
ikr
okont
roler
a
z
wolniejsz
ymi u
kład
ami
pery
fery
jn
ymi,
gdzi
e
tr
zeba
czekać n
p.
na
zako
ńczen
ie po
miar
u,
itp
.
W
nas
zym
prog
ra
mie
wy
ko
rzy
sta
m
y
fu
nkcj
ę opóźnia
jącą
do
g
e
nerowan
ia
p
rostego
efektu
świ
etl
nego
na
dioda
ch
L
ED.
K
od p
rogr
am
u
pr
zedst
awion
y
jest pon
iżej :
/
/
definicja
funkcji opóźni
ającej
void
czekaj(un
sign
ed
cha
r
x
)
{
/
/
dekla
racj
a dwó
ch
zmi
en
nych pomocnic
z
ych
unsign
ed c
har a,
b;
/
/
pot
rójnie
za
gnieżdzona
pęt
la
for
/
/
ta
pę
tla
zost
anie
wy
konana
x-razy
f
or( ;
x
> 0
; x-
-)
/
/
ta
10
razy
f
or(a =
0
;
a
<
10;
++a)
/
/
a
ta
100
razy
f
or(b =
0
;
b
<
25;
++b);
}
/
/
głó
wna fu
n
k
cja
progra
mu
v
oid
ma
in(v
oid)
{
/
/
pęt
la
ni
eskończona
wh
ile(
1)
{
/
/
zapal
o
dpowie
dnią
kom
bin
ace
dio
d
LED
P
0
=
0x55;
/
/
odcz
ekaj
pe
wie
n o
kres
czasu
c
zekaj
(250)
;
/
/
zapal
i
n
n
ą
ko
mbina
cję
d
iod
LED
P
0
=
0xAA;
/
/
odcz
ekaj
pe
wie
n o
kres
czasu
c
zekaj
(250)
;
}
}
Po
ra
z
pierwszy
stw
orzyliśmy
własną
f
u
nkcję.
Zgodnie
z
t
ym
, co
n
api
sa
łęm
w
pierwszej
części ku
rsu
,
funkcja
czek
aj
nie
zwr
aca
zad
nej
wartości (void)
i
w
ym
ag
a jednego
par
am
et
ru
t
ypu
un
sig
ned
ch
ar
(lic
zba 8-
bit
owa
b
ez
z
na
ku)
.
Pa
ra
met
rem
tym będzie
ża
da
na
pr
zez
n
as
dł
ugość
opóźni
eni
a
(mn
iej-więce
j
w
mil
iseku
nda
ch)
.
P
rzyjrz
yjm
y
sie pi
erwszej
pętl
i
f
or
:
f
or( ;
x
> 0
; x-
-)
B
rakuje tut
aj
częś
ci i
nic
jali
zacji
zmi
en
nej
licz
nikowej
, pon
ieważ t
ą
zmi
en
ną
jest
pa
ram
et
r
p
rze
kazy
wany
do
fun
kcji. G
d
yb
y
śm
y
w
t
ym m
iejsc
y
z
ai
nicj
ali
zo
wal
i z
mie
nn
ą
x,
to p
rze
kazy
wany
p
ara
met
r
zostałby
z
am
aza
ny.
W
pę
tli
for
może br
ako
wać
do
wolnego
elemen
tu
-
może n
awe
t
pęt
la
f
or
w
ygl
ą
d
a
ć
na
stęp
u
jąco
:
f
or( ;
; ;
)
W
taki
m
p
rzypadku
pętl
a
ta
będzie
w
yk
ony
wana bez
końca
.
N
asza
funkcja
op
óźn
iaj
ąca sk
łada
s
ię
z
tr
zech
zag
nie
żdzo
ny
ch
pętli
for.
Ww
yniku
tego
łąc
zny
czas
wy
kon
y
wania
tyc
h
pętli
j
est i
l
oc
z
ynem powt
ór
zeń
każ
dej
pętli
.
Dokłąd
n
y cz
a
s
opóźnie
nia
tr
ud
no
je
st ok
reślić,
po
nieważ ze
wzgledu n
a
r
ózne
t
e
chni
ki
opty
mali
zacji
kodu
pr
zez
kom
pila
tor
n
ie
j
est
zna
ny
dok
ł
ądny czas
wy
kon
y
wania
jednej
pętli
.
Możn
a
co
pr
awda
odcz
ytać
z
pliku
*.as
m
gene
ro
wan
eg
o p
rzez
kompil
ator
jakie
i
ns
tru
kcje
zostały
uzyte
do
rea
liza
cji tych pęt
li
i
określić dok
ładny
czas
ich
wy
konan
ia,
ale
ni
e m
amy
gwara
ncji
,
że
po
zm
ia
nie
bądź
w
a
run
ku
pętl
i,
bad
ź war
tośc
i
po
c
z
ą
tko
wy
ch
oraz
ko
ń
cow
yc
h
kompi
lato
r
nie
z
astosuje
in
n
ego
kodu
. T
ak
wię
c
gene
rowanie
op
óźni
eń
z
a
pomoc
ą
pętli
jest
pr
zydatne
tylko
p
rzy
generown
iu
przyblizony
ch
opóźni
eń.
Do
od
mierz
an
ia
dokład
nych odcink
ó
w
c
z
asu n
al
eży
z
astoso
wać
we
wnętr
zne
t
ime
r
y m
ikro
kontr
oler
a.
Programowa
ni
e mik
rokontrolerów 80
51 w
jez
yku
C
-
czę
ść
3
Instrukc
ja sw
itch
i
prep
rocesor.
W
s
ytuacji, gdy
c
h
c
em
y
sp
rawdz
ić
jedną
z
mie
nn
ą
na
okol
icz
ność
r
óżnych
je
j
wartości,
za
mia
st
u
ż
ycia
r
ozbudwanego
bl
oku i
nst
ru
kcji i
f
-else
w
yg
odniej
j
est z
astoso
wać
i
nst
ru
kcję
switch
.
Ogóln
a
pos
t
ac
in
str
ukc
ji
switch
wy
gląda
nas
tępująco
:
sw
itch
(zmie
nna){
c
ase
jaka
sWartosc
1: in
strukcja
; br
eak;
c
ase
jaka
sWartosc
2: in
strukcja
; br
eak;
.
.
.
c
ase
jaka
sWartoscn:
instruk
cja;
bre
ak;
d
efault
: i
nstrukcja
; br
eak;
}
z
mie
n
na
może b
yc
dowo
lnym
w
yrażen
iem
bądź
zm
ien
ną
,
pod
waruk
iem
że wa
rtość
tej z
mie
nne
j l
ub
wyrażeni
a
jest
typu
całkowit
ego. Nas
z p
rzykładow
y
p
rogr
am
nie
ch
re
ali
zuje n
as
tępującą
f
u
nkcję
:
po
na
cis
nięci
u p
rzycisk
u
z
apa
l
pr
zeciwną
d
iodę
LED
(tz
n
"od
dru
giej st
rony"). P
rzyjrz
yjm
y
sie kodo
wi
na
szego p
rogr
amu
:
/
/
doł
ączeni
e
plik
u na
główk
oweg
o
/
/
zawie
rajac
ego
d
efini
cj
e
rej
estrow
/
/
wewn
etrzny
ch pro
cesora
#
inclu
de
<805
1.h>
/
/
zdefi
niowan
ie
al
terna
tywn
ej
nazwy
portu
P2
#
defin
e
klawi
atur
a
P2
/
/
zdefi
niowan
ie
al
terna
tywn
ej
nazwy
portu
P0
#
defin
e
diod
y
P0
/
/
głó
wna fu
n
k
cja
progra
mu
v
oid
ma
in(v
oid)
{
/
/
pęt
la
ni
eskończona
wh
ile(
1)
{
/
/
zgaszeni
e d
iod
LED
d
iody
=
0xFF;
/
/
w
zależnos
ci
od w
ciś
nięt
ego
przyci
sku
/
/
zapal
o
dpowie
dnią
dio
dę
LED
sw
itch
(kla
wiatur
a){
c
ase
254
:
diod
y
= 1
27;
break;
c
ase
253
:
diod
y
= 1
91;
break;
c
ase
251
:
diod
y
= 2
23;
break;
J
ak z
apewne z
auważył
eś, pojaw
ił
a si
ę
nowa
d
y
re
k
t
y
wa
prep
roce
sora
-
#define -
jak
na
zwa
ws
k
azuje
s
łuży
ona
do defin
io
wan
ia
.
W r
zeczy
wist
ości
m
a
ona
dwoja
kie z
astoso
wani
e. Po
pierwsze sł
uży
do
pros
teg
o
pr
zypi
s
an
ia
do ci
ągu
zna
ków
bądź
stałęj wart
oś
ci
liczbo
wej
l
ub,
jak
w
n
as
z
ym p
rzypadk
u,
do
określeni
a
"w
yg
odniejsze
j"
n
azwy
jakiejś
zm
ien
nej
.
P
o d
rugi
e do definiowan
ia
sy
mbo
li ko
mpilacji
waru
nkowe
j.
Z d
rug
im
z
aga
dn
ien
iem
spotka
m
y
się w
dals
zej
częś
ci k
ursu
,
więc
ter
az
nie
z
apr
ząt
aj
my
n
im
so
bie
u
wag
i.
Tak
w
ięc
z
a
pomocą
dyrekty
w
y
#define p
rzypisal
iśmy
do n
ap
isu
klawi
atur
a
nap
is
P2.
W
ty
m m
iejscu
n
al
eży
wy
ja
śnić
c
o
to ta
kiego
jest
pr
eprocesor.
Tak
więc
s
ł
ow
o
"p
rep
roe
sor"
j
est połąc
zeniem
słów
"p
re"
- p
rze
d o
raz
"p
roc
esor" -
w
tym
p
rzypadk
u kompil
ato
r.
T
ak
więc
pr
eprocesor
je
s
t
prog
ram
em
u
ruc
ha
mia
nym
pr
zed
ur
ucho
mien
iem
właściw
eg
o
komp
ila
tora
.
P
reproces
or
służy
do wstępnej
o
bróbk
i
plik
u
źró
dło
weg
o.
Gdy
pr
eproces
or
pr
zegl
ąda
p
lik
ź
ródłow
y
i
n
at
ra
fi
n
a
c
i
ąg
zn
aków
zdefiniowany
p
rz
ez
d
yrekty
we
#
de
fi
ne,
t
o
zas
tąpi
ten
ci
ąg,
cią
giem
do
nie
g
o
p
rzypisa
n
y
m. D
zięki
temu
mozemy
z
ami
est n
iewiele
zn
acz
ący
ch
naz
w por
tu
uzy
wać
w
progr
am
ie
jasnych i
jednoz
nac
zni
e
mów
iący
ch o
ich
pr
zezn
ac
z
e
ni
u
na
zw z
mie
nnyc
h i
st
ały
ch
. Po
na
da
ni
u
portom
na
szego
m
ikr
okont
roler
a
wy
go
dny
ch i
p
rzej
rzyst
ych
n
az
w n
adc
hodzi
c
zas n
a
właś
ciwy
prog
ram
.
I z
nowu
bę
dzi
e
on
wy
kon
y
wan
y
w
pętli
n
ies
k
ońc
zonej
while(1)
.
Na
po
cz
ątku
tej
pętli
p
rzypiszemy
do
port
u
diod
y
li
czbę
0
x
F
F
czyli
255
.
Sp
owo
duj
e
to
w
yga
s
z
en
ie diod
po
zw
olni
en
iu
pr
zy
cisku,
a
t
akże
w
sytuac
ji gdy
n
aci
śni
emy
więc
ej
n
iż
jeden
pr
z
ycisk.
Następn
ie
po
jawia si
ę
in
str
ucka
s
witch
.
Jako
z
mien
n
ą
tej
ins
tr
ukcji
w
yk
orz
ysatmy
na
sz
ą
k
lawiat
urę
.
Ter
az
n
ale
ży
sp
rawdz
ić
pr
z
ypa
de
k
nac
iśn
ięci
a k
ażdego
z
pr
zyci
sków
o
so
bno. Pon
i
eważ
n
aciś
nięcie
p
rzycisku
je
st
s
ygna
lizowane
w
ym
uszenie
m
na
lin
ii
,
do
której jest
podłączony
st
an
u
ni
ski
ego,
to po
na
ciś
nięci
u
p
rzycisku
S1
klawiat
ur
a
p
rzyjmie
wartość
1111
1110
bina
rn
ie
,
czyli
254
dz
iesiętn
ie.
Jeżeli
nac
iśn
ięcie tego
p
rzycisku
zostan
ie
stwierd
zone,
to
na
ley
z
apa
lić
diodę
D8
- p
rze
z
przypisa
ni
e do port
u
diody
li
czb
y
01
111111
dwó
jko
w
o,
cz
yli 12
7 d
ziesiętn
ie.
Po
w
yk
ona
niu
z
ałożonego za
da
ni
a
n
al
eży
opuścić
isn
tr
ukcję
sw
i
t
c
h
za
pomocą
s
ł
owa
kluczow
ego
break
. W
podo
bny
spo
só
b
sp
rawdz
amy
pozostałe
siedem pr
zypadkó
w.
W
po
wy
ższ
ym
p
rzykład
zie n
iezbyt
elega
ncko
w
ygląda z
arówno
sprawd
zan
ie
który
k
lawisz
został
na
ciś
nię
t
y, jak
i
z
apa
la
ni
e
odp
owi
edn
iej
diod
y
LED.
Podczas p
isan
ia
pro
gra
mu
nie
n
ależy
podawać
s
tały
c
h
lic
zb
ow
y
ch
(an
i
ż
adnyc
h
i
nnych)
bezpośrednio
, tylko
n
ale
zy
wcze
ś
nie
j z
de
f
i
on
io
wać
stałą
o
n
az
wie jas
n
o
mówi
ącej
o
jej
p
rze
zn
acze
niu
.
Pozatym,
w
syt
uacji gdy
będziemy
musie
li
zmi
en
ić st
ałą
(
oczy
wiś
cie
n
a
e
tapie p
isa
nia
p
rogr
amu
,
a
n
ie
w
czasie jego
d
zia
ła
ni
a)
to
w
ba
rdzie
j
rozbudo
wa
n
ych
p
rogra
mac
h
zmi
enie
ni
e tej li
czb
y
w
miescach
w
k
tóry
ch
na
lezy
j
ą
z
mien
ić
bę
dzie
bardzo
kłopotiw
e. Tym bar
dzie
j, że
nie
będziemy
mogl
i u
ż
yć
m
ach
an
iz
mu
"
zn
ajdż
/za
mie
ń"
,
ponieważ
ła
t
wo
zm
ien
imy
nie
t
e
n
z
na
k
co
t
rz
e
ba
.
Bard
ziej elekga
ncka
(ocz
yw
iści
e
ni
e
n
ajba
rdz
iej
-
ta
będzie
za
chwile) wersja
pro
gra
mu
jest p
rzeds
tawiona
pon
iżej
:
/
/ d
o
łącze
n
ie
pl
i
k
u
n
ag
łówkowe
go
/
/ zawi
era
j
ace
go
de
fi
n
i
c
j
e
rej
estr
ow
/
/ wewnetrzn
y
ch
pr
ocesor
a
#i
nc
l
ude
<8051.h>
/
/ zdef
i
n
i
ow
an
i
e
altern
a
t
yw
ne
j
naz
wy
po
rtu
P2
#def
i
ne
k
law
ia
tur
a
P2
/
/ zdef
i
n
i
ow
an
i
e
altern
a
t
yw
ne
j
naz
wy
po
rtu
P0
#def
i
ne
d
iody
P0
/
/
#def
i
ne
poz
1 254
#def
i
ne
poz
2 253
#def
i
ne
poz
3 251
#def
i
ne
poz
4 247
#def
i
ne
poz
5 239
#def
i
ne
poz
6 223
#def
i
ne
poz
7 191
#def
i
ne
poz
8 127
/
/ głów
na
fun
kc
ja
pr
ogramu
void
m
ai
n
(v
oi
d)
{
/
/ pę
t
la
ni
es
kończo
na
whi
le
(1)
{
/
/ zgasze
n
ie
diod
LED
diod
y
= 0xF
F;
/
/ w zale
żno
sc
i
od
wci
śn
i
ętego przy
c
isk
u
/
/ zapal
od
powied
ni
ą
diodę
LED
swit
ch(k
law
i
atura){
case
poz
1 :
d
i
o
dy
=
poz8; break
;
case
poz
2 :
d
i
o
dy
=
poz7; break
;
case
poz
3 :
d
i
o
dy
=
poz6; break
;
case
poz
4 :
d
i
o
dy
=
poz5; break
;
case
poz
5 :
d
i
o
dy
=
poz4; break
;
case
poz
6 :
d
i
o
dy
=
poz3; break
;
case
poz
7 :
d
i
o
dy
=
poz2; break
;
case
poz
8 :
d
i
o
dy
=
poz1; break
;
}}}
J
ako
"na
zwy
jas
no
mówiąc
e o
pr
zen
acze
niu
stałej" wy
brałem pozx
, g
dzie
x
=
1..
8.
Ja
k ł
atwo
moż
na
sie
domys
leć
"poz"
to
skrót
od
"pozy
cja
". Po
nie
w
aż sta
łe l
iczbo
we
odpowiadając
e p
rzycis
kom,
jaki
diod
m LED
sa
i
den
t
yczne
nie
z
astoso
wałem
roz
różn
ie
ni
a
czy
chodz
i
o
pozyc
ję
p
rzycisku
cz
y
diod
y
L
E
D
. Jed
nak
ju
ż
na
pr
awde
elega
ncko
będzie, g
d
y
uży
jem
y
odp
owi
edn
ich
st
ały
ch
dla
d
iod
i
pr
z
ycisków
oso
bno.
#
inclu
de
<805
1.h>
/
/
zdefi
niowan
ie
al
terna
tywn
ej
nazwy
portu
P2
#
defin
e
klawi
atur
a
P2
/
/
zdefi
niowan
ie
al
terna
tywn
ej
nazwy
portu
P0
#
defin
e
diod
y
P0
/
/
#
defin
e
S1 25
4
#
defin
e
S2 25
3
#
defin
e
S3 25
1
#
defin
e
S4 24
7
#
defin
e
S5 23
9
#
defin
e
S6 22
3
#
defin
e
S7 19
1
#
defin
e
S8 12
7
/
/
#
defin
e
D1 2
54
#
defin
e
D2 2
53
#
defin
e
D3 2
51
#
defin
e
D4 2
47
#
defin
e
D5 2
39
#
defin
e
D6 2
23
#
defin
e
D7 1
91
#
defin
e
D8 1
27
/
/
głó
wna fu
n
k
cja
progra
mu
v
oid
ma
in(v
oid)
{
/
/
pęt
la
ni
eskończona
wh
ile(
1)
{
/
/
zgaszeni
e d
iod
LED
d
iody
=
0xFF;
/
/
w
zależnos
ci
od w
ciś
nięt
ego
przyci
sku
/
/
zapal
o
dpowie
dnią
dio
dę
LED
sw
itch
(kla
wiatur
a){
c
ase
S1 :
di
ody
=
D8;
brea
k;
c
ase
S2 :
di
ody
=
D7;
brea
k;
c
ase
S3 :
di
ody
=
D6;
brea
k;
c
ase
S4 :
di
ody
=
D5;
brea
k;
c
ase
S5 :
di
ody
=
D4;
brea
k;
c
ase
S6 :
di
ody
=
D3;
brea
k;
c
ase
S7 :
di
ody
=
D2;
brea
k;
c
ase
S8 :
di
ody
=
D1;
brea
k;
}
}}
Te
ra
z
n
asz
prog
ram
w
ygląda ju
z
bard
zo p
rzej
rzyś
cie. Ja
w
ybr
ałem
na
zwy
ide
nty
cz
n
e
z
nu
mer
am
i
e
l
e
m
entów
n
a
mojej
płytc
e
ur
uchom
ien
io
wej
, Ty
możesz je
do
wolnie z
mie
nić
.
Gdy
b
y
porównać
kod wy
nikow
y
po
wy
ższ
yc
h
t
rzec
h
pr
ogr
amów
to
dla
k
ażde
g
o z
n
ich
by
łb
y
iden
ty
czny. Dz
iej
e się t
ak,
że
z
pu
nk
tu
widzen
ia
komp
ila
t
o
ra
t
e
t
rzy p
rogr
amy
są
iden
t
yczne,
pon
ieważ w
"miejscach
str
ateg
icz
ych" wy
st
ępują
te
same
dane
.
Jest
to kolejny
m
obj
awe
m p
rep
roc
esora
- kod ź
ródł
o
w
y
p
rog
ram
u
p
rzed
kompi
lacją
został
doprowadzony
do
postaci z
rozu
mia
łej
p
rze
z
kompila
tor
(
gd
yb
y
pomi
nąć
p
roc
es
pr
zetwa
rza
ni
a
plik
u
pr
zez
p
reproces
or
, to
kompil
ator
zg
łosiłby
m
nóstwo
błedó
w).
Programowa
ni
e mik
rokontrolerów 80
51 w
jęz
yku
C
-
czę
ść
4
T
ablic
e
danych
.
T
ablica
jest
miejscem
prz
echow
y
wania
da
n
ych
o
tym
samym
typi
e.
Tabl
icę
d
e
k
lar
ujemy
podając
ty
p elemen
tó
w
w
niej
pr
zechow
yw
any
ch,
j
ej
na
zwę
oraz
roz
mia
r.
Rozmiar
podaje
się w
nawi
asach
k
wad
ra
to
wy
ch
[].
El
emen
t
y
t
ablicy
są p
rzec
how
y
wane
w
kol
ejno n
as
tępujący
ch
po
so
bie
komó
rkach
pam
ięci.
Pr
z
ykł
ado
wa
dekla
racja
t
ablicy
może
w
yglądać
na
stęp
ując
o
:
i
nt
tabl
ica[
5];
Pow
y
ższ
y
za
pis
dekla
ruje
pięci
oelementową
tabl
icę
danych
t
ypu i
nt.
Dostęp
do
posz
c
z
egól
n
ych ele
m
e
ntów
t
ablicy
uzy
skujem
y
pr
zez
poda
nie
na
zwy
tablicy,
oraz
n
ume
ru
elementu
t
ablicy,
do które
g
o dostęp c
h
c
e
my
u
z
yskać. P
rzykładow
o,
zapi
san
ie
do
dr
ugi
ego
elem
e
ntu
t
ablicy
jakiejś
wa
rtości
może wy
glądac
n
astep
ując
o
:
t
abli
ca[1
]
= 0
;
W
t
ym m
iejsc
u waż
na
u
wag
a :
eleme
nty
ta
blicy
s
a n
ume
rowane
o
d 0
a
n
ie
od
1.
T
ak
więc
pie
rws
zy
eleme
nt
ma
n
ume
r
0,
dr
ugi
1 i
td.
Aby
w
miejscu
dekla
racji
tabl
ic
y
od r
azu
um
ieś
c
i
ć
w
ni
ej jakies d
ane
n
ale
ży
z
astoso
wać
po
niżs
z
y
zap
is
:
i
nt
tabl
ica[
5]
=
{5,
2,
31,
5
5,
40};
Gdy
już
ma
m
y jako t
akie
po
jęci
e n
a
te
mat
t
ablic p
rzyjrzy
jmy
si
ę
pierwszemu
pr
z
ykł
ado
wemu
pro
gra
mowi
w
tej
części ku
rsu:
}
v
oid
ma
in(v
oid)
{
wh
ile(
1)
{
P
0
=
tabl
ica[
0];
c
zekaj
(250)
;
P
0
=
tabl
ica[
1];
c
zekaj
(250)
;
P
0
=
tabl
ica[
2];
c
zekaj
(250)
;
P
0
=
tabl
ica[
3];
c
zekaj
(250)
;
}
}
P
rogra
m
t
en
m
a
za
z
ada
ni
e
gener
e
ować
p
rostą
sekw
encję
(p
rzec
h
owy
w
aną
właśni
e w
tablicy)
odpo
wiednio
z
apa
la
ny
c
h d
iod LED,
podłąc
z
o
n
ychdo
portu
P0
.
P
on
iew
aż
poszczególne eleme
nty
tej
tabl
ic
y
n
ie
będ
ą
się
n
igdy
z
mie
ni
ać
(są
to
dan
e
stałe)
, m
ożemy
ją um
ieścić
w
pa
mięci
prog
ra
mu
.
Ok
reśla
to słow
o
cod
e
pr
zed
n
azwą
t
ablicy
. Po
dekla
racji
tabl
ic
y
pojawia
się z
naj
oma
już n
am
fun
k
cja
opó
ź
niaj
ą
c
a c
z
e
kaj, sł
użąca
do
gene
rowania
opóźni
eń
w
w
yk
onan
iu
pr
ogr
amu
.
P
rogra
m
g
łó
wny
opiera
s
ię
na
w
ys
y
łaniu
n
a
po
rt,
d
o k
tórego
podłączone
sa
d
iod
y
LED,
kolejny
ch
elem
e
ntów
t
ablic
y
z
awieraj
ąc
ej
da
ne
ster
u
j
ac
e diod
ami
.
Gd
y
tablic
a skł
ada
się
z
niewielu
eleme
ntów,
to
po
wy
ższ
y
prog
ra
m
jeszc
z
e
może
zostać u
zn
any
za
popr
awny,
ale
w
syt
uacji gdy
t
ablica
bę
dz
ie
się
sk
łada
ć
z
ki
lkun
as
tu,
lub naw
et ki
lkudz
iesięciu ele
mentów,
to
pr
zepi
s
yw
an
i
e
elementów
z
tablicy
do
portu
n
al
eży
już
zr
eal
izować
w
pętli
.
Pr
zykłado
wa
re
ali
zacja
z
użyci
em
pętli
for p
rzeds
tawiona
jest
poni
żej
:
#
inclu
de
<805
1.h>
c
har co
de
ta
bli
ca[4]
=
{
0x55,
0xAA,
0x0F,
0xF0};
/
/
def
inic
ja
funkcj
i
opóźni
ające
j
v
oid
c
zekaj(
unsigned
char
x)
{
/
/
dekl
arac
ja
dwóc
h z
mienn
ych
pomo
cnic
zyc
h
unsign
ed c
har a,
b;
/
/
pot
rójnie
za
gnieżdzona
pęt
la
for
/
/
ta
pę
tla
zost
anie
wy
konana
x-razy
f
or( ;
x
> 0
; x-
-)
/
/
ta
10
razy
f
or(a =
0
;
a
<
10;
++a)
/
/
a
ta
100
razy
f
or(b =
0
;
b
<
25;
++b);
}
v
oid
ma
in(v
oid)
{
c
har i;
wh
ile(
1)
{
f
or(i
= 0
; i
<
4;
i++
)
{
P
0
=
tabl
ica[
i];
c
zekaj
(250)
;
}
}}
Licz
ni
k
pętli
for jest
je
d
nocz
eśn
ie i
nde
ksem eleme
ntu
w
tablicy.
Ws
ka
źnik
i
Wska
źni
ki
są
bardzo
ważnym elemen
tem
języ
ka
C.
Ogóln
ie
m
ówiąc wskaź
nik
jest z
mie
nn
ą
prz
echow
ująca
a
dre
s
in
ne
j z
mie
nne
j.
Wskaźn
iki
dekl
aruj
em
y
w
na
stępu
jac
y
spo
sób
:
t
yp
*
nazwa;
Aby
uzyska
c
d
ostęp do z
mie
nn
ej wskazy
wane
j p
rzez
w
skaź
ni
k
na
lezy
uży
ć
oper
atora
w
yłu
skan
ia
*,
na
pr
zykład
po
niżs
za
in
st
ri
kcja
:
*
wskaznik
= 0
;
spow
oduj
e
z
api
san
ie
do
zm
ien
nej
(a
ra
cezj
do
komórki
pa
mi
ec
i
) wskaz
ywanej
p
rze
z
w
skaz
nik
liczby
0.
Można
sobi
e
za
dać
p
yta
nie
jaki
je
st cel
sto
sow
an
ia
ws
ka
źni
ków,
sk
o
ro
w
ska
zują on
a
na
in
n
ą
zmi
en
ną
,
jakb
y
ni
e m
ożn
a
by
ło
się posługiwać
tylko
tą
z
mie
nn
ą
.
Wsk
aźn
iki
odgry
wają
dużą
r
olę w
pr
zeka
z
ywaniu
do
funkcji p
ar
ame
trów,
a
ściślej
mówiąc
poz
wal
ają n
a
mody
fiko
wanie
par
ame
tr
u
p
rzek
aza
nego
do
funkcji.
Jedna
k
na
ra
zie
u
ż
yje
my
wskaźi
kó
w
do i
nn
ego
ce
l
u, a
m
ia
nowicie
do
do
stępu do poz
na
nej wcześniej
tabli
c
y
z
da
nymi.
P
rzyjrzy
jm
y
się
po
niżs
zemu
p
rogra
mowi
:
}
v
oid
ma
in(v
oid)
{
wh
ile(
1)
{
ws
kaznik =
ta
bli
ca;
P
0
=
*wskaznik+
+;
c
zekaj
(250)
;
P
0
=
*wskaznik+
+;
c
zekaj
(250)
;
P
0
=
*wskaznik+
+;
c
zekaj
(250)
;
P
0
=
*wskaznik+
+;
c
zekaj
(250)
;
}
}
Reali
zuje
on
dokładn
ie
tak
ą
sam
ą
funkcję
jak pi
erwsz
y
p
rogr
am
z
tej
częśc
i
kurs
u.
Pie
rw
szą
z
mi
an
ą
w
stosunk
u
do popr
zedn
iego
pr
ogr
amu
je
st dek
lar
acja
ws
ka
źni
ka
:
c
har co
de
*
wskazni
k;
Zgodn
ie
z
tym,
co
pisa
ł
e
m
o
de
k
lar
o
wan
iu
wskaźn
ik
a
wskazuje
o
n n
a
t
yp
cha
r
um
ieszczony
w
p
ami
ęci
p
rogr
am
u
cod
e.
J
ed
nak
sa
mo
zade
klar
o
wa
ni
e
wskaźn
ika
nie
pozwol
a
na
m
na
jeg
o
uży
wanie.
Wtym
momecie
n
as
z
ws
k
aźn
ik
n
ie
pr
zechowuj
e
żadn
ego ad
resu
,
a
zwłaszcza
ad
res
u
na
szej t
ablicy.
P
rze
d jeg
o
uży
ciem,
na
lezy
z
apis
ać do n
iego a
dres
tabl
ic
y.
Dok
onujemy
tego
w
poni
ższy
s
p
osó
b
:
ws
kaznik =
ta
bli
ca;
I
tu
pow
sta
nie
ma
łe z
am
iesza
nie
,
pon
ie
waż
tabl
ica r
ó
w
nież
je
st
w
skaź
nik
iem!
T
ak
więc
pow
yż
sz
y
z
apis
p
rze
pisuje
do
j
ed
neg
o wskaź
nik
a
zawa
rtość
in
ne
go
wskaźn
ik
a.
Aby
w
ja
w
n
y
sposó
b
do
wskaźn
ik
a
pr
z
ypi
sac
a
dre
s
jakiejś
zm
ien
nej
na
leży
uży
ć
opera
tor
a
dresu
&,
tak
jak
pokaza
no
pon
iżej
:
ws
kaznik =
&
tabl
ic
a[0];
I
tu
z
nów
m
ał
e za
mi
esza
nie,
ponieważ
chcem
y
do
w
skaź
nik
a
z
apisa
ć ad
res
pierwszego
elementu
tablicy
, do
k
tórego
do
stęp
uzy
skamy
p
rzez
p
oda
ni
e
w
nawi
asach
k
wad
ra
to
wy
ch
jed
o
nu
mer
u.
Gd
yb
y
śm
y
użyli
taki
eg
o
z
apis
u
:
ws
kaznik =
&
tabl
ic
a;
to ko
mpila
tor
z
głosi błą
d,
gdy
ż z
apis
te
n
oza
ncza
przypisa
nie
do
wsk
a
źn
ika
a
dres
u i
nn
ego
w
skaź
nik
a,
a
ni
e
a
dre
su da
nej
t
ypu
cha
r
.
W
ie
m,
że to
na
początku
jest
bardz
o
skompli
k
owane,
bo
wie
m
w
skaź
nik
i
n
ale
żą
do
n
ajt
rud
n
iejszy
ch
zag
adn
ień
w
ję
zyku
C
i
bar
dzo często
spr
awiają
problem
y
po
cząt
kujac
ym
prog
ra
mis
tom.
C
zęść
1
- S
terowanie
diodami
LED
W
przykła
dzie
tym
pozna
m
y sposó
b
st
ero
wan
ia
d
i
od
ami
LED
.
Zalecam
uży
cie
mik
rokont
role
ra
AT
89S825
2,
l
ub
in
ne
go
w
obudo
wi
e
40-końców
ko
we
j.
W
tej
s
ytuacji
do
stęp
n
ych jest 32
l
ini
e
I/O,
co
poz
woli
na
m
na
swo
bo
dne
pozn
awan
ie m
ik
rokon
trole
ra
,
bez
ma
rtwi
enia
się
o
brak
ujące
p
o
rty.
Aby
pr
zep
rowa
d
zić ćwiczenie n
al
eży
do por
tu
P0 n
as
zego
mik
rokon
tro
l
e
ra
podłączy
ć
8
diod
LED w
s
posób
poka
zany n
a
rysunk
u
.
A
by
wł
ą
czyć
dowo
l
ną
diodę
LED n
ale
ż
y
n
a
odpo
wiedni
m
w
y
prowa
dze
niu
por
tu
ustawić
s
tan
ni
ski
.
Pr
zyk
ład
1.1
.ASM
NAM
E P0
1_01_ASM_SRC
$
INCLU
DE (A
TMEL/REG82
52.INC
)
P
01_01_ASM S
EGMENT
COD
E
RSEG
P01_01_AS
M
C
L
R
P0.0
;
USTAWIENIE
WYPRO
WADZENI
A
P0.0
W STAN
NISKI
;
POWODUJ
E ZAŚWIECE
NIE
SIĘ
DIODY LED
D1
S
J
MP $
;
PĘ
TLA NIE
SKOŃC
ZONA
E
ND
Pr
zyk
ład
1.1
.C
#
inc
lude <
ATME
L/REG8252.H>
sbit
LED1
=
0x80;
/
/
Deklar
acja
zm
ien
nej
o
nazw
ie
LED1
/
/
Znajd
ujac
ej
sie pod ad
resem
80h
/
/
Co
odpo
wiada
pinowi 0
port
u
0
void
ma
in
(void)
{
L
ED1 =
0;
/
/
ustawien
ie p
inu
P0.0
w
sta
n
n
iski
wh
ile(1);
//
petla
n
ieskon
cz
o
na
}
Pr
zyk
ład
1.1
.B
AS
Reset
P0.0
Do
:
Lo
op
:
En
d
Omówieni
e:
W
przykła
dzie
1.1
włączen
ie diody
LED
D1 n
ast
ępuje
p
rze
z
ustawien
ie n
a
wy
prow
adzen
iu
P0.0
sta
nu
ni
skiego.
-
W języ
ku
asemblera
jest to z
rea
lizowa
n
e
p
rzez
uży
cie
i
nst
ru
kcji
"CLR
P0.
0".
In
str
ukc
j
a
CLR
(an
g.
Clear
)
s
łuży
w
yłą
c
znie
do
zerowani
a
wsk
a
Ąnik
a
pr
zen
iesie
ni
a
lub
dow
olnego
bi
tu ad
resowanego
bezpośredni
o,
tzn
.
bit
u w
o
bszar
ze
pami
ęci RAM
adr
eso
wanym
bito
wo
lub p
rzest
rze
ni
rejestrów
SFR
dostępny
ch
bit
owo
(
o ad
resi
e
podz
ielnym p
rzez
8).
-
W języ
ku
C
najp
ierw t
rz
e
ba
z
adekla
rować
zmi
en
ną
o
w
y
bran
e
j n
azwi
e
(
w poda
nym
pr
zykładz
ie "LED1
"
)
.
N
astępn
ie z
a
pomo
c
ą
zw
ykł
ej
i
nst
ru
kcji
przypisa
nia
do
zm
ien
nej
odpo
wiadającej
da
nemu
bitowi
przypisujemy
"0
".
-
W języ
ku
B
ASIC
do
zerowani
a
bitu
portu
s
łuży
in
st
ruk
cja "RESET
".
W
każdym z
języ
kó
w
do
zre
ali
zowani
a
da
nego celu (
ustawienie
w
ypro
wa
d
z
e
nia
P0
.0
w
st
an
ni
ski)
u
ż
y
t
o
j
ednej
i
ns
tru
kcji
teg
o języ
ka.
Zo
baczy
my
ter
az
n
a
ile
ins
tr
ukcji
tłu
maczo
ne jest
to polecenie i
jak
dużo m
iejsc
a
w
p
am
i
ę
c
i
z
a
j
muje
każdy
pro
gra
m.
Plik
i
w
yniko
we
prog
ra
mu
(
*.HEX) zosta
ł
y
zdi
asemblo
wane
przy
użyciu
p
rogr
am
u
D51.
Pr
zyk
ład
1.1
.ASM
.D51
;
;
D
51 V2.
6
8051
Disassembly
of
a
sm.
hex
;
1
0/11/2
003
16
:58
;
o
rg 0
;
c
lr
p0
.0
X0
002:
sjmp
X0002
;
e
nd
;
Pr
zyk
ład
1.1
.C.
D51
;
;
D
51 V2.
6
8051
Disassembly
of
c
.hex
;
1
0/11/2
003
16
:58
;
o
rg 0
;
lj
mp
X0003
;
X0
003:
mov
sp
,#8
c
lr
a
m
o
v
r0
,#0
f
f
h
X0
009:
mov
@
r
0,a
dj
nz
r
0,X
0009
m
o
v
p2,#
0f
f
h
lj
mp
X0012
;
X0
012:
clr
p0.0
X0
014:
sjmp
X0014
;
e
nd
;
Pr
zyk
ład
1.1
.B
AS.
D51
;
;
D
51 V2.
6
8051
Disassembly
of
ba
s
.
hex
;
1
0/11/2
003
16
:58
;
o
rg 0
;
lj
mp
X002e
;
r
eti
;
o
rg 0b
h
;
r
eti
;
o
rg 1
3h
;
r
eti
;
o
rg 1b
h
;
r
eti
;
o
rg 2
3h
;
r
eti
;
o
rg 2b
h
;
r
eti
;
o
rg 2
eh
;
X0
02e: mov
r0
,#0ff
h
c
lr
a
X0
031:
mov
@
r
0,a
dj
nz
r
0,X
0031
m
o
v
sp,#
21h
m
o
v
20h
,#
0
c
lr
p0
.0
X0
03c: ljm
p
X003c
;
c
lr
ea
X0
041:
sjmp
X0041
;
e
nd
;
P
rro
gra
m
n
ap
isa
ny
w
asemblerze
po
zdia
semblo
wan
iu
skład
a
się
z
dokład
nie
tych sa
m
ych
ins
tr
ukcji,
jak
ie
zost
ały
użyte
w
kodzie Ą
ródło
wy
m.
N
ie
co
go
rzej
je
st
z
prog
ra
mem
n
api
sa
nym w
C.
P
i
e
rw
sz
ą i
nst
ru
kcją
je
st i
ns
tru
kcja "LJMP X00
03",
któ
ra
w
n
as
z
ym
przykła
dzie
po
wod
uje
"p
rzeskok" do n
ast
ępnej i
nst
r
ukcji
z
kolei, c
z
yli ta
ins
tr
uk
c
j
a
je
s
t
zbędna!
Wynika
z
te
g
o fak
t,
że komp
ila
t
o
r
ni
e
spr
a
wd
za
zak
resu
skoku i
wstawia t
ą
ins
tr
ukcję
zupe
łn
ie n
iepot
rz
e
bn
ie.
Jeżeli
już
m
usi
b
yć
o
na
użyta
to lep
sz
ym
rozwią
za
nie
m
b
yło
b
y
uży
cie
d
wubajto
we
j
"AJMP"
lub "SJMP" z
ami
ast
t
rzybajt
owe
j
"LJM
P
"
.
Z kolejny
ch s
i
e
dmiu
i
nst
ruk
cji skł
ada
s
ię
procedur
a
ini
cjali
zacji
mi
kroko
ntro
lera
.
I
nst
ruk
cja "MOV
SP, #
8" us
tawia
ws
k
a
ˇ
nik
s
to
su n
a
8.
Czt
ery
kol
e
jne i
ns
tr
ukcje:
c
lr
a
m
o
v
r0
,#0
f
f
h
X0
009:
mov
@r
0,a
dj
nz
r
0,X
0009
s
łużą
do wy
zero
wani
a
w
ewnętrz
nej pa
mię
c
i
RAM
mik
rokon
trol
era
,
któ
rej
zawar
tość
po włączen
iu
za
sila
n
ia
mo
że
b
yć
ni
eokreślon
a.
Kolejna
in
st
ruk
cja "MOV
P2,#
0
FF
h"
po
wodu
je
us
tawienie
w
szy
stkich
w
ypro
wadzeń
po
rtu
P2
w
st
an
w
y
so
ki. List
in
g
pro
gra
mu
i
nic
ju
j
ą
cego
mik
rokont
role
r
zn
ajduje się w
kat
alog
iu kom
pila
tor
a
i
ba
rdz
iej
doci
ekl
i
wi
cz
ytelnicy
tego
kurs
u
mogą
się
z
ni
m
zapo
zn
ać.
Następ
nie
w
yst
ępu
je
ins
tr
ukcja
"LJM
P
X0
012".
I
tut
aj z
nowu
po
wod
uje
ona
prz
ejś
cie
do
nas
tęp
nej z
kolei i
ns
tru
kcji,
więc
jest
ni
epotr
zebna.
Petla
n
ies
k
ońc
zona
jest
zre
al
izowana
pr
z
y u
ż
yciu
d
w
u
bajto
we
j
in
st
ru
kcji "SJMP X00
14",
czy
li
najodpow
iedn
i
e
j
szej
do tego celu.
P
rogra
m
n
ap
isa
ny
w
Bascomie
już wy
gląda
dużo gor
zej. N
a początk
u
w
y
stę
puje
i
nst
ru
kcja skoku do p
rocedury
i
nicj
ali
zującej
p
roces
or.
Po
tej
ins
tr
ukcji
nas
tępuje
kil
ka
i
nst
ru
kcji
p
owrotu z
p
roc
e
d
u
r
o
bsługi
prz
erwa
ń.
J
e
że
l
i
w
na
szym
pr
ogr
am
ie n
ie
wy
ko
rzys
tujem
y
pr
ze
rwań
,
to te
in
str
uk
c
je
spoko
jni
e
m
o
żna
b
y
b
yło
pomin
ąć.
Zaoszczędzil
ib
yśm
y
kilk
adz
iesią
t
ba
j
t
ów
pa
mięci
prog
ra
mu,
co
w
niek
tórych
pr
zypadkac
h
może
b
yć
zbawien
ne.
P
roc
edur
a
i
nicja
lizuj
ąca
proces
or
j
est podobna do tej z
C
.
Po
p
rocedurze
ini
cjal
izującej
j
est
w
końcu
nas
za
i
ns
tru
kcja
po
wod
ująca
włączenie
diody
LED.
Pętla
nie
skończon
a
j
est
w
tym
pr
z
ypa
dku
zrea
li
zow
a
na
p
rzy
u
ż
yciu
tr
zyb
ajtow
ej
i
nst
ru
kcji "LJMP",
chociaż
dwub
ajtow
a
"SJMP"
w
z
upełności
b
y
w
ys
tarc
z
yła.
Znow
u
komp
ila
tor
n
ie
spr
awdza
z
akres
u skoku.
Następ
nie
w
ys
tępu
je
ins
tr
ukcja
bl
okująca p
rze
rwan
ia
,
pom
imo
n
iew
ykorz
yst
y
wania
uk
ładu
p
rze
rwań
w
p
rogr
am
ie.
Ta
os
t
atn
ia
isn
tr
ukcj
a t
rochę
mni
e
dziwi
, po
nieważ n
ie
zost
an
ie
ona
ni
gdy
wyk
onan
a!
Prog
ra
m
za
pętli
się
n
a
popr
zedn
iej
in
st
ruk
cji re
ali
zującej
pętlę n
iesko
ń
c
zoną
,
więc
dwie
ostatn
ie
in
st
ruk
cj
e w
kod
z
ie są
zupe
łni
e zbęd
n
e
. Z
no
wu ma
r
not
ra
wieni
e pa
mięci
w
p
rzypadk
u
BASCOMA.
J
ak widać
z
po
w
yżs
zego
porówna
nia
,
najwięce
j
n
iepot
rzebnych in
st
ru
kcji ge
ner
u
je Bascom. W
C
j
est o
wiele
le
piej
n
iż
w
Basc
omie, a
le i
tak
dużo
gorzej n
iż
w
a
sembl
e
rze.
Tylko
ten
jed
e
n p
rzykład
jest
w
sta
ni
e
u
zmysł
owi
ć
na
m,
jaka
jest
za
leta
p
rogr
amowan
ia
w
asemblerz
e
-
całkowita kon
tro
la
ro
zmi
ar
u
kodu
wyni
kow
ego.
Pon
ie
waż
w
p
akiecie RIDE
51
w
y
stę
puje
bar
dzo pożyt
eczna
mo
im
zda
ni
em
opcja
kompilowani
a
pro
gra
mu
pop
rzez
pro
gra
m
a
semblera
(
i
generowa
nia
jednocześnie
plik
u
*.SRC do ka
żdego pl
iku
*.C
)
w
na
st
ępnych
p
rzykład
ach
wy
ko
rzys
ta
m
y
tą
funk
c
ję
zam
ia
st
di
asemblo
wani
a
plik
u
*HEX
(chyb
a,
że za
jdzie
tak
a
potr
zeba).
Pr
zyk
ład
1.2
W
t
ym p
rzykład
zie
na
uczym
y
się wy
ko
rzy
sty
wa
ć
a
li
as
y
naz
w (
tzn
.
bę
dzi
e
my
da
nem
u
pin
owi
port
u p
rzypisy
w
ać
i
nn
ą
n
azwę i
w
p
rogra
mie
odw
oły
w
ać
się
do
tego
pin
u
popr
zez
tą
n
azw
ę
)
.
Pr
zyk
ład
1.2
.ASM
NAM
E P0
1_02_ASM_SRC
$
INCLU
DE (A
TMEL/REG82
52.INC
)
L
ED1 EQU P0.
0
P
01_02_ASM S
EGMENT
COD
E
RSEG
P01_02_AS
M
C
L
R
LED1
;
UST
AWIENI
E WYPROWA
DZENIA
P0.0
W S
TAN NISKI
;
POWODUJ
E ZAŚWIECE
NIE
SIĘ
DIODY LED
D1
S
J
MP $
;
PĘ
TLA NIE
SKOŃC
ZONA
E
ND
Pr
zyk
ład
1.2
.C
Pon
ie
waż
w
C
al
ia
s n
ad
al
iśmy
już
w
pie
rw
s
z
ym
przykła
dzie
nie
ma
wersji
pr
zykładu
1.2
w
jęz
yku
C
.
Pr
zyk
ład
1.2
.B
AS
Led1 A
lias
P0.0
Reset
L
ed1
Do
:
Lo
op
:
En
d
Ze
względu n
a
t
o
, że
pr
zykład
1.2
n
ie
róż
ni
się pod względem
kodu
w
ynikow
eg
o
od p
rzykładu
1.1
nie
p
rze
prowadzono di
asemblacji i
a
na
liz
y
k
odu
w
yniko
we
go.
Przykał
d 1.
2
mi
ał
n
a
c
elu
prz
edstawien
ie
wy
go
dni
e
jszego
posługiwa
nia
się
pin
am
i
.
Polecam te
n
spos
ób
odw
oł
yw
ania
się do pi
nów
ze względu
na
ł
atwiejsz
e wprowadzan
ie
zm
ia
n
do
prog
ram
u.
W
yo
braˇmy
so
bie
s
ytac
ję,
gdy
w
prog
ra
mie
lic
zący
m
k
ilka
dzi
esiąt
,
lub n
awet k
ilka
set i
ns
tr
ukcji
od
woł
y
wali
śmy
się do pi
nów
b
e
z
pośredn
io
pr
zez
ic
h
na
zwę i
n
ag
le
m
usimy
zm
ien
ić
pin
pełn
iący
da
ną
funkcję. Za
mias
t
męcz
yć
sie z
tymi
kilk
uset i
nst
ru
kcjami
i
prz
eo
czy
ć
połow
ę
z
n
ich
lu
b
pop
eł
nić
wiel
e
in
nych
błedó
w,
zm
ia
ni
amy tylko
dekl
ara
cję
ali
asu
. Jest
t
o
rozwią
zan
ie
du
zo
prosts
z
e
, a
poz
aty
m d
aje
ono
bard
ziej czy
teln
e
p
rogra
m
y
.
Bar
dziej wy
mo
wne
jest stoso
wanie
naz
w typu: "LED1"
czy
"KLAWISZ1"
zam
ias
t
P0.
0 it
p.
Pr
zyk
ład
1.3
Te
n
p
rzykład
pr
ezen
tuje
metodę
ust
a
wi
an
ia
st
an
u
n
iskie
g
o n
a
w
ypr
owadz
en
iu
za
pom
ocą i
ns
tru
kcji
ilocz
ynu
log
icznego
ANL
.
P
rzyjrz
yjm
y
się t
ab
e
li p
rawdy
dl
a
funkcji AND.
A
B
Y
0
0
0
0
1
0
1
0
0
1
1
1
J
ak widać,
w
ynikiem
funkcji
AND
jes
t
l
og
iczna
jed
ynka
t
ylko
wt
edy,
gdy
ob
yd
wa
par
am
etry fun
kc
ji
są
log
icznymi jedynkami.
W
pozo
s
tały
ch
przypa
dkach
wyn
i
ki
e
m jest
"0".
Możemy
to
w
yk
orzy
stać
do
włączeni
a
d
iod
y,
a
nawet
kilk
u
diod z
a
pomo
cą
j
ednej i
nst
ru
kcji
asembl
e
ra.
Pr
zyk
ład
1.3
.ASM
NAM
E P0
1_03_ASM_SRC
$
INCLU
DE (A
TMEL/REG82
52.INC
)
P
01_03_ASM S
EGMENT
COD
E
RSEG
P01_03_AS
M
ANL P0
,#0FE
h
S
J
MP $
;
PĘ
TLA NIE
SKOŃC
ZONA
E
ND
Pr
zyk
ład
1.3
.C
#
inc
lude <
ATME
L/REG8252.H>
void
ma
in
(void)
{
P
0
&=
0xFE;
wh
ile(1);
}
Pr
zyk
ład
1.3
.B
AS
P
0
=
P0
And
&B1111111
0
Do
:
Lo
op
:
En
d
Pon
ie
waż
iloczyn
logicz
n
y
jest
w
yk
on
yw
any
na
całym
porcie,
a
ni
e
na
poj
edy
nczy
m
bicie, możemy
to
wy
korz
yst
a
ć
do z
mi
any st
anu
kilk
u
bitó
w
portu
jednocześnie.
W te
n
spos
ób
zaoszczędz
imy
m
iejs
ce
w
pam
ięci
p
rogr
am
u,
bo
z
am
iast
użyc
ia
np.
czte
rech
dwu
bajto
wy
ch
i
nst
ru
kcji "
CL
R
bit"
uży
jem
y
j
ed
ną
tr
zyb
ajto
wą
"ANL
d
rect,
#d
ata
",
co
p
rze
dstawia
pr
zykład
1.4
.
Pr
zyk
ład
1.4
P
rzykład
1.4
.ASM
NAM
E P0
1_03_ASM_SRC
$
INCLU
DE (A
TMEL/REG82
52.INC
)
P
01_03_ASM S
EGMENT
COD
E
RSEG
P01_03_AS
M
ANL P0
,#0AA
h
S
J
MP $
;
PĘ
TLA NIE
SKOŃC
ZONA
E
ND
Pr
zyk
ład
1.4
.C
#
inc
lude <
ATME
L/REG8252.H>
void
ma
in
(void)
{
P
0
&=
0xAA;
wh
ile(1);
}
Pr
zyk
ład
1.4
.B
AS
P
0
=
P0
And
&B1010101
0
Do
:
Lo
op
:
En
d
J
ak widać,
za
pom
ocą tylko
jednej
i
nst
ru
kcji włączyli
ś
m
y
cz
tery
diody
je
d
no
cześni
e.
Tak
ie r
ozwiąza
ni
e
j
est
ba
rdzo
es
tetyc
zne
i
użyt
eczne,
chocia
ż
z
dru
giej st
rony
bard
ziej
cz
ytelne
je
st u
ż
ycie
pojed
yncz
y
c
h
i
ns
tr
ukcji
z
poszczególnymi n
azwa
mi
ust
awianych
pinów.
C
ześć
2
- obsługa
kla
wiatury
W
ć
wiczeniu
tym
za
pozn
amy
się z
obsł
u
gą p
rostej
k
lawiat
ury. Aby
p
rzep
rowadzić
to
ćw
iczenie
musi
m
y
do
po
rtu
P2
podłączy
ć
p
rzeł
ącz
nik
i
zwier
ające
w
ypr
owadz
e
nia
po
rtu
do
ma
s
y
w
mome
n
c
ie na
ciś
nięci
a p
rzycisku,
t
ak
jak
pokaza
no
na
rysunku
.
P
odłą
czenie
diod LED
je
st
iden
t
yczne
jak w
pr
z
ykł
ądzi
e
popr
zedn
im
.
Ni
e
na
daje
s
ię
do
teg
o celu
port
P0
ze względu
na
bra
k we
wnętr
znyc
h
re
z
ystoró
w
podci
ą
g
ając
ych. Jeżeli
chce
m
y
do port
u
P0
podłączyć
klawia
tur
ę t
o
m
usimy
"podc
i
ągn
ąć"
piny por
to
P0 do p
lusa
za
sila
ni
a
poprz
ez dol
ączenie
pomiędzy
wy
prow
adzeni
a
port
u
a
szyn
ę
zasi
lając
ą re
z
ystoró
w
o
war
tości
kilku
-
do
kilku
dzi
esięciu ki
lo
omów
.
Pr
zyk
ład
2.1
P
rogra
m
p
rze
dstawiony
w
tym p
rzykład
zie kop
iuj
e
sta
n
lin
ii
port
u
P2 do por
tu
P0,
czy
li
nac
iśn
ięcie
pr
zycis
ku
będzie sygnali
zo
wa
ne za
ś
wi
e
ceniem
się odpow
iedniej diody
LED.
Dioda
b
ędzie s
ię
św
ieciła
tylko
czasi
e
p
rzyciśnięcia
p
rzyci
sk
u. Po
jeg
o
puszcze
niu
di
ada
zgaś
nie
.
Pr
zyk
ład
2.1
.ASM
NAM
E P0
2_01_ASM_SRC
$
INCL
UDE (AT
MEL/REG825
2.INC
)
P0
2_01_ASM S
EGMENT
COD
E
RSEG
P02_01_ASM
P
ETLA:
MOV
P0,P2
SJMP P
ETLA
E
ND
Pr
zyk
ład
2.1
.C
#
inc
lude <
ATME
L/REG8252.
h>
void
ma
in
(void)
{
wh
ile(1)
P0
=
P2;
}
Pr
zyk
ład
2.1
.B
AS
Do
P0
=
P2
Loop
E
nd
Omówieni
e
W
po
wy
ższ
ym
p
rzykład
zie s
tan
lin
ii
por
tu
P2
j
est kopiow
a
n
y
do
portu
P0.
W
j
ęzy
ku ase
m
ble
ra
zostało to
zrea
li
zo
wa
ne p
rzy
pomo
cy
i
nst
ru
kcji "MOV
direc
t1,
di
rect2
"
,
kopiującej
z
awar
toś
ćˇ komór
ki
w
ewnętrz
nej
pam
ięci RAM
z
ob
sza
ru
ad
reso
wanego bezpo
ś
rednio l
ub
z
obszaru
r
ej
est
ró
w
SFR
do komórk
i
pam
ięci,
lub r
e
j
e
st
ru
SFR
w
tym
samym
ob
sza
rze.
W celu
n
ies
k
ońc
zoneg
o powtar
za
ni
a
tej i
ns
tru
kcji
zastosow
ano in
st
ru
kcję
sk
oku
krótk
ieg
o "SJ
M
P a
dr
"
wy
kon
ującą
sk
ok
do
e
t
ykie
ty
"PETLA"
W
j
ęzy
ku C
za
dan
ie
to zost
ało
z
real
izowane
poprze
z p
rzypisa
nie
do
portu
P
0
war
t
ości po
rtu
P2.
Pętl
a
n
ies
k
ońc
zona
został
a
zr
eal
izowan
a
poprze
z
uży
cie
i
nst
ru
kcji "wh
ile(1)"
W
j
ęzy
ku Basic i
nst
ru
kcja p
rzypisa
nia
wartości por
tu
P2
do
po
rtu
P0
została
u
jęta
pom
i
ę
dz
y
i
ns
tru
kcje
"DO"
i
"LOO
P
"
,
które
rea
li
zują
pęt
lę
nie
skończon
ą.
P
rzep
rowadˇm
y
ter
az
a
na
li
zę
kodu wy
nikow
ego
po
w
yż
s
z
ego
p
rogra
mu
w
y
generow
a
neg
o popr
zez
ka
żdy
z
u
ż
yty
ch kompi
lato
ró
w.
Pr
zyk
ład
2.1
.ASM
.D51
;
;
D
51 V2.
6
8051
Disassembl
y
of
a
sm.
hex
;
10
/28/2
003
19
:06
;
o
rg 0
;
X0
000:
mov
p
0,p2
sjmp
X000
0
;
e
nd
;
Pr
zyk
ład
2.1
.C.
D51
m
ai
n:
?WHI
LE1:
;
SOUR
CE
LINE #
6
;
$@$
C_SOU
RCE_LINE(6)
MOV
P0,P2
SJMP ?WHI
LE1
;
EN
D OF
mai
n
Pr
zyk
ład
2.1
.B
AS.
D51
;
;
D
51 V2.
6
8051
Disassembl
y
of
bas.
hex
;
10
/28/2
003
19
:06
;
.
; Pomi
nię
te zost
ał
y
in
st
ruk
cj
e
powr
otu
.
; z
podprogr
amów
o
bsługi
prz
erwa
ń
.
X0
02e: mov
r0
,#0ff
h
cl
r
a
X0
031:
mov
@
r0
,a
dj
nz
r
0,X0
031
mov
sp,#
21h
mov
20h
,#
0
;
Tu
taj
rozp
o
czyna s
ię
właściw
y
pro
gra
m
X0
03a:
mov
p0,p
2
lj
mp
X003a
;
cl
r
ea
X0
042:
sjmp
X0042
;
e
nd
Kompi
lato
r
każ
dego
z
jęz
yk
ów
użył
do
zr
eal
izowani
a
podan
ego
zad
an
ia
je
d
nej
ins
tr
uk
c
j
i
"MOV di
rect1
,
d
irect
2",
a
wię
c
zre
ali
zował to
zada
ni
e
opt
ymal
nie
.
Jed
yną wątp
liwo
ść
budzi
u
ż
ycie
p
rzez
B
ascoma t
rzybajto
w
ej
i
ns
tru
kcji
"LJM
P" do z
rea
lizowan
ia
pę
tli
ni
eskończonej.
Ponieważ skok n
ast
ępuje
do popr
zed
niej i
nst
ru
kcji
wy
starczy
ło
uży
ć
dw
ubajto
wą
i
ns
tr
ukcję
"SJMP"
,
e
wentu
aln
ie
ta
kże
dwu
bajto
wą
ins
tr
ukcję
"AJMP".
Ś
w
i
adc
z
y
to o tym,
że Bascom
nie
sp
rawdz
a
zakr
esu
skoku
i
zawsze wstawia
i
nst
ru
kcję
obe
jmują
c
ą
na
jwi
ększy
ob
sza
r
p
am
i
ę
c
i
i
n
iepotr
zebnie
zaj
mującą
j
eden
bajt
pa
mięci
pr
gr
am
u
więc
ej.
Natomia
st
kompil
ator
j
e
z
yka
C u
ż
ył do
z
rea
liz
o
wan
ia
p
ę
tli
n
ajbar
dzi
ej
op
tymaln
ej
ins
tr
ukcji
"SJMP".
Pr
zyk
ład
2.2
P
rogra
m
p
rze
dstawiony
w
tym p
rzykład
zie po n
aci
śn
ięciu p
rzycisku S1
zap
al
a
diodę
D1,
a
po n
aciś
nięc
iu
p
rzycisku
S8
gasi
tę
diod
ę
.
Pr
zyk
ład
2.2
.ASM
NAM
E P0
2_02_ASM_SRC
$
INCL
UDE (AT
MEL/REG825
2.INC
)
P0
2_01_ASM S
EGMENT
COD
E
RSEG
P02_01_ASM
S1
EQU
P2.0
S8
EQU
P2.7
L
ED
EQU
P0.
0
S
TART:
JB
S1,
DALEJ
CLR
LED
DALEJ:
JB
S8,
S
T
ART
S
ETB LED
SJMP S
TART
E
ND
Pr
zyk
ład
2.2
.C
#
inc
lude <
ATME
L\
REG8252.
H
>
sbit
S1 =
P
2^0;
sbit
S2 =
P
2^7;
sbit
LED1 =
P
0
^0;
void
ma
in
(void)
{
wh
ile(1)
{
if
(S1 ==
0)
LED1 =
0
;
if
(S2 ==
0)
LED1 =
1
;
}
}
Pr
zyk
ład
2.2
.B
AS
S1
Ali
as
P2.0
S2
Ali
as
P2.7
L
ED
Ali
as
P0.0
Do
If S1
=
0
The
n
R
eset
LED
If S2
=
0
The
n
Set
LED
Loop
E
nd
W
t
ym p
rzykład
zie
do
skona
le widać,
który
z
j
ęzyk
ów
of
eruje
najl
epszą
czy
telność
kodu.
As
e
m
bler
ocz
yw
iśc
ie
n
ie
za
pe
w
nia
tej jak
że
ważnej cechy
. Moi
m zd
an
iem
najba
rdz
iej czyt
elny
j
est p
rogr
am
na
pis
any w
j
ęzy
ku C,
c
ho
ć zwolenn
ic
y
Basc
oma
zapewne n
ie
pr
zyzn
ają
mi
r
acji.
Pr
zyk
ład
2.3
P
rogra
m
w
tym
pr
z
ykł
adzie
po
na
ciś
nięciu
p
rzy
c
i
sku
S1 za
pal
a
di
odę
D1
a
po
ponown
ym na
ciś
nięci
u p
rzyci
sku
S1
gas
i
tą
diodę.
Pr
zyk
ład
2.3
.ASM
NAM
E P0
2_02_ASM_SRC
$
INCL
UDE (AT
MEL/REG825
2.INC
)
P0
2_01_ASM S
EGMENT
COD
E
RSEG
P02_01_ASM
S1
EQU
P2.0
L
ED
EQU
P0.
0
S
TART:
JB
S1,
S
T
ART
CPL
LED
SJMP S
TART
E
ND
Pr
zyk
ład
2.3
.C
#
inc
lude <
ATME
L\
REG8252.
H
>
sbit
S1 =
P
2^0;
sbit
LED1 =
P
0
^0;
void
ma
in
(void)
{
wh
ile(1)
{
if
(S1 ==
0)
L
ED1 =
!LED
1;
}
}
Pr
zyk
ład
2.3
.B
AS
S1
Ali
as
P2.0
Led1 A
lias
P0.0
Do
If S1
=
0
The
n
L
ed1
=
N
ot
Le
d1
Loop
E
nd
Op
is:
N
asz
prog
ram
ni
e
zac
h
owuje
się t
ak,
jak powinie
n.
Po
n
aciś
nięc
iu p
rzycis
k
u
dioda
się
za
pa
la
w
spo
sób
p
rzypadkow
y.
Gd
y
pr
z
ycisk
pr
zytrzymamy
w
ciśnię
t
y
t
rochę
dłuż
ej, to jas
noś
ć świec
eni
a
diod
y
sp
ada,
co
świadczy
o
t
ym
, że
dioda
j
est n
a
prz
emi
an
za
pal
an
a
i
gas
z
o
na.
Pr
z
yczy
ną
tego
je
st og
romna
szy
bko
ść
wy
kon
y
wania
p
rogr
amu
pr
zez
m
ikro
k
o
ntr
oler
,
w
ynos
ząca
ok. 1
mi
lio
n
ins
t
rukc
ji
na
sekun
dę.
Ab
y
temu
z
apobi
ec
na
leży
w
stawić
pętlę opóˇniaj
ącą.
Pr
zyk
ład
2.4
.ASM
NAM
E P0
2_04_ASM_SRC
$
INCL
UDE (AT
MEL/REG825
2.INC
)
P0
2_04_ASM S
EGMENT
COD
E
RSEG
P02_04_ASM
S1
EQU
P2.0
L
ED
EQU
P0.
0
S
TART:
JB
S1,
S
T
ART
CPL
LED
ACALL
CZEKAJ
SJMP S
TART
CZ
EKAJ:
MOV
R1,#255
L2:
MOV
R0,#255
L1:
DJNZ R0,L1
DJNZ R1,L2
RE
T
E
ND
Pr
zyk
ład
2.4
.C
#
inc
lude <
ATME
L\
REG8252.
H
>
sbit
S1 =
P
2^0;
sbit
LED =
P0
^0;
void
czekaj(v
oid)
{
c
har
x,y;
for (
x =
25
5;
x
>
0;
--x)
for (y
=
25
5;
y
>
0;
--y);
}
void
ma
in
(void)
{
wh
ile(1)
{
if
(S1 ==
0)
{
L
ED
=
!LED;
czek
aj();
}
}
}
Pr
zyk
ład
2.4
.B
AS
S1
Ali
as
P2.0
Led1 A
lias
P0.0
Do
If S1
=
0
The
n
L
ed1
=
N
ot
Le
d1
wai
tms
200
Loop
E
nd
Op
is:
P
rzyjrz
yjm
y
się p
rocedurze
op
óˇn
iającej
n
ap
isa
nej
w
języ
ku
asemblera
:
CZ
EKAJ:
MOV
R1,#255
L2:
MOV
R0,#255
L1:
DJNZ R0,L1
DJNZ R1,L2
RE
T
I
nst
ruk
cja "MOV
R
1
, #25
5"
służy
do
ustawien
ia
l
iczn
ik
a
pętl
i
L2.
Ins
tru
kcja
"
MOV
R0, #
255"
służy
do
us
tawieni
a
licz
ni
ka
pętli
L1.
Uż
yc
ie
dw
óch
pętli
zag
nie
żdżo
n
ych
pod
ykt
owane
je
st m
ałym z
akr
esem powtórzeń
r
eal
izowanych
pr
zez
i
nst
ru
kcję
"DJNZ
" (m
aksymaln
ie
256
ra
zy, gdy
l
iczn
ik
pętli
ust
awim
y
na
"0").
Do
z
rea
liz
o
wan
ia
p
ę
tli
s
łuż
y
ins
tr
uk
c
j
a
"DJNZ
Rn,
re
l".
W
na
szym pr
zykładz
ie w
pierwszej
kol
ejności
jest
r
eal
izowana
pętla
L1
(255
po
wtórzeń
,
co
daje ok.
510
us,
p
rzy
zega
rze
12
MHz).
Pętla
ta
jest
z
kolei powtar
za
na
2
55 r
a
z
y w
pętli
L2
. W
s
u
mie
daje
to
opó
ˇ
nieni
e ok.
130
ms.
W
j
ęzy
ku C
procedur
a
opó
ˇ
niając
a wy
gląda n
as
tępująco:
void
czekaj(v
oid)
{
c
har
x,y;
for (
x =
25
5;
x
>
0;
--x)
for (y
=
25
5;
y
>
0;
--y);
}
W
pierwszym
wiersz
u p
rocedury
dekla
ruje
m
y
dwie
zm
ien
ne,
które
posłużą
na
m
jako
licz
ni
ki
pę
tli
.
Ins
tru
kcja
"for(x
=
255;
x
>0
;
--x)"
rea
li
zuje
pętlę,
w
k
tórej
jest
zag
nie
żdżo
na
dru
ga
pęt
la,
podobna
d
o p
ierwszej
.
Skon
str
uo
wa
nie tych pęt
li,
ja
k
o l
iczący
ch
"
w
dół" n
ar
z
ucone
zostało p
rze
z
arc
hit
ektu
rę
m
ikro
kontr
oler
a
i
wy
st
ępo
wanie
w
jęz
yku
asemblera
i
nst
ru
kcji pęt
li
w
yk
orz
ystując
y
ch dek
remen
tację
lic
zni
ka
pętli
.
Daje
to
ba
rdz
iej
zwięzł
y
kod
w
yniko
wy
n
iż
z
re
al
izując
a t
ą
sam
ą
licz
b
ę
po
wtórzeń
pętla
"for(x =
0;
x <
255,
+
+x)".
W
j
ęzy
ku BASCOM
do
op
óˇn
i
e
ni
a
w
yk
orzy
sta
na
zosta
ła
specjalnie
do
tego
celu
pr
zezn
ac
zon
a
in
str
ukcja
"WAI
TMS
x".
Jest on
a
na
jprosts
za
w
użyciu, bow
iem
podajem
y
lic
z
bow
o
czas
opó
ˇ
nien
ia
w
mil
iseku
nda
ch
ni
e
m
usimy
mozolić
się z
obliczan
iem
i
lości
po
wtórzeń
i cz
asu
real
izowan
ia
pęt
li,
j
a
k
w
przypadk
u C
i
asemblera
.
Porównajmy
ter
az
kod
w
yniko
w
y
tych tr
zec
h
pro
gra
mów.
Już
sa
mo
porównani
e r
ozm
ia
ru
plików
*.BIN
daje
n
am
jasny
o
br
az
ef
ekty
wn
ośc
i k
ażdego
z
t
rzec
h
jęz
yk
ów
:
-
pl
ik
gene
ro
w
an
y
pr
zez
BASCOM
- 1
01 B
-
pl
ik
gene
ro
w
an
y
pr
zez
RC51
- 3
7
B
-
pl
ik
gene
ro
w
an
y
pr
zez
RA51 -
18
B
P
rogra
m
n
ap
isa
ny
w
BASCOMie
j
est pon
ad
5,6
razy większ
y
od p
rogr
amu
na
pis
an
ego
w
asemblerze
speł
ni
ającego
tą
sam
ą
funkcję
.
Dokładn
ie
ty
le
samo
te p
rogr
amy
zajm
ują p
am
i
ę
c
i
w
mik
rokon
trole
rze
.
Pr
zyk
ład
2.4
.B
AS.
D51
;
;
D
51 V2.
6
8051
Disassembl
y
of
bas.
hex
;
2/
16/20
04
13:
07
;
.
; Pomi
nię
te zost
ał
y
in
st
ruk
cj
e
powr
otu
.
; z
podprogr
amów
o
bsługi
prz
erwa
ń
.
X0
02e: mov
r0
,a
X0
02f:
mov
a
,#0
adh
X0
031:
i
nc
a
n
op ;
d
ata
tru
nc
at
ed
;
o
rg 3
ah
;
j
nz
X003
1
n
op
dj
nz
r
0,X0
02f
r
et
;
X0
040:
mov
r
0,
#0ffh
cl
r
a
X0
043:
mov
@
r0
,a
dj
nz
r
0,X0
043
mov
sp,#
21h
mov
20h
,#
0
X0
04c: mov
c,p2.
0
mov
20h
.4
,c
j
nc X005
5
lj
mp
X005a
;
X0
055:
mov
c
,p0.
0
cp
l c
mov
p0.0
,c
X0
05a:
mov
a,
#0c8h
ac
all
X00
2e
lj
mp
X004c
;
cl
r
ea
X0
063:
sjmp
X0063
;
e
nd
;
J
ak widać
kod
w
yniko
w
y
p
rogr
amu
na
pis
an
ego
w
Bascomie
j
est z
agm
atwa
ny
i
m
ało
cz
ytelny.
Cz
ęść
3
- w
yświetla
cz
si
edmi
osegmentowy.
W
c
elu
w
yk
onan
ia
ćwiczenia
na
leży
wy
kona
ć poł
ączeni
a
jak
na
rysunku
.
Na
rys
u
nku
n
ie
za
zn
aczo
no
r
ezys
torów
ogra
nic
zających
pr
ąd,
ale
nie
w
olno
o
nic
h
z
apom
nieć
w
ukł
adz
ie.
Pr
zyk
ład
3.1
.ASM
NAM
E P0
3_01_ASM_SRC
$
INCL
UDE (AT
MEL/REG825
2.INC
)
P0
3_01_ASM S
EGMENT
COD
E
RSEG
P03_01_ASM
WYSW EQU
P0
W1
EQU
P2.0
W2
EQU
P2.1
W3
EQU
P2.2
W4
EQU
P2.3
CLR
W1
MOV
WYS
W,
#0
SJMP $
E
ND
Pr
zyk
ład
3.1
.C
#
inc
lude <
ATME
L\
REG8252.
H
>
#
de
fi
ne
WYSW
P0
sbit
W1 =
P2^
0;
sbit
W2 =
P2^
1;
sbit
W3 =
P2^
2;
sbit
W4 =
P2^
3;
void
ma
in
(void)
{
W1
=
0;
WYSW =
0
;
wh
ile(1);
}
Pr
zyk
ład
3.1
.B
AS
WYSW al
ias
p0
w1
al
ia
s p2
.0
w2
al
ia
s p2
.1
w3
al
ia
s p2
.2
w4
al
ia
s p2
.3
w1
=
0
wy
sw
=
0
do
loop
e
nd
O
mó
wienie:
Pow
y
ższ
y
pro
gra
m
powo
duj
e
zaświece
n
ie
wsz
yst
kich
segmen
tów
w
yś
wi
etlacza
W1.
Ustawienie s
tan
u
nis
kie
g
o
n
a
lin
ii
P2.
0 (
W1) wprowa
d
za
tr
an
zystor
w
sta
n
n
asyc
eni
a
i
na
an
odę
w
yś
wi
etlacza
W1
pod
a
ne
j
est
nap
ięcie
z
asil
an
ia
.
Następ
nie
w
szy
stkie
li
nie
po
rtu
P0
są
ustawia
ne w
st
an
nisk
i.
Po
wo
duj
e
to
włączenie
wsz
ys
tkich
segme
ntów
wy
ś
wi
etlacz
a W1.
Pr
zyk
ład
3.2
W
t
ym p
rzykład
zie
zajm
i
e
m
y
się wy
ś
wi
etlenie
m
na
w
yś
wi
etlaczu
kol
ejno cy
fr
kodu
szesn
astkow
ego
(0.
.F).
Sposó
b
poł
ąc
z
enia
po
szczególnych
segmen
tó
w
w
yś
wi
etlacza
z
wy
pro
wadzenia
mi
mik
roko
ntro
lera
pr
zedst
a
wi
a
rysune
k.
T
abela
kod
ów
steruj
ąc
ych
wy
św
ietlaczem s
i
e
dmios
e
gm
e
ntow
ym
:
T
abela
3.1
W
yś
wi
etla
na
c
yf
ra
Liczba d
ziesiętn
ie
Liczba
szesn
astkowo
Liczba dwó
jk
ow
o
0
19
2
C0
11
0000
0
0
1
24
9
F
9
11
1110
0
1
2
16
4
A4
10
1001
0
0
3
17
6
B0
10
1100
0
0
4
15
3
99
10
0110
0
1
5
14
6
92
10
0100
1
0
6
13
0
82
10
0000
1
0
7
24
8
F
8
11
1110
0
0
8
12
8
80
10
0000
0
0
9
14
4
90
10
0100
0
0
A
13
6
88
10
0010
0
0
B
13
1
83
10
0000
1
1
C
19
8
C6
11
0001
1
0
D
16
1
A1
10
1000
0
1
E
13
4
86
10
0001
1
0
F
14
2
8
E
10
0011
1
0
Pr
zyk
ład
3.2
.ASM
NAM
E P0
3_02_ASM_SRC
$
INCL
UDE (AT
MEL/REG825
2.INC
)
P0
3_02_ASM S
EGMENT
COD
E
RSEG
P03_02_ASM
_
0 EQU 0C
0h
_
1 EQU 0F
9h
_
2 EQU 0A4
h
_
3 EQU 0B0
h
_
4 EQU 09
9h
_
5 EQU 09
2h
_
6 EQU 08
2h
_
7 EQU 0F
8h
_
8 EQU 08
0h
_
9 EQU 09
0h
_A
EQU
088
h
_B E
Q
U 08
3h
_
C E
Q
U 0C
6h
_D
EQU
0A1
h
_
E
EQU
086h
_F
EQU
08
Eh
WYSW EQU
P0
W1
EQU
P2.0
W2
EQU
P2.1
W3
EQU
P2.2
W4
EQU
P2.3
CLR
W1
S
TART:
MOV
WYS
W,
#_0
ACALL
CZEKAJ
MOV
WYS
W,
#_1
ACALL
CZEKAJ
MOV
WYS
W,
#_2
ACALL
CZEKAJ
MOV
WYS
W,
#_3
ACALL
CZEKAJ
MOV
WYS
W,
#_4
ACALL
CZEKAJ
MOV
WYS
W,
#_5
ACALL
CZEKAJ
MOV
WYS
W,
#_6
ACALL
CZEKAJ
MOV
WYS
W,
#_7
ACALL
CZEKAJ
MOV
WYS
W,
#_8
ACALL
CZEKAJ
MOV
WYS
W,
#_9
ACALL
CZEKAJ
MOV
WYS
W,
#_A
ACALL
CZEKAJ
MOV
WYS
W,
#_B
ACALL
CZEKAJ
MOV
WYS
W,
#_C
ACALL
CZEKAJ
MOV
WYS
W,
#_D
ACALL
CZEKAJ
MOV
WYS
W,
#_E
ACALL
CZEKAJ
MOV
WYS
W,
#_F
ACALL
CZEKAJ
SJMP S
TART
CZ
EKAJ:
MOV
R1,#255
L2:
MOV
R0,#255
L1:
DJNZ R0,L1
DJNZ R1,L2
RE
T
E
ND
Pr
zyk
ład
3.2
.C
#
inc
lude <
ATME
L\
REG8252.
H
>
#
de
fi
ne
WYSW
P0
#
de
fi
ne
_0
192
#
de
fi
ne
_1
249
#
de
fi
ne
_2
164
#
de
fi
ne
_3
176
#
de
fi
ne
_4
153
#
de
fi
ne
_5
146
#
de
fi
ne
_6
130
#
de
fi
ne
_7
248
#
de
fi
ne
_8
128
#
de
fi
ne
_9
144
#
de
fi
ne
_A
136
#
de
fi
ne
_B
131
#
de
fi
ne
_C
19
8
#
de
fi
ne
_D
161
#
de
fi
ne
_E
13
4
#
de
fi
ne
_F
142
sbit
W1 =
P2^
0;
sbit
W2 =
P2^
1;
sbit
W3 =
P2^
2;
sbit
W4 =
P2^
3;
void
czekaj(v
oid)
{
c
har
x,y;
for (
x =
25
5;
x
>
0;
--x)
for (y
=
25
5;
y
>
0;
--y);
}
void
ma
in
(void)
{
W1
=
0;
wh
ile(1)
{
WYSW =
_
0;
czek
aj();
WYSW =
_
1;
czek
aj();
WYSW =
_
2;
czek
aj();
WYSW =
_
3;
czek
aj();
WYSW =
_
4;
czek
aj();
WYSW =
_
5;
czek
aj();
WYSW =
_
6;
czek
aj();
WYSW =
_
7;
czek
aj();
WYSW =
_
8;
czek
aj();
WYSW =
_
9;
czek
aj();
WYSW =
_A
;
czek
aj();
WYSW =
_B;
czek
aj();
WYSW =
_
C;
czek
aj();
WYSW =
_D
;
czek
aj();
WYSW =
_
E;
czek
aj();
WYSW =
_F;
czek
aj();
}
}
Pr
zyk
ład
3.2
.B
AS
Wys
w
Alias
P0
W1
Alia
s P
2.0
_
0 A
lias
192
_
1 A
lias
249
_
2 A
lias
164
_
3 A
lias
176
_
4 A
lias
153
_
5 A
lias
146
_
6 A
lias
130
_
7 A
lias
248
_
8 A
lias
128
_
9 A
lias
144
_
a
Alia
s 13
6
_b A
lias
13
1
_c
Alia
s 19
8
_
d A
lias
161
_e
Alia
s 13
4
_f Al
ias
142
Reset
W
1
Do
Wys
w
=
_0
Wa
itms
2
50
Wys
w
=
_1
Wa
itms
2
50
Wys
w
=
_2
Wa
itms
2
50
Wys
w
=
_3
Wa
itms
2
50
Wys
w
=
_4
Wa
itms
2
50
Wys
w
=
_5
Wa
itms
2
50
Wys
w
=
_6
Wa
itms
2
50
Wys
w
=
_7
Wa
itms
2
50
Wys
w
=
_8
Wa
itms
2
50
Wys
w
=
_9
Wa
itms
2
50
Wys
w
=
_a
Wa
itms
2
50
Wys
w
=
_b
Wa
itms
2
50
Wys
w
=
_c
Wa
itms
2
50
Wys
w
=
_d
Wa
itms
2
50
Wys
w
=
_e
Wa
itms
2
50
Wys
w
=
_
f
Wa
itms
2
50
Loop
E
nd
K
ażdy
p
rogr
am
sp
e
łni
a
swo
je
zada
n
ie,
jedn
ak
na
pis
any jest
bar
dzo r
ozwlekl
e
i
nieestetyc
zn
ie.
To sa
mo
zad
an
ie
mo
żna
zr
eal
izować
zna
czn
ie
ba
rdz
iej
est
e
t
ycznie.
Poró
wnaj
m
y
jedna
k
wc
ześniej ro
zmi
ary kodu
w
ynik
owe
go
tych p
rogr
amów:
-
BASCOM
- 1
97 bajtów
-
C
-
127
ba
jtów
-
ase
m
bler
-
93
bajt
y
Tym r
aze
m
pro
gra
m
w
Bas
comie za
jmuje
ni
ec
o pon
ad
2
razy więce
j
n
iż
jego
odpo
wie
d
nik
w
a
semblerze.
Pr
zyk
ład
3.3
.ASM
NAM
E P0
3_03_ASM_SRC
$
INCL
UDE (AT
MEL/REG825
2.INC
)
P0
3_03_ASM S
EGMENT
COD
E
RSEG
P03_03_ASM
WYSW EQU
P0
W1
EQU
P2.0
CLR
W1
S
TART:
MOV
DPTR,#ZNAKI
P
ETLA:
CLR
A
MOVC
A,@
A+DPTR
JZ S
TA
RT
MOV
WYS
W,A
IN
C DPTR
ACALL
CZEKAJ
SJMP P
ETLA
CZ
EKAJ:
MOV
R1,#255
L2:
MOV
R0,#255
L1:
DJNZ R0,L1
DJNZ R1,L2
RE
T
ZNAKI:
DB
192
,249
,164
,176
,153
,146
,130
,24
8,12
8,1
44,1
36,1
31,
198
,161
,134
,142
,0
E
ND
Pr
zyk
ład
3.3
.C
#
inc
lude <
ATME
L\
REG8252.
H
>
#
de
fi
ne
WYSW
P0
c
har
code
zn
ak
i[
17]
=
{1
92,24
9,164
,176
,153
,14
6,13
0,2
48,1
28,
144,1
36,
131
,198
,161
,134
,142
,0};
sbit
W1 =
P2^
0;
void
czekaj(v
oid)
{
c
har
x,y;
for (
x =
25
5;
x
>
0;
--x)
for (y
=
25
5;
y
>
0;
--y);
}
void
ma
in
(void)
{
W1
=
0;
wh
ile(1)
{
code
ch
ar
*
pz
nak
i
=
&
zn
aki
;
wh
ile(*pz
na
ki)
{
WYSW =
*
pzna
ki
;
p
zna
ki
++;
czek
aj();
}
}
}
Pr
zyk
ład
3.3
.B
AS
Wys
w
Alias
P0
W1
Alia
s P
2.0
D
im
I
As
B
yt
e
Reset
W
1
Do
For
I
=
0
To
15
Wys
w
=
L
ook
up(i
,
Z
naki
)
Wa
itms
2
50
Next
I
Loop
Z
naki
:
D
ata
19
2 ,
2
49
,
164
,
176
,
15
3 ,
1
46
,
130
,
248
,
12
8 ,
1
44
,
136
,
13
1
,
19
8 ,
1
61
,
134
,
14
2
E
nd
Pow
y
ższ
y
pro
gra
m
r
eal
izuje
dokładn
ie
to
samo
zad
an
ie,
j
a
k
p
rogr
am
p
op
rzed
ni
,
jednak
zre
ali
zo
w
an
y
zosta
ł
z
u
ż
ycie
m
pętli
i
u
mieszcze
niem
kodó
w
cy
fr
w
tab
lic
y.
Zapis
prog
ra
mu
stał
s
i
ę
pr
zez
to z
nac
zn
ie
kr
ótszy
i
ba
rdz
iej
estet
yczn
y. Najbar
dziej czyte
l
n
y
i
łat
w
y
do
zroz
umi
en
ia
jest
pro
gra
m
n
ap
isa
ny
w
Bascomie. Do
pobra
ni
a
elemen
tu
tab
lic
y
s
łuży
ty
l
k
o
jedno
polec
eni
e
- "LOOKUP
"
.
Natomia
st
w
języ
ku
C
koniecz
ne by
ło
z
astoso
wan
ie
łącz
nie
t
rzec
h
poleceń.
W
pie
rw
szej
kolejn
ości za
dekla
rowano z
mi
en
ną
wskaˇni
k
ową "p
zna
ki
"
i
p
rzypisa
no
do
n
iej
pr
zy
uży
ciu opera
t
o
ra
a
dres
u "&" a
dres
tabl
ic
y
"z
na
ki"
.
Nas
tępnie
pobra
no
elemen
t
tabli
c
y
p
rzy
użyc
iu i
nst
r
ukcji
"WYS
W =
*p
zn
aki
".
Na
końcu kon
ieczne
b
yło
zin
kr
eme
ntowan
ie wskaˇn
ika
,
aby
wskazy
wał
na
kolejn
y
element
t
ablicy
. Ja
k widać pobra
nie
elemen
tu
z
tab
lic
y
w
jęz
yk
u C
jest
dos
yć
skomp
likow
a
ne
w
poró
wn
an
iu
z
Basco
mem.
Pyzat
ym,
w
skaˇ
nik
i
są
je
d
n
ym z
t
ru
dn
iejszy
ch do z
rozu
mie
nia
eleme
ntów
jęz
yka
C
dla
p
ocząt
kując
ych.
Najbardzi
ej
sk
om
plikowana
sp
rawa
jest
w
asembler
ze.
Do
z
rea
liz
o
wan
ia
rozpa
trywanego
pr
zez
na
s
za
da
ni
a
z
astosow
ano
aż
o
siem
ins
tr
ukcji:
S
TART:
MOV
DPTR,#ZNAKI
P
ETLA:
CLR
A
MOVC
A,@
A+DPTR
JZ S
TA
RT
MOV
WYS
W,A
IN
C DPTR
ACALL
CZEKAJ
SJMP P
ETLA
I
nst
ruk
cja "MOV
DPTR,#ZNAKI"
odp
owiada
przypisa
ni
u
do
w
skaˇ
nik
a
adr
esu
pierwszego
ele
mentu
m
ikr
okont
roler
ze
tablicy.
W
mik
rokon
tro
l
e
rz
e
80
51 jed
ynym
rejestre
m,
któ
r
y
możn
a
z
astosow
ać
jako
16-
bit
ow
y
wskaˇn
ik
jest
rejestr
DPT
R.
W n
o
wszy
ch wersja
c
h
mik
rokont
role
ra
8
051,
w
tym
w
wers
j
i
89S825
2,
w
ys
tęp
ują
dwa
w
skaˇ
niki
DPTR.
J
ed
nakż
e ze
względu n
a
ko
nieczność z
a
c
howani
a
100%
komp
aty
bilności kodu
z
8051
mo
żliwe
jest w
dan
ej
chwil
i u
ż
ycie
tylko
jednego
wskaˇni
ka
DPT
R
.
W za
leż
ności od ro
dzaju
mik
rokont
role
ra
p
rze
łącza
ni
e
aktywn
ego
danej
chwili
wskaˇn
ika
je
st r
eal
izowane
w
róż
ny
spo
sób
. Ab
y
na
sze
pr
zykład
y
moż
na
by
ło
za
stoso
wa
ć
w
dow
olnym
m
ik
rokont
role
rze
ni
e
b
ędziemy
korzystać z
tego
udogodnien
ia
.
I
nst
ruk
cja "C
L
R
A" jest koni
e
c
zna
,
po
nieważ ad
res
komórki
p
amięci
pro
gra
mu
po
biera
nej z
a
pomo
c
ą
ins
tr
ukcji
"MOVC
A,
@A
+DPTR"
jest
sumą
z
awar
tości
aku
mul
ator
a
i
wskaˇn
ika
DPTR. W p
rzypadku
n
iew
yzer
owania
a
kumu
la
tora
przy powtarz
an
iu
pętli
a
dres
b
yłb
y
o
bliczony
błędni
e.
Ins
tru
kcja "JZ S
TA
RT"
spr
awdza
,
cz
y
osiąg
nię
t
y
został
kon
i
e
c
tablicy.
Jeśl
i
ta
k,
to n
as
tępuje
op
uszc
z
e
nie
pętli
.
Następn
ie
po
br
any
element
t
ablicy
zost
aj
e wy
słany
do
port
u
P0.
Prz
ed powt
ór
zenie
m
pętli
mu
simy
jeszcze
zwiększ
yć
adr
es n
as
tępne
go
el
e
mentu
t
ablicy
do
po
br
ani
a
o
1.
W
iem
y
już
,
jak s
i
ę p
rz
edstawia
stopień
komp
lik
a
cji
pro
gra
mu
w
za
leżn
ości
od
użyte
go
j
ęzyk
a
.
Sp
rawdˇmy
te
raz
i
loś
ć m
iejs
ca
zajmowanego
w
pa
mięci
pr
zez
ka
żdy
p
rogr
am
.
-
Basc
om -
185
bajtó
w
(
197
ba
jtów
bez
wy
korz
ystani
a
pętl
i
i
tablicy)
-
C
-
82 bajty
(127
bajtó
w)
-
Asembler
- 4
2 bajty
(93 bajty)
Zgodn
ie
z
oczekiw
a
nia
mi
asembler
w
ypa
da
naj
lepiej. T
ak
że w
poró
wn
an
iu
do popr
zedn
iego
pr
zykładu
be
z pę
tli
i
t
ablicy
w
ase
m
bler
ze zysku
jemy
n
ajwiększą
osz
częd
noś
ć
pa
mięci
prog
ra
mu.
P
rzejdˇmy
te
ra
z
do
ciekaw
s
z
ego
zaga
dn
ien
ia
,
mi
anowicie
do
mu
lti
pleksow
a
neg
o ste
ro
wan
ia
wy
ś
wi
etlaczem
.
Aby
z
aoszc
z
ędzić por
t
y
mik
roko
ntr
olera
,
ba
rdzo c
zę
sto
stos
owane
jes
t
sterowanie
mul
tip
lekso
wane
. O
zna
cza
to,
że
ka
t
ody
odpow
iednic
h
segmentów
s
ą połączo
n
e
ra
ze
m
do
w
ypr
owadz
eń
s
t
e
rujący
ch,
a
an
od
y
są s
terowane
oso
bno. Zap
alając
odpo
wi
ed
nio
szy
bk
o
poszczególne s
e
gme
nty
ot
rzymuj
emy
wraże
nie
świe
cenia
się
w
szy
stkich
wy
św
iet
lac
z
y.
Pr
zyk
ład
3.4
.ASM
NAM
E P0
3_04_ASM_SRC
$
INCL
UDE (AT
MEL/REG825
2.INC
)
P0
3_04_ASM S
EGMENT
COD
E
RSEG
P03_04_ASM
WYSW EQU
P0
W1
EQU
P2.0
W2
EQU
P2.1
W3
EQU
P2.2
W4
EQU
P2.3
MOV
DPTR,#ZNAKI
P
ETLA:
CLR
W1
MOV
A,#9
MOVC
A,@
A+DPTR
MOV
WYS
W,A
ACALL
CZEKAJ
S
ETB W1
CLR
W2
MOV
A,#8
MOVC
A,@
A+DPTR
MOV
WYS
W,A
ACALL
CZEKAJ
S
ETB W2
CLR
W3
MOV
A,#7
MOVC
A,@
A+DPTR
MOV
WYS
W,A
ACALL
CZEKAJ
S
ETB W3
CLR
W4
MOV
A,#6
MOVC
A,@
A+DPTR
MOV
WYS
W,A
ACALL
CZEKAJ
S
ETB W4
SJMP P
ETLA
CZ
EKAJ:
MOV
R1,#255
L2:
MOV
R0,#255
L1:
DJNZ R0,L1
DJNZ R1,L2
RE
T
ZNAKI:
DB
192
,249
,164
,176
,153
,146
,130
,24
8,12
8,1
44,1
36,1
31,
198
,161
,134
,142
,0
E
ND
Pr
zyk
ład
3.4
.C
#
inc
lude <
ATME
L\
REG8252.
H
>
#
de
fi
ne
WYSW
P0
c
har
code
zn
ak
i[
17]
=
{1
92,24
9,164
,176
,153
,14
6,13
0,2
48,1
28,
144,1
36,
131
,198
,161
,134
,142
,0};
sbit
W1 =
P2^
0;
sbit
W2 =
P2^
1;
sbit
W3 =
P2^
2;
sbit
W4 =
P2^
3;
void
czekaj(v
oid)
{
c
har
x,y;
for (
x =
25
5;
x
>
0;
--x)
for (y
=
25
5;
y
>
0;
--y);
}
void
ma
in
(void)
{
code
ch
ar
*
pz
nak
i;
p
zna
ki
=
&z
nak
i;
wh
ile(1)
{
W1
=
0;
WYSW =
(*(
zna
ki
+
4));
czek
aj();
W1
=
1;
W2
=
0;
WYSW =
(*(
zna
ki
+
3));
czek
aj();
W2
=
1;
W3
=
0;
WYSW =
(*(
zna
ki
+
2));
czek
aj();
W3
=
1;
W4
=
0;
WYSW =
(*(
zna
ki
+
1));
czek
aj();
W4
=
1;
}
}
Pr
zyk
ład
3.4
.B
AS
Wys
w
Alias
P0
W1
Alia
s P
2.0
W2
Alia
s P
2.1
W3
Alia
s P
2.2
W4
Alia
s P
2.3
Do
Reset
W
1
Wys
w
=
L
ook
up(0
,
Zna
ki)
Wa
itms
1
00
Set
W1
Reset
W
2
Wys
w
=
L
ook
up(1
,
Zna
ki)
Wa
itms
1
00
Set
W2
Reset
W
3
Wys
w
=
L
ook
up(2
,
Zna
ki)
Wa
itms
1
00
Set
W3
Reset
W
4
Wys
w
=
L
ook
up(3
,
Zna
ki)
Wa
itms
1
00
Set
W4
Loop
Z
naki
:
D
ata
19
2 ,
2
49
,
164
,
176
,
15
3 ,
1
46
,
130
,
248
,
12
8 ,
1
44
,
136
,
13
1
,
19
8 ,
1
61
,
134
,
14
2
E
nd
Efektem
dzi
ała
ni
a
pow
y
ższeg
o
prog
ram
u
jest
w
yś
wi
etlan
ie
c
y
fr na
kolejny
ch
w
y
św
ietlaczach
od p
rawej
d
o
lewe
j
stro
ny.
Celo
wo
zast
os
owan
o du
że opóˇnie
nie
w
pr
zeł
ącza
niu
w
yś
wi
etlaczy,
ab
y
lepiej
uz
m
ysłow
ić
za
sadę
s
terow
a
nia
m
ult
ipl
ekso
wanego. P
rzy
t
ak
d
uży
m opóˇnie
niu
dokł
adn
ie
widać
kolejn
o z
apa
la
ne
segmen
ty.
N
as7tępny
przykła
d
zawiera
już no
rm
al
ne
opóˇnie
nie.
Pr
zyk
ład
3.5
.ASM
NAM
E P0
3_05_ASM_SRC
$
INCL
UDE (AT
MEL/REG825
2.INC
)
P0
3_05_ASM S
EGMENT
COD
E
RSEG
P03_05_ASM
WYSW EQU
P0
W1
EQU
P2.0
W2
EQU
P2.1
W3
EQU
P2.2
W4
EQU
P2.3
MOV
DPTR,#ZNAKI
P
ETLA:
CLR
W1
MOV
A,#9
MOVC
A,@
A+DPTR
MOV
WYS
W,A
MOV
A,#5
ACALL
CZEKAJ
S
ETB W1
CLR
W2
MOV
A,#8
MOVC
A,@
A+DPTR
MOV
WYS
W,A
MOV
A,#5
ACALL
CZEKAJ
S
ETB W2
CLR
W3
MOV
A,#7
MOVC
A,@
A+DPTR
MOV
WYS
W,A
MOV
A,#5
ACALL
CZEKAJ
S
ETB W3
CLR
W4
MOV
A,#6
MOVC
A,@
A+DPTR
MOV
WYS
W,A
MOV
A,#5
ACALL
CZEKAJ
S
ETB W4
SJMP P
ETLA
CZ
EKAJ:
MOV
R0,A
L20
:
MOV
R6,#248
L22
:
DJNZ R6,L22
MOV
R6,#248
L21
:
DJNZ R6,L21
DJNZ R0,L20
RE
T
ZNAKI:
DB
192
,249
,164
,176
,153
,146
,130
,24
8,12
8,1
44,1
36,1
31,
198
,161
,134
,142
,0
E
ND
Pr
zyk
ład
3.5
.C
#
inc
lude <
ATME
L\
REG8252.
H
>
#
de
fi
ne
WYSW
P0
c
har
code
zn
ak
i[
17]
=
{1
92,24
9,164
,176
,153
,14
6,13
0,2
48,1
28,
144,1
36,
131
,198
,161
,134
,142
,0};
sbit
W1 =
P2^
0;
sbit
W2 =
P2^
1;
sbit
W3 =
P2^
2;
sbit
W4 =
P2^
3;
void
czekaj(cha
r
k)
{
c
har
x,y,z;
for (
z
=
k;
z
>
0;
--z
)
for (
x =
10
;
x >
0;
--x)
for (y
=
47
;
y
>
0;
--y)
;
}
void
ma
in
(void)
{
code
ch
ar
*
pz
nak
i;
p
zna
ki
=
&z
nak
i;
wh
ile(1)
{
W1
=
0;
WYSW =
(*(
zna
ki
+
4));
czek
aj(5);
W1
=
1;
W2
=
0;
WYSW =
(*(
zna
ki
+
3));
czek
aj(5);
W2
=
1;
W3
=
0;
WYSW =
(*(
zna
ki
+
2));
czek
aj(5);
W3
=
1;
W4
=
0;
WYSW =
(*(
zna
ki
+
1));
czek
aj(5);
W4
=
1;
}
}
Pr
zyk
ład
3.5
.B
AS
Wys
w
Alias
P0
W1
Alia
s P
2.0
W2
Alia
s P
2.1
W3
Alia
s P
2.2
W4
Alia
s P
2.3
Do
Reset
W
1
Wys
w
=
L
ook
up(0
,
Zna
ki)
Wa
itms
5
Set
W1
Reset
W
2
Wys
w
=
L
ook
up(1
,
Zna
ki)
Wa
itms
5
Set
W2
Reset
W
3
Wys
w
=
L
ook
up(2
,
Zna
ki)
Wa
itms
5
Set
W3
Reset
W
4
Wys
w
=
L
ook
up(3
,
Zna
ki)
Wa
itms
5
Set
W4
Loop
Z
naki
:
D
ata
19
2 ,
2
49
,
164
,
176
,
15
3 ,
1
46
,
130
,
248
,
12
8 ,
1
44
,
136
,
13
1
,
19
8 ,
1
61
,
134
,
14
2
E
nd
Efektem
dzi
ała
ni
a
tego
pro
gra
mu
j
est już
stabil
ny
n
ap
is
.
Stało
się
ta
k
dzię
ki bezwł
a
dności lud
zk
iego
oka.
J
ed
nak
wadą
sterowani
a
mul
tip
leksowanego
jest,
c
o
za
p
ew
ne
widać, m
ni
ejsza
jasność
ś
wiecenia
wy
ś
wi
etlaczy
.
W
bi
eż
ąc
ym
przykła
dzie
zmody
fik
owana
został
a
procedura
op
óˇn
iająca.
Li
c
z
bę
po
wtórzeń
pęt
li
opó
ˇ
niającej
mo
żem
y
te
ra
z
wy
bra
ć
z
za
kre
su od 1
do
256,
poprze
z u
mieszczen
ie w
aku
mul
ato
rze
prz
ed
w
y
wo
łaniem
p
rocedury
lic
zb
y
określającej
il
oś
ć powt
órz
eń.
J
ed
no
po
wtórzen
ie
procedury
t
rwa
ok. 1m
s p
rzy
zegar
ze
12MHz.
T
ak
więc
pr
oc
edur
a
zap
e
w
nia
opóˇnien
ie
od
1 do 25
6ms.
C
zęść
4
- M
agi
stral
a
I2C
W
t
ym ćwiczeniu
w
yk
orzy
stamy
dwa doda
tko
we
uk
łady
scalo
n
e
ty
pu
P
CF8
574A
produ
k
cji fi
rmy
Ph
ilips
.
Ukła
d te
n
je
st
8-bito
wy
m
ekspa
nde
rem
ma
gist
ra
li
I2C
.
Lin
ie SDA i
SCL
na
leży
pod
ł
ączy
ć
odpo
wiednio do
p
inów
P2.0
i
P2.
1 m
ik
rokont
role
ra.
Do
w
y
jś
ć
pierwszego
ukł
adu
podłącz
amy
d
iod
y
LED,
a
do
dr
ugie
g
o u
kłądu
n
as
zą
k
lawiat
urę.
Ze
względu n
a
złożoność
procedur
obs
ług
i
ma
gist
ra
li
I2C
pr
zyg
otowan
o d
la
jęz
yka
asemblera
i
C
oddzi
e
l
ne
p
liki
zw
i
erające
podstawo
w
e
p
rocedury
o
bsługi
tej
mag
ist
ral
i
.
M
a to
na
c
e
l
u
un
ik
ni
ę
c
ie
cią
głeg
o p
rze
pisy
wania
s
t
osun
ko
wo
dużego kodu z
awierającego
nie
zbędne p
roc
edu
r
y.
Zamieszc
z
on
e
poni
żej
plik
i
zawie
rają
procedury
z
apewniaj
ące:
-
w
yge
nerowanie
sekw
encji
"START"
-
w
yge
nerowanie
sekw
encji
"STOP"
-
w
ysłanie n
a
mag
ist
ra
lę
ba
j
tu d
anych
-
odcz
ytan
ie z
m
agis
tr
ali
bajtu
danych
P
roc
edury
te pozwalają
na
komu
nik
ację
z
wi
ększoś
cią
ty
po
wy
ch
ukł
adów
scalonych
z
a
wi
erający
ch i
nte
rfejs
I
2C
p
rac
ując
y
w
t
ryb
ie
"MASTER-SLAVE".
Pl
ik
I2C.
ASM
;
;
P
roc
edur
a
gene
rująca
sekw
encję
START
;
I
2C_START:
S
ETB SDA
S
ETB SCL
ACALL
DELAY
CLR
SDA
ACALL
DELAY
CLR
SCL
RE
T
;
;
P
roc
edur
a
gene
rująca
sekw
encję
STOP.
;
St
an
li
ni
i
S
DA
zostaje
z
ap
ami
ęta
ny
po
zakoń
czeni
u
;
t
ra
ns
mis
ji
w
e
w
skaˇ
niku
prz
eni
esien
ia
C
.
;
I
2C_STOP:
CLR
SDA
ACALL
DELAY
S
ETB SCL
ACALL
DELAY
S
ETB SDA
ACALL
DELAY
MOV
C,SDA
RE
T
;
;
P
roc
edur
a
odcz
ytują
ca
ba
jt
z
mag
ist
ra
li
I2C
.
;
Wa
rtość bitu
ACK
nal
eży
p
rze
kaz
ać do p
roce
d
ury
poprze
z
;
wskaˇn
ik
p
rze
nies
ieni
a
C.
;
O
d
czytany
bajt
j
est um
ieszcza
ny
w
ak
umul
ato
rze
.
;
I
2C_READ:
MOV
ACK,C
S
ETB SDA
MOV
R0,#8
L0:
ACALL
DELAY
S
ETB SCL
ACALL
DELAY
MOV
C,SDA
RLC
A
CLR
SCL
DJNZ R0,L0
MOV
C,ACK
MOV
SDA,C
ACALL
DELAY
CLR
SCL
RE
T
;
;
P
roc
edur
a
w
ys
y
łają
ca
ba
jt
na
ma
gist
ra
lę
I2C.
;
St
an
bitu
ACK jest
zwrac
any
poprze
z
w
skaˇn
ik
p
rze
nie
sieni
a
C.
;
Bajt
d
o wy
słani
a
na
leży
umieścić w
aku
mul
ator
ze.
;
I
2C_WRITE:
MOV
R0,#9
S
ETB C
L1:
CLR
SCL
RLC
A
MOV
SDA,C
ACALL
DELAY
S
ETB SCL
ACALL
DELAY
DJNZ R0,L1
MOV
C,SDA
CLR
SCL
RE
T
D
ELAY:
NOP
NOP
RE
T
Pl
ik
I2C.
C
void
delay(
void
)
{
a
sm{0x
00};
a
sm{0x
00};
}
void
I2C_S
TART(
void)
{
SDA
=
SCL
=
1;
de
la
y();
SDA
=
0;
de
la
y();
SCL
=
0;
}
bit
I2C
_STOP(v
oid
)
{
SDA
=
0;
de
la
y();
SCL
=
1;
de
la
y();
SDA
=
1;
de
la
y();
r
etur
n
(
~SDA);
}
u
nsi
gned
char
I
2C_READ(bit ACK
)
{
u
nsi
gned
char
bit
C
ou
nt
=
8
,
temp;
SDA
=
1;
do
{
de
la
y();
SCL
=
1;
de
la
y();
te
mp
<<=
1;
if
(SDA)
temp
++;
SCL
=
0;
}
while
(--bi
t
Coun
t)
;
SDA
=
ACK;
de
la
y();
SCL
=
1;
de
la
y();
SCL
=
0;
r
etur
n
(
temp);
}
bit
I2C
_WR
ITE
(un
sign
ed
cha
r
b
yt
e)
{
u
nsi
gned
char
bit
C
ou
nt
=
9
;
bit
tem
p;
do
{
SCL
=
0;
SDA
=
b
yt
e
&
0x80
;
by
te
=
(by
te
<
<
1)
+
1;
de
la
y();
SCL
=
1;
de
la
y();
}wh
ile(--bitCou
nt);
te
mp
=
SDA;
SCL
=
0;
r
etur
n
(te
mp)
;
}
Pr
zyk
ład
4.1
Pr
zyk
ład
4.1
.ASM
NAM
E P0
4_01_ASM_SRC
$
INCL
UDE (AT
MEL/REG825
2.INC
)
P0
4_01_ASM S
EGMENT
COD
E
RSEG
P04_01_ASM
SDA
EQU
P2.0
SCL
EQU
P
2.1
ACK
EQU
00h
ACALL
I2C
_START
MOV
A,
#70
h
ACALL
I2C
_W
RITE
MOV
A,
#25
4
ACALL
I2C
_W
RITE
ACALL
I2C
_STOP
SJMP $
$
INCL
UDE (I
2C.ASM)
E
ND
Pr
zyk
ład
4.1
.C
#
inc
lude <
ATME
L/REG8252.H>
#
inc
lude "
I2C.H"
void
ma
in
(void)
{
I
2C_START();
I
2C_WRITE(0x
70);
I
2C_WRITE(0xF
E);
I
2C_STOP()
;
wh
ile(1);
}
P
rzykład
4.1
.BAS
Co
nfig Sda
=
P
2.0
Co
nfig Scl
=
P2.1
I
2cstar
t
I
2c
wb
y
te
&H7
0
I
2c
wb
y
te
&HF
E
I
2cst
op
Do
Loop
E
nd
Efektem
dzi
ała
ni
a
tego
pro
gra
mu
j
est włączen
ie diody
LED D1
.
Troc
hę uwagi
na
leży
poś
wię
cić
prog
ra
mow
i
w
a
semblerze i
ję
zyk
u C.
W
asemblerze
dołączen
i
e
wsp
om
nia
nego wcze
ś
niej
plik
u
z
podstaw
ow
ym
i
procedur
ami
nas
tą
pił
o
pr
zy
u
ż
yciu
dyrekty
w
y
"$INCLUDE". Dyr
ekty
wa
t
a
pow
oduj
e
wstawian
iu
w
je
j
miejsc
e
pr
zez
kompi
lato
r
asemblera
z
awar
toś
ci
plik
u
w
ska
zane
g
o
tą
dyrekt
yw
ą. T
ak
więc
dwa fizy
czne
plik
i
zawier
ające
kod
ˇró
dło
wy
w
czas
ie
komp
ila
c
ji
są
łączo
n
e
w
j
eden.
Kon
s
ekwenc
ją
tego
j
est fak
t,
że cok
olw
iek z
adekl
aru
jem
y
w
pli
ku
pierwszym
będzie to ob
ow
i
ą
zy
wało
równie
ż w
plik
u
dr
ugi
m.
D
latego pomi
mo
pozorn
ego
niewy
korzy
st
yw
ani
a bitów
SDA i
SCL
pr
zez
prog
ra
m
w
plik
u
P04_0
1_ASM_S
RC.A5
1 um
ieszczona
tam
de
k
lar
acja
jest
koniecz
na
do
pop
rawnego
dzi
ał
an
ia
pr
oc
edu
r
zawar
t
ych
w
p
liku
I
2C.ASM
.
T
rochę
in
acz
ej
ta
spr
awa
pr
zedstawi
a się
w
jęz
yku
C
.
Pli
k I2
C.C
zosta
ł
dodany
d
o p
roje
k
tu
z
a
pomo
cą polecenia
"Ad
d no
de
Source
/
Applic
ation
" z
menu
RI
DE
IDE
.
Pliku
ˇ
ródło
wym
na
szego p
rogr
amu
umiesz
czamy
dyrekty
wę
"#i
ncl
ude "I2
C.H"".J
est
to
dy
re
kt
y
wa
pre
proce
sora
włączająca
plik
n
ag
łówko
w
y
do
plik
u
ˇ
ródłow
ego.
ˇ
ródłow
ego
pli
ku
na
główko
w
ym
umi
e
s
zczone są
pro
tot
yp
y
p
rocedur
zawa
rtych w
plik
u
I2C
.C.
W
Bas
comie
spr
awa p
rz
edstawia
się zu
pełn
ie
pros
t
o,
ponieważ
o
bsługa
magi
str
al
i
I
2C
j
est wbud
owa
n
a
w
komp
ila
tor
i
n
ie
ma
pot
rzeb
y
z
awrac
ani
a
s
obie
głow
y
dołącza
niem
jakichko
l
wiek dodatkow
yc
h pl
ikó
w
a
pr
zede
wszy
stkim
samodzie
lne
g
o op
rogra
mow
y
wania
tra
ns
m
isji.
W
t
ym mo
mencie
prz
e
wa
ga
Ba
scoma n
ad
a
semblerem
i
C
j
est n
ajbar
dzi
ej
wido
czna
.
Aby
korzystać
z
ma
gist
ra
li
I2C
ni
e
potrz
e
bujemy
z
nać
dokł
adn
ie
p
rotokołu
tr
an
sm
isji
,
w
ys
tarc
z
y
t
ylko
podł
ącz
yć
do
procesora
od
powi
ednio
lin
ie
SDA i
SCL
i
możemy
w
p
rost
y
sposó
b
ste
ro
wać
ukła
dam
i
p
rze
z
I2C.
Pr
zyk
ład
4.2
.ASM
NAM
E P0
4_02_ASM_SRC
$
INCL
UDE (AT
MEL/REG825
2.INC
)
P0
4_02_ASM S
EGMENT
COD
E
RSEG
P04_02_ASM
SDA
EQU
P2.0
SCL
EQU
P
2.1
ACK
EQU
00h
S
TART:
ACALL
I2C
_START
MOV
A,
#72
h
ACALL
I2C
_W
RITE
MOV
A,
#0FFh
ACALL
I2C
_W
RITE
ACALL
I2C
_STOP
ACALL
I2C
_START
MOV
A,#73
h
ACALL
I2C
_W
RITE
MOV
A,#0
ACALL
I2C
_READ
ACALL
I2C
_STOP
MOV
R4, A
ACALL
I2C
_START
MOV
A,#70
h
ACALL
I2C
_W
RITE
MOV
A,R4
ACALL
I2C
_W
RITE
ACALL
I2C
_STOP
SJMP S
TART
$
INCL
UDE (I
2C.ASM)
E
ND
Pr
zyk
ład
4.2
.C
#
inc
lude <
ATME
L/REG8252.H>
#
inc
lude "
I2C.H"
void
ma
in
(void)
{
u
nsi
gned
char
tem
p;
wh
ile(1)
{
I
2C_START();
I
2C_WRITE(0x
72);
I
2C_WRITE(0xFF
);
I
2C_STOP()
;
I
2C_START();
I
2C_WRITE(0x
73);
te
mp
=
I2C_READ(1);
I
2C_STOP()
;
I
2C_START();
I
2C_WRITE(0x
70);
I
2C_WRITE(tem
p);
I
2C_STOP()
;
}
}
Pr
zyk
ład
4.2
.B
AS
Co
nfig Sda
=
P
2.0
Co
nfig Scl
=
P2.1
D
im
Temp
As
B
yt
e
Do
I
2cstar
t
I
2c
wb
y
te
&H7
2
I
2c
wb
y
te
&HF
F
I
2cst
op
I
2cstar
t
I
2c
wb
y
te
&H7
3
I
2crb
yte
Tem
p
,
9
I
2cst
op
I
2cstar
t
I
2c
wb
y
te
&H7
0
I
2c
wb
y
te
Tem
p
I
2cst
op
Loop
E
nd
Pow
y
ższ
y
pro
gra
m
odczy
tuje
sta
n
k
lawiat
ury
i
zap
al
a
diodę
LED
o
n
ume
rze
odpowiadając
ym
n
aciś
ni
ętemu
p
rzycisk
owi
kl
awiatu
ry, czyli
odcz
ytuj
e
s
t
an
we
jś
ć
pierwszego
u
kładu
PCF8574
i
pr
zesy
ła go n
a
w
y
jś
cia
d
rug
iego
ukł
adu
PCF857
4
C
zęść
6
- W
yświe
tlac
z
LCD
Pr
zyk
ład
6.1
.ASM
NAM
E P0
6_01_ASM_SRC
$
INCL
UDE (AT
MEL/REG825
2.INC
)
P0
6_01_ASM S
EGMENT
COD
E
RSEG
P06_01_ASM
PORTLCD EQU P2
RS
EQU
PORTLCD.2
E
EQU
P
ORTLCD.3
D7
EQU
PORTLCD.7
D6
EQU
PORTLCD.6
D5
EQU
PORTLCD.5
D4
EQU
PORTLCD.4
CL
EA
R E
Q
U 01H
HOME EQU 02H
IN
C
REM
ENT
EQU
04H
D
ECREMENT
E
QU
0
6
H
SHIFTR
I
G
HT
EQU
07H
SHIFTLEFT
EQU
05H
BLINK
EQU
09H
NOBLINK
E
QU
0
8
H
CURON
EQU 0AH
CUROF
F
EQU
08H
DISPON E
Q
U 0
C
H
DISPOFF E
Q
U
08H
SHIFT_CU
RSOR
_LEFT E
Q
U 10H
SHIFT_CU
RSOR
_RI
GHT
EQ
U 1
4
H
SHIFT_DISPLAY_
LEF
T
EQU
18H
SHIFT_DISPLAY_
RIGH
T EQU 1CH
S
TART:
ACALL
LCD_INIT
MOV
DPTR,#NAPIS1
ACALL
WRITE_T
EXT
SJMP $
WRITE_
TO_LCD:
PUSH
ACC ;
zap
ami
ętaj
zawa
rtość
aku
mul
ator
a
na
s
t
osie
S
ETB E
;u
staw na
l
in
ii
E
sta
n
wy
so
ki
ORL
PO
RTLCD,
#0F0H
;us
taw
4
sta
rsze
bity
port
u P1
ORL
A,#0FH
;ustaw
4 m
łodsze
bity
aku
mul
ator
a
ANL PORTLCD,A
;iloczyn
logicz
n
y
port
u
P1 i
ak
umu
lato
ra
;
po
wo
duje
z
mia
nę
tylko
4
st
ars
z
ych
bit
ów
por
tu
4
młodsze bez z
mia
n
CLR
E;opa
dające
zbo
cze
na
E
z
apisu
j
e do rejestr
u
w
yś
wi
etlacza
POP
ACC ;
przywróć
początkową
zawa
rtość
akum
ula
tor
a
SWAP A
;z
amie
ń
m
iejscami
połó
wki
aku
mul
ator
a
S
ETB E
;u
staw na
l
in
ii
E
sta
n
wy
so
ki
ORL
PO
RTLCD,
#0F0H
;us
taw
4
sta
rsze
bity
port
u P1
ORL
A,#0FH
;ustaw
4 m
łodsze
bity
aku
mul
ator
a
ANL PORTLCD,A
;iloczyn
logicz
n
y
port
u
P1 i
ak
umu
lato
ra
;
po
wo
duje
z
mia
nę
tylko
4
st
ars
z
ych
bit
ów
por
tu
4
młodsze bez z
mia
n
CLR
E
;opad
ające
zb
ocze
n
a
E
zap
isuje
do
rejestru
wy
ś
wie
t
lac
z
a
MOV
A,#1
;opóˇnie
nie
ok. 1
ms
LCALL
DELAY
RE
T
WRITE_
COMMAND:
CLR
RS
;0
na
RS
->
za
pis
do
rejestru
ro
zka
zó
w
LCALL
WR
IT
E_TO_LCD
;za
pis
bajtu do r
e
j
e
st
ru
wy
ś
wi
etlacz
a
RE
T
WRITE_
C
HAR:
S
ETB RS
;1
na
RS
->
za
pis
do
pam
ięci
o
bra
zu
LCALL
WR
IT
E_TO_LCD
;
za
pis
bajt
u
do
rejestr
u
w
yś
wi
etlacza
RE
T
WRITE_
TEX
T:
MOV
R7,#0
;w
yz
eruj r
eje
st
r
r7
M0
:
MOV
A,R7 ;p
rze
nie
ś do ak
umu
lato
ra
rejestr
r7
MOVC
A,@
A+DPTR
;pr
ześlij
bajt z
p
amięci
kodu do
aku
mul
ato
ra
JZ M1
;jeśli
t
e
n
bajt jest ze
rem
to
skocz
do
końca
procedury
LCALL
WR
IT
E_CHA
R
;w
yś
wi
etl z
na
k
n
a
w
y
św
iet
l
aczu
IN
C R7 ;z
w
ięk
s
z
ad
res
zna
ku
o
1
AJMP
M0 ;skocz n
a
p
ocząt
e
k
pętli
M1
:
RE
T
D
EFINE_CHARA
CT
ER
S:
MOV
A,#40H ;u
staw
t
r
yb
z
ap
isu
zna
ków
do
pami
ęci gene
ra
tor
a
zn
aków
LCALL
WR
IT
E_COMMAND
MOV
DPTR,#CHA
R_PL
;d
o
DPTR
wpisz ad
res
tabli
c
y
z
definicja
mi
zn
aków
LCALL
WR
IT
E_TE
XT
;i
z
ap
isz
te z
na
ki
do
pam
ięci ge
ner
ator
a
z
nak
ó
w
MOV
A,#80H ;powróć
do t
r
ybu
zap
isu
zn
aków
do
pam
ięci obrazu
LCALL
WR
IT
E_COMMAND
RE
T
LCD_
CL
S:
MOV
A,#CL
E
AR ;
do
akum
ul
ator
a
z
apisz
kod
rozka
zu
czy
szczeni
a
ekr
anu
LCALL
WR
IT
E_COMMAND
RE
T
LCD_LOWERL
INE
:
MOV
A,#0A
8
H
LCALL
WR
IT
E_COMMAND
RE
T
LCD_SHIFT_LEFT:
MOV
A,#SHIFT_DISPLA
Y_LEFT
LCALL
WR
IT
E_COMMAND
RE
T
LCD_SHIFT_R
I
G
HT:
MOV
A,#SHIFT_DISPLA
Y_RIG
HT
LCALL
WR
IT
E_COMMAND
RE
T
CURS
OR_S
HIFT_
LEF
T:
MOV
A,#SHIFT_CU
RSOR
_LEFT
LCALL
WR
IT
E_COMMAND
RE
T
CURS
OR_S
HIFT_
RIGHT:
MOV
A,#SHIFT_CU
RSOR
_RI
GHT
LCALL
WR
IT
E_COMMAND
RE
T
LCD_INI
T:
MOV
A,#0FH
LCALL
DELAY
CLR
E
CLR
RS
MOV
R0,#3
LL:
S
ETB E
ANL PORTLCD,
#3FH
CLR
E
;z
ap
is do wy
ś
wie
tlacz
a
MOV
A,#5
LCALL
DELAY ;czek
aj
ok. 5
ms
DJNZ R0,LL
;powt
ór
z i
nicja
liz
ację
3
r
azy
S
ETB E
ANL PORTLCD,
#2FH
CLR
E
MOV
A,#01H
LCALL
DELAY
MOV
A,#28H
LCALL
WR
IT
E_COMMAND
MOV
A,#08H
LCALL
WR
IT
E_COMMAND
MOV
A,#01H
LCALL
WR
IT
E_COMMAND
MOV
A,#06H
LCALL
WR
IT
E_COMMAND
MOV
A,#0CH
LCALL
WR
IT
E_COMMAND
;L
CAL
L DEF
INE_CHAR
ACTERS
RE
T
D
ELAY:
MOV
R3,A
L1:
MOV
R2,#10
L2:
MOV
R1,#47
L3:
DJNZ R1,L3
DJNZ R2,L2
DJNZ R3,L1
RE
T
CHAR_
PL:
DB
32,
32,
14
,
1,
15,
1
7,
15
,
2,
;
ą
(8)
DB
2,
4
,
14,
16
,
16,
17
,
14
,
32,
;ć
(9)
DB
32,
32,
14
,
17,31
,
16
, 1
4 ,
4,
;ę (
10)
DB
12,
4,
6,
12
,
4,
4,
1
4,
32,
;
ł
(11)
DB
2,
4
,
22,
25
,
17,
17
,
17,
32
,
;ń
(12)
DB
2,
4
,
15,
16
,
14,
1,
30,
32,
;ś (
13)
DB
32,
4,
31,
2
,
4,
8,
3
1,
32,
;
ż
(14)
DB
2,
4
,
31,
2,
4,
8,
3
1,
32,
;ˇ
(
15)
DB
0
NAPIS1:
DB
"ABCDEFGH
IJKLM
NO",0
E
ND
Pr
zyk
ład
6.1
.C
#
inc
lude <
ATME
L/REG8252.H>
#
de
fi
ne
PORT P2
sbit
RS
=
PO
RT
^2;
sbit
E
=
PORT^3;
sbit
D4
=
P
ORT
^4;
sbit
D5
=
P
ORT
^5;
sbit
D6
=
P
ORT
^6;
sbit
D7
=
P
ORT
^7;
void
Delay
(cha
r
k
)
{
c
har
x,y;
wh
ile(k)
{
k
--;
for (
x =
24
8;
x
>
0 ;
x
--);
for (y
=
24
8;
y
>
0 ;
y-
-);
}
}
void
Wri
teToLcd(
c
har
X)
{
E
=
1;
PORT
|= 0xF
0;
PORT
&=
(X
|
0x0F)
;
E
=
0;
E
=
1;
X
<<
=
4;
PORT
|= 0xF
0;
PORT
&=
(X
|
0x0F)
;
E
=
0;
Del
a
y(1);
}
void
Wri
teComma
nd
(ch
ar
X)
{
RS
=
0;
W
rit
eTo
Lcd(X);
}
void
Wri
teC
ha
r(c
ha
r
X)
{
RS
=
1;
W
rit
eTo
Lcd(X);
}
void
Wri
teText
(cha
r
*S)
{
wh
ile(*S)
{
W
rit
eCha
r
(*S);
S
++;
}
}
void
De
f
ineCh
ar
acte
rs(ch
ar
*z
na
ki)
{
W
rit
eC
o
mma
nd(
0x40
);
W
rit
eText(z
na
ki
);
W
rit
eC
o
mma
nd(
0x80
);
}
void
Lc
d
Ini
t(void)
{
c
har
i;
Del
a
y(15);
PORT
=
0x0F;
for (
i =
0;
i<3;
i+
+)
{
E
=
1;
PORT
&=
0x3F
;
E
=
0;
Del
a
y(5);
}
E
=
1;
PORT
&=
0x2F
;
E
=
0;
Del
a
y(1);
W
rit
eC
o
mma
nd(
0x28
);
W
rit
eC
o
mma
nd(
0x08
);
W
rit
eC
o
mma
nd(
0x01
);
W
rit
eC
o
mma
nd(
0x06
);
W
rit
eC
o
mma
nd(
0x0C)
;
}
void
ma
in
(void)
{
LcdIn
it(
);
W
rit
eText("ABCDEFGHI
JKLMN
O");
wh
ile(1);
}
Pr
zyk
ład
6.1
.B
AS
Co
nfig Lcd
=
1
6 *
2
Co
nfig Lcdpin
=
Pin
,
Db4
=
P2.4
,
Db5 =
P
2.5
,
Db6
=
P2.6
,
Db7
=
P2.
7 ,
E
=
P2.3
,
Rs
=
P2.2
C
ursor
Off
C
ls
Lcd "ABCDEFGHI
JKLM
NO"
Do
Loop
E
nd