background image

Programowa

ni

e mik

rokontrolerów 80

51 w 

jez

yku 

C

 

czę

ść 

1

Gdy

 już 

skompletujemy

 

nas

z

 wars

zta

prog

ra

mis

t

yczny

 i

 sp

rz

ęto

wy

,

 por

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

an

ie 

moz

na

 

odraz

zoba

c

z

y

c

 n

a

 

w

ł

a

s

ne ocz

y.

 

Ja

zwy

kle, gdy

 z

aczynam

 p

racę 

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

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

 

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

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

.

t

ym podtem

acie

 

za

pozamy

 

się

 

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

do

 

dan

ej zm

ien

n

e

wartości i

nn

ej 

zm

ien

nej,

 badź 

sta

łej.

/

doł

ączeni

plik

u na

główk

oweg

o

/

zawie

rajac

ego

 d

efini

cj

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

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

w

 

procesora.

 Gdy

b

my

 

tego

 

nie

 z

robili

,

to n

ie

 mogl

ib

yśm

y

 odwo

ły

wa

c

 

się do rejestrów

 

proces

ora

 z

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

b

ob

y

 

bardzo 

niewy

go

d

n

e

. Ja 

w

 n

as

z

ym 

pr

z

ykła

dzie

doł

ącz

yłem

 

pli

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 

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

dan

ego

 

mi

kroko

ntro

ler

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

8051.

h

.

K

ażdy

 p

rogr

am

 

pisany w

 

jęz

yku

 C

 mus

się

 

skła

dać 

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

j

est p

rzek

azy

wan

żad

na

 

wartość, 

wi

ęc

 fun

kcj

ę

 

 

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

background image

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

ona

 p

rzyjmo

wać

 

ora

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

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 

zal

eżą 

one 

o

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

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

ciąg

i

e

zn

aków

 

'0x'

.

Po

 

za

pisa

ni

u

 do

 

port

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

w

yk

on

yw

ana 

ta

długo, 

 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

j

est war

tością st

ałą

re

preze

nt

ującą 

pr

awdę

 

logiczn

ą,

 

to

 

na

sza

 

pętla

 będzie s

wy

kon

y

wała

 

bez

 

końca.

Funkcje

 logi

czne.

Wyz

erowanie 

od

powi

edn

i

c

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

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,

 

zmi

en

 B

 

jako

 

mas

 

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 

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

 wa

rtość

 0

W

 

pr

zeciwnym

 

przypadku

 sta

n

 

bitu

r

eje

st

ru 

sie n

ie 

zm

ien

i.

 

Rz

eczą 

waż

 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

i

locz

ynu log

iczn

eg

o jest

 

pr

zedst

awion

y

 

poniż

e

:

/

doł

ączeni

plik

u na

główk

oweg

o

/

zawie

rajac

ego

 d

efini

cj

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

portu P

ze 

stałą

 55h

P

&= 

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 :

background image

P

&= 

0x

55;

Jest to 

skrócon

y

 z

api

s n

as

tepującego

 

w

yrażen

ia

 :

P

P0 

0x5

5

;

Języ

k

 

umoz

liwia 

sto

sow

an

ie

 

sk

róc

ony

ch wyrażeń,

 będąc

ych

 

połączeni

em 

op

e

rator

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

+=

 b

a

 =

 a

 +

 

b

od

ejmow

an

i

e

-= 

b

a

 =

 

- b

m

noż

enie

a

 *=

 b

a

 * 

b

dziele

nie

/=

 b

a

 =

 a

 

b

ilocz

yn log

iczny

a

 &= 

b

& b

suma

 l

giczn

a

|= 

b

| 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

^=

 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 

oc

zy

wiś

cie

 bity

 do

 

ustawie

nia

 m

uszą

 m

ieć wart

ć

 

0.

P

rogra

m

 p

rze

dstawiony

 jest

 

poni

żej

 

:

/

doł

ączeni

plik

u na

główk

oweg

o

/

zawie

rajac

ego

 d

efini

cj

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

stan ni

ski

P

0;

/

suma 

logi

czna 

portu 

P0

 z

e

 

stał

ą 

F0h

P

|= 0

xF

0;

/

pusta 

pęt

la

 ni

eskończona 

zatrzym

anie

 porgra

mu

wh

ile(

1);

}

nas

zym

 

prog

ra

mie

 pojawił

 

się dodat

ko

w

y

 

wi

e

rsz kodu 

P

0;

background image

Ustawia o

n wsz

ystkie

 

lin

ie 

port

P0 w

 

