Computer de Bord Auto. Controlul de Timp al Sistemului

CAPITOLUL 1

Funcționarea și utilizarea calculatorului de bord auto.

1.1 Descrierea calculatorului de bord.

Calculatorul de bord este un microsistem de calcul care are atașate câteva periferice. Aceste periferice pot fi: senzori pentru citirea anumitor parametrii, afișaj pentru afișarea parametrilor prelucrați, tastatură pentru introducerea de date sau comutare între funcțiile afișate.

Calculatoarele de bord au evoluat in decurs de câțiva ani de la sisteme simple, care estimau numai distanța care mai poate fi parcursă, până la sisteme mult mai complicate care oferă mai multe informații cum ar fi: viteză medie, viteză instantanee, cantitate de combustibil rămasă , cantitate de combustibil consumată, consumul mediu și instantaneu, ora și data, timpul de la începutul deplasării, timpul până la destinație, temperatură interioară și exterioară, diferite capacitați de diagnosticare.

Un calculator de bord, ce înglobează mai multe funcții, este prezentat în schema bloc din fig. 1.1

fig. 1.1 schema bloc a unui calculator de bord.

Conducătorul auto poate introduce informații în calculator la începutul unei călătorii – cum ar fi de exemplu distanța până la destinație. Pe timpul călătoriei, conducătorul auto poate solicita informații specifice.

Este de preferat să se afișeze o singură mărime la un moment dat, pentru a putea fi citită, urmărită ușor si a nu distrage atenția conducătorului prea mult timp.

De obicei se folosesc afișaje cu una sau două linii pe care prin selecție se pot urmări toate mărimile.

1.2 Utilizarea calculatorului de bord.

Din privința unui utilizator de automobil un computer de bord este ceva simplu care afișează mărimea de interes (ceasul, temperatură, viteză etc.). Dacă nu este mărimea dorită se selectează prin apăsarea unui buton eventual de mai mute ori. Prin apăsarea consecutiva se face de fapt o baleere a mărimilor care pot fi afișate. Din privința unui proiectant de calculator de bord auto, problemele se complică cu cât numărul mărimilor de afișat crește și simplitatea utilizării trebuie să rămână aceiași. Consola calculatorului de bord este formată in din trei taste cu funcții multiple.

Funcțiile tastelor pentru partea de control de timp sunt:

prima tastă notată „but1” pentru schimbare ceas/cronometru sau incrementare a datei unde este poziționat cursorul.

a doua tastă notată „but2” pentru intrarea/ieșire in modul setare ceas sau start/stop în mod cronometru.

a treia tastă notată „but3” pentru deplasare cursor în mod ceas sau reset în mod cronometru.

1.3 Funcționare calculatorului de bord.

Partea calculatorului de bord care o voi prezenta în continuare este de control de timp al sistemului, partea de ceas, calendar și cronometru. Probabil partea cea mai importantă din întreg calculatorul deoarece, se vede și din fig. 1.1 intră în calculul multor alte mărimi.

La stabilirea alimentării microsistemului acesta intră automat în programul de ceas și începe să funcționeze cu o dată stabilită de obicei cu data de fabricație, ulterior se poate seta de utilizator la data si ora curente.

Contorizarea timpului se realizează eficient cu un microcontroler care lucrează în întreruperi periodice generate de contorul T2, mai exact de unul din registrele de comparare ale acestuia. Contorul „timer 2” funcționează în modul 1 sursă de ceas /12

și prescalare cu 2 a acesteia.

Acest proiect este conceput astfel încât in timpul funcționarii sa consume cât mai puține resurse ale microcontrolerului. Cea mai mare importanță în funcționarea proiectului o reprezintă timerul T2, care functioneaza in mod 1 si număra încontinuu de la valoarea 0 la 137968.4211 μs în zecimal, datorită prescalării cu 2 a timerului T2.

În momentul în care registrul de comparare CM0 detectează ca numărătorul timerului a ajuns la valoarea B98CH acesta va genera o cerere de întrerupere care va reseta timerul T2 , acesta începând imediat să numere de la 0 la B98CH.Toate aceste reseturi sunt numărate intr-un contor .

Precizia ceasului este data de precizia cristalului de quarz, cel folosit in proiectul de față este de 11.4 megaherți. Precizia este dată de oscilator deoarece quarz-ul este foarte sensibil la variațiile de temperatură.

La această frecvență și modul unu de lucru timpul de incrementare a contorului este 0.0010526315 secunde sau 1.0526315 μs iar timpul maxim de depășire este de 137968.4211 μs. Contorul este setat să genereze întrerupere la atingerea valorii de 100 ms când va fi și resetat și va începe incrementarea de la zero.

Calculul valorii de reset și întrerupere este prezentat in tabelul din fig. 1.2. La un prim calcul și cu doar cinci zecimale obținem o valoare de reset cu o eroare de 0.15 μs la 100 ms. Extinzând numărul de zecimale la nouă scade eroarea de calcul și se obține timpul de reset de exact 100 ms .

În tabel sunt figurate alăturat și pozițiile biților de la LSB (cel mai nesemnificativ bit) la MSB (cel mai semnificativ bit) de sus in jos atât pentru contor cat și pentru registrul de comparare.

Fig. 1.2 tabel cu calculul timpului de depășire contor T2 timp de încărcare și valorii de încărcare.

În urma calculului se obține valoarea de reset cu care se încarcă registrul de comparare CM0, astfel se obține 9BH pentru CMH0 registrul 0 de comparare parte superioară și 8CH pentru CML0 registrul 0 de comparare parte inferioară.

Cu valoarea de 100 ms astfel obținută putem trece la obținerea unei secunde prin incrementarea unui registru odată la 100 ms. La zece incrementări ale acestui registru avem o secundă. Pentru a detecta trecere unei secunde odată cu incrementarea se face și o comparare cu zece iar dacă se constată egalitate se incrementează un registru contor pentru secunde.

La stabilirea alimentării microsistemului acesta intră automat în programul de ceas și începe să funcționeze cu o dată stabilită de obicei cu data de fabricație, ulterior se poate seta de utilizator la data si ora curente.

Prezentarea modului de funcționare a programului se face pe baza organigramei prezentată în anexă.

CAPITOLUL 2

Structura hard a calculatorului

2.1 Prezentare generală

Partea principală a calculatorului o constituie microsistemul de calcul care este dezvoltat în jurul elementului de calcul, în acest caz microcontrolerul 80c552.

Microcontroler de înaltă performanță proiectat pentru a fi utilizat în aplicații de timp real, cum ar fi: instrumentație, control industrial și control pe automobil – pentru controlul motorului și al transmisiei. Dispozitivul asigură, în plus față de funcțiile standard 80C51, un număr de funcții hardware dedicate pentru aceste aplicații.

Circuitul 80C552 folosește setul de instrucțiuni puternic al familiei 80C51 din care și face parte. Pentru controlul perifericelor on-chip sunt încorporate registre de funcții speciale suplimentare.

80C552 conține o memorie ROM nevolatilă de dimensiunea 8K×8, o memorie volatilă de 256×8 – memorie de date de tip scrie / citește, cinci porturi I / O de 8 biți, un port de intrare de 8 biți, două circuite timer / numărător de evenimente de 16 biți (identice cu timerele din 80C51), un timer suplimentar de 16 biți cuplat cu latchuri de captură și de comparare, o structură de întreruperi imbricată (nested) cu 15 surse și două nivele de prioritate, un convertor A / D de 10 biți cu 8 intrări, un convertor D / A dublu cu interfață de impulsuri modulate în durată (PWM), două interfețe seriale (UART și magistrală I2C), un timer watchdog – ”câine de pază" și oscilator și circuite de timing on-chip.

80C552 are două moduri, selectabile software, de reducere a activității pentru o diminuare mai pronunțată a consumului de putere: mers în gol și putere scăzută. Modul mers în gol "îngheață" CPU și resetează timerul T2, convertorul A / D și circuitele PWM, dar permite funcționarea celorlalte timere, a memoriei RAM, a porturilor seriale, iar sistemul de întreruperi continuă să funcționeze. Modul putere scăzută salvează conținutul memoriei RAM, dar "îngheață" oscilatorul, ceea ce inactivează toate funcțiile de pe chip.

2.2.1 Memoria program

80C552 conține 8 kocteți de memorie program on-chip ce poate fi extinsă până la 64 kocteți de memorie externă ( fig. 2.1). Când pinul este ținut la nivel HIGH, circuitul 8XC552 aduce instrucțiuni de la ROM-ul intern până când adresa depășește 1FFFH. Locațiile 2000H până la FFFFH sunt aduse din memoria program externă. Când pinul este ținut la nivel LOW, toate aducerile de instrucțiuni sunt de la memoria externă. Locațiile ROM de la 0003H până la 0073H sunt utilizate de rutinele de servire a întreruperilor.

Fig. 2.1 Harta memoriei

2.2.2 Memoria date

Memoria internă de date este divizată în 3 secțiuni: 128 octeți inferiori, 128 octeți superiori (RAM) și aria de 128 octeți a registrelor de funcții speciale. Cei 128 octeți inferiori de RAM de la 128 la 255 și aria registrelor de funcții speciale împart același spațiu de adresă, iar accesarea lor se face în moduri de adresare diferite. Locațiile RAM 128 la 255 sunt adresabile numai indirect, iar registrele de funcții speciale sunt adresabile numai direct. Toate celelalte aspecte ale memoriei interne RAM sunt identice cu 80C51.

Stiva poate fi localizată oriunde în RAM-ul intern prin încărcarea indicatorului de stivă de 8 biți. Înălțimea stivei este de maximum 256 octeți.

2.2.3 Registrele de funcții speciale

Registrele de funcții speciale (adresabile numai direct) conțin toate registrele pentru 80C552, cu excepția contorului de program (PC) și cele patru bancuri de registre. Majoritatea din cele 56 registre de funcții speciale este folosită pentru controlul perifericelor hardware on-chip. Alte registre sunt registrele aritmetice (ACC, B, PSW, indicator de stivă SP) și registrele indicatoare de date (DPH, DPL). 16 dintre registrele de funcții speciale (SFR) conțin 128 locații direct adresabile la nivel de bit. Tabelul 2.1 (Anexă) – prezintă registrele de funcții speciale pentru 80C552.

Registrele de funcții speciale 80C51 sunt prezente și au funcții identice în 80C552, cu excepțiile menționate în paragrafele ce urmează.

2.3 Timerul T2

2.3.1 Prezentarea Timerul T2

Timerul T2 este un timer de 16 biți ce conține 2 registre TMH2 (octet superior) și TML2 (octet inferior). Timerul / numărător de 16 biți poate fi deconectat sau conectat la clock printr-un circuit de prescalare de la una din două surse: fOSC / 12 sau de la un semnal extern. Atunci când timerul T2 este configurat ca numărător, circuitul de prescalare primește clock de la un semnal extern pe intrarea T2 (P 1.4). Un front crescător la pinul T2 incrementează circuitul de prescalare, iar rata maximă de repetiție este o numărare pe ciclu mașină (1 MHz cu un oscilator de 12 MHz).

Rata maximă de repetiție pentru timerul T2 este de două ori mai mare decât cea a timerului 0 și a timerului 1. T2 (P 1.4) este eșantionat la momentul S2P1 și din nou la S5P1 (deci de două ori pe un ciclu mașină). Un front crescător este detectat când T2 este LOW pe durata unui eșantion și HIGH pe durata eșantionului următor. Pentru a asigura detecția frontului crescător, semnalul de intrare trebuie să fie LOW pentru cel puțin 1/2 ciclu și apoi HIGH pentru cel puțin 1/2 ciclu. Dacă este detectat un front crescător înaintea sfârșitului S2P1, timerul va fi incrementat pe durata următorului ciclu; în caz contrar va fi incrementat un ciclu mai târziu. Circuitul de prescalare are un factor de prescalare de 1, 2, 4 sau 8 și este șters dacă factorul său de divizare sau sursa de intrare se modifică, ori dacă timerul / numărător este resetat.

Timerul T2 poate fi citit "din zbor", dar nu posedă latchuri de citire suplimentare, iar pentru a evita interpretarea eronată a datelor în cazul unei ieșiri de la octetul inferior către octetul superior în timp ce se citește timerul T2 trebuie luate precauții software. Timerul T2 nu este încărcabil și este resetat de către semnalul RST sau de un front crescător la intrarea de semnal RT2, dacă intrarea a nalul de intrare trebuie să fie LOW pentru cel puțin 1/2 ciclu și apoi HIGH pentru cel puțin 1/2 ciclu. Dacă este detectat un front crescător înaintea sfârșitului S2P1, timerul va fi incrementat pe durata următorului ciclu; în caz contrar va fi incrementat un ciclu mai târziu. Circuitul de prescalare are un factor de prescalare de 1, 2, 4 sau 8 și este șters dacă factorul său de divizare sau sursa de intrare se modifică, ori dacă timerul / numărător este resetat.

Timerul T2 poate fi citit "din zbor", dar nu posedă latchuri de citire suplimentare, iar pentru a evita interpretarea eronată a datelor în cazul unei ieșiri de la octetul inferior către octetul superior în timp ce se citește timerul T2 trebuie luate precauții software. Timerul T2 nu este încărcabil și este resetat de către semnalul RST sau de un front crescător la intrarea de semnal RT2, dacă intrarea a fost activată. RT2 este activat prin intermediul bitului T2ER (SFR – TM2CON.5).

Atunci când octetul cel mai puțin semnificativ al timerului depășește, sau atunci când are loc o depășire pe 16 biți, se poate genera o cerere de întrerupere. Una sau ambele dintre aceste depășiri pot fi programate pentru a solicita o întrerupere. Atunci când octetul inferior (TML2) depășește, se setează flagul T2BO (TM2CON), iar flagul T2OV (TM2IR) este setat când depășește octetul superior (TMH2). De notat că atunci când T2OV este setat, T2BO va fi de asemenea setat. Pentru a activa întreruperile la depășirea octetului inferior trebuie setați biții ET2 (IEN1.7 – activare întrerupere la depășire, fig. 2.2) și T2IS0 (TM2CON.6 – selecție întrerupere la depășire octet). Bitul T2BO (TM2CON.4) este flagul de depășire octet al timerului T2.

Pentru a valida întreruperea la depășirea de 16 biți, trebuie să fie setați biții ET2 (IEN1.7 – activare întrerupere la depășire) și T2IS1 (TM2CON.7 – selecție întrerupere la depășire 16 biți). Pentru a activa atât întreruperile la depășirea de octet cât și la 16 biți, trebuie setați T2IS0 și T2IS1, fiind solicitate două rutine de întrerupere. Un test al flagurilor de depășire va indica rutina care va trebui să fie executată. Pentru fiecare rutină trebuie șters numai flagul corespunzător depășirii.

Timerul T2 poate fi resetat de un front crescător la RT2 (P 1.5) dacă este setat bitul de reset extern al timerului T2 (T2ER) din TM2CON. Acest reset șterge de asemenea și circuitul de prescalare. În modul "mers în gol", timerul numărător și circuitul de prescalare sunt resetate și oprite. Timerul T2 este controlat de registrul de funcții speciale TM2CON (fig. 2.3).

Fig. 2.2 Registrul de activare a întreruperilor timerului T2 (IEN1) – adresabil la nivel de bit

Fig. 2.3 Registrul de control al timerului T2 (TM2CON)

2.3.2 Extensia timerului T2: Atunci când se folosește un oscilator de 12 MHz, o depășire la 16 biți a timerului T2 are loc la fiecare 65.5, 131, 262 sau 524 ms, funcție de factorul de divizare al circuitului de prescalare; ca urmare, valoarea maximă a ciclului de timp este de aproximativ 0.5 secunde. În aplicații în care ciclurile de timp sunt mai mari de 0.5 secunde, este necesar să se extindă timerul T2. Acest lucru este realizat prin selectarea valorii fOSC / 12 ca sursă de clock (T2MS0 = setat, T2MS1 = resetat), setând factorul de divizare al circuitului de prescalare la 1/8 (set T2P0, set T2P1), dezactivând întreruperile la depășirea de octet (reset T2IS0) și activând întreruperea la depășirea de 16 biți (set T2IS1).

