CapMicrocontr8051 PDF
CapMicrocontr8051 PDF
Page 2 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
intervin variabile cu două stări ca în cazul manipulării comenzilor numerice care pot avea doar
două niveluri: 0 sau 1.
În concluzie UAL poate opera cu date pe 1, 8 şi 16 biţi.
P2 LATCH
R
PORT 2
128 x 8 4k x 8 PCH DPH
A
RAM ROM
R PCL DPL
P0 LATCH
INTERNAL BUS
IR
A
PLA
TMP1 TMP2 B
CONTROL
P
S ALU
W SP
INTERNAL BUS
TCON IE
P0 LAT CH SCON IP P3 LAT CH
TMOD
PORT 0 SBUF INTERRUPT PORT 3
TL0
SBUF CONTROL
TH0
SERIAL PORT TL1
TH1
TIMER CONTROL
Acumulatorul şi PSW
Arhitectura lui 8051 este orientată pe acumulator. Acumulatorul (A) conţine unul din
operanzi, iar după execuţia operaţiei conţine rezultatul. El este folosit la unele operaţii de transfer
Page 3 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
de date fiind utilizat obligatoriu la operaţii de transfer cu memoria RAM externă, la rotaţii, calcul
al parităţii, test cu zero, etc.
Deşi arhitectura este bazată pe acumulator există instrucţiuni de transfer la care sursa
poate fi orice locaţie din memoria internă, iar destinaţia poate fi orice registru sau locaţie de
memorie, regiştrii pot fi încărcaţi cu o constantă, ş.a.m.d..
Registrul PSW (Program Status Word) conţine câţiva biţi de stare (indicatori
condiţionali) care reflectă starea curentă a UCP. Indicatorii condiţionali sunt afectaţi de execuţia
unor instrucţiuni. Registrul PSW trebuie salvat prin program înainte de servirea rutinelor de
cerere de întrerupere alături de PC şi DP:
MSB LSB
P - OV RS0 RS1 F0 A C
7 6 5 4 3 2 1 0
C- flag (indicator) de transport setat hard/soft de anumite instrucţiuni logice şi
aritmetice.
A- flag (indicator) de transport auxiliar indică transport sau împrumut la/de la nibbel-
ul superior.
F0- flag (indicator) definit de utilizator.
R0, R1- biţi de selecţie a celor 4 bancuri de registre din RAM; setaţi sau resetaţi
software.
OV- flag (indicator) de depăşire a capacităţii de reprezentare.
P- flag (indicator) de paritate.
Regiştrii de uz general
Microcontrolerul foloseşte patru bacuri de regiştri situaţi în memoria RAM, fiecare banc
conţinând 8 regiştri, notaţi R0 ÷ R7. La un moment dat procesorul lucrează doar cu registrele din
bancul de memorie curent. Instrucţiunile care adresează registrele folosesc 3 biţi pentru
specificarea registrului.
Regiştrii speciali
În memoria internă, în zona de adrese 80H÷FFH, este definită o arie de regiştri cu funcţii
speciale (SFR – Special Function Registers). O parte din adrese sunt rezervate pentru dezvoltări
ulterioare. Unele dintre registre permit accesarea pe bit, iar altele doar pe octet. Câteva dintre
aceste registre sunt:
Page 4 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
registru de 8 biţi. Memoria RAM internă pentru date are capacitatea de 128 sau de 256 octeți.
Atât memoria RAM, cât şi memoria ROM pot fi extinse în exterior până la 64 Kocteţi (memorie
internă + memorie externă), situaţie în care există o singură magistrală de adrese de 16 biţi, o
singură magistrală de date de 8 biţi, dar semnale de control diferite pentru cele două memorii.
Memoria externă pentru programe (ROM/RAM) este selectată cu semnalul PSEN (Program
Store Enable - activ low), iar memoria pentru date (RAM) este citită activând semnalul RD şi
8051 WR MEM WR
RD
MEM RD
PSEN
Deşi adresa de referire a locațiilor din memoria RAM internă este de 8 biți, de fapt se pot
adresa 384 octeți prin utilizarea unei adresări fizice diferite în cazul modurilor de adresare
directă şi indirectă. Astfel, pentru adresele logice mai mari de 7FH, în cazul adresării directe
vom avea un bloc de memorie de 128 octeți diferit de cel cu aceeași adresă, dar cu un mod de
adresare indirect. Regiştrii SFR constituie zona de memorie, cu adrese logice mai mari de 7FH,
care este adresată direct. Pentru un mod de adresare indirect şi o adresă mai mare de 7FH vor fi
adresate locații din RAM-ul intern.
Datorită faptului că memoria este împărțită în zone on şi off-chip, programatorul vede
un singur spațiu logic de memorie, fiindu-i invizibilă împărţirea memoriei în arii interne şi
externe.
Page 6 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
care execută citiri de la un port activează semnalul „citire din circuitul bistabil de tip D”, iar
altele activează semnalul „citire pin”.
Exemple de instrucțiuni care execută citirea datelor din circuitul bistabil de tip D:
ANL (ŞI logic între acumulator şi datele de la un port, exemplu: ANL P1,A)
ORL (SAU logic între acumulator şi datele de la un port)
XRL (SAU EXCLUSIV logic între acumulator şi datele de la un port)
JBC (salt, dacă pe o linie a unui port este un bit 1, exemplu: JBC P1.3, LABEL)
CPL (complementează bitul din circuitul bistabil de tip D asociat portului,
exemplu: CPL P3.1)
INC (incrementează conținutul circuitul bistabil de tip D asociat portului,
exemplu: INC P3)
DEC (decrementează conținutul circuitul bistabil de tip D asociat portului)
DJNZ (decrementează conținutul circuitul bistabil de tip D şi execută salt dacă nu
este zero, exemplu: DJNZ P2,LABEL)
MOV PX,Y,C (mută bitul de transport C pe poziţia bitului Y al portului X)
CLR PX,Y (resetează bitul Y al portului X)
SETB PX,Y (setează bitul Y al portului X)
2.4.2. Timerele
Microcontrolerele din familia MCS-51 au două circuite de temporizare/numărare
(Timer/Counter), programabile, multi-mod, de 16 biţi fiecare, denumite generic Timer 0 şi
Timer 1. Registrul TMOD (control mod timer 0 şi 1) selectează modul de lucru al circuitului, iar
registrul TCON (control timere 0 şi 1) controlează funcţionarea timer-ului.
Registrul de 8 biţi TMOD conţine 4 biţi de configurare pentru fiecare timer/numărător:
bit GATE =1 Timer/Numărător este activat, atunci când INTx şi TxR sunt setate;
=0 Timer/Numărător este activat, atunci când TxR este setat.
bit C/T - face selecţia modului de lucru: timer sau numărător.
biţii M0/M1 - configurează modul de numărare al circuitului (cu sau fără reîncărcare
automată la depăşire, timer pe 8 sau 16 biţi, timer oprit)
Registrul de 8 biţi TCON conţine câte 4 biţi de control pentru fiecare timer/numărător:
bit TF - timer flag (indicator) – este setat hard ori de câte ori se înregistrează o
depăşire la numărare; el este resetat când se execută rutina de tratare a
întreruperii de depăşire.
bit TR - timer run - setat/resetat prin program pentru a opri sau porni circuitul.
Page 8 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
bit IE - setat la detecția unei cereri de întrerupere externă. Activ pe front sau
palier negativ. Resetat la execuția rutinei de tratare a întreruperii.
bit IT - specifică dacă semnalul de cerere de întrerupere externă este activ pe
front sau palier negativ.
Circuitul, configurat ca timer, poate măsura (prin numărare) intervale de timp, poate
determina lărgimea unor impulsuri, poate furniza semnale de comandă, cu o rezoluţie de o
microsecundă. Configurat ca numărător el poate acumula într-o structură FIFO evenimente
externe cu o precizie de reprezentare de 16 biţi şi cu o frecvenţă de până la 500kHz. Evenimentul
este memorat prin momentul său de producere, echivalent cu o valoare a numărătorului pe 16
biţi.
Page 9 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
memoriei ROM externă este PSEN care este activat doar în cazul conectării microcontrolerului
la memoria externă. Pe durata aducerii instrucțiunilor din memoria program externă, porturile P0
şi P2 sunt dedicate realizării magistralelor de adrese şi de date. Portul P0 implementează o
magistrală de date şi adrese multiplexată. P0 transmite partea mai puţin semnificativă a
numărătorului de program PC (PCL), furnizând octetul mai puţin semnificativ al adresei
instrucțiunii din memoria program externă. După transferul adresei, P0 este configurat ca
magistrală de date. În momentul în care PCL este valid la ieşirea portului P0, semnalul ALE
(Address Low Enable) transmite comanda de încărcare a PCL în circuitul bistabil de tip D
(basculant bistabil) care face demultiplexarea magistralei de la portul P0. Simultan se generează
la ieşirea portului P2 PCH astfel încât la ieşirea circuitului basculant bistabil şi portului P0 se
găseşte adresa instrucțiunii care urmează a fi extrasă din memoria program externă. Apoi se
generează semnalul de strobe (selectare) pentru memoria externă PSEN care comandă citirea
instrucțiunii, transferată pe liniile portului P0.
Conectarea cu memoria RAM externă presupune folosirea portului P0 ca magistrala de
date şi adrese multiplexat şi două variante de generare a adresei. Prima variantă implică o adresă
formată dintr-un octet generat la ieşirea portului P0 şi încărcat sub comanda semnalului ALE în
circuitul basculant bistabil de demultiplexare, la care se adaugă 3 biţi de selecţie a paginii de
memorie externă generaţi prin portul P2. În acest fel se pot adresa 8 pagini de dimensiune 256
octeţi. A doua variantă presupune generarea unei adrese pe 16 biţi cu partea mai puţin
semnificativă pe liniile portului P0 (la ieşirea circuitului basculant bistabil de demultiplexare) şi
partea mai semnificativă pe liniile portului P2. În ambele cazuri semnalele de comandă
8051 EPROM
P1 P1 P0 INSTR.
EA
LATCH
P3 P3
ALE
P2
} ADDR
PSEN OE
8051 EPROM
cu ROM intern
P1 P0
Vcc LATCH
EA
RD
} P3
ALE
P2
} } ADDR
WR I/O
WE OE
Biti de
selectie
pagina
8051
8234 4
P2.7 P4
P2.6 } Intrari
P2.5 CS 4
P2.4 PROG P5
4
P2.3 P23 P6
P2.2 P22
P2.1 P21 4
P20 P7
P2.0
Page 11 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
În limbajul de asamblare 8051, acest mod de adresare este specificat prin utilizarea
simbolurilor de forma Rn (cu n = 0 ÷7) sau prin nume simbolice definite anterior ca registre cu
directive de tip EQU sau SET.
b) Adresare directă (tip octet)
Permite adresarea directă a oricăror locaţii de memorie, porturi I/O sau registre hardware.
În formatul instrucţiunii, octetul care urmează după octetul de cod al operaţiei specifică adresa
locaţiei de memorie sau registrul vizat. Un octet suplimentar adăugat codului instrucţiunii
specifică locaţia folosită. Funcţie de valoarea celui mai semnificativ bit al acestui octet este
Page 14 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
selectat unul din două spaţii fizice de memorie. Dacă adresa directă este între 0 şi 127 (00-7FH)
este utilizat RAM-ul intern. Dacă varianta de microcontroler compatibil 8051 are mai mult de
128 de octeţi de RAM local (aşa cum se întâmplă la 8052 şi la majoritatea derivatelor recente),
doar primii 128 octeţi pot fi adresaţi direct, restul adreselor de memorie RAM pot fi adresate
doar indirect cu R0 sau R1 ca pointer sau prin intermediul indicatorului de stivă (SP).
De exemplu, secvenţa:
MOV A,30h
ADD A,40h
MOV 40h,A
adună conţinutul locaţiilor de adresă 30H şi 40h din RAM şi transferă rezultatul în RAM la
adresa 40h.
Toate porturile I/O şi registrele speciale au asignate adrese în intervalul 128-255 (80H-
0FFH). Când adresa directă utilizată este în aceste limite se accesează registrele corespunzătoare
din SFR. Adresarea directă permite ca toate registrele cu funcţii speciale să fie citite, scrise sau
utilizate ca operanzi. În general aceasta este singura metodă folosită pentru accesarea porturilor
I/O şi a regiştrilor speciali. Dacă adresarea directă este folosită cu alte adrese decât cele
predefinite în lista de registre speciale ale microcontrolerului rezultatul instrucţiunii este
nedefinit.
c) Adresare de tip registru indirect
Acest mod este destinat în esenţă manipulării variabilelor a căror adresă fizică (locaţie
RAM) este determinată, calculată sau modificată dinamic. Situaţia apare atunci când se
manipulează adrese de memorie în secvenţă, intrări indexate din tabele aflate în RAM, la operaţii
cu precizie extinsă (format de reprezentare pe mai mult de un octet) sau la operaţii cu şiruri.
Pentru adresarea memoriei externe pentru date 8051 utilizează două feluri de adresare indirectă.
Primul mod foloseşte registrele R0 şi R1 din bancul curent pentru generarea unei adrese de 8 biţi
care este transferată pe portul P0, adresă suficientă pentru adresarea porturilor I/O sau pentru arii
mici de memorie RAM. Al doilea mod foloseşte o adresă indirectă de 16 biţi furnizată de
registrul DPTR cu care procesorul poate accesa o memorie de date de până la 64 kocteţi. În
limbajul de asamblare 8051 adresarea indirectă este identificată prin simbolul (prefixul) "@"
urmat de R0 sau R1 sau un simbol asignat anterior acestora.
În limbajul de asamblare al procesorului I-8051 adresarea indirectă este reprezentată cu
@, ca în exemplul următor:
MOV A,@R0
ADD A,@R1
Page 15 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
d) Adresare imediată
Atunci când operandul sursă este o constantă şi nu o variabilă (instrucţiunea foloseşte o
valoare cunoscută în momentul asamblării), constanta respectivă poate fi încorporată
instrucţiunii prin utilizarea unui octet suplimentar. Valoarea respectivă nu mai poate fi
modificată pe parcursul executării programului. Identificarea adresării directe a operandului se
face cu ajutorul prefixului "#" (diez). Operandul poate fi un şir numeric, o valoare simbolică sau
o expresie aritmetică folosind constante (evaluată în momentul asamblării).
Data pe 8 biţi urmează octetului de cod al operaţiei. În limbajul de asamblare datele sunt
precedate de semnul #. De exemplu:
MOV A,#15
ADD A,#18
Modul de adresare este specificat în codul instrucţiunii. O instrucţiune poate folosi mai
multe moduri de adresare pentru operanzii sursă sau/şi destinaţie.
Exemplu:
START: JMP MAIN ;instrucţiune de salt
LOOP: DJNZ R7,LOOP ;execuţie buclă
Folosirea etichetelor este obligatorie atunci când la adresele respective se fac referiri în
program.
Dezvoltarea aplicaţiilor cu microcontrolere presupune proiectarea părţii hardware şi a
părţii software. Pentru realizarea programelor proiectantul are la dispoziţie un ansamblu de
„instrumente” software:
- asamblorul – este programul care converteşte fişierul sursă, care este un fişier text
(ASCII), care conţine instrucţiunile microcontrolerului sub formă de mnemonice, în fişier obiect,
Page 16 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
respectiv într-un fişier care conţine codurile maşină corespunzătoare instrucţiunilor din cadrul
fişierului sursă;
- compilatorul – este programul care converteşte fişierul sursă scris într-un limbaj
evoluat, în fişier obiect;
- link-editorul – realizează cuplarea mai multor module de program memorate în fişiere
obiect distincte şi alocă zone de memorie necesare programelor şi variabilelor folosite de către
acesta. Link-editorul facilitează dezvoltarea structurată a programelor, precum şi realizarea unor
module de program ca aplicaţii distincte;
- convertorul OBJ-IntelHEX – realizează conversia din format obiect (OBJ) într-un
format care conţine: adresa de localizare, numărul de octeţi ai liniei respective, tipul datelor (cod
sau date), şirul de coduri, suma de control corespunzătoare tuturor informaţiilor liniei respective,
precum şi terminatorul de linie format din caracterele CR, LF;
- depanatorul (debugger) – permite execuţia pas cu pas, sau secvenţă cu secvenţă, a unui
program aflat în faza de testare cu scopul de a verifica corectitudinea funcţionării. În general,
acest program funcţionează cu un sistem de dezvoltare care dispune de un program monitor
(acesta este un program care accesează componentele de bază ale sistemului, respectiv memoria,
regiştrii, fanioanele);
- emulatorul – este programul care permite simularea funcţiilor şi a instrucţiunilor
microcontrolerului pe un alt sistem de calcul gazdă. El poate prezenta unele restricţii în special
legate de posibilitatea de simulare a întreruperilor. Acest program poate să funcţioneze atât pe un
calculator de uz general, gen PC, sau chiar pe microcontrolerul respectiv. În acest caz, sistemul
cu microcontroler trebuie să fie conectat la o consolă care poate fi chiar un calculator PC putând
astfel verifica şi executarea subrutinelor de întrerupere.
- mediul de simulare – este folosit pentru aplicaţii complexe, situaţie în care practic
sistemul care implementează aplicaţia este dezvoltat cu funcţii de depanare. El include atât
facilităţi software cât şi facilităţi hardware.
Exemplu. Să se execute scăderea unui şir numeric adresat cu registrul R1, din şirul
adresat cu R0, şirurile având lungimea dată de registrul R2 şi să se facă verificara pentru
depăşire. Numerele sunt reprezentate în complement faţă de 2.
CLR C ; şterge borrow (cerere de
împrumut)
SUBSTR: MOV A,@R0
SUBS1: SUBB A, @R1 ; se scad poziţiile curente
MOV @R0, A
INC R0 ; actualizează pointeri
INC R1
DJNZ R2, SUBS1 ; buclare până termin toate poziţiile
JNB OV, OV_OK ; verific dacă a apărut depăşire
… ; aici rutina de tratare a depăşirii
OV_OK: ; ieşire corectă
RET
Adunarea zecimală (în cod BCD) este posibilă cu utilizarea instrucţiunii DA (Decimal
Adjust) împreună cu ADD şi/sau ADDC. Valoarea binară din acumulator rezultată prin adunarea
a două variabile (fiecare cu două cifre în format BCD împachetat cu 2 cifre BCD per octet) este
ajustată astfel încât să formeze două cifre BCD, fiecare de câte 4 biţi. Dacă biţii 3÷0 din
conţinutul acumulatorului codifică o valoare mai mare ca 9 sau dacă flagul AC este setat, se
adună 6 la acumulator producând astfel valoarea codificată corectă pe cei mai puţini
semnificativi 4 biţi (nibble inferior). Dacă flagul C este setat sau dacă valoarea codificată pe cei
mai semnificativi 4 biţi (nibble superior) depăşeşte 9, se adună 6 la aceasta. Flagul C rămâne
Page 18 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
setat dacă a fost iniţial setat sau este setat dacă apare depăşire (dacă suma este mai mare de 100).
Aceste instrucţiuni pot utiliza aceleaşi moduri de adresare ca şi cele aritmetice, dar nu sunt
limitate numai la operarea prin intermediul acumulatorului. Octeţii adresaţi direct pot fi utilizaţi
ca destinaţie având ca sursă fie acumulatorul, fie o constantă.
Instrucţiunile sunt utile pentru ştergerea (ANL), setarea (ORL) sau complementarea
(XRL) a unuia sau a mai multor biţi din RAM, porturi sau regiştri speciali.
Exemplu. Pe cei mai puţin semnificativi 5 biţi (4-0) ai portului 1 să se plaseze un cod
(prezent în A) fără a afecta starea biţilor 7÷5 care au o altă utilizare.
OUT_PX: ANL P1,#11100000B ;şterge biţii P1.0÷P1.4
ORL P1,A ;setează biţii lui P1 corespunzători lui A
RET
bitul testat, iar octetul 3 offsetul), ultima (JBC) realizând şi ştergerea necondiţionată a bitului
testat.
Există două instrucţiuni de apel subrutină: ACALL (Absolute Call) şi LCALL (Long
Call). Ambele incrementează PC până la adresa următoarei instrucţiuni, salvează în stivă această
valoare (octetul inferior primului) care va reprezenta adresa de întoarcere. Adresa de start a
subrutinei este codificată analog instrucţiunilor de salt AJMP şi LJMP, de unde rezultă şi
aceleaşi domenii pentru adresa de start (început) a subrutinei faţă de punctul de apelare.
Majoritatea asambloarelor 8051 recunosc o mnemonică generică „CALL" (o
pseudoinstrucţiune) care este translatată automat în instrucţiuni maşină LCALL sau ACALL în
funcţie de adresa de start a subrutinei.
dimensiunile 11x21; relaţia de calcul a adresei intrării dorite este: (ADR. BAZA) + (21x
INDEX_I) +INDEX_J, valorile pentru INDEX_I şi INDEX_J se completează înainte de apelare
(I reprezintă indexul liniilor, iar J este indexul coloanelor).
INDEX_I EQU R6 ;coordonată coloane
INDEX_J EQU 23H ;coordonată linii
;
MATRX1: MOV A,INDEX_I
MOV B,#21
MUL AB
ADD A,INDEX_J
INC A ;introduce offset 1 octet
MOVC A,@A+PC
RET
Soluţia din exemplu este adecvată atunci când dimensiunea tabelei de salturi plus cea a
rutinelor alternative nu depăşeste 256 octeţi, tabela şi rutinele putând fi plasate oriunde în
memoria program relativ la paginile de 256 octeţi.
Page 24 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
Dacă sunt necesare mai mult de 128 de opţiuni (ramificaţii) se poate folosi următoarea
abordare.
ANL A,#00000010B
JNZ SETF
TESTX: MOV A,TCON ;încarcă X
ANL A,00001000B
JZ TESTZ
MOV A,20H ;încarcă Y
ANL A,#00000001B
JZ SETF
TESTZ: MOV A,21H ;încarcă Z
ANL A,#00000001B
JZ SETF
CLRF: MOV A,OUTBF
ANL A,#11110111B
JMP OUTF
SETF: MOV A,OUTBF
ORL A,#00001000B
OUTF: MOV OUTBF,A
MOV A,P3
Page 28 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
LINII DE SCANARE
LINII DE
RECEPTIE
I 8051
P1 P2
INT0
Rutina de deservire a întreruperii trebuie să identifice care din taste a fost apăsată, dacă se
presupune că două taste nu pot fi apăsate simultan. Starea curentă a liniilor de recepţie este
memorată într-un registru intern. Dacă o singură tastă este apăsată, toate liniile de recepţie mai
puţin una (cea la care aparţine tasta apasată) vor fi citite ca „1” logic. După aceea procesul se
inversează, adică este înscris „0” logic pe liniile de recepţie şi „1” logic pe liniile de scanare, iar
liniile citite sunt cele de scanare. Dacă o singură tastă este apăsată, numai una dintre aceste linii
de scanare va fi citită ca „0” logic. Localizând unicul nivel logic „0” din fiecare set de linii, se
identifică tasta apăsată. Dacă mai mult de două taste ale matricii sunt apăsate simultan, atunci
unul sau ambele seturi de linii vor conţine mai mulţi de „0”. O subrutină are sarcina de a
determina care din cei 8 biţi din fiecare set este 0. Dacă se apasă mai multe taste simultan, nu se
va executa nici o acţiune. Pentru tastele ce trebuie apăsate simultan cu alte taste (ex.: Shift, Alt,
Control), nu se face conectarea la liniile matricei. Aceste taste speciale vor fi conectate direct la
câte un pin al portului microcontrolerului, în acest mod existând posibilitatea generării unei
comenzi dacă pe lângă tasta specială se mai apasă o tastă; mai mult se previne generarea unei
Page 29 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
Page 30 of 32
Curs MICROCONTROLERE
Prof. Dr.Ing. Vasile Lăzărescu
Ş.L.Dr.Ing. Rodica Constantinescu INTEL 8051
mai mare decât 1, ceea ce semnifică apăsarea mai multor taste simultan, atunci prin
decrementare ZERO_COUNTER nu devine zero şi atunci se sare la eticheta REJECT care
resetează flagul de întrerupere externă (in rest nu se mai execută nimic). Dacă
ZERO_COUNTER este 1, adică s-a apăsat o singură tastă, atunci prin decrementare el devine 0
şi nu se mai execută saltul.
2) Instrucţiunea MOV ADDRESS,ZERO_BIT încarcă la locaţia ADDRESS rangul liniei
de recepţie pe care se găseşte tasta apăsată. Apoi se testează şi liniile de scanare şi în ZERO_BIT
se obţine rangul liniei de scanare pe care se găseşte tasta apăsată. După execuţia secvenţei de
instrucţiuni:
XCH A, ZERO_BIT
SWAP A
ORL ADDRESS, A
pe semioctetul superior al variabilei ADDRESS se regăseşte rangul liniei scanate pe care se află
tasta apăsată (vezi ultimele două instrucţiuni ale secvenţei), iar pe semioctetul inferior al
variabilei ADDRESS se găseşte rangul liniei de recepţie corespunzătoare tastei apăsate (vezi
instrucţiunea MOV ADDRESS, ZERO_BIT). Rangul liniei, care poate avea 8 valori, se
reprezintă pe un semioctet.
3) Întreruperea generată de apăsarea unei taste trebuie să fie activă pe front. Dacă ar fi
activă pe palier atunci atât timp cât tasta se menţine apăsată rutina s-ar executa de mai multe ori.
4) Înainte de părăsirea subrutinei de tratare a întreruperilor se execută resetarea flagului
de întrerupere externă (Ex0) asociat intrării de cerere de întrerupere INT0. Cererea de întrerupere
setează flagul Ex0, această setare generând în fapt cererea de întrerupere la unitatea centrală a
microcontrolerului. Flagul Ex0 este resetat hard în momentul în care se acceptă cererea de
întrerupere. În perioada de aşteptare pentru ridicarea tastei există posibilitatea ca datorită jocului
contactului tastei, să se genereze mai multe fronturi pe INT0, care setează Ex0. De aceea, Ex0
trebuie resetat soft înainte de ieşirea din rutină, în caz contrar rutina executându-se de mai multe
ori.
5) În rutina ASTEPT_STABILIZ _TASTA va trebui să încărcăm un timer cu valoarea
corespunzătoare întârzierii. Relaţia între valoarea încărcată şi întârzierea în msecunde este:
f osc (kHz) întârziere(ms)
valoare încarcat ă =
12
De exemplu, dacă frecvenţa oscilatorului este 3,58 Mhz pentru o întârziere de 30 ms se
obţine 8950 reprezentat ca DD0Ah.
Page 32 of 32