stan

 n

iski

.

 Pon

i

ewa

ż

 

chcemy

 

li

nie

 po

rtu

 P0 

ustawić

 

wię

c

 

mus

zą 

b

 

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

lin

ii

 w

 

stan

 

w

ys

oki

 re

ali

zuje

po

niżs

z

y

 

kod

 

:

P

|= 0

xF

0;

Ponownie z

astoso

wałem skrócony

 

za

pis 

łacz

ąc

y

 

op

er

ator

 p

rzypisa

nia

 

operato

rem 

sumy

 

logicz

nej.

Programowa

ni

e mik

rokontrolerów 80

51 w 

jęz

yku 

C

 

czę

ść 

2

dru

giej części

 

ku

rsu 

pro

gra

mowani

zapo

zn

amy

 

się z

 ob

sług

ą k

lawiatu

ry.W

 

tym

 

c

e

l

musi

m

y

 

podłąc

z

 

do

u

kładu

 

poprzed

niej 

czę

ści k

ursu

do

 

portu

 P3

8 p

rzycisk

ów

 

w

 sposó

b

 pokaz

any

 

na

 pon

izszym rysunk

:

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

do

 

masy,

 

co

 wy

my

s

za n

a

 

w

y

prowa

dzen

iu 

port

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 

tak

że w

 

bardzo 

popula

rny

m AT

89C20

51 z

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

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

plik

u na

główk

oweg

o

/

zawie

rajac

ego

 d

efini

cj

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

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ę

 

:

background image

P

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 

port

P3 do por

tu 

P0.

Instrukc

ja wa

r

unkowa if

Te

ra

z

 poz

namy

 

bard

zo waż

 i

nst

ru

kcję

 wa

run

ko

wą 

if. S

łuży

 

on

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

plik

u na

główk

oweg

o

/

zawie

rajac

ego

 d

efini

cj

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)