2.3.3 Timerul T2. Logica de captură și de comparare. Timerul T2 este conectat la 4 registre de captură de 16 biți. Un registru de captură poate fi utilizat pentru a "captura"conținutul timerului T2, când are loc o tranziție la pinul său de intrare corespunzător. Un registru de comparare poate fi utilizat pentru a seta, reseta sau inversa prin basculare pinii de ieșire ai portului 4 la intervale de timp programabile.

Timerul T2 și logica de captură și comparare sunt prezentate în fig. 2.4.

Fig. 2.4 Schema bloc a timerului 2

2.3.4 Logica de captură. Cele patru registre de 16 biți la care este conectat timerul T2 sunt: CT0, CT1, CT2 și CT3. Aceste registre sunt încărcate cu conținutul timerului T2, iar o întrerupere este cerută la recepționarea ei la una din intrările de semnal CT0I, CT1I, CT2I, CT3I. Aceste semnale sunt partajate cu portul 1. Aceste patru flaguri de întreruperi sunt în registrul de întreruperi al timerului T2 (registrul de funcții speciale TM2IR). Dacă facilitatea de captură nu este utilizată, aceste intrări pot fi privite ca intrări suplimentare de întreruperi externe.

Folosind registrul de control al capturii CTCON (fig. 2.5), aceste intrări pot realiza captura pe un front crescător, un front căzător sau fie pe un front crescător sau căzător. Intrările sunt eșantionate pe durata S1P1 a fiecărui ciclu. Când se detectează frontul selectat, conținutul timerului T2 este capturat la sfârșitul ciclului.

2.3.5 Măsurarea intervalelor de timp folosind registrele de captură. Atunci când un eveniment extern care se repetă este reprezentat sub forma unui front crescător sau descrescător la unul din cei patru pini de captură, timpul dintre două evenimente poate fi măsurat folosind timerul T2 și un registru de captură. Când un eveniment are loc, conținutul timerului T2 este copiat în registrul de captură corespunzător și se generează o cerere de întrerupere. Rutina de servire a întreruperii poate calcula intervalul de timp dacă se cunoaște conținutul precedent al timerului T2 când a avut loc ultimul eveniment. Cu un oscilator de 12 MHz, timerul T2 poate fi programat să depășească la fiecare 524 ms. Atunci când intervalul de timp între evenimente este mai scurt decât această valoare, calcularea intervalului de timp este simplă, iar rutina de servire a întreruperii este scurtă. Pentru intervale de timp mai lungi, trebuie utilizată o rutină de extensie a timerului T2.

2.3.6 Logica de comparare. De fiecare dată când timerul T2 este incrementat, se compară conținutul celor trei registre de comparare de 16 biți cu noua valoare numărată în timerul T2. Când se constată o egalitate (o coincidență a valorilor), flagul corespunzător al întreruperii este setat în registrul TM2IR la sfârșitul ciclului următor. Când are loc o coincidență cu CM0, controlerul setează biții 0 – 5 ai portului 4, dacă biții corespunzători din registrul de activare a setării STE sunt la nivel logic "1".

Când are loc o coincidență cu registrul CM1, controlerul resetează biții 0 – 5 din portul 4 dacă biții corespunzători ai registrului de activare a resetării / basculării RTE sunt la nivel "1" logic (vezi fig. 4.6 pentru registrul RTE). Dacă RTE este "0", atunci P4.n nu este afectat de o împerechere între registrul CM1 sau CM2 și timerul T2. Când are loc o coincidență, controlerul basculează biții 6 și 7 din portul 4 dacă biții corespunzători din RTE sunt "1" logic. Latchurile portului pentru biții 6 și 7 nu sunt basculate. Două bistabile suplimentare încarcă ultima operație și de fapt aceste bistabile vor fi basculate.

Astfel, dacă operația curentă este "set", următoarea operație va fi "reset", chiar dacă latchul portului este resetat prin software înainte ca operația "reset" să aibă loc. Prima basculare după un reset va seta latchurile portului. Conținutul acestor două bistabile poate fi citit la STE.6 și STE.7 (corespunzând la P4.6, respectiv P4.7). Biții STE.6 și STE.7 sunt numai "citire" (vezi fig. 4.7 pentru registrul STE). Un "1" logic indică faptul că la următoarea basculare se va reseta latchul din port. CM0, CM1 și CM2 sunt resetate de semnalul RST.

Informația modificată în latchul portului apare la pinul portului pe durata S5P1 al ciclului mașină următor celui în care s-a produs coincidența. Dacă portul este modificat prin software, ieșirile se schimbă pe durata S1P1 a ciclului următor. Fiecare bit al portului 4 poate fi setat sau resetat prin software la orice moment de timp. O modificare hardware, rezultând din coincidența cu un comparator ia precedență în raport cu o modificare software în același ciclu. Când rezultatul comparării necesită un "set" și un "reset" în același timp, latchul portului va fi resetat.

Fig. 2.5 Registrul de control al capturii (CTCON)

Fig. 2.6 Registrul de activare resetare / basculare (RTE)

Fig. 2.7 Registrul de activare al setării (STE)

2.3.7 Registrul flagurilor de întreruperi ale timerului T2 (TM2IR). Opt din nouă flaguri de întreruperi ale timerului T2 sunt localizate în registrul de funcții speciale TM2IR (vezi fig. 4.8). Al nouălea flag este TM2CON.4. Flagurile CT0 și CT1 sunt setate pe durata S4 a ciclului în care conținutul timerului T2 este capturat. CT0I este scanat de logica de întreruperi pe durata S2, iar CT1I este scanată pe durata S3. CT2I și CT3I sunt setați pe durata S6 și sunt scanați pe intervalele S4 și S5. Cererile de întrerupere asociate sunt recunoscute pe durata ciclului următor. Dacă aceste flaguri sunt verificate, o tranziție la CT0I sau CT1I va fi recunoscută un ciclu înaintea unei tranziții la CT2I sau CT3I, întrucât registrele sunt citite pe intervalul S5. Flagurile CMI0, CMI1 și CMI2 sunt setate pe perioada S6 a ciclului ce urmează unei coincidențe. CMI0 este scanat de logica de întreruperi pe durata S2; CMI1 și CMI2 sunt scanate pe perioadele S3 și S4. O coincidență va fi recunoscută de către logica de întreruperi (sau prin verificarea flagurilor) la două cicluri mașină după ce coincidența a avut loc.

Flagul de depășire la 16 biți (T2OV) și flagul de depășire pe octet (T2BO) sunt setați pe perioada S6 a ciclului în care a avut loc depășirea. Aceste flaguri sunt recunoscute de logica de întrerupere pe durata următorului ciclu.

Registrul de funcții speciale IP1 (fig. 2.8) este utilizat pentru a determina prioritatea întreruperilor timerului T2. Setarea unui bit la nivel HIGH, dă funcției o prioritate înaltă, iar setarea bitului la nivel LOW dă funcției o prioritate scăzută. Funcțiile controlate de către diferiți biți ai registrului IP1 sunt prezentate în fig. 2.8

Registrul flagurilor de întreruperi (TM2IR) – adresabil la nivel de bit

Registrul de priorități ale întreruperilor timerului T2 (IP1) – adresabil la nivel de bit

Fig. 2.8 Registrele TM2IR și IP1

2.4 Circuitele de reset

Circuitele de reset pentru 8XC552 sunt conectate la pinul RST. Pentru rejecția zgomotului la intrare se folosește un trigger Schmitt (vezi fig. 4.25). Ieșirea triggerului Schmitt este eșantionată de către circuitul reset la fiecare ciclu mașină.

Un reset este realizat prin menținerea pinului RST la nivel HIGH pentru cel puțin două cicluri mașină (24 perioade oscilator) în timp ce oscilatorul funcționează. Unitatea centrală răspunde prin executarea unui reset intern. Pe timpul resetului ALE și PSEN dau la ieșire un nivel HIGH. În vederea realizării unui reset corect, acest nivel de reset nu trebuie să fie afectat de elementele externe. Linia RST poate de asemenea să fie trasă HIGH în mod intern printr-un tranzistor pullup activat de timerul watchdog T3. Lungimea impulsului de ieșire de la T3 este de 3 cicluri mașină. Un impuls de o durată așa scurtă este necesar pentru a reveni dintr-o eroare de procesor sau sistem cât mai rapid posibil.

De notat că impulsul de reset scurt de la timerul T3 nu poate descărca condensatorul de reset de la punerea sub tensiune (vezi fig. 4.26). Ca urmare, când timerul watchdog este folosit de asemenea pentru a seta dispozitive externe, această structură cu condensator nu trebuie conectată la pinul RST și trebuie folosit un circuit distinct pentru a realiza operația de reset la punerea sub tensiune. O depășire de timer T3, dacă acesta va fi activat, va forța o condiție de reset pentru 8XC552 printr-o conexiune internă, chiar dacă ieșirea RST este conectată LOW sau nu este conectată.

Resetul intern este executat pe durata celui de–al doilea ciclu în care RST este HIGH și este repetat la fiecare ciclu până când RST trece la nivel LOW. El lasă registrele interne după cum urmează:

2.5 Întreruperi

2.5.1 Descrierea întreruperilor timer T2.

8XC552 are 15 surse de întreruperi, fiecăreia putându-i fi atribuit unul din două nivele de prioritate, așa cum se prezintă în fig. 2.9 (Anexă). Cele cinci surse de întrerupere comune cu circuitul 80C51 sunt întreruperile externe ( și ), întreruperile timerului 0 și ale timerului 1 (IT0 și IT1) și întreruperea serială (RI sau TI). Întrucât subsistemul care creează aceste întreruperi este identic în ambele circuite, funcționalitatea lor este identică ca aspect. Singurile diferențe sunt locațiile pentru registrele de activare și de prioritate, configurațiile și structura priorităților. Mai jos se detaliază aceste aspecte, împreună cu caracteristicile întreruperilor unic specifice pentru 8XC552.

8 întreruperi ale timerului T2 sunt generate de flagurile CTI0 – CTI3, CMI0 – CMI2 și de logica OR a flagurilor T2OV și T2BO. Flagurile CTI0 la CTI3 sunt setate de semnalele de intrare CT0I la CT3I. Flagurile CMI0 la CMI2 sunt setate când are loc o coincidență între conținutul timerului T2 și a registrelor de comparare CM0, CM1 și CM2. Când are loc o depășire pe 8 biți sau pe 16 biți, flagurile T2BO, respectiv T2OV sunt setate. Aceste nouă flaguri nu sunt șterse prin hardware și trebuie resetate prin software pentru a permite întreruperi repetate.

2.5.2 Registre de activare a întreruperilor. Fiecare sursă de întrerupere poate fi activată în mod individual sau dezactivată prin setarea sau ștergerea unui bit în registrele de funcții speciale de activare a întreruperilor IEN0 și IEN1. Toate sursele de întrerupere pot fi de asemenea activate sau dezactivate în mod global prin setarea sau ștergerea bitului EA din IEN0. Registrele de activare a întreruperilor sunt descrise în fig. 2.10 și 2.11.

Fig. 2.10 Registrul de activare a întreruperilor (IEN0)

Fig. 2.12 Registrul de activare a întreruperilor timerului T2 (IEN1)

2.5.3 Structura de prioritate a întreruperilor. Fiecărei surse de întrerupere i se poate atribui unul din două nivele de prioritate. Nivelele de prioritate a întreruperilor sunt definite de registrele de funcții speciale a prioităților întreruperilor IP0 și IP1. IP0 și IP1 sunt prezentate în fig. 2.13 și 2.14.

Nivelele de prioritate a întreruperilor sunt după cum urmează:

"0" – prioritate scăzută

"1" – prioritate înaltă

O întrerupere cu nivel scăzut de prioritate poate fi întreruptă de o întrerupere de nivel înalt. O întrerupere de nivel înalt nu poate fi întreruptă de nici o altă sursă de întrerupere. Dacă apar simultan două cereri de întreruperi pe nivele de prioritate diferite, este servită cererea cu nivel de prioriate înalt. Dacă se primesc simultan cereri pe același nivel de prioritate, o secvență de testare internă (polling) va determina care cerere va servită. Astfel, în interiorul fiecărui nivel de prioritate, există o a doua structură de prioritate, determinată de secvența de polling. Această a doua structură de prioritate este prezentată în tabelul 2.2.

Structura de prioriate din interiorul nivelului de mai sus este folosită numai când există cereri simultane de același nivel de prioritate.

2.5.4 Manevrarea întreruperilor. Sursele de întrerupere sunt eșantionate la momentul S5P2 al fiecărui ciclu mașină. Eșantioanele sunt verificate pe durata următorului ciclu mașină. Dacă unul din flaguri a fost într-o condiție de stare de setare la momentul S5P2 al ciclului mașină anterior, ciclul de polling îl va identifica și sistemul de întreruperi va genera un LCALL la rutina de servire corespunzătoare, cu condiția că acest LCALL generat hardware nu este blocat de oricare din următoarele condiții:

O întrerupere de prioritate mai înaltă sau egală în desfășurare;

Ciclul mașină curent nu este ciclul final în executarea instrucțiunii în desfășurare (nici o cerere de întrerupere nu va fi servită până când instrucțiunea în curs de execuție nu este completată);

Instrucțiunea în curs este RETI sau orice acces la registrele de prioritate a întreruperilor sau de activare a întreruperilor (nu va fi servită nici o întrerupere după RETI sau după o citire sau scriere în IP0, IP1, IE0 sau IE1, până când cel puțin o altă instrucțiune ulterioară nu a fost executată).

Fig. 2.13 Registrul de prioritate a întreruperilor (IP0)

Fig. 2.14 Registrul de prioritate a întreruperilor (IP1)

Tabelul 2.2 Structura de prioritate a întreruperilor

Ciclul polling este repetat cu fiecare ciclu mașină, iar valorile testate sunt valorile existente la momentul S5P2 al ciclului mașină precedent. De notat faptul că un flag de întrerupere este activ, dar nu i se răspunde din cauza condițiilor de mai sus și dacă flagul este inactiv când condiția de blocare a fost îndepărtată, atunci întreruperea blocată nu va mai fi servită. Astfel, faptul că flagul de întrerupere a fost odată activ, dar nu a fost servit, nu se memorează. Fiecare ciclu polling este unul nou.

Procesorul confirmă o cerere de întrerupere prin executarea unui LCALL generat hardware la rutina de servire corespunzătoare. În unele cazuri el șterge de asemenea flagul care a generat întreruperea, iar în alte cazuri nu. El șterge flagurile pentru timerul 0, timerul 1 și întreruperi externe. Un flag de întrerupere externă (IE0 sau IE1) este șters numai dacă a fost activat pe front. Toate celelalte flaguri de întrerupere nu sunt șterse hardware și trebuie șterse software. Instrucțiunea LCALL salvează în stivă conținutul contorului de program (dar nu salvează cuvântul de stare program PSW) și reîncarcă contorul de program cu o adresă ce depinde de sursa întreruperii ce este vectorizată, așa cum se prezintă în tabelul 2.3.

Executarea programului continuă de la adresa vectorului, până când este întâlnită instrucțiunea RETI. Instrucțiunea RETI șterge bistabilul "nivel de prioritate activ" care a fost setat când această întrerupere a fost confirmată. Apoi extrage din stivă cei 2 octeți plasați cel mai sus și reîncarcă contorul de program. Executarea programului întrerupt continuă din punctul în care a fost întrerupt.

