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
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Computer de Bord Auto. Controlul de Timp al Sistemului (ID: 161453)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