{

/

tla

 

nieskoń

czona

wh

ile(

1)

{

/

jeś

li 

P3

.0

 je

st 

stanie

 n

iskim

 

i

f(P3_

== 

0)

/

to 

ustaw

 na 

P0.0

 

stan 

niski

P

0_0 

0;

/

jes

li 

P3

.1

 je

st 

stanie

 n

iskim

i

f(P3_

== 

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)

nawi

asac

o

k

rąg

ł

ych 

po

 s

ło

wie

 if u

mieszc

z

on

o

 

waru

ne

.

 Wa

ru

nki

em

 mus

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

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

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

w

 jezy

ku

 

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

Pascal 

z

 początk

u ba

rdzo ł

atwo

 s

 

myli

 

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

w

yk

onanych m

a

 b

 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

 {}

:

background image

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

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

b

 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)

przykła

do

wy

m

 p

rogr

am

ie 

w

y

korz

ys

t

amy

 

pętlę for do wy

genero

wani

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

.

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

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 

tla

 zost

anie 

wy

konana 

x-razy

f

or( ; 

> 0

; x-

-)

/

ta 

10 

razy

f

or(a =

 0

;

 

10; 

++a)

/

ta 

100 

razy

f

or(b =

 0

;

 

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

LED

P

0x55;

/

odcz

ekaj

 pe

wie

n o

kres 

czasu

c

zekaj

(250)

;

/

zapal

 i

n

n

ą

 

ko

mbina

cję

 d

iod

 LED

P

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 

t

ym

, co

 n

api

sa

łęm 

w

 

pierwszej

 części ku

rsu

funkcja

czek

aj

 

nie

 zwr

aca 

zad

nej 

wartości (void)

 

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

(mn

iej-więce

j

 w

 

mil

iseku

nda

ch)

.

P

rzyjrz

yjm

y

 

sie pi

erwszej

 pętl

f

or 

:

background image

f

or( ; 

> 0

; x-

-)

B

rakuje tut

aj 

częś

ci i

nic

jali

zacji 

zmi

en

nej 

licz

nikowej

, pon

ieważ t

ą 

zmi

en

 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

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( ; 

; ;

 )

taki

m

 p

rzypadku 

pętl

ta 

będzie

 

w

yk

ony

wana bez

 

końca

.

N

asza

 funkcja 

op

óźn

iaj

ąca sk

łada

 s

 

tr

zech

 

zag

nie

żdzo

ny

ch 

pętli

 for. 

Ww

yniku

 

tego

 

łąc

zny

 

czas

wy

kon

y

wania

 tyc

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

co

 pr

awda

 odcz

ytać

 

pliku

 

*.as

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 

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

po

c

z

ą

tko

wy

ch

 

oraz

 ko

ń

cow

yc

h

 

kompi

lato

nie

 z

astosuje

 in

n

ego

kodu

. T

ak 

wię

c

 

gene

rowanie 

op

óźni

 z

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ę

ść 

Instrukc

ja sw

itch 

prep

rocesor.

s

ytuacji, gdy

 c

h

c

em

y

 sp

rawdz

 

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

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

,

 

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

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

plik

u na

główk

oweg

o

/

zawie

rajac

ego

 d

efini

cj

rej

estrow

/

wewn

etrzny

ch pro

cesora

#

inclu

de 

<805

1.h>

/

zdefi

niowan

ie

 al

terna

tywn

ej 

nazwy 

portu 

P2

#

defin

klawi

atur

a

 

P2

/

zdefi

niowan

ie

 al

terna

tywn

ej 

nazwy 

portu 

P0

#

defin

diod

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

background image

d

iody

 =

 0xFF;

/

zależnos

ci 

od w

ciś

nięt

ego

 przyci

sku

/

zapal

 o

dpowie

dnią

 dio

 LED

sw

itch

(kla

wiatur

a){

c

ase 

254 

diod

= 1

27; 

break;

c

ase 

253 

diod

= 1

91; 

break;

c

ase 

251 

diod

= 2

23; 

break;

J

ak z

apewne z

auważył

eś, pojaw

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

ci 

liczbo

wej

 l

ub,

 

jak 

w

 n

as

z

ym p

rzypadk

u, 

do

 

określeni

"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

plik

ź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

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

mów

iący

ch o

 

ich

 

pr

zezn

ac

z

e

ni

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

 

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

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

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

 

pr

z

ypa

de

nac

iśn

ięci

a k

ażdego

 

pr

zyci

sków

 

o

so

bno. Pon

i

eważ 

n

aciś

nięcie

p

rzycisku

 

je

st 

s

ygna

lizowane 

w

ym

uszenie

na

 

lin

ii

,

 

do

 

której jest

 

podłączony

 st

an

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

przypisa

ni

e do port

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

za

 pomocą

s

ł

owa

 

kluczow

ego

 

break

. W 

podo

bny

 

spo

b

 sp

rawdz

amy

 pozostałe 

siedem pr

zypadkó

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

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

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ć 

dzie 

bardzo 

kłopotiw

e. Tym bar

dzie

j, że 

nie

 będziemy

 

mogl

i u

ż

 m

ach

an

iz

mu

"

zn

ajdż

/za

mie

ń"

ponieważ 

ła

t

wo

 

zm

ien

imy

 

nie

 

t

e

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

background image

#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 

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

o

 pozyc

 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

 

pr

z

ycisków

 oso

bno.

#

inclu

de 

<805

1.h>

/

zdefi

niowan

ie

 al

terna

tywn

ej 

nazwy 

portu 

P2

#

defin

klawi

atur

a

 

P2

/

zdefi

niowan

ie

 al

terna

tywn

ej 

nazwy 

portu 

P0

#

defin

diod

P0

/

#

defin

S1 25

4

#

defin

S2 25

3

#

defin

S3 25

1

#

defin

S4 24

7

#

defin

S5 23

9

#

defin

S6 22

3

#

defin

S7 19

1

#

defin

S8 12

7

/

/

#

defin

D1 2

54

#

defin

D2 2

53

#

defin

D3 2

51

#

defin

D4 2

47

#

defin

D5 2

39

#

defin

D6 2

23

#

defin

D7 1

91

#

defin

D8 1

27 

/

głó

wna fu

n

k

cja

 progra

mu

v

oid

 ma

in(v

oid)

{

/

pęt

la

 ni

eskończona

background image

wh

ile(

1)

{

/

zgaszeni

e d

iod 

LED

d

iody

 =

 0xFF;

/

zależnos

ci 

od w

ciś

nięt

ego

 przyci

sku

/

zapal

 o

dpowie

dnią

 dio

 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

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

kompila

tor

 (

gd

yb

y

 pomi

nąć

 p

roc

es

 

pr

zetwa

rza

ni

a

 

plik

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

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

;

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

tabl

ica[

0];

c

zekaj

(250)

;

background image

P

tabl

ica[

1];

c

zekaj

(250)

;

P

tabl

ica[

2];

c

zekaj

(250)

;

P

tabl

ica[

3];

c

zekaj

(250)

;

}

}

P

rogra

m

 t

en

 m

za

 z

ada

ni

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

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

 w

 

w

yk

onan

iu 

pr

ogr

amu

.

 P

rogra

m

 g

łó

wny

 

opiera

 s

 

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ę 

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 

dz

ie

 

się

sk

łada

ć

 

ki

lkun

as

tu,

 

lub naw

et ki

lkudz

iesięciu ele

mentów,

 

to

 

pr

zepi

s

yw

an

i

elementów

 

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

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 

tla

 zost

anie 

wy

konana 

x-razy

f

or( ; 

> 0

; x-

-)

/

ta 

10 

razy

f

or(a =

 0

;

 

10; 

++a)

/

ta 

100 

razy

f

or(b =

 0

;

 

25; 

++b);

}

v

oid

 ma

in(v

oid)

{

c

har i;

wh

ile(

1)

{

f

or(i 

= 0

; i

 <

 4; 

i++

)

{

P

tabl

ica[

i];

c

zekaj

(250)

;

}

}}

Licz

ni

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

d

ostęp do z

mie

nn

ej wskazy

wane

j p

rzez

 

w

skaź

ni

na

lezy

 

uży

ć

 oper

atora

 

w

yłu

skan

ia

 

*, 

na

 pr

zykład

po

niżs

za

 in

st

ri

kcja 

background image

*

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

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

na

 

in

n

ą

 

zmi

en

,

 

jakb

y

 

ni

e m

ożn

a

by

ło

 

się posługiwać

 

tylko

 

 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

na

 

ra

zie

 u

ż

yje

my

wskaźi

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

*wskaznik+

+;

c

zekaj

(250)

;

P

*wskaznik+

+;

c

zekaj

(250)

;

P

*wskaznik+

+;

c

zekaj

(250)

;

P

*wskaznik+

+;

c

zekaj

(250)

;

}

}

Reali

zuje

 

on 

dokładn

ie 

tak

ą 

sam

ą 

funkcję

 

jak pi

erwsz

y

 p

rogr

am

 

tej

 

częśc

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

o

 

de

k

lar

o

wan

iu

 wskaźn

ik

wskazuje

 o

n n

a

 

t

yp

 

cha

r

 

um

ieszczony

 

w

 p

ami

ęci

p

rogr

am

cod

e. 

J

ed

nak

 sa

mo

 

zade

klar

o

wa

ni

e

 

wskaźn

ika

 

nie

 pozwol

na

m

 

na

 

jeg

o

 

uży

wanie.

 Wtym

 

momecie

n

as

ws

k

aźn

ik

 n

ie 

pr

zechowuj

e

 

żadn

ego ad

resu

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;

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

sz

y

 z

apis

p

rze

pisuje

 

do

 

j

ed

neg

o wskaź

nik

zawa

rtość

 

in

ne

go

 

wskaźn

ik

a.

 Aby

 w

 

ja

w

n

y

 sposó

b

 do

 

wskaźn

ik

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];