Tabelul 2.3 Adresele vectorilor de întrerupere

2.6 Structura porturilor I/O

8XC552 are șase porturi de 8 biți. Fiecare port constă dintr-un latch (registru de funcții speciale P0 la P5), un buffer de intrare și un driver de ieșire (numai porturile 0 la 4). Porturile 0 – 3 sunt aceleași ca la 80C51, cu execepția funcțiilor suplimentare ale portului 1. Funcționarea paralel a portului 4 este identică cu a porturilor 1, 2 și 3. Portul 5 poate fi numai port de intrare.

Un latch de bit corespunde unui bit din porturile registrelor de funcții speciale și este reprezentat de un bistabil tip D. Un semnal "scrie în latch" de la unitatea centrală va "zăvorî" un bit de pe magistrala internă, iar un semnal "citește latch", semnalul de la unitatea centrală plasează ieșirea Q a bistabilului pe magistrala internă. Un semnal "citește pin" de la unitatea centrală plasează nivelul prezent la pinul portului pe magistrala internă. Anumite instrucțiuni de citire în port citesc nivelele prezente la pinii portului, alte instrucțiuni citesc conținuturile latchurilor (registre de funcții speciale).

În tabelul 2.4 din anexa este prezentată structura porturilor intrare / ieșire și funcții alternative ale acestora.

2.7 Organizarea memoriei

Organizarea memoriei pentru 8XC552 este aceeași ca pentru 80C51, cu excepția faptului că 8XC552 are 8 kROM, 256 octeți RAM și registrele de funcții speciale adiționale. Modurile de adresare sunt aceleași pentru 8XC552 și 80C51. Detalii asupra diferențelor sunt date în următoarele paragrafe.

În circuitul 8XC552, partea inferioară de 8k din spațiul adresei de memorie de 64 k este ocupată de ROM-ul intern. Prin conectarea pinului la nivel HIGH, procesorul preia instrucțiuni de la memoria program ROM internă. Expansiunea magistralei pentru accesarea memoriei program de la 8 k în sus este automată, întrucât preluarea instrucțiunilor externe se desfășoară automat atunci când contorul de program depășește valoarea 8191. Dacă pinul este conectat la nivel LOW, tot programul este preluat de la memoria externă. Viteza de execuție pentru 8XC552 este aceeași indiferent dacă preluarea instrucțiunilor se face de la memoria program internă sau externă. Dacă toată stocarea este on-chip, atunci locația octetului 8191 trebuie lăstă liberă pentru a preveni un proces de pre-aducere nedorit de la adresa memoriei program externă 8192.

Câteva locații din memoria program sunt rezervate pentru operații speciale de program. Locațiile 0000H la 0002H sunt rezervate pentru programul de inițializare. După reset, unitatea centrală începe executatrea programului de la locația 0000H. Locațiile 0003H la 0075H sunt rezervate pentru 15 rutine de servire a întreruperilor.

Din punct de vedere funcțional, memoria de date interne este partea cea mai flexibilă din spațiul de adresă. Spațiul intern al memoriei de date este subdivizat într-un spațiu de adresă de 256 octeți de date interne RAM și un spațiu de adresă de 128 octeți al registrelor de funcții speciale.

Spațiul de adresă al memoriei interne RAM este de la 0 la 255. Patru bancuri de registre de 8 biți ocupă locațiile 0 la 31; 128 locații de bit ale memoriei interne RAM sunt accesibile prin adresare directă. Acești biții sunt cuprinși în 16 octeți de memorie internă RAM la locațiile 20H la 2FH. Stiva poate fi localizată oriunde în spațiul de adresă al memoriei interne RAM prin încărcarea indicatorului de stivă de 8 biți. Înălțimea stivei poate fi de maximum 256 octeți.

Spațiul de adresă al registrelor de funcții speciale este 128 la 255. Toate registrele, cu excepția contorului de program și toate cele patru bancuri de registre de 8 biți sunt plasate în acest spațiu. Maparea memoriei pentru registrele de funcții speciale le permite acestora să fie accesate la fel de ușor precum RAM-ul intern și, ca și acesta, pot fi operate prin mai multe instrucțiuni. Cele 56 registre de funcții speciale în spațiul de adresă al registrelor de funcții speciale este prezentată în fig. 2.15.

Conectarea unui modul de afișare cu cristale lichide

1. Prezentare generală.

Există mai multe tipuri de module de afișare cu cristale lichide care diferă între ele prin:

– numărul de linii pe care se face afișarea: 1 sau 2,

– numărul de caractere pe linie: 16, 20, 24, 32 sau 40,

– fond verzui sau gri.

Toate, însă, au câteva caracteristici comune:

– încorporează circuite de comandă LSI,

– au aceeași interfață cu exteriorul ceea ce înseamnă că se comandă la fel,

– au aceleași comenzi,

– au aceeași codificare pentru date, (ASCII).

Un modul de afișare cu cristale lichide poate fi conectat la o magistrală de date de 4 sau 8 biți. Dacă se folosește o magistrală de 4 biți, liniile D0-3 nu sunt folosite.

Modulul dispune de o memorie pentru afișare, DDRAM, având capacitatea de 80 octeți, corespunzător posibilităților maxime de afișare, 2 * 40 caractere, în care se memorează codurile caracterelor primite de la unitatea centrală.

Codul unui caracter este transformat într-o matrice de 5 * 7 puncte, corespunzătoare caracterului respectiv, care este afișată pe ecran. Transformarea se face prin intermediul unui generator de caractere, realizat cu o memorie ROM care conține octeții corespunzători la 160 matrici de 5 * 7 puncte.

Modulul mai conține un generator de caractere realizat cu o memorie RAM, CGRAM, având capacitatea de 64 octeți, prin intermediul căreia se pot defini 8 caractere utilizator, având dimensiunea de 5 * 8 puncte.

Pentru afișarea unui caracter este necesar ca unitatea centrală să trimită către modul adresa poziției pe care se va afișa cursorul și apoi codul caracterului. Matricea care îi corespunde, din CGRAM sau ROM, va fi afișată la adresa indicată.

Se poate comanda autoincrementarea sau autodecrementarea cursorului ceea ce înseamnă că nu mai este necesară transferarea adresei pentru fiecare caracter. De asemenea este posibilă deplasarea la dreapta sau la stânga a întregului ecran, ceea ce permite crearea efectului de rotire a informației pe ecran.

Tab. 1.1 prezintă comenzile unui modul de afișare cu cristale lichide:

Este necesară respectarea duratei de execuție a comenzilor.

În continuare vor fi descrise semnificațiile comenzilor. Prima semnificație corespunde valorii 1 a rangurilor iar a doua corespunde valorii 0 a rangurilor.

Ștergere ecran: are efectul de a șterge informația de pe ecran.

Inițializare: aduce cursorul în poziția inițială.

Setare mod introducere: setează modul de introducere a datelor. Semnificațiile rangurilor sunt următoarele:

I/ D: incrementare/ decrementare automată a adresei cursorului;

S: validează sau nu deplasarea ecranului.

Ecran on/ off: semnificațiile rangurilor sunt următoarele:

D: activare sau nu a ecranului;

C: activare sau nu a cursorului;

B: pâlpâire sau nu a matricii de puncte la poziția cursorului.

Deplasare ecran/ cursor: provoacă deplasarea ecranului sau a cursorului; semnificațiile rangurilor sunt:

S/ C: deplasare ecran sau cursor

R/ L: deplasare la dreapta sau la stânga.

Setare funcții: setează caracteristicile de lucru; semnificațiile rangurilor sunt următoarele:

DL: interfață pe 8 sau 4 biți;

N: număr de linii de pe ecran: 2 sau 1.

Setare adresă din CGRAM: câmpul ACG indică una din cele 64 locații din CGRAM în care se va înscrie un octet care face parte din matricea corespunzătoare unui caracter utilizator; la afișarea unui asemenea caracter, prima locație, dintr-un grup de 8, corespunde liniei de sus, următoarea locație corespunde liniei următoare ș. a. m. d.

Setare adresă din DDRAM: câmpul ADD indică adresa din DDRAM în care se va înscrie codul caracterului ce se va afișa; această adresă indică poziția cursorului; primei poziții din primul rând îi corespunde adresa 80H iar primei poziții din al doilea rând îi corespunde adresa A8H.

Citire adresă și indicator: citește adresa din numărătorul de program, care poate fi adresa unei locații din CGRAM sau din DDRAM, AC și indicatorul ce arată starea de ocupat/ liber a modulului de afișare, BF.

Scrie și afișează data: scrie data în CGRAM sau DDRAM; atunci când se scrie în CGRAM, doar celor 5 ranguri mai puțin semnificative, din fiecare octet, le vor corespunde puncte pe ecran; 1 înseamnă punct aprins iar 0 înseamnă punct stins.

Citește data: citește data din CGRAM sau DDRAM.

Tab. 1.2 prezintă terminalele unui modul de afișare cu cristale lichide și semnificațiile lor.

Fig. 1.3 prezintă ciclurile de scriere, a, la modulul de afișare și de citire, b, din modulul de afișare.

Valorile tipice pentru timpii care intervin în diagrame sunt: tCYCE = min 1000 ns, tE = min 450 ns, tAS = min 140 ns, tAH = min 10 ns, tDSW = min 195 ns, tH = min 10 ns, tDDR = max 320 ns și tDHR = min 20 ns.

Fig. 1.3 Ciclurile de scriere, a și citire, b la/ de la un modul de afișare cu cristale lichide.

În cazul sistemului experimental cu microcontrolerul 80C552 a fost conectat un modul SHARP cu 2 linii * 24 caractere. Schema de conectare este prezentată în cadrul schemei generale a sistemului, iar în listingul sistemului sunt prezentate rutinele de comandă a modulului.

2.Descrierea sistemului de afișare tip LCD L2432

L2432 este un sistem de afișare dotat cu un afișor cu cristale lichide de tipul matricial cu puncte cu consum redus , contrast ridicat și unghi larg de vedere cu 2 x 24 caractere si un controler de comanda fabricat în tehnologie CMOS .

Fig. 1.4 Structura generala a sistemului L2432:

Caracteristici :

display cu cristale lichide , 2 x 24 caractere, matrice 5 x 7 puncte + cursor

factor de umplere 1/16

ROM generator de caractere pentru 192 de tipuri

RAM generator de caratere , pentru 8 tipuri de caractere speciale (scrise în program )

RAM afișare date 80 x 8 biți ( 80 de caractere maximum )

interfațare pe 4 sau 8 biți

posibilitate de citire de către sistemul cu microcontroler a RAM-ului afișare date și a RAM-ului generator de caractere

multiple funcții-instrucțiuni : ștergere afișaj, cursor la capăt, afișare ON/OFF, afișare caracter clipitor, deplasare cursor și deplasare afișaj

circuit oscilator inclus

alimentare de la o sursă +5v

circuit de reset automat la stabilirea alimentării încorporat

controler CMOS ( KS0066 )

domeniul temperaturilor de funționare la C.

Fig. 1.5 Structura controlerului KS0066

Tab.1.6 prezintă caracterele generate prin intermediul memoriei ROM. Ultimele 2 coloane corespund unor caractere ce se vor afișa pe o matrice de 5 * 10 puncte.

Capitolul 4.

Structura soft a computerului.

Prezentarea programului pe baza organigramelor din anexă și comentarea subrutinelor componente.

4.1 Programul de inițializare

Programul începe cu includerea fișierului „REG552.INC” care conține declarații specifice microcontrolerului 80c552, referitoare la regiștri de funcții speciale, timer doi și trei, convertor analog- digital, convertor digital-analog, linii de pot cu funcții multiple, și alte diferențe față de 80C51.

La începutul programului se află zona pentru inițializarea microcontrolerului. Inițial se vor defini ssec, sec, min, ora, ziua, luna, anul1 și anul2 ca segmente de date, pentru cronometru și cora, cmin, csec, cssec pentru cronometru. Acestea nu vor fi apelate decât la începutul programului.

$INCLUDE (REG552.INC)

cora DATA 2bh ; definește segment date ora la adresa 2BH.

cmin DATA 2cH ; definește segment date minute la adresa 2CH.

csec DATA 2dH ; definește segment date secunde la adresa 2DH.

cssec DATA 2eH ; definește segment date sutimisec la adresa 2EH.

ssec DATA 2FH ; definește segment date sutimisec la adresa 2fH.

sec DATA 30H ; definește segment date SEC la adresa 30H.

min DATA 31H ; definește segment date MIN la adresa 31H.

ora DATA 32H ; definește segment date ORA la adresa 32H.

ziua DATA 33H ; definește segment date ZIUA la adresa 33H.

luna DATA 34H ; definește segment date LUNA la adresa 34H.

anul1 DATA 35H ; definește segment date ANUL parte inferioară la 35H.

anul2 DATA 36H ; definește segment date ANUL parte superioară la 36H.

but1 bit 0b1H ;p3.1

but2 bit 0b2H ;p3.2

but3 bit 0b3H ;p3.3

Se declara zona de salt a programului la stabilirea alimentării sau la reset „8000H” de aici va începe să ruleze programul in memoria internă a microcontrolerului si adresa de deservire a întreruperii comparării CM0.

ORG 8000H ; adresa la care începe programul la reset.

JMP start ; salt la eticheta.

ORG 805bH ; adresa deservire întrerupere CM0.

jmp time2 ; salt la eticheta time2.

In subrutina definită de eticheta „start” se încarcă valorile de la care începe să funcționeze ceasul, prima valoare care se va afișa.

start: ; Se definește rutina prin eticheta „start”.

MOV ssec,#00H ; Încarcă valoarea de inițializare a sutimilor.

MOV sec,#0aH ; Încarcă valoarea de inițializare a secundelor.

MOV min,#0bH ; Încarcă valoarea de inițializare a minutelor.

MOV ora,#0cH ; Încarcă valoarea de inițializare a orei.

MOV ziua,#11H ; Încarcă valoarea de inițializare a zilei

MOV luna,#06H ; Încarcă valoarea de inițializare a lunii.

MOV anul2,#04H ; Încarcă valoarea de inițializare a anului parte inferioară . MOV anul1,#14H ; Încarcă valoarea de inițializare a anului parte superioară.

Pentru a se lucra cu afișajul se face o inițializare a acestuia, inițializare se face în subrutina „LCD_INIT”. Totodată se va afișa ceasul și calendarul prin cele patru subrutine „dafișaj, dceas, dluna și ddata”.

CALL LCD_INIT ;Inițializarea afișajului prin apelul subrutinei.

call dafisaj ;subrutina de afișaj comentarii și „:”

call dceas ;subrutina de afișaj oră min sec

call dluna ;subrutina de afișaj luna.

call ddata ;subrutina de afișaj ziua si anul.

4.2 Programul principal.

Odată cu începere rutinei „init2” începe și programul principal dar după inițializare timerului T2. Se definește „init2” program principal deoarece din această rutină se apelează toate celelalte subrutine. Totodată după generarea întreruperii de către registrul de comparare CM0 timerul trebuie resetat și trebuie reinițializat timerul T2.

Această întrerupere se programează la fiecare 100ms prin încărcarea registrelor CML0 cu 25h și CMH0 cu 89h ; când are loc o coincidență intre timer și registrul de comparare. Resetul timerului se realizează prin aplicare la intrarea RT2 a unui front pozitiv, care se obține prin bascularea din 0 în 1 logic a pinului 4.0.

init2: ; Se definește rutina prin eticheta „init2”.

CLR P 4.4 ; Șterge pinul (4.4) la care se leagă resetul T2

MOV STE,#10h ; Activare set pin port 4.4 la comparare

MOV TM2CON,#25H ; Timer 2 în modul 1 SURSA CLOCK /12.

MOV CML0,#0b9H ; Încărcare comparare registru 0 parte low.

MOV CMH0,#08cH ; Încărcare comparare registru 0 parte high.

SETB EA ; Activare globala a întreruperilor.

SETB ET2 ; Activare întreruperi timer T2.

SETB ECM0 ; Activare întrerupere comparare 0 T2.

SETB PCM0 ; Nivel prioritate comparare CM0 T2

JNB but1,cron ;p3.1

JNB but2,sceas ;p3.2

JMP init2 ; Salt la int2, se face o buclă fără sfârșit cu rol ; de program principal.

4.3 Programul de deservire a întreruperii CM0.

Subrutina de deservire a întreruperii comparare a registrului de comparare CM0 cu timerului T2 apelată de la adresa flagului de întrerupere. Cu prima instrucțiune din subrutină se ștergere flagul de întrerupere, deoarece la terminarea subrutinei s-ar reveni în aceasta fără să mai fie generată altă cerere. Pentru acest flag este necesară o ștergere prin program el nefiind șters automat.

time2: ; Se definește rutina prin eticheta „timer2”.

jnb but2,endcs ; Salt la eticheta „endcs”, salt peste apelul rutinei de

; incrementare a cronometrului.

call icron ; Apelul rutinei de incrementare a cronometrului.

endcs: ; Etichetă „endcs”

CLR CMI0 ; Șterge flag intrerupere CM0 al T2

MOV A,ssec ; Încarcă valoarea sutimilor de secundă în A.

INC A ; Incrementează acumulatorul.

MOV ssec,A ; Mută noua valoare în ssec, noua valoare a

; sutimilor de secundă.

CJNE A,#0aH, endtime2 ; ; Compară valoare a acumulatorului cu

; numărul 10 dacă nu este egal sare la

; eticheta „endtime2”.

MOV ssec,#00H ; Dacă s-a ajuns la 10 se rescriu sutimile de ;secundă cu 0.

Programul continuă cu subrutinele de afișaj, se afișează noile valori. Se introduce în acest punct al programului apelul subrutinelor de afișaj pentru a se face o reafișare a noilor valori o dată cu trecerea unei secunde. Astfel se face o temporizare afișării de o secundă. Tot aici se introduce un salt peste rutina de afișaj a ceasului daca but1 este afișat aceasta reprezentând starea cronometru în care se află programul.

jnb but1,pesteceas ; Salt dacă but1 nu este afișat la eticheta

; „pesteceas” când starea este cronometru.

call dceas ;subrutina de afișaj oră min sec

call dluna ;subrutina de afișaj luna.

call ddata ;subrutina de afișaj ziua si anul.

pesteceas: ; Etichetă „pesteceas”.

Programul de ceas.

Începe din subrutina de deservire a întreruperii timerului T2 propriu-zis odată cu contorizarea sutimilor de secundă. Ne interesează pentru măsurarea și afișarea ceasului cantitatea minimă de 1s și cu contorizarea acestei valori vom începe programul de ceas.

Se constată depășirea unei secunde și se trece la subrutina de incrementare și testare a numărului maxim de secunde.

MOV A,sec ; Încarcă valoarea secundelor în A.

INC A ; Incrementează acumulatorul.

MOV sec,A ; Mută noua valoare în sec, noua valoare a

; secundelor.

CJNE A,#3cH, endtime2 ; Compară valoare a acumulatorului cu

; numărul 60 dacă nu este egal sare la

; eticheta „endtime2”.

MOV sec,#00H ; Dacă s-a ajuns la 60 se rescriu secundele cu 0.

Se constată depășirea a 60 secunde adică a unui minut și se trece la subrutina de incrementare și testare a numărului maxim de minute.

MOV A,min ; Încarcă valoarea minutelor în A.

INC A ; Incrementează acumulatorul.

MOV min,A ; Mută noua valoare în min, noua valoare a

; minutelor.

CJNE A,#3cH, endtime2 ; Compară valoare a acumulatorului cu

; numărul 60 dacă nu este egal sare la

; eticheta „endtime2”.

MOV min,#00H ; Dacă s-a ajuns la 60 se rescriu minutele cu 0.

Se constată depășirea a 60 minute adică a unei ore și se trece la subrutina de incrementare și testare a numărului maxim de ore.

MOV A,ora ; Încarcă valoarea orelor în A.

INC A ; Incrementează acumulatorul.

MOV ora,A ; Mută noua valoare în ora, noua valoare a

; orelor.

CJNE A,#18H, endtime2 ; Compară noua valoare a acumulatorului cu

; numărul 24 dacă nu este egal sare la

; eticheta „endtime2”.

MOV ora,#00H ; Dacă s-a ajuns la 24 se rescriu orele cu 0

Se constată depășirea a 24 ore adică a unei zile și se trece la subrutina de incrementare și testare a numărului maxim de zile. Aici se complică puțin programul deoarece avem luni care au 30 sau 31 zile și februarie care are 28 sau 29 zile.

MOV R6,luna ; Mută în registru R6 luna.

CJNE R6,#02H ,merge ; Compara luna sa vad daca nu este

; februarie și sare la subrutina „merge”

jmp feb ; Daca este luna februarie sare la

; subrutina lunii februarie

Următoarea subrutină testează dacă luna are 30 sau 31 de zile pentru a ști până la ce valoare se incrementează zilele. Testarea se face prin împărțirea numărului lunii curente la doi, rezultatul se compara cu unu iar daca este egal avem luna cu 30 zile.

merge: ; Subrutina cu eticheta „merge”.

MOV A,luna ; Încarcă valoarea lunilor în A.

MOV B,#02H ; Încarcă registrul B cu 2.

DIV AB ; Împarte A la B

MOV R5,B ; Încarcă registrul R5 cu conținutul registrului B

CJNE R5,#01H ,luna30 ; Compară R5 cu 1 și sare la dacă nu egal la

; subrutina „luna30

Subrutina care urmează este pentru luna cu 31 zile. În urma comparărilor sa decis că luna este cu 31 zile și se trece la incrementarea și testarea numărului maxim de zile. În această subrutină mai avem declarată o subrutină prin eticheta „cont” unde se face revenirea din subrutinele de deservise a lunilor cu 30 zile si a lunii februarie.

Este necesară această subrutină de continuare a programului deoarece după depășirea numărului de zile ale lunii curente se reinițializează valoarea zilelor cu zero și se trece la incrementarea si testarea lunii curente.

MOV A,ziua ; Încarcă valoarea zilelor în A.

INC A ; Incrementează acumulatorul.

MOV ziua,A ; Mută noua valoare în ziua, noua valoare a

; zilelor.

CJNE A,#20H, endtime2 ; Compară noua valoare a acumulatorului cu

; numărul 32 zecimal dacă nu este egal sare la

; eticheta „endtime2”.

cont: ; Etichetă subrutină.

MOV ziua,#01H ; Dacă s-a ajuns la 24 se rescriu zilele cu 1 zecimal.

Odată cu subrutina „cont” și inițializarea zilelor cu valoarea 1 se depășește o lună și se trece la următoarea subrutină de incrementare și testare a valorii maxime a numărului de luni.

MOV A,luna ; Încarcă valoarea lunilor în A.

INC A ; Incrementează acumulatorul.

MOV luna,A ; Mută noua valoare în luna, noua valoare a

; lunilor.

CJNE A,#0dH, endtime2 ; Compară noua valoare a acumulatorului cu

; numărul 13 zecimal dacă nu este egal sare la

; eticheta „endtime2”.

mov luna,#01H ; Dacă s-a ajuns la 13 se rescrie luna cu 1 zecimal.

Se constată depășirea a 12 luni adică a unui an și se trece la subrutina de incrementare și testare a numărului maxim de ani, parte inferioară ultimii doi digiți.

Când se ajunge la valoarea maximă de 99 ani parte inferioară se incrementează și poarte superioară a anilor.

MOV A,anul2 ; Încarcă valoarea anilor inferior în A.

INC A

MOV anul2,A ; Mută noua valoare în anul2, noua valoare a

; anilor parte inferioară.

CJNE A,#64H, endtime2 ; Compară noua valoare a acumulatorului cu

; numărul 100 zecimal dacă nu este egal sare la

; eticheta „endtime2”.

MOV anul2,#00H ; Dacă s-a ajuns la 100 zecimal se rescrie anul

; parte inferioară cu 0 zecimal.

MOV A,anul1 ; Încarcă valoarea anilor superior în A

INC A ; Incrementează acumulatorul.

MOV A,anul1 ; Mută noua valoare în anul2, noua valoare a

; anilor parte superioară.

endtime2: ; Etichetă „endtime2”

reti ; Revenire din subrutina de deservire a întreruperii

; CM0 a timerului T2.

Subrutina „luna30” este apelată numai atunci când în urma testării se constată că luna curentă are 30 zile. Este o buclă de program în interiorul rutinei de deservire a întreruperii CM0 a timerului T2. Se testează numărul maxim de zile, se sare la sfârșitul subrutinei „time2” (endtime2) dacă nu au trecut 30 zile si la eticheta „cont” dacă au trecut 30 și se continuă programul de la această etichetă.

luna30: ; Etichetă „luna30”

MOV A,ziua ; Încarcă valoarea zilelor în A.

INC A ; Incrementează acumulatorul.

MOV ziua,A ; Mută noua valoare în ziua, noua valoare a

; zilelor.

CJNE A,#1fH, endtime2 ; Compară noua valoare a acumulatorului cu

; numărul 31 zecimal dacă nu este egal sare la

; eticheta „endtime2”.

jmp cont ; Sare la eticheta „cont”.

Dacă în urma testării se constată luna curentă este februarie programul sare la subrutina de deservire a lunii februarie definită de eticheta „feb”. Aceasta este împărțită în două adică are două bucle una pentru ani bisecți și una pentru anii nebisecți.

Pentru an bisect/nebisect se face o împărțire a ultimelor două cifre la patru și se compară restul cu 0. Dacă restul împărțirii nu este se decide că anul curent nu este bisect și programul sare la eticheta „ann” unde se incrementează numărul maxim de zile până la 28. Dacă restul împărțirii este zero programul continuă cu eticheta „anb” și se incrementează numărul maxim de zile pană la 29.

În ambele cazuri revenirea din aceste subrutine se face la eticheta „cont” unde se încarcă ziua cu 0 și se continuă programul, sau la eticheta „endtime2” care marchează sfârșitul întreruperii CM0.

feb: ; Etichetă „feb”

MOV A,anul2 ; Încarcă valoarea anului ultimele două

; cifre în A.

MOV B,#04H ; Încarc registrul B cu 4 zecimal.

DIV AB ; Împart registrul A la B.

MOV R7,B ; Mută conținutul registrului B în registrul R7.

CJNE R7,#00H ,ann ; Compară registrul R7 cu 0 zecimal sare la

; ”ann” anul nu este bisect rest diferă de 0

anb: ; Etichetă „anb” anul este bisect .

MOV A,ziua ; Încarcă valoarea zilei în A.

INC A ; Incrementează acumulatorul.

MOV ziua,A ; Mută noua valoare în ziua, noua valoare a

; zilelor.

CJNE A,#1EH, endtime2 ; Compară noua valoare a acumulatorului cu

; numărul 30 zecimal dacă nu este egal sare la

; eticheta „endtime2”.

jmp cont ; Programul sare la eticheta „cont”

ann: ; Etichetă „ann” anul nu este bisect.

MOV A,ziua ; Încarcă valoarea zilei în A.

INC A ; Incrementează acumulatorul.

MOV ziua,A ; Mută noua valoare în ziua, noua valoare a

; zilelor.

CJNE A,#1DH, endtime2 ; Compară noua valoare a acumulatorului cu

; numărul 29 zecimal dacă nu este egal sare la

; eticheta „endtime2”.

jmp cont ; Programul sare la eticheta „cont”

Programul cronometru.

La detectarea tastei „but1” programul sare la rutina de cronometru care începe la eticheta „cron”. Avem la începutul aceste rutine două testări ale tastei „but3”, dacă aceasta nu este apăsată se afișează starea curentă de cronometru împreună cu interogarea de start.

Odată cu apăsarea „but3” cronometru începe să funcționeze și se apelează rutina de afișare a cronometrului. Prin reapăsarea tastei „but3” se resetează cronometrul și se reafișează interogarea de start cronometru.

Stopul cronometrului pentru citirea unor valori intermediare se face prin apăsarea tastei „but2” care inhibă incrementarea cronometrului. La o nouă apăsare a tastei reîncepe incrementarea cronometrului, în tot acest timp se rămâne în starea de afișaj a cronometrului.

cron: ; Eticheta de program a cronometrului.

JNB but3,pestdst ; Test dacă tasta but3 este apăsată și salt la eticheta

; „pestdst” dacă nu este apăsată.

CALL dst_cr ; Se apelează rutina de afișaj a stării de interogare pentru

; cronometru de la eticheta „dst_cr”.

MOV cssec,#00H ; inițializare cssec cu 0.

MOV csec,#00H ; inițializare csec cu 0.

MOV cmin,#00H ; inițializare cmin cu 0

MOV cora,#00H ; inițializare cora cu 0.

pestdst: ; Etichetă pentru saltul but3 neapăsat.

JB but3,endb3 ; Salt dacă tasta but3 nu este apăsată la eticheta „endb3”.

CALL dcron ; Se apelează rutina de afișaj a cronometru activ de la

; eticheta „dcron”.

endb3: ; Eticheta „endb3 „

JMP init2 ; Salt la eticheta „init2” care constituie partea de program

; principal și unde se testează dacă nu s-a modificat starea ; programului, dacă nu a trecut în starea de ceas.

Rutina de incrementare a cronometrului apelată la în urma testului de but2 apăsat din rutina de deservire a întreruperii timerului T2. Se introduce o întrerupere a incrementării cronometrului pentru a putea fi oprit și citit la intervale de timp dorite.

La intrarea in rutina de deservire a întreruperii avem depășirea unui interval de timp de 100 ms sau 0.1 s același folosit și pentru ceas și se va face o contorizare identică doar ca valoarea maximă a cronometrului este de 99 ore după care se începe numărarea de la zero.

icron: ; Eticheta „icron” care definește rutina de

; incrementare a registrelor cronometrului.

INC cssec ; Se incrementează sutimile de secundă

; corespunzătoare cronometrului.

MOV A,cssec ; Mută valoarea sutimilor de secundă în acumulator.

CJNE A,#0aH, endicron ; Se testează dacă s-a ajuns la 10, adică 1 secundă ; și sare la eticheta „endicron”.

MOV cssec,#00H ; Se rescrie registrul sutimilor de secundă cu 0.

INC csec ; Se incrementează secundele.

MOV A,csec ; Mută valoarea secundelor în acumulator.

CJNE A,#03cH, endicron ; Se testează dacă s-a ajuns la 60, adică 1 minut

; și sare la eticheta „endicron”.

MOV csec,#00H ; Se rescrie registrul secundelor cu 0.

INC cmin ; Se incrementează minutele.

MOV A,cmin ; Mută valoarea minutelor în acumulator.

CJNE A,#03cH, endicron ; Se testează dacă s-a ajuns la 60, adică 1 oră

; și sare la eticheta „endicron”.

MOV cmin,#00H ; Se rescrie registrul minutelor cu 0.

INC cora ; Se incrementează orele.

MOV A,cora ; Mută valoarea orelor în acumulator.

CJNE A,#064H, endicron ; Se testează dacă s-a ajuns la 99, numărul

; maxim de ore și sare la eticheta „endicron”.

MOV cora,#00H ; Se rescrie registrul orelor cu 0.

endicron: ; Eticheta „endicron”

RET ; Revenire din rutina de incrementare a

; cronometrului și continuă în zona de program unde

;a fost apelată rutina de incrementare a cronometrului.

Programul de setare a ceasului.