tu

 z

nów

 m

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

:

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,

 

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

w

skaź

nik

i

 n

ale

żą

 do

n

ajt

rud

n

iejszy

ch 

zag

adn

ień

 w

 

zyku

 C 

i

 bar

dzo często

 

spr

awiają 

problem

y

 

po

cząt

kujac

ym

 

prog

ra

mis

tom.

 

background image

C

zęść

 1 

- S

terowanie

 diodami

 

LED

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

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

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

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

0

void

 

ma

in

(void)

{

L

ED1 =

 0;

 /

ustawien

ie p

inu

 

P0.0

 w

 

sta

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:

przykła

dzie 

1.1

 włączen

ie diody

 

LED 

D1 n

ast

ępuje

 p

rze

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

CLR

 

(an

g.

 

Clear

)

s

łuży

 

w

yłą

c

znie 

do

 

zerowani

wsk

a

Ąnik

pr

zen

iesie

ni

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

 

najp

ierw t

rz

e

ba

 z

adekla

rować

 

zmi

en

 

o

 

w

y

bran

e

j n

azwi

e

 

(

w poda

nym

 

pr

zykładz

ie "LED1

"

)

.

N

astępn

ie z

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

bitu 

portu

 s

łuży

 

in

st

ruk

cja "RESET

".

każdym z

 języ

w

 

do

 

zre

ali

zowani

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

w

background image

p

am

i

ę

c

i

 z

a

j

muje

 

każdy

 

pro

gra

m.

 

Plik

w

yniko

we

 

prog

ra

mu

 (

*.HEX) zosta

ł

y

 

zdi

asemblo

wane 

przy

 

użyciu

p

rogr

am

D51.

Pr

zyk

ład 

1.1

.ASM

.D51

;

;

 D

51 V2.

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.

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.

8051 

Disassembly

 of

 ba

s

.

hex

;

 1

0/11/2

003

 16

:58

;

o

rg 0

;

lj

mp 

X002e

;

r

eti

 

;

background image

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

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

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 

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 

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

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

 o

na 

użyta

 

to lep

sz

ym

 

rozwią

za

nie

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

 

procedur

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

w

ewnętrz

nej pa

mię

c

RAM

 

mik

rokon

trol

era

któ

rej

 

zawar

tość

 po włączen

iu 

za

sila

n

ia

mo

że

 

b

 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

pro

gra

mu

 i

nic

ju

j

ą

cego

 

mik

rokont

role

zn

ajduje się w

 

kat

alog

iu kom

pila

tor

i

ba

rdz

iej

 

doci

ekl

i

wi 

cz

ytelnicy

 

tego

 

kurs

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

background image

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

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

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ą

ba

j

t

ów

 

pa

mięci 

prog

ra

mu,

 

co

 w

 

niek

tórych

 

pr

zypadkac

może

 

b

 zbawien

ne.

P

roc

edur

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

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

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ć 

po

w

yżs

zego

 porówna

nia

,

 

najwięce

j

 n

iepot

rzebnych in

st

ru

kcji ge

ner

u

je Bascom. W 

j

est o

 

wiele

le

piej

 n

 

w

 

Basc

omie, a

le i

 

tak

 dużo 

gorzej n

 

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

pro

gra

mu

pop

rzez

 pro

gra

m

 a

semblera 

generowa

nia

 jednocześnie 

plik

*.SRC do ka

żdego pl

iku

 *.C

w

 na

st

ępnych

p

rzykład

ach

 wy

ko

rzys

ta

m

y

 

tą 

funk

c

 

zam

ia

st 

di

asemblo

wani

plik

*HEX

 

(chyb

a, 

że za

jdzie 

tak

potr

zeba).

Pr

zyk

ład 

1.2

t

ym p

rzykład

zie 

na

uczym

y

 

się wy

ko

rzy

sty

wa

ć

 a

li

as

y

 

naz

w (

tzn

.

 

dzi

e

my

 da

nem

pin

owi

 

port

u p

rzypisy

w

i

nn

ą

 n

azwę i

 w

 

p

rogra

mie

 odw

oły

w

 

się

 

do

 

tego

 

pin

u

 popr

zez 

 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.

mi

 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

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

 funkcję. Za

mias

męcz

 

sie z

 tymi 

kilk

uset i

nst

ru

kcjami

 

prz

eo

czy

ć

 połow

ę

background image

z

 n

ich

 lu

b

 

pop

nić 

wiel

e

 

in

nych

 błedó

w,

 

zm

ia

ni

amy tylko

 dekl

ara

cję

 

ali

asu

. Jest 

t

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

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

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

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

l

og

iczna

 jed

ynka 

t

ylko

 

wt

edy,

 

gdy

 ob

yd

wa

 

par

am

etry fun

kc

ji 

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,

 

nawet 

kilk

diod z

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, 

ni

na

 

poj

edy

nczy

m

 

bicie, możemy

 to

wy

korz

yst

a

ć

 do z

mi

any st

anu

 

kilk

bitó

w

 

portu 

jednocześnie. 

W te

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

 

"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

background image

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

j

est

ba

rdzo 

es

tetyc

zne 

użyt

eczne,

 chocia

ż 

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

ć

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

 

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

port

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

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

 

ś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

background image

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

po

wy

ższ

ym

 p

rzykład

zie s

tan

 

lin

ii

 por

tu 

P2 

j

est kopiow

a

n

y

 

do

 

portu

 P0.

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

 

ob

sza

ru 

ad

reso

wanego bezpo

ś

rednio l

ub

 

z

obszaru

 r

ej

est

w

 

SFR

 do komórk

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" 

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ł

zr

eal

izowan

poprze

uży

cie

 i

nst

ru

kcji "wh

ile(1)" 

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" 

"LOO

P

"

które 

rea

li

zują

 pęt

 

nie

skończon

ą.

 

P

rzep

rowadˇm

y

 

ter

az

 a

na

li

zę 

kodu wy

nikow

ego

 

po

w

s

z

ego

 p

rogra

mu

 

w

y

generow

a

neg

o popr

zez 

ka

żdy

 z

u

ż

yty

ch kompi

lato

w.

Pr

zyk

ład 

2.1

.ASM

.D51

;

;

 D

51 V2.

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 # 

;

$@$

C_SOU

RCE_LINE(6)

MOV 

P0,P2

SJMP ?WHI

LE1

background image

;

 EN

D OF 

mai

n

Pr

zyk

ład 

2.1

.B

AS.

D51

;

;

 D

51 V2.

8051 

Disassembl

y

 of

 bas.

hex

;

 10

/28/2

003

 19

:06

;

.

 

; Pomi

nię

te zost

y

 

in

st

ruk

cj

e

 

powr

otu 

.

 

; z

 

podprogr

amów

 

o

bsługi 

prz

erwa

ń

.

X0

02e: mov

 

r0

,#0ff

h

cl

a

X0

031: 

mov

 @

r0

,a

dj

nz

 r

0,X0

031

mov

 

sp,#

21h

mov

 

20h

,#

0

;

 Tu

taj 

rozp

o

czyna s

 

właściw

y

 pro

gra

m

X0

03a:

 mov

 

p0,p

2

lj

mp 

X003a

;

cl

ea

X0

042: 

sjmp 

X0042

;

e

nd

Kompi

lato

każ

dego

 

jęz

yk

ów

 użył

 

do

 

zr

eal

izowani

podan

ego

 

zad

an

ia

 

je

d

nej

 

ins

tr

uk

c

j

i

 

"MOV di

rect1

,

d

irect

2", 

wię

c

 

zre

ali

zował to 

zada

ni

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

 i

ns

tr

ukcję

 

"SJMP"

 

e

wentu

aln

ie

 ta

kże 

dwu

bajto

 

ins

tr

ukcję

 

"AJMP". 

Ś

w

i

adc

z

y

to o tym, 

że Bascom

 

nie

 sp

rawdz

zakr

esu 

skoku

 

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

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

background image

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 

The

n

 

R

eset

 

LED

If S2 

The

n

 

Set

 

LED

Loop

E

nd

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

tą 

diodę.

Pr

zyk

ład 

2.3

.ASM

NAM

E P0

2_02_ASM_SRC

background image

$

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 

The

n

 

L

ed1 

N

ot 

Le

d1

Loop

E

nd

Op

is:

N

asz 

prog

ram

 

ni

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

diod

y

 sp

ada,

 

co

świadczy

 

o

 

t

ym

, że 

dioda 

j

est n

a

 

prz

emi

an

 za

pal

an

a

 

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

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

background image

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; 

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 

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

pętl

L2. 

Ins

tru

kcja 

"

MOV 

R0, #

255" 

służy

 do

us

tawieni

licz

ni

ka

 

pętli 

L1. 

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ń

background image

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.

j

ęzy

ku C 

procedur

opó

ˇ

niając

a wy

gląda n

as

tępująco:

void

 

czekaj(v

oid)

{

c

har

 x,y;

for (

x =

 25

5; 

0; 

--x)

for (y

 =

 25

5; 

y

 

0; 

--y);

}

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

arc

hit

ektu

 m

ikro

kontr

oler

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

 z

 re

al

izując

a t

ą 

sam

ą 

licz

b

ę

 

po

wtórzeń

 

pętla

 "for(x =

 

0; 

x <

 

255,

 +

+x)".

j

ęzy

ku BASCOM

 

do

 

op

óˇn

i

e

ni

w

yk

orzy

sta

na

 zosta

ła

 specjalnie 

do

 

tego

 

celu

 

pr

zezn

ac

zon

in

str

ukcja

"WAI

TMS

 

x".

 Jest on

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

w

 

przypadk

u C 

i

 asemblera

.

Porównajmy

 

ter

az

 

kod

 

w

yniko

w

y

 tych tr

zec

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

 

t

rzec

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

 BASCOM’ie 

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.

8051 

Disassembl

y

 of

 bas.

hex

;

 2/

16/20

04 

13:

07

;

.

 

; Pomi

nię

te zost

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

a

X0

043: 

mov

 @

r0

,a

dj

nz

 r

0,X0

043

background image

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

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

ęść 

- w

yświetla

cz

 si

edmi

osegmentowy.

c

elu 

w

yk

onan

ia

 ćwiczenia

 

na

leży

 wy

kona

ć poł

ączeni

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);

}