Se apelează din programul principal, dacă nu ne aflăm în rutina cronometrului, prin detectarea tastei „but2” apăsată. Nu se poate trece din rutina cronometrului în rutina de setare a ceasului din două motive:

În această rutina tasta but2 are alt rol; de oprire și pornire a cronometrului pentru valori intermediare.

Nu mai este citită tasta but2 deoarece se face salt în rutina cronometrului prin citire tastei but1 înainte de testarea acesteia.

Programul rămâne în această rutină până la o nouă apăsare a butonului but2, care se citește în mod repetat prin introducerea unei bucle, fiind dezactivată și întreruperea care ar putea să scoată programul din această buclă.

La apelarea setării ceasului se încarcă un registru cu valoarea adresei primului registru de interes în acest caz 31; registru minutelor avându-se la adresa 31h. Se mai introduc două bucle de program una pentru testarea tastei but1 și una pentru testarea tastei but3; but1 are rol de incrementare a registrului curent, iar but3 are rol de deplasare și selectare a următorului registru. Plecând de la registru min prin apăsarea tastei but3 se trece la registrul min prin o nouă apăsare se selectează următorul registru, în ordine de la min, ore, zile, luni, anul1, anul2.

sceas: ; Etichetă care definește rutina de setare a ceasului.

MOV 38H,#31H ; Mută In registrul de la adresa 38H numărul 31

; corespunzător adresei la care se află minutele.

; Pentru o contorizare și deplasare a registrelor de interes.

CLR EA ; Dezactivare globală a întreruperilor.

resc: ; Eticheta „resc”

JB but1,pesteinc ; Salt la eticheta „pesteinc” dacă but1 nu este apăsat.

MOV A,38H ; Mută valoarea registrului de la adresa 38H în acumulator.

CJNE A,#31h,peste1 ; Compară A cu valoarea 31 sare dacă nu este egal la

; eticheta „peste1” nu este selectat registrul curent.

INC min ; Incrementează min.

MOV R4,min

CJNE R4,#3cH,peste1 ; Compară si sare la eticheta „peste1” dacă în urma

; incrementării registrului s-a ajuns la valoarea maximă.

MOV min,#00h ; Încarcă min cu 0 zecimal.

peste1: ; Eticheta „peste1”

CJNE A,#32h,peste2 ; Compară A cu valoarea 32 sare dacă nu este egal la

; eticheta „peste2” nu este selectat registrul curent.

INC ora ; Incrementează ora.

MOV R4,ora

CJNE R4,#18H,peste2 ; Compară si sare la eticheta „peste2” dacă în urma

; incrementării registrului s-a ajuns la valoarea maximă.

MOV ora,#00h ; Încarcă ora cu 0 zecimal.

peste2: ; Eticheta „peste2”

CJNE A,#33h,peste3 ; Compară A cu valoarea 33 sare dacă nu este egal la

; eticheta „peste3” nu este selectat registrul curent.

INC ziua ; Incrementează ziua.

MOV R4,ziua

CJNE r4,#1eH,peste3 ; Compară si sare la eticheta „peste3” dacă în urma

; incrementării registrului s-a ajuns la valoarea maximă.

MOV ziua,#01h ; Încarcă ziua cu 1 zecimal.

peste3: ; Eticheta „peste3”

CJNE A,#34h,peste4 ; Compară A cu valoarea 34 sare dacă nu este egal la

; eticheta „peste4” nu este selectat registrul curent.

INC luna ; Incrementează luna.

MOV R4,luna

CJNE R4,#0cH,peste4 ; Compară si sare la eticheta „peste4” dacă în urma

; incrementării registrului s-a ajuns la valoarea maximă.

MOV luna,#01h ; Încarcă luna cu 1 zecimal.

peste4: ; Eticheta „peste4”

CJNE A,#35h,peste5 ; Compară A cu valoarea 35 sare dacă nu este egal la

; eticheta „peste5” nu este selectat registrul curent.

INC anul1 ; Incrementează anul parte superioară.

MOV R4,anul1

CJNE R4,#064H,peste5 ; Compară si sare la eticheta „peste5” dacă în urma

; incrementării registrului s-a ajuns la valoarea maximă.

MOV anul1,#00h ; Încarcă anul1 cu 0 zecimal.

peste5: ; Eticheta „peste5”

CJNE A,#36h,peste6 ; Compară A cu valoarea 36 sare dacă nu este egal la

; eticheta „peste6” nu este selectat registrul curent.

INC anul2 ; Incrementează anul parte inferioară.

MOV R4,anul2

CJNE R4,#064H,peste6 ; Compară si sare la eticheta „peste6” dacă în urma

; incrementării registrului s-a ajuns la valoarea maximă.

MOV anul2,#00h ; Încarcă anul2 cu 0 zecimal.

peste6: ; Eticheta „peste6”

Se introduce o buclă pentru incrementarea cu tasta but3 a registrului de la 38H. În cazul detecției tastei but1 apăsată și testarea numărului maxim al registrului, care coincide cu adresa anului parte inferioară. La atingerea valorii maxime 36H registrul de contor se inițializează cu 31H corespunzător adresei la care se află minutele.

Dacă tasta but3 nu este apăsată se sare peste partea de incrementare a registrului, Se introduce o temporizare de 100 ms, se afișează noile valori și se reia programul de la eticheta „resc”.

pesteinc: ; Eticheta „pesteinc”

JB but3,pesteinc1 ; Salt la eticheta „pesteinc1” dacă but3 nu este apăsat.

MOV A,38H

CJNE A,#36H,pesteinc2 ; Compară și sare dacă nu s-a atins valoarea maximă

; 36 a registrului contor de la adresa 38H.

MOV 38H,#31H : Încarcă registrul contor cu valoarea 31.

pesteinc2: ; Eticheta „pesteinc2”

INC 38h ; Incrementează registrul contor de la adresa 38H.

pesteinc1: ; Eticheta „pesteinc1”

call DELAY_15000 ; Se introduce o întârziere de 100 ms pentru

call DELAY_15000 ; temporizarea citirii tastaturii.

call DELAY_15000

call DELAY_15000

call DELAY_15000

call DELAY_15000

call DELAY_15000

JNB but2,revin ; Sare la eticheta revin dacă nu se detectează o nouă

; apăsare a tastei but2,

JMP init2 ; Iese din programul de setare a ceasului dacă se

; detectează o nouă apăsare a tastei but2 prin salt la

; la eticheta „init2” programul principal.

revin: ; Eticheta „revin”

CALL dceas ; Afișează ceasul noile valori după incrementare, prin

CALL dluna ; apelul subrutinelor de afișare de la etichetele „dceas”

CALL ddata ; „dluna” si „ddata”

JMP resc ; Salt în la eticheta „resc” se creează o buclă.

Odată cu detectarea absenței tastei but2 apăsată programul sare la eticheta „init2”, care este eticheta programului principal. Aici se reactivează întreruperile prin setarea bitului EA și programul de ceas continuă funcționarea cu noile valori lăsate în urma rulării rutinei se setare a ceasului.

4.4 Programul de inițializare a afișajului.

Program de utilizare a display-ului LCD cu 24 caractere pe un rând pe chitul de dezvoltare cu microcontroler 80C552.

LCD_INIT: ; Etichetă „LCD_INIT”

CALL DELAY_15000 ;se introduce o întârziere de 3×15000 us

;impusa de funcționarea afișajului

CALL DELAY_15000

CALL DELAY_15000

MOV DPTR,#0100H ;prin intermediul adresei transmise cu DPTR

;aria memoriei externe RAM (in care se "vad"

;registrele display-ului) se selectează display-ul

;si se pun pe 0 biții RS si WR incât controlerul

;modulului LCD sa poată primi instrucțiuni

MOV A,#38H ;fixează modul de lucru al afișajului pe 8 biți

MOVX @DPTR,A ;se transmite comanda la LCD

Aceasta secvența de inițializare a afișajului pentru funcționarea afișajului pe

8 biți se face in mod repetat de patru ori pentru a fi siguri ca modulul funcționează

in modul dorit de către utilizator.

CALL DELAY_4000 ;a doua întârziere scade la 4 ms (4000 us)

MOV DPTR,#0100H

MOV A,#38H

MOVX @DPTR,A

CALL DELAY_100 ;a treia întârziere scade la 0.1 ms (100 us)

MOV DPTR,#0100H

MOV A,#38H

MOVX @DPTR,A

CALL DELAY_100 ;a patra întârziere este tot de 0.1 ms (100 us)

MOV DPTR,#0100H

MOV A,#38H

MOVX @DPTR,A

S-au terminat buclele de temporizare, se trece afișajul in starea off (cuvânt de control 08H)

CALL DELAY_100

MOV DPTR,#0100H

MOV A,#08H

MOVX @DPTR,A

Se șterge tot afișajul si se readuce cursorul pe poziția inițiala (cuvânt de control #01H).

CALL DELAY_100

MOV DPTR,#0100H

MOV A,#01H ; cu aceasta valoare înscrisa in registrul de

MOVX @DPTR,A ; control al display-ul se șterge tot afișajul

; si se readuce cursorul pe poziția inițiala

Comanda obligatorie pentru LCD după ștergere afișaj si/sau Cursor Home (cuvânt de control #02H) – aduce cursorul pe poziția inițiala.

CALL DELAY_100

MOV DPTR,#0100H;aceasta instrucțiune readuce cursorul pe poziția

MOV A,#02H ;inițiala si este absolut necesara după ce au fost

MOVX @DPTR,A ;executate anterior una din instrucțiunile

;Cursor Home sau Display Clear

Se fixează modul de lucru cu incrementare fără deplasarea afișajului (cuvânt de control #06H).

CALL DELAY_100

MOV DPTR,#0100H

MOV A,#06H

MOVX @DPTR,A

Se activează afișajul si cursorul (ON), iar cursorul nu va clipi (cuvânt de control #0EH).

CALL DELAY_4000

MOV DPTR,#0100H

MOV A,#0CH ;ca sa apară cursor trebuie 0EH!

MOVX @DPTR,A

CALL DELAY_100

S-a terminat secvența de inițializare a afișajului se revine din subrutina inițializare afișaj.

RET

Zona cu subrutinele de temporizare <<DELAY_XXXX>> varianta fora segment relocabil pentru buclele de temporizare se folosesc registrele 50H, 51H si 52H

cnt_01 EQU 50H

cnt_02 EQU 51H

cnt_03 EQU 52H

_Frecv_Osc EQU 11 ;se introduce frecventa de clock a microcontrolerului

;(in MHz) (se pot introduce si alte valori, calculul se

;face automat

_Delay_40uS EQU 40*_Frecv_Osc/24-2*12/_Frecv_Osc

;se scad 2 cicli pentru CALL si 2 cicli pentru MOV

;_Delay_40uS EQU 40*11/24-2

DELAY_40:

MOV cnt_01,#_Delay_40uS

S01: DJNZ cnt_01,S01

RET

DELAY_100:

MOV cnt_02,#03

S020: CALL DELAY_40

DJNZ cnt_02,S020

RET

DELAY_1000:

MOV cnt_02,#25

S021: CALL DELAY_40

DJNZ cnt_02,S021

RET

DELAY_4000:

MOV cnt_02,#100

S023: CALL DELAY_40

DJNZ cnt_02,S023

RET

DELAY_15000:

MOV cnt_03,#15H

S030: CALL DELAY_1000

DJNZ cnt_03,S030

RET

4.5 Programul de afișare.

Se transmit la afișaj primele 24 caractere (1 … 24). Datele ce se afișează se găsesc in registrele RAM interne 60H … 77H. Cursorul afișajului este deja plasat pe prima poziție (Cursor Home).

dafisaj:

CALL DELAY_100

MOV DPTR,#0100H

MOV A,#80H ; Plasează cursorul pe prima poziție, prima linie.

MOVX @DPTR,A

CALL DELAY_100

MOV R0,#18H ;numărul de caractere (24)ce vor fi trimise la afișaj

MOV 54H,#00H ;contor pentru transfer cu MOVC A,@A+DPTR

LPAF1:

CALL DELAY_40

MOV DPTR,#TAB_AFIS_1

MOV A,54H ;deplasament căutare in tabel

MOVC A,@A+DPTR

MOV DPTR,#0101H

MOVX @DPTR,A ;transmite caracterul la afișaj

INC 54H ;incrementare adresa relativa tabel

DJNZ R0,LPAF1 ;bucla pentru 24 caractere

;linia 2

CALL DELAY_100 ;este bine sa se înceapă cu o temporizare!

MOV DPTR,#0100H

MOV A,#0C0H ;cuvânt de control pentru fixare adresa DDRAM

;pe digitul 24

MOVX @DPTR,A ;transmite comanda

MOV R0,#18H ;numărul de caractere ce vor fi trimise la afișaj

MOV 54H,#00H ;contor pentru transfer cu MOVC A,@A+DPTR

LPAF2:

CALL DELAY_40

MOV DPTR,#TAB_AFIS_2

MOV A,54H

MOVC A,@A+DPTR

MOV DPTR,#0101H

MOVX @DPTR,A ;transmite caracterul la afișaj

INC 54H ; incrementare adresa relativa tabel

DJNZ R0,LPAF2 ;bucla pentru 24 caractere

RET

Se introduce secvența de afișare in zecimal a rezultatelor

Pe prima linie de la stânga la dreapta ora:min:sec

dceas:

MOV R0,#32H ;Mută în R0 numărul 32 registrul orelor la 32H.

MOV R1,#86H ;Mută în R1 numărul 86 prima poziție ORA.

rep1:

CALL DELAY_100

MOV A,@R0

MOV B,#0AH

DIV AB

ADD A,#30h

MOV R2,A

MOV A,B

ADD A,#30h

MOV R3,A

CALL DELAY_40

MOV DPTR,#0100H

MOV A,R1 ;fixează cursor pe poziția x2 / linia 1

MOVX @DPTR,A

CALL DELAY_40

MOV DPTR,#0101H

MOV A,R2

MOVX @DPTR,A

INC R1

CALL DELAY_40

MOV DPTR,#0100H

MOV A,R1 ;fixează cursor pe poziția x2 / linia 1

MOVX @DPTR,A

CALL DELAY_40

MOV DPTR,#0101H

MOV A,R3

MOVX @DPTR,A

DEC R0

INC R1

INC R1

CJNE R0,#2Fh ,rep1

ret

ddata:

CALL DELAY_100 ;este bine sa se înceapă cu o temporizare!

MOV R0,#33H ; Mută în R0 numărul 33 registru zile la 33H

MOV R1,#0c6H ; Mută în R0 numărul C6 prima poziție zile.

call re

CALL DELAY_100 ;este bine sa se înceapă cu o temporizare!

MOV R0,#35H ;MUTA IN R0 NUMĂRUL 35 anul parte superioara.

MOV R1,#0cdH ;MUTA IN R1 NUMĂRUL cd poziția primului digit.

call re

CALL DELAY_100 ;este bine sa se înceapă cu o temporizare!

MOV R0,#36H ;MUTA IN R0 NUMĂRUL 36 anul parte superioara.

MOV R1,#0cfH ;MUTA IN R1 NUMĂRUL cf poziția primului digit.

call re

re:

CALL DELAY_40

MOV A,@R0

MOV B,#0AH

DIV AB

ADD A,#30h

MOV R2,A

MOV A,B

ADD A,#30h

MOV R3,A

MOV DPTR,#0100H ; registrul control

MOV A,R1 ;fixează cursor pe poziția x2 / linia 1

MOVX @DPTR,A

CALL DELAY_40

MOV DPTR,#0101H

MOV A,R2

MOVX @DPTR,A

INC R1

CALL DELAY_40

MOV DPTR,#0100H

MOV A,R1 ;fixează cursor pe poziția x2 / linia 1

MOVX @DPTR,A

CALL DELAY_40

MOV DPTR,#0101H

MOV A,R3

MOVX @DPTR,A

ret

dluna:

CALL DELAY_100 ;este bine sa se înceapă cu o temporizare!

MOV DPTR,#0100H ; registrul control

mov A,luna ;încarcă acumulator cu data de la adresa lunii

mov b,#05h ;încarcă registrul B cu 5

mul ab ;înmulțește A cu B pentru a vedea care este adresa

;relativa la tabel TABL.

MOV 57H,a ; contor pentru transfer cu MOVC A,@A+DPTR

MOV R0,#05H ;numărul de caractere ce vor fi trimise la afișaj

CALL DELAY_100 ;este bine sa se înceapă cu o temporizare!

MOV A,#0C8h ;poziția cursor 10/2

MOVX @DPTR,A ;transmite comanda

DOI2: CALL DELAY_40

MOV DPTR,#TABL

MOV A,57H

MOVC A,@A+DPTR

MOV DPTR,#0101H

MOVX @DPTR,A ;transmite caracterul la afișaj

INC 57H ;incrementare adresa relativa tabel

DJNZ R0,DOI2 ;bucla pentru 3 caractere

ret

Se introduce secvența de afișare in zecimal a rezultatelor pentru cronometru pe prima linie de la stânga la dreapta cora:cmin:csec:ssec

dcron:

MOV R0,#2bH ;MUTA IN R0 NUMĂRUL 2b cronom ORE LA 2bH

MOV R1,#8cH ;MUTA IN R1 NUMĂRUL 8c PRIMA POZIȚIE CORA

repdc:

CALL DELAY_100

MOV A,@R0

MOV B,#0AH

DIV AB

ADD A,#30h

MOV R2,A

MOV A,B

ADD A,#30h

MOV R3,A

CALL DELAY_40

MOV DPTR,#0100H

MOV A,R1 ;fixează cursor pe poziția x2 / linia 1

MOVX @DPTR,A

CALL DELAY_40

MOV DPTR,#0101H

MOV A,R2

MOVX @DPTR,A

INC R1

CALL DELAY_40

MOV DPTR,#0100H

MOV A,R1 ;fixează cursor pe poziția x2 / linia 1

MOVX @DPTR,A

CALL DELAY_40

MOV DPTR,#0101H

MOV A,R3

MOVX @DPTR,A

inc R0

INC R1

CALL DELAY_40

MOV DPTR,#0100H

MOV A,R1 ;fixează cursor pe poziția x2 / linia 1

MOVX @DPTR,A

CALL DELAY_40

MOV DPTR,#0101H

MOV A,#3aH

MOVX @DPTR,A

CJNE r0,#2fh ,repdc

ret

Se introduc mesajele ce se doresc a fi afișate pe doua linii pe fiecare linie cate un tabel pentru funcționare normala.

TAB_AFIS_1:

DB 'ORA: : : '

TAB_AFIS_2:

DB 'DATA: '

TABC:

DB 'CRONOMETRU: START? '

TABL: DB ' '

DB ' IAN '

DB ' FEB '

DB ' MAR '

DB ' APR '

DB ' MAI '

DB ' IUN '

DB ' IUL '

DB ' AUG '

DB ' SEP '

DB ' OCT '

DB ' NOV '

DB ' DEC '

END

ANEXA

Organigrama programului principal.

Organigrama cererii de întrerupere a timerului T2.

Organigrama rutinei de afișaj:

„dceas” „ddata”

Tabelul 2.1 Registrul de funcții speciale 8XC552

* registre de funcții speciale adresabile la nivel de bit; # registre de funcții speciale modificate față de 80C51

Tabelul 2.4 Porturile intrare / ieșire

Fig. 2.9 Structura nivelurilor de prioritate.

Fig. 2.15 Maparea registrelor de funcții speciale

Tab.1.6 prezintă caracterele generate prin intermediul memoriei ROM.

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 1

MS-DOS MACRO ASSEMBLER A51 V4.3

OBJECT MODULE PLACED IN PR.OBJ

ASSEMBLER INVOKED BY: A51 PR.A51 DEBUG XREF

LOC OBJ LINE SOURCE

1 $INCLUDE (REG552.INC)

=1 2 ;––––––––––––––––––––––––––-

=1 3 ; Copyright 1995-1996 KEIL Software, Inc.

=1 4 ; 80552 Processor Declarations

=1 5 ;––––––––––––––––––––––––––-

=1 6 +1 $SAVE

=1 95 +1 $RESTORE

=1 96

97

98

00B1 99 but1 bit 0b1H ;p3.1

00B2 100 but2 bit 0b2H ;p3.2

00B3 101 but3 bit 0b3H ;p3.3

102 ;–––––––

103 ;–––––––

002B 104 cora DATA 2bH

002C 105 cmin DATA 2cH

002D 106 csec DATA 2dH

002E 107 cssec DATA 2eH

108

109

002F 110 ssec DATA 2FH

0030 111 sec DATA 30H

0031 112 min DATA 31H

0032 113 ora DATA 32H

0033 114 ziua DATA 33H

0034 115 luna DATA 34H

0035 116 anul1 DATA 35H

0036 117 anul2 DATA 36H

118

119 ;––––––––

120 ;––––––––

121

122 ;RESET

8000 123 ORG 8000H

8000 02805E 124 JMP start

125

126 ;INTRERUPERI

805B 127 ORG 805bH

805B 02816C 128 jmp time2

129

130 ;––––––––

131 ;––––––––

132

133

134 ;INITIALIZARI

135

805E 136 start:

805E 752F00 137 mov ssec,#00H ; initializare sutimisec.

8061 75300A 138 MOV sec,#0aH ; initializare SEC.

8064 75310B 139 MOV min,#0bH ; initializare MIN.

8067 75320C 140 MOV ora,#0cH ; initializare ORA.

806A 753311 141 MOV ziua,#11H ; initializare ZIUA.

806D 753406 142 MOV luna,#06H ; initializare LUNA.

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 2

LOC OBJ LINE SOURCE

8070 753604 143 MOV anul2,#04H ; initializare ANUL.

8073 753514 144 MOV anul1,#14H ; initializare ANUL.

145

146 ;–––––––-

8076 128210 147 CALL LCD_INIT

8079 128296 148 call dafisaj

807C 1282D3 149 call dceas

807F 12834F 150 call dluna

8082 128309 151 call ddata

152

153 ;––––––––

154 ;––––––––

155

8085 156 init2:

8085 C2C4 157 clr P4.4 ; 4 pinul (4.4)la care se leaga resetul t2

8087 75EE10 158 mov STE,#10h ; activare set pin port 4.4 la comparare

808A 75EA25 159 MOV TM2CON,#25H ; Timer 2 în modul 1 SURSA CLOCK /12.

808D 75A98C 160 MOV CML0,#08cH ;Incarcare comparare registru 0 parte low.

8090 75C9B9 161 MOV CMH0,#0b9H ;Incarcare comparare registru 0 parte high.

8093 D2AF 162 SETB EA ; Activare globala a intreruperilor.

8095 D2EF 163 SETB ET2 ; Activare intreruperi timer T2.

8097 D2EC 164 SETB ECM0 ; Activare intrerupere comparare 0 T2.

8099 D2FC 165 SETB PCM0 ; Nivel prioritate comparare C0 T2

809B 30B105 166 jnb but1,cron ;p3.1

809E 30B242 167 jnb but2,sceas ;p3.2

80A1 80E2 168 jmp init2

169

170 ;––––––––

80A3 171 cron:

80A3 30B30F 172 jnb but3,pestdst

80A6 128374 173 call dst_cr

80A9 752E00 174 mov cssec,#00H ; initializare cssec

80AC 752D00 175 MOV csec,#00H ; initializare csec.

80AF 752C00 176 MOV cmin,#00H ; initializare cmin.

80B2 752B00 177 MOV cora,#00H ; initializare cmin.

80B5 178 pestdst:

80B5 20B303 179 jb but3,endb3

80B8 128394 180 call dcron

181

182 ;––––––––-

183

80BB 184 endb3:

80BB 80C8 185 jmp init2

186 ;––––––––-

187

80BD 188 icron:

80BD 052E 189 INC cssec

80BF E52E 190 MOV A,cssec

80C1 B40A1E 191 CJNE A,#0aH, endicron

80C4 752E00 192 MOV cssec,#00H

193

80C7 052D 194 INC csec

80C9 E52D 195 MOV A,csec

80CB B43C14 196 CJNE A,#03cH, endicron

80CE 752D00 197 MOV csec,#00H

198

80D1 052C 199 INC cmin

80D3 E52C 200 MOV A,cmin

80D5 B43C0A 201 CJNE A,#03cH, endicron

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 3

LOC OBJ LINE SOURCE

80D8 752C00 202 MOV cmin,#00H

203

80DB 052B 204 INC cora

80DD E52B 205 MOV A,cora

80DF B46400 206 CJNE A,#064H, endicron

207

80E2 22 208 endicron: RET

209 ;––––––––

210 ;––––––––

211

80E3 212 sceas:

80E3 753831 213 mov 38H,#31H

80E6 C2AF 214 clr ea

80E8 215 resc:

216

217 ;––––––––-

218

80E8 20B150 219 jb but1,pesteinc

80EB E538 220 mov A,38H

221

80ED B4310A 222 cjne A,#31h,peste1

80F0 0531 223 inc min

80F2 AC31 224 mov r4,min

80F4 BC3C03 225 cjne r4,#3cH,peste1

80F7 753100 226 mov min,#00h

80FA 227 peste1:

228

229 ;–––––––––

230

80FA B4320A 231 cjne A,#32h,peste2

80FD 0532 232 inc ora

80FF AC32 233 mov r4,ora

8101 BC1803 234 cjne r4,#18H,peste2

8104 753200 235 mov ora,#00h

8107 236 peste2:

237

238 ;––––––––-

239

8107 B4330A 240 cjne A,#33h,peste3

810A 0533 241 inc ziua

810C AC33 242 mov r4,ziua

810E BC1E03 243 cjne r4,#1eH,peste3

8111 753301 244 mov ziua,#01h

8114 245 peste3:

246

247 ;–––––––––

8114 B4340A 248 cjne A,#34h,peste4

8117 0534 249 inc luna

8119 AC34 250 mov r4,luna

811B BC0C03 251 cjne r4,#0cH,peste4

811E 753401 252 mov luna,#01h

8121 253 peste4:

254

255 ;–––––––––

256

8121 B4350A 257 cjne A,#35h,peste5

8124 0535 258 inc anul1

8126 AC35 259 mov r4,anul1

8128 BC6403 260 cjne r4,#064H,peste5

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 4

LOC OBJ LINE SOURCE

812B 753500 261 mov anul1,#00h

812E 262 peste5:

263

264 ;–––––––––

265

812E B4360A 266 cjne A,#36h,peste6

8131 0536 267 inc anul2

8133 AC36 268 mov r4,anul2

8135 BC6403 269 cjne r4,#064H,peste6

8138 753600 270 mov anul2,#00h

813B 271 peste6:

272 ;–––––––––

273 ;–––––––––

813B 274 pesteinc:

813B 20B30A 275 jb but3,pesteinc1

813E E538 276 mov A,38H

277 ;–––––––––

8140 B43603 278 cjne A,#36H,pesteinc2

8143 753831 279 mov 38H,#31H

8146 280 pesteinc2:

281 ;–––––––––

8146 0538 282 inc 38h

8148 283 pesteinc1:

284 ;–––––––––

285 ;–––––––––

286

8148 12828D 287 call DELAY_15000

814B 12828D 288 call DELAY_15000

814E 12828D 289 call DELAY_15000

8151 12828D 290 call DELAY_15000

8154 12828D 291 call DELAY_15000

8157 12828D 292 call DELAY_15000

293

815A 30B203 294 jnb but2,revin

815D 028085 295 jmp init2

296 ;–––––––––

8160 297 revin:

8160 1282D3 298 call dceas

8163 12834F 299 call dluna

8166 128309 300 call ddata

8169 0280E8 301 jmp resc

302 ;–––––––––

303 ;–––––––––

304

816C 305 time2:

306

816C 75EA25 307 MOV TM2CON,#25H ; Timer 2 în modul 1 SURSA CLOCK /12.

816F C2CC 308 clr cmi0 ; Sterge flag intrerupere C0 T2

309 ;–––––––

310

8171 20B202 311 jb but2,endcs

8174 11BD 312 call icron

8176 313 endcs:

314 ;–––––––-

315

8176 E52F 316 MOV A,ssec ;SUTIMI DE SECUNDA

8178 04 317 INC A

8179 F52F 318 MOV ssec,A

817B B40A68 319 CJNE A,#0aH, endtime2

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 5

LOC OBJ LINE SOURCE

817E 752F00 320 MOV ssec,#00H

321

322 ;––––––––

323

8181 E530 324 MOV A,sec ;SECUNDE

8183 04 325 INC A

8184 F530 326 MOV sec,A

327

328 ;––––––––

8186 30B109 329 jnb but1,pesteceas

8189 1282D3 330 call dceas

818C 12834F 331 call dluna

818F 128309 332 call ddata

8192 333 pesteceas:

334 ;––––––––

335

8192 E530 336 MOV A,sec

8194 B43C4F 337 CJNE A,#3cH, endtime2

8197 753000 338 mov sec,#00H

339

340 ;–––––––––-

341

819A E531 342 MOV A,min ;minute

819C 04 343 INC A

819D F531 344 MOV min,A

819F B43C44 345 CJNE A,#3cH, endtime2

81A2 753100 346 mov min,#00H

347

348 ;–––––––––

349

81A5 E532 350 MOV A,ora ;ora

81A7 04 351 INC A

81A8 F532 352 MOV ora,A

81AA B41839 353 CJNE A,#18H, endtime2

81AD 753200 354 mov ora,#00H

355

356 ;–––––––––

357

81B0 AE34 358 MOV R6,luna

81B2 BE0203 359 CJNE R6,#02H ,merge ;compara luna sa vad daca feb

81B5 0281F1 360 jmp feb ;sare la rutina lunii februarie

361

362 ;–––––––––

363

81B8 364 merge:

365

81B8 E534 366 MOV A,luna ; PENTRU LUNA 30/31

81BA 75F002 367 MOV B,#02H

81BD 84 368 DIV AB

81BE ADF0 369 MOV R5,B

81C0 BD0124 370 CJNE R5,#01H ,luna30 ;SARE LA RUTINA LUNA 30 (are 30)

371

372 ;–––––––––

373

81C3 E533 374 MOV A,ziua ;pentru luna cu 31

81C5 04 375 INC A

81C6 F533 376 MOV ziua,A

81C8 B4201B 377 CJNE A,#20H, endtime2

81CB 378 cont:

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 6

LOC OBJ LINE SOURCE

81CB 753301 379 MOV ziua,#01H ;

380 ;–––––––––

381

81CE E534 382 MOV A,luna ;luna

81D0 04 383 INC A

81D1 F534 384 MOV luna,A

81D3 B40D10 385 CJNE A,#0dH, endtime2

81D6 753401 386 mov luna,#01H

387

388 ;–––––––––

389

81D9 E536 390 MOV A,anul2 ;anul untimile 2cifre

81DB 04 391 INC A

81DC F536 392 MOV anul2,A

81DE B46405 393 CJNE A,#64H, endtime2

81E1 753600 394 mov anul2,#00H

81E4 0535 395 inc anul1

396 ;–––––––––

397

81E6 398 endtime2:

399

81E6 32 400 reti

401

402 ;–––––––––

403

81E7 404 luna30:

81E7 E533 405 MOV A,ziua ; pentru luna cu 30 zile

81E9 04 406 INC A

81EA F533 407 MOV ziua,A

81EC B41FF7 408 CJNE A,#1fH, endtime2

81EF 80DA 409 jmp cont

410 ;––––––––-

411

81F1 412 feb: ;PENTRU AN BISECT

81F1 E536 413 MOV A,anul2

81F3 75F004 414 MOV B,#04H ;impart ultimele 2 cifre la 4

81F6 84 415 DIV AB

81F7 AFF0 416 MOV R7,B

81F9 BF000A 417 CJNE R7,#00H ,ann ;anul nu este bisect rest difera de 0

418

419 ;–––––––––

81FC 420 anb: ;e bisect

81FC E533 421 MOV A,ziua ;feb are 29

81FE 04 422 INC A

81FF F533 423 MOV ziua,A

8201 B41EE2 424 CJNE A,#1EH, endtime2

8204 80C5 425 jmp cont

426 ;––––––-

8206 427 ann: ;nu-i bisect

8206 E533 428 MOV A,ziua ;feb are 28

8208 04 429 INC A

8209 F533 430 MOV ziua,A

820B B41DD8 431 CJNE A,#1DH, endtime2

820E 80BB 432 jmp cont

433 ;––––––––-

434 ;––––––––

435

436 ;program de utilizare a display-ului LCD cu 24 caractere pe un rand

437 ;pe kitul de dezvoltare cu microcontroler 80C552

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 7

LOC OBJ LINE SOURCE

438

439 ;secventa de initializare a afisajului

8210 440 LCD_INIT:

8210 12828D 441 CALL DELAY_15000 ;se introduce o intarziere de 3×15000 us

442 ;impusa de functionarea afisajului

8213 12828D 443 CALL DELAY_15000

8216 12828D 444 CALL DELAY_15000

8219 900100 445 MOV DPTR,#0100H ;prin intermediul adresei transmise cu DPTR

446 ;aria memoriei externe RAM (in care se "vad"

447 ;registrele display-ului) se selecteaza display-ul

448

449 ;si se pun pe 0 bitii RS si WR incat controlerul

450 ;modulului LCD sa poata primi instructiuni

821C 7438 451 MOV A,#38H ;fixeaza modul de lucru al afisajului pe 8 biti

821E F0 452 MOVX @DPTR,A ;se transmite comanda la LCD

453

454 ;aceasta secventa de initializare a afisajului pentru functionarea afisajului pe

455 ;8 biti se face in mod repetat de patru ori pentru a fi siguri ca modulul functioneaza

456 ;in modul dorit de catre utilizator

457

821F 128284 458 CALL DELAY_4000 ;a doua intarziere scade la 4 ms (4000 us)

8222 900100 459 MOV DPTR,#0100H

8225 7438 460 MOV A,#38H

8227 F0 461 MOVX @DPTR,A

462

8228 128272 463 CALL DELAY_100 ;a treia intarziere scade la 0.1 ms (100 us)

822B 900100 464 MOV DPTR,#0100H

822E 7438 465 MOV A,#38H

8230 F0 466 MOVX @DPTR,A

467

8231 128272 468 CALL DELAY_100 ;a patra intarziere este tot de 0.1 ms (100 us)

8234 900100 469 MOV DPTR,#0100H

8237 7438 470 MOV A,#38H

8239 F0 471 MOVX @DPTR,A

472

473 ;s-au terminat buclele de temporizare

474

475 ;se trece afisajul in starea off (cuvant de control 08H)

823A 128272 476 CALL DELAY_100

823D 900100 477 MOV DPTR,#0100H

8240 7408 478 MOV A,#08H

8242 F0 479 MOVX @DPTR,A

480

481 ;se sterge tot afisajul si se readuce cursorul pe pozitia initiala (cuvant

482 ;de control #01H)

8243 128272 483 CALL DELAY_100

8246 900100 484 MOV DPTR,#0100H

8249 7401 485 MOV A,#01H ;cu aceasta valoare inscrisa in registrul de

824B F0 486 MOVX @DPTR,A ;control al display-ul se sterge tot afisajul

487 ;si se readuce cursorul pe pozitia initiala

488

489 ;comanda obligatorie pentru LCD dupa stergere afisaj si/sau Cursor Home (cuvant

490 ;de control #02H) – aduce cursorul pe pozitia initiala

824C 128272 491 CALL DELAY_100

824F 900100 492 MOV DPTR,#0100H ;aceasta instructiune readuce cursorul pe pozitia

8252 7402 493 MOV A,#02H ;initiala si este absolut necesara dupa ce au fost

8254 F0 494 MOVX @DPTR,A ;executate anterior una din instructiunile

495 ;Cursor Home sau Display Clear

496

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 8

LOC OBJ LINE SOURCE

497 ;se fixeaza modul de lucru cu incrementare fara deplasarea afisajului (cuvant

498 ;de control #06H)

8255 128272 499 CALL DELAY_100

8258 900100 500 MOV DPTR,#0100H

825B 7406 501 MOV A,#06H

825D F0 502 MOVX @DPTR,A

503

504 ;se activeaza afisajul si cursorul (ON), iar cursorul nu va clipi (cuvant

505 ;de control #0EH)

825E 128284 506 CALL DELAY_4000

8261 900100 507 MOV DPTR,#0100H

8264 740C 508 MOV A,#0CH ;ca sa apara cursor trebuie 0EH!

8266 F0 509 MOVX @DPTR,A

8267 128272 510 CALL DELAY_100

511

512 ;s-a terminat secventa de intializare a afisajului

826A 22 513 RET ;se revine din subrutina initializare afisaj

514

515

516 ;––––––––

517 ;––––––––

518

519 ;zona cu subrutinele de temporizare <<DELAY_XXXX>>

520 ;varianta fara segment relocabil

521 ;pentru buclele de temporizare se folosesc registrele 50H, 51H si 52H

0050 522 cnt_01 EQU 50H

0051 523 cnt_02 EQU 51H

0052 524 cnt_03 EQU 52H

525

526

000B 527 _Frecv_Osc EQU 11 ;se introduce frecventa de clock a microcontrolerului

528 ;(in MHz) (se pot introduce si alte valori, calculul se

529 ;face automat

530

0010 531 _Delay_40uS EQU 40*_Frecv_Osc/24-2*12/_Frecv_Osc

532 ;se scad 2 cicli pentru CALL si 2 cicli pentru MOV

533 ;_Delay_40uS EQU 40*11/24-2

826B 534 DELAY_40:

826B 755010 535 MOV cnt_01,#_Delay_40uS

826E D550FD 536 S01: DJNZ cnt_01,S01

8271 22 537 RET

538

8272 539 DELAY_100:

8272 755103 540 MOV cnt_02,#03

8275 516B 541 S020: CALL DELAY_40

8277 D551FB 542 DJNZ cnt_02,S020

827A 22 543 RET

544

827B 545 DELAY_1000:

827B 755119 546 MOV cnt_02,#25

827E 516B 547 S021: CALL DELAY_40

8280 D551FB 548 DJNZ cnt_02,S021

8283 22 549 RET

550

8284 551 DELAY_4000:

8284 755164 552 MOV cnt_02,#100

8287 516B 553 S023: CALL DELAY_40

8289 D551FB 554 DJNZ cnt_02,S023

828C 22 555 RET

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 9

LOC OBJ LINE SOURCE

556

828D 557 DELAY_15000:

828D 755215 558 MOV cnt_03,#15H

8290 517B 559 S030: CALL DELAY_1000

8292 D552FB 560 DJNZ cnt_03,S030

8295 22 561 RET

562

563 ;–––––––-

564 ;–––––––-

565

566 ;se transmit la afisaj primele 24 caractere (1 … 24). Datele ce se afiseaza

567 ;se gasesc in registrele RAM interne 60H … 77H. Cursorul afisajului

568 ;este deja plasat pe prima pozitie (Cursor Home)

569

8296 5172 570 dafisaj: CALL DELAY_100

8298 900100 571 MOV DPTR,#0100H

829B 7480 572 MOV A,#80H ;plaseaza cursorul pe prima pozitie, prima linie

829D F0 573 MOVX @DPTR,A

574

829E 5172 575 CALL DELAY_100

82A0 7818 576 MOV R0,#18H ;numarul de caractere (24)ce vor fi trimise la afisaj

82A2 755400 577 MOV 54H,#00H ;contor pentru transfer cu MOVC A,@A+DPTR

82A5 516B 578 LPAF1: CALL DELAY_40

82A7 9083D9 579 MOV DPTR,#TAB_AFIS_1

82AA E554 580 MOV A,54H ;deplasament cautare in tabel

82AC 93 581 MOVC A,@A+DPTR

82AD 900101 582 MOV DPTR,#0101H

82B0 F0 583 MOVX @DPTR,A ;transmite caracterul la afisaj

82B1 0554 584 INC 54H ;incrementare adresa relativa tabel

82B3 D8F0 585 DJNZ R0,LPAF1 ;bucla pentru 24 caractere

586 ;linia 2

82B5 5172 587 CALL DELAY_100 ;este bine sa se inceapa cu o temporizare!

82B7 900100 588 MOV DPTR,#0100H

82BA 74C0 589 MOV A,#0C0H ;cuvant de control pentru fixare adresa DDRAM

590 ;pe digitul 24

82BC F0 591 MOVX @DPTR,A ;transmite comanda

82BD 7818 592 MOV R0,#18H ;numarul de caractere ce vor fi trimise la afisaj

82BF 755400 593 MOV 54H,#00H ;contor pentru transfer cu MOVC A,@A+DPTR

82C2 516B 594 LPAF2: CALL DELAY_40

82C4 9083F1 595 MOV DPTR,#TAB_AFIS_2

82C7 E554 596 MOV A,54H

82C9 93 597 MOVC A,@A+DPTR

82CA 900101 598 MOV DPTR,#0101H

82CD F0 599 MOVX @DPTR,A ;transmite caracterul la afisaj

82CE 0554 600 INC 54H ;incrementare adresa relativa tabel

82D0 D8F0 601 DJNZ R0,LPAF2 ;bucla pentru 24 caractere

82D2 22 602 RET

603

604 ;––––––––

605 ;––––––––

606

607 ;Se introduce secventa de afisare in zecimal a rezultatelor

608 ;Pe prima linie de la stanga la dreapta ora:min:sec

609

82D3 610 dceas:

82D3 7832 611 MOV R0,#32H ;MUTA IN R0 NUMARUL 32 REGISTRUL ORELOR LA 32H

82D5 7986 612 MOV R1,#86H ;MUTA IN R1 NUMARUL 86 PRIMA POZITIE ORA

613

82D7 614 rep1:

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 10

LOC OBJ LINE SOURCE

82D7 5172 615 CALL DELAY_100

82D9 E6 616 MOV A,@R0

82DA 75F00A 617 MOV B,#0AH

82DD 84 618 DIV AB

82DE 2430 619 ADD A,#30h

82E0 FA 620 MOV R2,A

82E1 E5F0 621 MOV A,B

82E3 2430 622 ADD A,#30h

82E5 FB 623 MOV R3,A

624

82E6 516B 625 CALL DELAY_40

82E8 900100 626 MOV DPTR,#0100H

82EB E9 627 MOV A,R1 ;fixeaza cursor pe pozitia x2 / linia 1

82EC F0 628 MOVX @DPTR,A

82ED 516B 629 CALL DELAY_40

82EF 900101 630 MOV DPTR,#0101H

82F2 EA 631 MOV A,R2

82F3 F0 632 MOVX @DPTR,A

633

82F4 09 634 INC R1

635

82F5 516B 636 CALL DELAY_40

82F7 900100 637 MOV DPTR,#0100H

82FA E9 638 MOV A,R1 ;fixeaza cursor pe pozitia x2 / linia 1

82FB F0 639 MOVX @DPTR,A

82FC 516B 640 CALL DELAY_40

82FE 900101 641 MOV DPTR,#0101H

8301 EB 642 MOV A,R3

8302 F0 643 MOVX @DPTR,A

644

8303 18 645 DEC R0

8304 09 646 INC R1

8305 B82FCF 647 CJNE R0,#2Fh ,rep1

8308 22 648 ret

649 ;––––––––

8309 650 ddata:

8309 5172 651 CALL DELAY_100 ;este bine sa se inceapa cu o temporizare!

830B 7833 652 MOV R0,#33H ;MUTA IN R0 NUMARUL 33 REGISTRUL zile LA 33H

830D 79C6 653 MOV R1,#0c6H ;MUTA IN R1 NUMARUL c6 PRIMA POZITIE ZI

830F 128324 654 call re

655

656 ;––––––––

657

8312 5172 658 CALL DELAY_100 ;este bine sa se inceapa cu o temporizare!

8314 7835 659 MOV R0,#35H ;MUTA IN R0 NUMARUL 35 anul parte superioara.

8316 79CD 660 MOV R1,#0cdH ;MUTA IN R1 NUMARUL cd pozitia primului digit.

8318 128324 661 call re

662

663 ;––––––––

664

831B 5172 665 CALL DELAY_100 ;este bine sa se inceapa cu o temporizare!

831D 7836 666 MOV R0,#36H ;MUTA IN R0 NUMARUL 36 anul parte superioara.

831F 79CF 667 MOV R1,#0cfH ;MUTA IN R1 NUMARUL cf pozitia primului digit.

8321 128324 668 call re

669

670 ;––––––––

671

8324 672 re:

8324 516B 673 CALL DELAY_40

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 11

LOC OBJ LINE SOURCE

8326 E6 674 MOV A,@R0

8327 75F00A 675 MOV B,#0AH

832A 84 676 DIV AB

832B 2430 677 ADD A,#30h

832D FA 678 MOV R2,A

832E E5F0 679 MOV A,B

8330 2430 680 ADD A,#30h

8332 FB 681 MOV R3,A

682

8333 900100 683 MOV DPTR,#0100H ; registrul control

8336 E9 684 MOV A,R1 ;fixeaza cursor pe pozitia x2 / linia 1

8337 F0 685 MOVX @DPTR,A

8338 516B 686 CALL DELAY_40

833A 900101 687 MOV DPTR,#0101H

833D EA 688 MOV A,R2

833E F0 689 MOVX @DPTR,A

690

833F 09 691 INC R1

692

8340 516B 693 CALL DELAY_40

8342 900100 694 MOV DPTR,#0100H

8345 E9 695 MOV A,R1 ;fixeaza cursor pe pozitia x2 / linia 1

8346 F0 696 MOVX @DPTR,A

8347 516B 697 CALL DELAY_40

8349 900101 698 MOV DPTR,#0101H

834C EB 699 MOV A,R3

834D F0 700 MOVX @DPTR,A

834E 22 701 ret

702

703 ;–––––––

704 ;––––––-

705

834F 706 dluna:

834F 5172 707 CALL DELAY_100 ;este bine sa se inceapa cu o temporizare!

8351 900100 708 MOV DPTR,#0100H ; registrul control

8354 E534 709 mov A,luna ;incarca acumulator cu data de la adresa lunei

8356 75F005 710 mov b,#05h ;incarca registrul B cu 5

8359 A4 711 mul ab ;inmulteste A cu B pentru avedea care este adresa

712 ;relativa la tabel TABL.

835A F557 713 MOV 57H,a ;contor pentru transfer cu MOVC A,@A+DPTR

835C 7805 714 MOV R0,#05H ;numarul de caractere ce vor fi trimise la afisaj

715

835E 5172 716 CALL DELAY_100 ;este bine sa se inceapa cu o temporizare!

8360 74C8 717 mov a,#0c8h ;pozitia cursor 10/2

8362 F0 718 MOVX @DPTR,A ;transmite comanda

719

8363 516B 720 DOI2: CALL DELAY_40

8365 908421 721 MOV DPTR,#TABL

8368 E557 722 MOV A,57H

836A 93 723 MOVC A,@A+DPTR

836B 900101 724 MOV DPTR,#0101H

836E F0 725 MOVX @DPTR,A ;transmite caracterul la afisaj

836F 0557 726 INC 57H ;incrementare adresa relativa tabel

8371 D8F0 727 DJNZ R0,DOI2 ;bucla pentru 3 caractere

8373 22 728 ret

729

730 ;–––––––

731 ;–––––––

732

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 12

LOC OBJ LINE SOURCE

8374 5172 733 dst_cr: CALL DELAY_100

8376 900100 734 MOV DPTR,#0100H

8379 7480 735 MOV A,#80H ;plaseaza cursorul pe prima pozitie, prima linie

837B F0 736 MOVX @DPTR,A

737

837C 5172 738 CALL DELAY_100

837E 7818 739 MOV R0,#18H ;numarul de caractere (24)ce vor fi trimise la afisaj

8380 755400 740 MOV 54H,#00H ;contor pentru transfer cu MOVC A,@A+DPTR

8383 516B 741 stcr: CALL DELAY_40

8385 908409 742 MOV DPTR,#TABC

8388 E554 743 MOV A,54H ;deplasament cautare in tabel

838A 93 744 MOVC A,@A+DPTR

838B 900101 745 MOV DPTR,#0101H

838E F0 746 MOVX @DPTR,A ;transmite caracterul la afisaj

838F 0554 747 INC 54H ;incrementare adresa relativa tabel

8391 D8F0 748 DJNZ R0,stcr ;bucla pentru 24 caractere

8393 22 749 ret

750

751 ;–––––––

752 ;–––––––

753

754 ;Se introduce secventa de afisare in zecimal a rezultatelor

755 ;Pe prima linie de la stanga la dreapta cora:cmin:csec:ssec

756

8394 757 dcron:

8394 782B 758 MOV R0,#2bH ;MUTA IN R0 NUMARUL 2b cronom ORE LA 2bH

8396 798C 759 MOV R1,#8cH ;MUTA IN R1 NUMARUL 8c PRIMA POZITIE CORA

760

8398 761 repdc:

8398 5172 762 CALL DELAY_100

839A E6 763 MOV A,@R0

839B 75F00A 764 MOV B,#0AH

839E 84 765 DIV AB

839F 2430 766 ADD A,#30h

83A1 FA 767 MOV R2,A

83A2 E5F0 768 MOV A,B

83A4 2430 769 ADD A,#30h

83A6 FB 770 MOV R3,A

771

83A7 516B 772 CALL DELAY_40

83A9 900100 773 MOV DPTR,#0100H

83AC E9 774 MOV A,R1 ;fixeaza cursor pe pozitia x2 / linia 1

83AD F0 775 MOVX @DPTR,A

83AE 516B 776 CALL DELAY_40

83B0 900101 777 MOV DPTR,#0101H

83B3 EA 778 MOV A,R2

83B4 F0 779 MOVX @DPTR,A

780

83B5 09 781 INC R1

782

83B6 516B 783 CALL DELAY_40

83B8 900100 784 MOV DPTR,#0100H

83BB E9 785 MOV A,R1 ;fixeaza cursor pe pozitia x2 / linia 1

83BC F0 786 MOVX @DPTR,A

83BD 516B 787 CALL DELAY_40

83BF 900101 788 MOV DPTR,#0101H

83C2 EB 789 MOV A,R3

83C3 F0 790 MOVX @DPTR,A

791

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 13

LOC OBJ LINE SOURCE

83C4 08 792 inc R0

83C5 09 793 INC R1

794

83C6 516B 795 CALL DELAY_40

83C8 900100 796 MOV DPTR,#0100H

83CB E9 797 MOV A,R1 ;fixeaza cursor pe pozitia x2 / linia 1

83CC F0 798 MOVX @DPTR,A

83CD 516B 799 CALL DELAY_40

83CF 900101 800 MOV DPTR,#0101H

83D2 743A 801 MOV A,#3aH

83D4 F0 802 MOVX @DPTR,A

803

83D5 B82FC0 804 CJNE r0,#2fh ,repdc

83D8 22 805 ret

806 ;–––––––-

807

808 ;se introduc mesajele ce se doresc a fi afisate pe doua linii

809 ;pe fiecare linie cate un tabel pentru functionare normala

810

83D9 811 TAB_AFIS_1:

83D9 4F52413A 812 DB 'ORA: : : '

83DD 20202020

83E1 3A20203A

83E5 20202020

83E9 20202020

83ED 20202020

813

83F1 814 TAB_AFIS_2:

83F1 44415441 815 DB 'DATA: '

83F5 3A202020

83F9 20202020

83FD 20202020

8401 20202020

8405 20202020

8409 816 TABC:

8409 43524F4E 817 DB 'CRONOMETRU: START? '

840D 4F4D4554

8411 52553A20

8415 53544152

8419 543F2020

841D 20202020

818

8421 20202020 819 TABL: DB ' '

8425 20

8426 2049414E 820 DB ' IAN '

842A 20

842B 20464542 821 DB ' FEB '

842F 20

8430 204D4152 822 DB ' MAR '

8434 20

8435 20415052 823 DB ' APR '

8439 20

843A 204D4149 824 DB ' MAI '

843E 20

843F 2049554E 825 DB ' IUN '

8443 20

8444 2049554C 826 DB ' IUL '

8448 20

8449 20415547 827 DB ' AUG '

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 14

LOC OBJ LINE SOURCE

844D 20

844E 20534550 828 DB ' SEP '

8452 20

8453 204F4354 829 DB ' OCT '

8457 20

8458 204E4F56 830 DB ' NOV '

845C 20

845D 20444543 831 DB ' DEC '

8461 20

832

833

834 END

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 15

XREF SYMBOL TABLE LISTING

–- –– –– ––-

N A M E T Y P E V A L U E ATTRIBUTES / REFERENCES

ADCH. . . . D ADDR 00C6H A 39#

ADCON . . . D ADDR 00C5H A 40#

ANB . . . . C ADDR 81FCH A 420#

ANN . . . . C ADDR 8206H A 417 427#

ANUL1 . . . D ADDR 0035H A 116# 144 258 259 261 395

ANUL2 . . . D ADDR 0036H A 117# 143 267 268 270 390 392 394 413

B . . . . . D ADDR 00F0H A 367 369 414 416 617 621 675 679 710 764 768

BUT1. . . . B ADDR 00B0H.1 A 99# 166 219 329

BUT2. . . . B ADDR 00B0H.2 A 100# 167 294 311

BUT3. . . . B ADDR 00B0H.3 A 101# 172 179 275

CMH0. . . . D ADDR 00C9H A 34# 161

CMH1. . . . D ADDR 00CAH A 33#

CMH2. . . . D ADDR 00CBH A 32#

CMI0. . . . B ADDR 00C8H.4 A 87# 308

CMI1. . . . B ADDR 00C8H.5 A 86#

CMI2. . . . B ADDR 00C8H.6 A 85#

CMIN. . . . D ADDR 002CH A 105# 176 199 200 202

CML0. . . . D ADDR 00A9H A 37# 160

CML1. . . . D ADDR 00AAH A 36#

CML2. . . . D ADDR 00ABH A 35#

CNT_01. . . N NUMB 0050H A 522# 535 536

CNT_02. . . N NUMB 0051H A 523# 540 542 546 548 552 554

CNT_03. . . N NUMB 0052H A 524# 558 560

CONT. . . . C ADDR 81CBH A 378# 409 425 432

CORA. . . . D ADDR 002BH A 104# 177 204 205

CR0 . . . . B ADDR 00D8H.0 A 83#

CR2 . . . . B ADDR 00D8H.7 A 78#

CRON. . . . C ADDR 80A3H A 166 171#

CSEC. . . . D ADDR 002DH A 106# 175 194 195 197

CSSEC . . . D ADDR 002EH A 107# 174 189 190 192

CTCON . . . D ADDR 00EBH A 20#

CTH0. . . . D ADDR 00CCH A 31#

CTH1. . . . D ADDR 00CDH A 30#

CTH2. . . . D ADDR 00CEH A 29#

CTH3. . . . D ADDR 00CFH A 28#

CTI0. . . . B ADDR 00C8H.0 A 91#

CTI1. . . . B ADDR 00C8H.1 A 90#

CTI2. . . . B ADDR 00C8H.2 A 89#

CTI3. . . . B ADDR 00C8H.3 A 88#

CTL0. . . . D ADDR 00ACH A 46#

CTL1. . . . D ADDR 00ADH A 45#

CTL2. . . . D ADDR 00AEH A 44#

CTL3. . . . D ADDR 00AFH A 43#

DAFISAJ . . C ADDR 8296H A 148 570#

DCEAS . . . C ADDR 82D3H A 149 298 330 610#

DCRON . . . C ADDR 8394H A 180 757#

DDATA . . . C ADDR 8309H A 151 300 332 650#

DELAY_100 . C ADDR 8272H A 463 468 476 483 491 499 510 539# 570 575 587 615 651 658 665 707 716 733 738

762

DELAY_1000. C ADDR 827BH A 545# 559

DELAY_15000 C ADDR 828DH A 287 288 289 290 291 292 441 443 444 557#

DELAY_40. . C ADDR 826BH A 534# 541 547 553 578 594 625 629 636 640 673 686 693 697 720 741 772 776 783

787 795 799

DELAY_4000. C ADDR 8284H A 458 506 551#

DLUNA . . . C ADDR 834FH A 150 299 331 706#

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 16

N A M E T Y P E V A L U E ATTRIBUTES / REFERENCES

DOI2. . . . C ADDR 8363H A 720# 727

DST_CR. . . C ADDR 8374H A 173 733#

EA. . . . . B ADDR 00A8H.7 A 162 214

EAD . . . . B ADDR 00A8H.6 A 50#

ECM0. . . . B ADDR 00E8H.4 A 59# 164

ECM1. . . . B ADDR 00E8H.5 A 56#

ECM2. . . . B ADDR 00E8H.6 A 55#

ECT0. . . . B ADDR 00E8H.0 A 63#

ECT1. . . . B ADDR 00E8H.1 A 62#

ECT2. . . . B ADDR 00E8H.2 A 61#

ECT3. . . . B ADDR 00E8H.3 A 60#

ENDB3 . . . C ADDR 80BBH A 179 184#

ENDCS . . . C ADDR 8176H A 311 313#

ENDICRON. . C ADDR 80E2H A 191 196 201 206 208#

ENDTIME2. . C ADDR 81E6H A 319 337 345 353 377 385 393 398# 408 424 431

ENS1. . . . B ADDR 00D8H.6 A 79#

ES0 . . . . B ADDR 00A8H.4 A 52#

ES1 . . . . B ADDR 00A8H.5 A 51#

ET2 . . . . B ADDR 00E8H.7 A 54# 163

FEB . . . . C ADDR 81F1H A 360 412#

ICRON . . . C ADDR 80BDH A 188# 312

IEN0. . . . D ADDR 00A8H A 23#

IEN1. . . . D ADDR 00E8H A 22#

INIT2 . . . C ADDR 8085H A 156# 168 185 295

IP0 . . . . D ADDR 00B8H A 15#

IP1 . . . . D ADDR 00F8H A 14#

LCD_INIT. . C ADDR 8210H A 147 440#

LPAF1 . . . C ADDR 82A5H A 578# 585

LPAF2 . . . C ADDR 82C2H A 594# 601

LUNA. . . . D ADDR 0034H A 115# 142 249 250 252 358 366 382 384 386 709

LUNA30. . . C ADDR 81E7H A 370 404#

MERGE . . . C ADDR 81B8H A 359 364#

MIN . . . . D ADDR 0031H A 112# 139 223 224 226 342 344 346

ORA . . . . D ADDR 0032H A 113# 140 232 233 235 350 352 354

P4. . . . . D ADDR 00C0H A 41# 157

P5. . . . . D ADDR 00C4H A 42#

PAD . . . . B ADDR 00B8H.6 A 65#

PCM0. . . . B ADDR 00F8H.4 A 72# 165

PCM1. . . . B ADDR 00F8H.5 A 71#

PCM2. . . . B ADDR 00F8H.6 A 70#

PCT0. . . . B ADDR 00F8H.0 A 76#

PCT1. . . . B ADDR 00F8H.1 A 75#

PCT2. . . . B ADDR 00F8H.2 A 74#

PCT3. . . . B ADDR 00F8H.3 A 73#

PESTDST . . C ADDR 80B5H A 172 178#

PESTE1. . . C ADDR 80FAH A 222 225 227#

PESTE2. . . C ADDR 8107H A 231 234 236#

PESTE3. . . C ADDR 8114H A 240 243 245#

PESTE4. . . C ADDR 8121H A 248 251 253#

PESTE5. . . C ADDR 812EH A 257 260 262#

PESTE6. . . C ADDR 813BH A 266 269 271#

PESTECEAS . C ADDR 8192H A 329 333#

PESTEINC. . C ADDR 813BH A 219 274#

PESTEINC1 . C ADDR 8148H A 275 283#

PESTEINC2 . C ADDR 8146H A 278 280#

PS0 . . . . B ADDR 00B8H.4 A 67#

PS1 . . . . B ADDR 00B8H.5 A 66#

PT2 . . . . B ADDR 00F8H.7 A 69#

PWM0. . . . D ADDR 00FCH A 13#

A51 MACRO ASSEMBLER PR DATE 06/06/04 PAGE 17

N A M E T Y P E V A L U E ATTRIBUTES / REFERENCES

PWM1. . . . D ADDR 00FDH A 12#

PWMP. . . . D ADDR 00FEH A 11#

RE. . . . . C ADDR 8324H A 654 661 668 672#

REP1. . . . C ADDR 82D7H A 614# 647

REPDC . . . C ADDR 8398H A 761# 804

RESC. . . . C ADDR 80E8H A 215# 301

REVIN . . . C ADDR 8160H A 294 297#

RTE . . . . D ADDR 00EFH A 16#

S01 . . . . C ADDR 826EH A 536# 536

S020. . . . C ADDR 8275H A 541# 542

S021. . . . C ADDR 827EH A 547# 548

S023. . . . C ADDR 8287H A 553# 554

S030. . . . C ADDR 8290H A 559# 560

S0BUF . . . D ADDR 0099H A 48#

S0CON . . . D ADDR 0098H A 47#

S1ADR . . . D ADDR 00DBH A 24#

S1CON . . . D ADDR 00D8H A 27#

S1DAT . . . D ADDR 00DAH A 25#

S1STA . . . D ADDR 00D9H A 26#

SCEAS . . . C ADDR 80E3H A 167 212#

SEC . . . . D ADDR 0030H A 111# 138 324 326 336 338

SI. . . . . B ADDR 00D8H.3 A 82#

SSEC. . . . D ADDR 002FH A 110# 137 316 318 320

STA . . . . B ADDR 00D8H.5 A 80#

START . . . C ADDR 805EH A 124 136#

STCR. . . . C ADDR 8383H A 741# 748

STE . . . . D ADDR 00EEH A 17# 158

STO . . . . B ADDR 00D8H.4 A 81#

T2OV. . . . B ADDR 00C8H.7 A 84#

T3. . . . . D ADDR 00FFH A 10#

TABC. . . . C ADDR 8409H A 742 816#

TABL. . . . C ADDR 8421H A 721 819#

TAB_AFIS_1. C ADDR 83D9H A 579 811#

TAB_AFIS_2. C ADDR 83F1H A 595 814#

TIME2 . . . C ADDR 816CH A 128 305#

TM2CON. . . D ADDR 00EAH A 21# 159 307

TM2IR . . . D ADDR 00C8H A 38#

TMH2. . . . D ADDR 00EDH A 18#

TML2. . . . D ADDR 00ECH A 19#

ZIUA. . . . D ADDR 0033H A 114# 141 241 242 244 374 376 379 405 407 421 423 428 430

_DELAY_40US N NUMB 0010H A 531# 535

_FRECV_OSC. N NUMB 000BH A 527# 531 531

REGISTER BANK(S) USED: 0

ASSEMBLY COMPLETE, NO ERRORS FOUND

Similar Posts