background image

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

wienie:

Pow

y

ższ

y

 

pro

gra

m

 powo

duj

e

 

zaświece

n

ie

 

wsz

yst

kich

 segmen

tów

 

w

wi

etlacza

 W1.

 Ustawienie s

tan

nis

kie

g

o

n

a

 

lin

ii

 P2.

0 (

W1) wprowa

d

za 

tr

an

zystor 

w

 

sta

n

 n

asyc

eni

na

 

an

odę

 

w

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

t

ym p

rzykład

zie 

zajm

i

e

m

y

 

się wy

ś

wi

etlenie

na

 

w

wi

etlaczu 

kol

ejno cy

fr

 

kodu

 

szesn

astkow

ego

 

(0.

.F).

Sposó

b

 poł

ąc

z

enia

 

po

szczególnych

 

segmen

w

 

w

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

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

background image

_

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

_

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:

background image

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; 

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();

background image

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

_

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

background image

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

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

wc

ześniej ro

zmi

ary kodu 

w

ynik

owe

go

tych p

rogr

amów: 

BASCOM

 

- 1

97 bajtów

 

127 

ba

jtów

 

ase

m

bler

 - 

93 

bajt

y

 

Tym r

aze

pro

gra

m

 w

 

Bas

comie za

jmuje

 

ni

ec

o pon

ad 

razy więce

j

 n

 

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

background image

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; 

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 

As

 

B

yt

e

Reset

 W

1

Do

For 

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

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

 

ł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

 

koniecz

ne by

ło

z

astoso

wan

ie

 

łącz

nie

 t

rzec

poleceń. 

W

 

pie

rw

szej

 

kolejn

ości za

dekla

rowano z

mi

en

 

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

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 

tab

lic

y

 w

 

jęz

yk

u C 

jest

 

dos

skomp

likow

a

ne

 

w

 

poró

wn

an

iu 

z

 Basco

mem.

 Pyzat

ym, 

w

skaˇ

nik

są 

je

d

n

ym z

 t

ru

dn

iejszy

ch do z

rozu

mie

nia

eleme

ntów

 

jęz

yka

 

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

 

 

o

siem 

ins

tr

ukcji:

background image

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

do

 

w

skaˇ

nik

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

 jako

 

16-

bit

ow

y

wskaˇn

ik

 jest

 

rejestr

 DPT

R.

 

W n

o

wszy

ch wersja

c

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

100%

 komp

aty

bilności kodu 

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

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

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

pomo

c

ą

 

ins

tr

ukcji

"MOVC 

A, 

@A

+DPTR"

 

jest

 

sumą

 z

awar

tości

 

aku

mul

ator

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

P0. 

Prz

ed powt

ór

zenie

pętli

 mu

simy

 jeszcze

 

zwiększ

 

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

tablicy)

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

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

sto

 

stos

owane

 

jes

sterowanie 

mul

tip

lekso

wane

. O

zna

cza

 to,

że 

ka

t

ody

 odpow

iednic

segmentów

 s

ą połączo

n

ra

ze

do

 

w

ypr

owadz

 s

t

e

rujący

ch, 

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

background image

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; 

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;

background image

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

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

wi

etlaczy,

 

ab

y

 

lepiej

 

uz

m

ysłow

 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

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

background image

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;

background image

void

 

czekaj(cha

r

 

k)

{

c

har

 x,y,z;

for (

k; 

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

background image

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

dzię

ki bezwł

a

dności lud

zk

iego

 

oka. 

J

ed

nak

wadą 

sterowani

mul

tip

leksowanego

 jest, 

c

o

 

za

p

ew

ne

 

widać, m

ni

ejsza 

jasność

 

ś

wiecenia

 wy

ś

wi

etlaczy

.

bi

ąc

ym

 

przykła

dzie 

zmody

fik

owana 

został

procedura

 

op

óˇn

iająca.

 

Li

c

z

 

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

ć 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

zap

e

w

nia

 opóˇnien

ie 

od

 

1 do 25

6ms.

C

zęść

 4 

- M

agi

stral

I2C

t

ym ćwiczeniu 

w

yk

orzy

stamy

 dwa doda

tko

we

 uk

łady

 scalo

n

ty

pu 

P

CF8

574A 

produ

k

cji fi

rmy

 

Ph

ilips

.

Ukła

d te

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

ć

 

pierwszego

 

ukł

adu 

podłącz

amy

 d

iod

y

 

LED, 

do

 

dr

ugie

g

o u

kłądu

n

as

 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

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

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ę

 

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

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

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

background image

ACALL

 

DELAY

MOV 

C,SDA

RE

T

;

;

 P

roc

edur

odcz

ytują

ca 

ba

jt 

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

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

w

ys

y

łają

ca 

ba

jt 

na

 

ma

gist

ra

lę 

I2C.

;

 St

an

 

bitu 

ACK jest

 

zwrac

any

 

poprze

w

skaˇn

ik

 p

rze

nie

sieni

a

 C.

;

 Bajt 

d

o wy

słani

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};

background image

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();

background image

}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

w

a

semblerze i

 

zyk

u C.

background image

asemblerze 

dołączen

i

e

 wsp

om

nia

nego wcze

ś

niej

 

plik

podstaw

ow

ym

i

 

procedur

ami

 

nas

pił

o

 

pr

zy

 u

ż

yciu

dyrekty

w

y

 

"$INCLUDE". Dyr

ekty

wa

 t

pow

oduj

e

 wstawian

iu 

w

 

je

j

 

miejsc

e

 

pr

zez

 kompi

lato

asemblera

z

awar

toś

ci 

plik

w

ska

zane

g

 dyrekt

yw

ą. T

ak

 więc

 dwa fizy

czne 

plik

zawier

ające

 

kod

 

ˇró

dło

wy

 

w

 czas

ie

komp

ila

c

ji 

są 

łączo

n

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

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

P04_0

1_ASM_S

RC.A5

1 um

ieszczona

 

tam

 

de

k

lar

acja 

jest

 

koniecz

na

 do

pop

rawnego

 

dzi

an

ia

 pr

oc

edu

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

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

 "#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

I2C

.C.

 

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

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 

j

est n

ajbar

dzi

ej

 

wido

czna

.

 Aby

 

korzystać

 

ma

gist

ra

li

 

I2C

 ni

potrz

e

bujemy

 z

nać

 dokł

adn

ie

p

rotokołu

 

tr

an

sm

isji

w

ys

tarc

z

y

 

t

ylko

 podł

ącz

 do

 

procesora 

od

powi

ednio 

lin

ie 

SDA i

 SCL 

możemy

 

w

 

p

rost

y

sposó

b

 ste

ro

wać

 

ukła

dam

i

 p

rze

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"

background image

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

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

 

zap

al

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

ć

 

pierwszego

 u

kładu

 

PCF8574 

pr

zesy

ła go n

a

 

w

y

cia

d

rug

iego

 

ukł

adu

 PCF857

4

C

zęść

 6 

- W

yświe

tlac

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

background image

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

 

sta

n

 wy

so

ki

ORL

 

PO

RTLCD,

#0F0H

 ;us

taw

 

sta

rsze 

bity

 

port

u P1

ORL

 

A,#0FH

 

;ustaw 

4 m

łodsze

 

bity

 

aku

mul

ator

ANL PORTLCD,A 

;iloczyn

 

logicz

n

y

 

port

P1 i

 ak

umu

lato

ra

;

po

wo

duje

 z

mia

 tylko

 4 

st

ars

z

ych 

bit

ów

 por

tu 

młodsze bez z

mia

n

CLR

 

E;opa

dające

 

zbo

cze

 

na

 E

 z

apisu

j

e do rejestr

w

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

 

sta

n

 wy

so

ki

ORL

 

PO

RTLCD,

#0F0H

 ;us

taw

 

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

P1 i

 ak

umu

lato

ra

;

po

wo

duje

 z

mia

 tylko

 4 

st

ars

z

ych 

bit

ów

 por

tu 

młodsze bez z

mia

n

CLR

 

E

 ;opad

ające

 

zb

ocze

 n

a

 

zap

isuje

 

do

 

rejestru

 wy

ś

wie

t

lac

z

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

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

do

 

rejestr

w

wi

etlacza

RE

T

WRITE_

TEX

T:

MOV 

R7,#0 

;w

yz

eruj r

eje

st

r7

M0

background image

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

wi

etl z

na

k

 n

a

 

w

y

św

iet

l

aczu

IN

C R7 ;z

w

ięk

s

ad

res 

zna

ku

 

o

 1

AJMP 

M0 ;skocz n

a

 

p

ocząt

e

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

zn

aków

LCALL

 

WR

IT

E_COMMAND

MOV 

DPTR,#CHA

R_PL

 ;d

o

 

DPTR

 

wpisz ad

res 

tabli

c

y

 

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

z

apisz

 kod 

rozka

zu

 czy

szczeni

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

background image

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 

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; 

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; 

background image

E

 

1; 

<<

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);

}

background image

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 ,

 

P2.3

 ,

 Rs

 

P2.2

C

ursor

 Off

C

ls

Lcd "ABCDEFGHI

JKLM

NO"

Do

Loop

E

nd