Creeaza.com - informatii profesionale despre


Evidentiem nevoile sociale din educatie - Referate profesionale unice
Acasa » tehnologie » electronica electricitate
Sa se proiecteze un microsistem electronic prin intermediul caruia se va comanda o masina de facut paine

Sa se proiecteze un microsistem electronic prin intermediul caruia se va comanda o masina de facut paine


Tema proiect

Sa se proiecteze un microsistem electronic prin intermediul caruia se va comanda o masina de facut paine.

Proiectarea presupune :

proiectarea hardware a masinii ;

proiectarea aplicatiei software in limbaj de asamblare.

Masina respectiva gestioneaza urmatoarele periferice:



- afisaj cu afisoare LED avand 7 segmente comandate multiplexat;

- tastatura comandata multiplexat ;

- senzor de temperatura ;

- motor malaxor;

- rezistenta incalzire (cuptor).

Operatiile pe care masina le face sunt urmatoarele:

framantare (F);

dospire(D);

coacere(C);

tinere la cald(T);s

functia de timer(H).

Elemente legate de opratiile efectuate:

OPERATIE

TIMP(minute)

TEMPERATURA(0C)

MOTOR

F

ON

D

OFF

C

OFF

T

OFF

Date individuale

Tipul procesorului 8051

Frecventa de lucru a procesorului - 16MHz

Tipul si organizarea memoriei ROM - externa 2764 - 8K x 8

Tipul si organizarea memoriei RAM - externa 6264 - 8K x 8

Tipul circuitului timer - extern 82C53

Tipul circuitului port-paralel - extern 82C55

TF1 = 30min

TF2 = 40min

TF3 = 55min

TD1 = 40min

TD2 = 50min

TD3 = 70min

TC1 = 45min

TC2 = 65min

TT = 55min

Numarul celulelor de afisare 6

Tipul afisajului - catod comun

Culoarea afisajului - verde

I .Proiectarea hardware

Microsistemul se constituie in jurul unui microcontroller 80C51, care are rolul de a prelua informatiile de la tastatura si de la senzorul de temperatura, de a procesa aceste informatii, de gestionare a sistemului de afisare si de control asupra motorului malaxorului si a rezistentelor de incalzire a cuptorului.

1 .Proiectarea unitatii de afisare

Se foloseste tehnica afisarii multiplexate.Tehnica se bazeaza pe efectul de integrare al ochiului la stimuli luminosi cu frecventa ridicata.

Afisajul este constituit din 6 celule de afisare; acestea vor fi organizate intr-un singur rand, asa cum se poate observa in figura de mai jos:

A10A16 reprezinta comanda pentru fiecare anod al unui digit, iar pentru selectarea unui digit din cei 6 se foloseste semnalul KC (KC0KC5).

Frecventa de aprindere a digitilor, pentru a creea impresia de continuitate trebuie sa fie de aproximativ 47 Hz.

Pentru cei 6 digiti timpul cat trebuie sa stea aprins un digit este de aproximativ 3.2ms.

Asa cum reiese si din figura de mai jos nu trebuie ca la un moment dat sa existe doi digiti aprinsi.

Momentele de timp " * " sunt momentele in care unitatea centrala primeste semnalizarea de trecere a 3.2 ms dupa care trebuie sa aibe loc aprinderea urmatorului digit.

Principalele caracteristici ale celulelor de afisare sunt:

- curent prin segment in regim continuu: 25mA

- curent prin segment in regim de impulsuri: 160mA

- caderea de tensiune pe segment: 3.6V

Schema de comanda a unui segment este urmatoarea:

In cazul acesta curentul printr-un segment trebuie sa fie .

aleg tranzistorul Q1 de tipul BC 517 cu

Iar valori limita absolute:

Trebuie ca

Aleg

aleg tranzistorul Q1 de tipul BC 107

Aleg

Aleg

Prin Q3 avem un curent de .

aleg tranzistorul Q3 de tipul BD 433

Aleg

Aleg tranzistorul Q4 de tipul BC 171:

Aleg

2. Tastatura

Tastatura este formata din 3 taste:

FC - prin intermediul acestei taste se selecteaza functiile ;

TM - selecteaza timpul dorit ;

START - porneste rularea celor patru functii.

Tastatura este gestionata prin intermediul portului PC de la circuitul 82C55:

Functionare :

se genereaza '0L' pe PC0 dupa care se citeste starea pinilor PC4, PC5 si PC6, daca unul dintre acesti pini este gasit in '0L', atunci tasta corespunzatoare este posibil sa fie apasata si se incepe tratarea secventei de debouncing.

TASTA

PC6 PC5 PC4  PC3 PC2 PC1 PC0

FC

TM

START

1 1 0 x x x 0

1 0 1 x x x 0

0 1 1 x x x 0

3. Conectarea memoriilor si a circuitelor periferice

Memoria ROM in care se va inscrie programul ce va fi rulat se va plasa in zona externa a memoriei de program a microcontrolerului 80C51 de la adresa 0000h.

Memoria RAM se va plasa in zona externa a memoriei de date a microcontrolerului 80C51 de la adresa 0000h. Deasemenea circuitele 82C53 si 82C55 se vor plasa in zona externa a memoriei de date a microcontrolerului 80C51.

Harta adreselor de conectare a circuitului de memorie RAM si a circuitelor periferice 82C55 si 82C53:

A15A14A13A12 A11A10A9A8 A7A6A5A4 A3A2A1A0

ADRESA

HEXA

Semnificatie

Zona

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1

0000h

1FFFh

Circuit SRAM

Zona externa a memoriei de date

0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1

2000h

2003h

Circuit

82C55

0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0

0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1

2010h

2013h

Circuit

82C53

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1

0000h

1FFFh

Circuit

ROM

Zona externa a memoriei de program

Circuitul de decodare si selectie pentru circuitul de memorie si cele 2 periferice este urmatorul:

5. Comanda rezistentelor si a malaxorului

Comenzile START/STOP pentru cele 2 rezistente si pentru motorul malaxorului se dau pe portul PA al circuitului 82C55 (PA0, PA1, PA2), iar validarea circuitelor se realizeaza prin intermediul celor 3 pini nefolositi ai portului PC: PC1, PC2 si PC3. Dar portul A poate fi folosit pentru a genera aceste comenzi doar in timpul unei intreruperi cand afisajul este stins.

4. Circuit de RESET

La punerea in functie a microcontrolerului circuitul de RESET trebuie sa actioneze cel putin un timp de 24 perioade de ceas. Inaintea conectarii tensiunii de alimentare condensatorul este descarcat, tensiunea la borne fiind 0. In momentul alimentarii condensatorul scurtcircuiteaza intrarea RESET la tensiunea de alimentare. Timpul de scurtcircuitare este dat de constanta .

constanta trebuie sa fie cel putin

Aleg => .

II .Proiectarea software

Din punct de vedere software programul va avea doua componente: programul principal si subrutina timer.

Necesitatea existentei subrutinei pentru tratarea intreruperii de la circuitul timer se justifica si prin activitatea de gestionare a tastaturii, dar si prin realizarea temporizarilor necesare functiilor si pentru controlul temperaturii in cuptor.

Activitatile pe care aceste doua componente software trebuie sa le rezolve sunt urmatoarele:

- initializarea si programarea circuitelor de tip I/O;

- initializare memorie RAM si pozitionare variabile;

- gestionarea afisajului multiplexat;

- gestionarea tastaturii;

- peluarea timpilor de la tastatura pentru fiecare functie;

- reglarea temperaturii in cuptor;

- afisarea functiei si a timpului corespunzator.

Repartizarea acestor activitati catre componentele software se poate face astfel: gestionarea afisajului, a tastaturii si cronometrarea timpilor pentru fiecare functie in parte vor fi rezolvate de catre subrutina timer datorita periodicizarii acesteia si a necesitatilor de rezolvare a respectivelor activitati de tip periodic, iar celelalte operatii vor fi rezolvate de catre programul principal.

Organigramele celor doua componente software

Programarea circuitelor periferice

Programarea circuitului 82C55

Porturile A si B trebuie programate ca iesire, iar liniile PC0, PC1, PC2, PC3 ale portului C vor fi programate ca iesire, iar liniile PC4, PC5, PC6 se vor programa ca intrare, practic prin citirea acestor linii se va observa apasarea vreunei taste.

Circuitul 82C55 se afla plasat in microsistem la adresa de baza 2000h.

2000h - adresa port A;

2001h - adresa port B;

2002h - adresa port C;

2003h - adresa registru cuvant de comanda.

Cuvantul de comanda: 1000 0001=81h - se trimite pe adresa registrului cuvantului de comanda 2003h.

Programarea circuitului 82C53

Cu ajutorul circuitului 82C53 trebuie sa realizam o temporizare de 1,6ms.

Semnalul de ceas al microcontrolerului se aplica si circuitului 82C53 pe canalul 0 de numarare pentru realizarea temporizarii.

Circuitul 82C53 este plasat in microsistem la adresa de baza 2010h.

2010h - adresa canal 0;

2011h - adresa canal 1;

2012h - adresa canal 2;

2013h - adresa registru cuvant de comanda.

Temporizarea se va realiza cu ajutorul canalului 0, programat in modul 2 (divizor de frecventa).

Constanta de timp cu care se face divizarea este:

.

Cuvantul de comanda: 0011 0100=34h - se trimite pe adresa registrului cuvantului de comanda - 2013h. Dupa aceasta se trimite constanta de divizare (se trimite prima data octetul cel mai putin semnificativ si dupa aceea octetul mai semnificativ) pe adresa registrului cuvantului de comanda - 2013h.

Programarea microcontrolerului sa lucreze in intreruperi

Circuitul temporizator 82C53 la fiecare 1,6ms genereaza un semnal de intrerupere catre microcontrolerul 80C51 pe intrarea . Astfel microcontrolerul trebuie programat sa lucreze in intreruperi; pentru acest lucru trebuie sa scriem corespunzator registrii IE si TCON.

IE: 1000 0001=81h

TCON: 0000 0001=01h

Organigrama blocului gestiune afisaj multiplexat

Algoritmul de implementare: se testeaza la fiecare 3.2ms care digit este aprins si se aprinde urmatorul. Pentru identificarea digitului aprins se foloseste o variabila DIGIT cu urmatoarele valori: 00h - digit 0, 01h - digit 1, 02h - digit 2, 03h - digit 3, 04h - digit 4, 05h - digit 5. Temporizarea este de 1.6ms de aceea este necesara realizarea a doua intreruperi pentru a realiza temporizarea de 3.2ms (aceasta este implementata prin variabila CONTOR_TIMER).

La pornirea sistemului se va afisa prima functie (F - framantare) impreuna cu primul timp corespunzator acestei functii (20minute):

Standardul de afisare va fi tipul functiei urmata de o liniuta si apoi timpul. Codurile pentru cele patru tipuri de functii sunt urmatoarele:

F - framantare:

- D - dospire:

C - coacere:

Tinere la cald:

Codul BCD 7 segmente al cifrelor de la 0 pana la 9 este:

'0' - 3Fh,

'1' - 06h,

'2' - 5Bh,

'3' - 4Fh,

'4' - 66h,

'5' - 6Dh,

'6' - 7Dh,

'7' - 07h,

'8' - 7Fh,

'9' - 6Fh.

iar pentru cele patru functii:

- F - framantare: 71h

- D - dospire: 3Fh

C - coacere: 39h

Tinere la cald: 31h

Se vor folosi variabilele DIGIT0, DIGIT1, DIGIT2, DIGIT3, DIGIT4 si DIGIT5 pentru a stoca codul binar corespunzator informatiei ce trebuie afisate.

Pentru controlul temperaturii din cuptor si pentru decrementarea timpului afisat se va realiza o temporizare de 1minut; astfel la trecerea unui minut se va citi temperatura de la senzor si se verifica daca se incadreaza in intervalul corespunzator functiei care se afla in curs de realizare. Pentru a contoriza 1 minut sunt necesare 37.500 (927Ch) de intreruperi (1,6 x 37500 = 60.000ms = 60s = 1minut). Se vor utiliza doua variabile pe cate un octet pentru a realiza temporizarea de 1 minut: CONTOR_TEMPO_H (initializare 92h) si CONTOR_TEMPO_L (initializare 7Ch).

Organigrama blocului gestiune tastatura

La fiecare 1.6ms se verifica daca s-a apasat vreo tasta. Daca se identifica o tasta apasata se verifica fenomenul de debouncing: se asteapta 10ms si daca se gaseste aceeasi tasta apasata inseamna ca este apasata si se face citirea. Dupa citire se asteapta relaxarea tastei cu verificarea fenomenului de debouncing si la relaxare.

Se folosesc urmatoarele variabile:

TASTA_PRES care este '1L' daca este apasata o tasta si '0L' daca nu;

PRES este folosita la verificarea fenomenului de debouncing cand este incert daca s-a apasat sau nu o tasta;

CONTOR_PRES este variabila folosita pentru contorizarea timpului de debouncing (10ms ceea ce inseamna o valoare de 05h pentru variabila CONTOR_PRES la initializare);

COD_ID_TASTA este variabila in care se stocheaza codul tastei apasate;

SEMAFOR_TASTA este variabila de semnalizare in programul principal a faptului ca a fost apasata o tasta;

TASTA_REL este folosita in verificarea fenomenului de debouncing la relaxarea tastei.

Organigrama pentru temporizarea de 1 minut

Pentru a indica in programul principal trecerea timpului de 1 minut se activeaza variabila SEMAFOR_TEMPO (0FFh). In programul principal se asteapta activarea acestei variabile pentru a decrementa timpul afisat cu 1 minut si a testa domeniul de temperatura.

Organigrama programului principal

Programul principal va trebui sa gestioneze urmatoarele secvente:

gestiunea informatiei ce trebuie afisata;

selectarea timpului de executie pentru fiecare functie;

controlul temperaturii in cuptor prin activarea sau dezactivarea uneia dintre rezistente;

pornirea si oprirea malaxorului in timpul functiei de framantare.

Pentru cele patru functii se foloseste variabila FUNCTION pentru identificarea acestora in program; astfel variabila FUNCTION poate lua 4 valori: 1 - F, 2 - D, 3 - C, 4 - T.

Pentru valoarea timpilor in cadrul celor 4 functii se folosesc urmatoarele variabile: TF­ - framantare, TD­ - ­dospire, TC - coacere, TT­ - tinere la cald. La pornire cele patru variabile vor fi initializate cu primul timp corespunzator fiecarei functii ( TF=30h, TD=40h, TC=45h si TT=55h ). Se poate observa ca in cazul timpului valorile in hexa corespund cu cele din zecimal; practic se foloseste aceasta metoda pentru ca in cazul afisajului se evita conversia din hexa in zecimal (cei patru biti mai putin semnificativi reprezinta cifra unitatilor ce trebuie afisata, iar cei patru biti mai semnificativi reprezinta cifra zecilor ce trebuie afisata). In cazul decrementarii trebuie sa se aibe grija ca aceasta sa fie o operatie echivalenta cu cea din zecimal, realizandu-se corectia atunci cand este necesar (ex.: 30 - 1 in hexa este 2Fh, dar in cazul acesta va trebui sa se realizeze corectia si va fi 29.).

Pentru a semnala in cadrul intreruperii faptul ca trebuie schimbata starea unei rezistente sau a motorului malaxorului se foloseste variabila SEM_CHANGE care va fi testata de fiecare data cand se intra in subrutina de intrerupere si cand va fi gasita ,1L' se va trece la tratarea starii respective. Starea in care se afla sistemul va fi transferata subrutinei de intrerupere prin intermediul variabilei STARE; aceasta va putea sa ia urmatoarele valori:

00h - sistemul se afla la pornire (urmeaza) functia de framantare si conform cu aceasta functie vor trebui pornite rezistenta 1 si malaxorul;

01h - va reprezenta sfarsitul functiei 1 si inceputul functiei 2 (dospire), moment in care trebuie oprit motorul malaxorului si pastrata rezistenta 1 (in functie de reglajul temperaturii);

02h - sfarsitul functiei 2 si inceputul functiei de coacere - se opreste rezistenta 1 si se porneste rezistenta 2;

03h - trecerea de la functia 2 la functia 3 - se opreste rezistenta 2 si se porneste rezistenta 1;

04h - sfarsitul functiei 4 si respectiv al procesului - se va reinitializa sistemul;

05h - schimba stare rezistenta - in urma testelor de temperatura rezistentele vor trebui oprite sau pornite.

Pentru a cunoaste starea in care se afla rezistentele respectiv motorul (ON/OFF) se vor folosi urmatoarele variabile: ST_REZ1, ST_REZ2 si ST_MOT (valoarea 0 pentru OFF si 1 pentru ON).

Pentru stocarea informatiei citite de la senzorul de temperatura se foloseste variabila TEMP, iar pentru temperatura minima si maxima admisa in cuptor pentru fiecare functie in parte se vor folosi urmatoarele variabile: TEMP_LOW1 - TEMPHIGH1 (temperatura minima respectiv temperatura maxima pentru functia 1), TEMP_LOW2 - TEMPHIGH2, TEMP_LOW3 - TEMPHIGH2, TEMP_LOW4 - TEMPHIGH4.

Sistemul de masurare a temperaturii ne furnizeaza informatia pe 8 biti. Considerand domeniul de temperature pentru senzor 00C - 1000C, rezulta variatia de temperatura:

Se observa ca valoarea citita de la senzorul de temperatura va trebui multiplicata cu 0.4, dar pentru a ne folosi de inmultirea cu 4 in binar (2 deplasari la stanga) se va multiplica cu 4 valoarea citita de la senzor, rezultatul obtinut reprezentand valoarea reala a temperaturii multiplicata cu 10, iar comparatia se va face cu pragurile de temperatura multiplicate cu 10.

FC

TEMP_LOW

TEMP_HIGH

ZECIMAL

HEXA

ZECIMAL

HEXA


F - framantare

12Ch

190h

D - dospire

190h

258h

C - coacere

2BCh

384h

T - tinere la cald

12Ch

190h

Variabilele TEMP_LOW si TEMP_HIGH sunt reprezentate pe 2 octeti astfel: temperatura minima pentru functia 1 (TEMP_LOW1) va fi formata din TEMP_LOW11=2Ch si TEMP_LOW12 = 01h, iar temperatura maxima de TEMP_HIGH11=90h si TEMP_HIGH12=01h; asemanator si pentru urmatoarele functii.

Tabelul variabilelor folosite in program:

Nr. crt

Nume var.

Descriere

Val. de init.

Tip var.

Adr. RAM

1

CONTOR_TIMER

Contorizeaza trecerea intervalelor de 4ms, necesar controlului afisajului multiplexat (2 val.)

00h

OCTET

0000h

2

DIGIT

Indica digitul asupra caruia actioneaza afisajul multiplexat:

0-DIGIT04-DIGIT4

00h

OCTET

0001h

3

SEMAFOR_TASTA

Variabila prin care este semnalizata apasarea unei taste:

00h -val. inactiva

FFh -val. activa

00h

OCTET

0002h

4

COD_ID_TASTA

Variabila in care se citeste codul tastei apasate

XX

OCTET

0003h

5

MEM_TASTA

Memoreaza prima valoare citita

XX

OCTET

0004h

6

PRES

Variabila ce indica eventuala apasare a unei taste si se asteapta trecerea timpului de debouncing:

00h -val. inactiva

01h -val. activa

00h

OCTET

0005h

7

TASTA_PRES

Indica faptul ca s-a apasat o tasta :

00h -val. inactiva

01h -val. activa

00h

OCTET

0006h

8

CONTOR_PRES

Variabila pentru contorizarea timpului de debouncing

XX

OCTET

0007h

9

TASTA_REL

Semafor pentru inceperea fenomenului de debouncing la relaxare:

00h -val. inactiva

01h -val. activa

XX

OCTET

0008h

10

SEMAFOR_TEMPO

Indica momentul in care s-a realizat o temporizare de 1minut:

00h -val. inactiva

FFh -val. activa

00h

OCTET

0009h

11

FUNCTION

Variabila de identificare a functiei:

01h - F, 02h - D, 03h - C, 04h - T

01h

OCTET

0010h

12

TF

Timpul pentru functia de framantare.

20h

OCTET

0011h

TD

Timpul pentru functia de dospire

30h

OCTET

0012h

TC

Timpul pentru functia de coacere

45h

OCTET

0013h

TT

Timpul pentru functia de tinere la cald

30h

OCTET

0014h

SEM_CHANGE

Semafor care indica faptul ca una dintre rezistente sau motorul trebuie sa fie pornite sau oprite :

00h -val. inactiva

01h -val. activa

00h

OCTET

0015h

CONTOR_TEMPO_H

CONTOR_TEMPO_L

Variabila pe 2 octeti folosita pentru realizarea temporizarii de 1min.

92h

7Ch

OCTET

0016h

0017h

STARE

Indica starea in care se afla sistemul.

XX

OCTET

0018h

20

ST_REZ1

Indica starea rezistentei 1:

00h - OFF

01h - ON

00h

OCTET

0019h

21

ST_REZ2

Indica starea rezistentei 2:

00h - OFF

01h - ON

00h

OCTET

0020h

22

ST_MOT

Indica starea motoeului:

00h - OFF

01h - ON

00h

OCTET

0021h

23

24

TEMP_LOW11

TEMP_LOW12

Temperatura minima (x10) a functiei 1 - framantare .

2Ch

01h

OCTET

0022h

0023h

25

26

TEMP_HIGH11

TEMP_HIGH12

Temperatura maxima (x10) a functiei 1 - framantare.

90h

01h

OCTET

0024h

0025h

27

28

TEMP_LOW21

TEMP_LOW22

Temperatura minima (x10) a functiei 2 - dospire

90h

01h

OCTET

0026h

0027h

29

30

TEMP_HIGH21

TEMP_HIGH22

Temperatura maxima (x10) a functiei 2 - dospire

58h

02h

OCTET

0028h

0029h

31

32

TEMP_LOW31

TEMP_LOW32

Temperatura minima (x10) a functiei 3 - coacere

BCh

02h

OCTET

0030h

0031h

33

34

TEMP_HIGH31

TEMP_HIGH32

Temperatura maxima (x10) a functiei 3 - coacere

84h

03h

OCTET

0032h

0033h

35

36

TEMP_LOW41

TEMP_LOW42

Temperatura minima (x10) a functiei 4 - tinere la cald

2Ch

01h

OCTET

0034h

0035h

37

38

TEMP_HIGH41

TEMP_HIGH42

Temperatura maxima (x10) a functiei 4 - tinere la cald

90h

01h

OCTET

0036h

0037h

39

TEMP

Codul temperaturii citit de la senzorul de temperatura pe 8 biti.

XX

OCTET

0038h

TEMP11

TEMP12

TEMP multiplicat cu 4

XX

XX

OCTET

0039h

0040h

TEMP_LOW1

TEMP_LOW2

Variabile generice pentru temperatura minima.

XX

XX

OCTET

0041h

0042h

TEMP_HIGH1

TEMP_HIGH2

Variabile generice pentru temperatura maxima.

XX

XX

OCTET

0043h

0044h

DIGIT0

DIGIT1

DIGIT2

DIGIT3

DIGIT4

DIGIT5

Contin codul BCD 7 segmente al informatiei de afisat

XX

XX

XX

XX

XX

XX

OCTET

0045h

0046h

0047h

0048h

0049h

0050h

Codul ASM al programului

ORG 0000h

JMP START

ORG 0003h

PUSH 0E0h

PUSH 0D0h

PUSH 0A0h

PUSH 82h

PUSH 83h

PUSH 00h

PUSH 01h

PUSH 02h

PUSH 03h

PUSH 04h

PUSH 05h

PUSH 06h

PUSH 07h

LCALL TEMPORIZARE

POP 07h

POP 06h

POP 05h

POP 04h

POP 03h

POP 02h

POP 01h

POP 00h

POP 83h

POP 82h

POP 0A0h

POP 0D0h

POP 0E0h

RETI

ORG 0100h

START:

;definirea variabilelor

CONTOR_TIMER EQU 0000h

DIGIT EQU 0001h

SEMAFOR_TASTA EQU 0002h

COD_ID_TASTA EQU 0003h

MEM_TASTA EQU 0004h

PRES EQU 0005h

TASTA_PRES  EQU 0006h

CONTOR_PRES EQU 0007h

TASTA_REL EQU 0008h

SEMAFOR_TEMPO   EQU 0009h

FUNCTION EQU 0010h

TF EQU 0011h

TD EQU 0012h

TC EQU 0013h

TT EQU 0014h

SEM_CHANGE EQU 0015h

CONTOR_TEMPO_H EQU 0016h

CONTOR_TEMPO_L EQU 0017h

STARE EQU 0018h

ST_REZ1 EQU 0019h

ST_REZ2 EQU 0020h

ST_MOT EQU 0021h

TEMP_LOW11   EQU 0022h

TEMP_LOW12   EQU 0023h

TEMP_HIGH11   EQU 0024h

TEMP_HIGH12   EQU 0025h

TEMP_LOW21   EQU 0026h

TEMP_LOW22   EQU 0027h

TEMP_HIGH21   EQU 0028h

TEMP_HIGH22   EQU 0029h

TEMP_LOW31   EQU 0030h

TEMP_LOW32   EQU 0031h

TEMP_HIGH31   EQU 0032h

TEMP_HIGH32   EQU 0033h

TEMP_LOW41   EQU 0034h

TEMP_LOW42   EQU 0035h

TEMP_HIGH41   EQU 0036h

TEMP_HIGH42   EQU 0037h

TEMP EQU 0038h

TEMP11 EQU 0039h

TEMP12 EQU 0040h

TEMP_LOW1 EQU 0041h

TEMP_LOW2 EQU 0042h

TEMP_HIGH1   EQU 0043h

TEMP_HIGH2   EQU 0044h

DIGIT0 EQU 0045h

DIGIT1 EQU 0046h

DIGIT2 EQU 0047h

DIGIT3 EQU 0048h

DIGIT4 EQU 0049h

DIGIT5 EQU 0050h

;PROGRAMARE CIRCUIT 82C55

MOV DPTR,#2003h

MOV A,#81h

MOVX @DPTR,A

;PROGRAMARE CIRCUIT 82C53

MOV DPTR,#2013h

MOV A,#34h

MOVX @DPTR,A

MOV A,#00h

MOVX @DPTR,A

MOV A,#76h

MOVX @DPTR,A

;PROGRAMARE MICROCONTROLER

;SA LUCREZE IN INTRERUPERI

MOV IE,#81h

MOV TCON,#01h

;INITIALIZARE VARIABILE

CLR A

MOV DPTR,#CONTOR_TIMER

MOVX @DPTR,A

MOV DPTR,#DIGIT

MOVX @DPTR,A

MOV DPTR,#SEMAFOR_TASTA

MOVX @DPTR,A

MOV DPTR,#PRES

MOVX @DPTR,A

MOV DPTR,#TASTA_PRES

MOVX @DPTR,A

MOV DPTR,#SEMAFOR_TEMPO

MOVX @DPTR,A

MOV DPTR,#SEMAFOR_CHANGE

MOVX @DPTR,A

MOV DPTR,#ST_REZ1

MOVX @DPTR,A

MOV DPTR,#ST_REZ2

MOVX @DPTR,A

MOV DPTR,#ST_MOT

MOVX @DPTR,A

MOV A,#01h

MOV DPTR,#FUNCTION

MOVX @DPTR,A

MOV A,#20h

MOV DPTR,#TF

MOVX @DPTR,A

MOV A,#30h

MOV DPTR,#TD

MOVX @DPTR,A

MOV A,#45h

MOV DPTR,#TC

MOVX @DPTR,A

MOV A,#30h

MOV DPTR,#TT

MOVX @DPTR,A

MOV A,#92h

MOV DPTR,#CONTOR_TEMPO_H

MOVX @DPTR,A

MOV A,#7Ch

MOV DPTR,#CONTOR_TEMPO_L

MOVX @DPTR,A

MOV A,#2Ch

MOV DPTR,#TEMP_LOW11

MOVX @DPTR,A

MOV A,#01h

MOV DPTR,#TEMP_LOW12

MOVX @DPTR,A

MOV A,#90h

MOV DPTR,#TEMP_HIGH11

MOVX @DPTR,A

MOV A,#01h

MOV DPTR,#TEMP_HIGH12

MOVX @DPTR,A

MOV A,#90h

MOV DPTR,#TEMP_LOW21

MOVX @DPTR,A

MOV A,#01h

MOV DPTR,#TEMP_LOW22

MOVX @DPTR,A

MOV A,#58h

MOV DPTR,#TEMP_HIGH21

MOVX @DPTR,A

MOV A,#02h

MOV DPTR,#TEMP_HIGH22

MOVX @DPTR,A

MOV A,#0BCh

MOV DPTR,#TEMP_LOW31

MOVX @DPTR,A

MOV A,#02h

MOV DPTR,#TEMP_LOW32

MOVX @DPTR,A

MOV A,#84h

MOV DPTR,#TEMP_HIGH31

MOVX @DPTR,A

MOV A,#03h

MOV DPTR,#TEMP_HIGH32

MOVX @DPTR,A

MOV A,#2Ch

MOV DPTR,#TEMP_LOW41

MOVX @DPTR,A

MOV A,#01h

MOV DPTR,#TEMP_LOW42

MOVX @DPTR,A

MOV A,#90h

MOV DPTR,#TEMP_HIGH41

MOVX @DPTR,A

MOV A,#01h

MOV DPTR,#TEMP_HIGH42

MOVX @DPTR,A

;PROGRAMUL PRINCIPAL

PROG_PRINCIPAL: LCALL MODIFICA_AFISAJUL

et10: MOV DPTR,#SEMAFOR_TASTA

MOVX A,@DPTR

CJNE A,#0FFh,et10

CLR A

MOVX @DPTR,A

MOV DPTR,#COD_ID_TASTA

MOVX A,@DPTR

ANL A,#70h

MOV R1,A

;verificam daca s-a apasat tasta 'FC'

CJNE A,#60h,et11

MOV DPTR,#FUNCTION

MOVX A,@DPTR

CJNE A,#04h,et12

MOV A,#01h

MOVX @DPTR,A

LCALL MODIFICA_AFISAJUL

JMP et10

et12: MOV DPTR,#FUNCTION

MOVX A,@DPTR

INC A

MOVX @DPTR,A

LCALL MODIFICA_AFISAJUL

JMP et10

;verificam daca s-a apasat tasta 'TM

et11: CJNE A,#50h,DERULARE_PROCES

MOV DPTR,#FUNCTION

MOVX A,@DPTR

CJNE A,#01h,et17

LCALL SETARE_TIMP_FC1

LCALL MODIFICA_AFISAJUL

JMP et10

et17: CJNE A,#02h,et18

LCALL SETARE_TIMP_FC2

LCALL MODIFICA_AFISAJUL

JMP et10

et18: CJNE A,#03h,et10

LCALL SETARE_TIMP_FC3

LCALL MODIFICA_AFISAJUL

JMP et10

DERULARE_PROCES:

; functia de framantare

MOV A,#01h

MOV DPTR,#FUNCTION

MOVX @DPTR,A

LCALL MODIFICA_AFISAJUL

MOV DPTR,#TEMP_LOW11

MOVX A,@DPTR

MOV DPTR,#TEMP_LOW1

MOVX @DPTR,A

MOV DPTR,#TEMP_LOW12

MOVX A,@DPTR

MOV DPTR,#TEMP_LOW2

MOVX @DPTR,A

MOV DPTR,#TEMP_HIGH11

MOVX A,@DPTR

MOV DPTR,#TEMP_HIGH1

MOVX @DPTR,A

MOV DPTR,#TEMP_HIGH12

MOVX A,@DPTR

MOV DPTR,#TEMP_HIGH2

MOVX @DPTR,A

CLR A

MOV DPTR,#STARE

MOVX @DPTR,A

INC A

MOV DPTR,#SEM_CHANGE

MOVX @DPTR,A

et24: MOV DPTR,#SEMAFOR_TEMPO

MOVX @DPTR,A

CJNE A,#0FFh,et24

CLR A

MOVX @DPTR,A

;micsoram timpul cu o unitate

MOV DPTR,#TF

MOVX A,@DPTR

LCALL MODIFICA_TIMPUL

MOVX @DPTR,A

LCALL MODIFICA_AFISAJUL

LCALL TEST_TEMPERATURA

MOV DPTR,#TF

MOVX A,@DPTR

CJNE A,#00h,et24

; functia de dospire

MOV A,#02h

MOV DPTR,#FUNCTION

MOVX @DPTR,A

LCALL MODIFICA_AFISAJUL

MOV DPTR,#TEMP_LOW21

MOVX A,@DPTR

MOV DPTR,#TEMP_LOW1

MOVX @DPTR,A

MOV DPTR,#TEMP_LOW22

MOVX A,@DPTR

MOV DPTR,#TEMP_LOW2

MOVX @DPTR,A

MOV DPTR,#TEMP_HIGH21

MOVX A,@DPTR

MOV DPTR,#TEMP_HIGH1

MOVX @DPTR,A

MOV DPTR,#TEMP_HIGH22

MOVX A,@DPTR

MOV DPTR,#TEMP_HIGH2

MOVX @DPTR,A

MOV A,#01h

MOV DPTR,#STARE

MOVX @DPTR,A

MOV DPTR,#SEM_CHANGE

MOVX @DPTR,A

et26: MOV DPTR,#SEMAFOR_TEMPO

MOVX @DPTR,A

CJNE A,#0FFh,et26

CLR A

MOVX @DPTR,A

;micsoram timpul cu o unitate

MOV DPTR,#TD

MOVX A,@DPTR

LCALL MODIFICA_TIMPUL

MOVX @DPTR,A

LCALL MODIFICA_AFISAJUL

LCALL TEST_TEMPERATURA

MOV DPTR,#TD

MOVX A,@DPTR

CJNE A,#00h,et26

; functia de coacere

MOV A,#03h

MOV DPTR,#FUNCTION

MOVX @DPTR,A

LCALL MODIFICA_AFISAJUL

MOV DPTR,#TEMP_LOW31

MOVX A,@DPTR

MOV DPTR,#TEMP_LOW1

MOVX @DPTR,A

MOV DPTR,#TEMP_LOW32

MOVX A,@DPTR

MOV DPTR,#TEMP_LOW2

MOVX @DPTR,A

MOV DPTR,#TEMP_HIGH31

MOVX A,@DPTR

MOV DPTR,#TEMP_HIGH1

MOVX @DPTR,A

MOV DPTR,#TEMP_HIGH32

MOVX A,@DPTR

MOV DPTR,#TEMP_HIGH2

MOVX @DPTR,A

MOV A,#02h

MOV DPTR,#STARE

MOVX @DPTR,A

MOV A,#01h

MOV DPTR,#SEM_CHANGE

MOVX @DPTR,A

et27: MOV DPTR,#SEMAFOR_TEMPO

MOVX @DPTR,A

CJNE A,#0FFh,et27

CLR A

MOVX @DPTR,A

;micsoram timpul cu o unitate

MOV DPTR,#TC

MOVX A,@DPTR

LCALL MODIFICA_TIMPUL

MOVX @DPTR,A

LCALL MODIFICA_AFISAJUL

LCALL TEST_TEMPERATURA

MOV DPTR,#TC

MOVX A,@DPTR

CJNE A,#00h,et27

; functia de tinere la cald

MOV A,#03h

MOV DPTR,#FUNCTION

MOVX @DPTR,A

LCALL MODIFICA_AFISAJUL

MOV DPTR,#TEMP_LOW41

MOVX A,@DPTR

MOV DPTR,#TEMP_LOW1

MOVX @DPTR,A

MOV DPTR,#TEMP_LOW42

MOVX A,@DPTR

MOV DPTR,#TEMP_LOW2

MOVX @DPTR,A

MOV DPTR,#TEMP_HIGH41

MOVX A,@DPTR

MOV DPTR,#TEMP_HIGH1

MOVX @DPTR,A

MOV DPTR,#TEMP_HIGH42

MOVX A,@DPTR

MOV DPTR,#TEMP_HIGH2

MOVX @DPTR,A

MOV A,#03h

MOV DPTR,#STARE

MOVX @DPTR,A

MOV A,#01h

MOV DPTR,#SEM_CHANGE

MOVX @DPTR,A

et28: MOV DPTR,#SEMAFOR_TEMPO

MOVX @DPTR,A

CJNE A,#0FFh,et28

CLR A

MOVX @DPTR,A

;micsoram timpul cu o unitate

MOV DPTR,#TT

MOVX A,@DPTR

LCALL MODIFICA_TIMPUL

MOVX @DPTR,A

LCALL MODIFICA_AFISAJUL

LCALL TEST_TEMPERATURA

MOV DPTR,#TT

MOVX A,@DPTR

CJNE A,#00h,et28

MOV A,#04h

MOV DPTR,#STARE

MOVX @DPTR,A

MOV A,#01h

MOV DPTR,#SEM_CHANGE

MOVX @DPTR,A

JMP PROG_PRINCIPAL

MODIFICA_AFISAJUL:

;digitul pt. liniuta

MOV A,#40h

MOV DPTR,#DIGIT2

MOVX @DPTR,A

;verificam care functie este activa

MOV DPTR,#FUNCTION

MOVX A,@DPTR

CJNE A,#01h,et14

MOV A,#71h ;codul pt. 'F'

MOV DPTR,#DIGIT3

MOVX @DPTR,A

MOV DPTR,#TF

MOVX @DPTR,A

JMP et13

et14: CJNE A,#02h,et15

MOV A,#3Fh ; codul pt. 'D'

MOV DPTR,#DIGIT3

MOVX @DPTR,A

MOV DPTR,#TD

MOVX @DPTR,A

JMP et13

et15: CJNE A,#03h,et16

MOV A,#39h ; codul pt. 'C'

MOV DPTR,#DIGIT3

MOVX @DPTR,A

MOV DPTR,#TC

MOVX @DPTR,A

JMP et13

et16: MOV A,#31h ; codul pt. 'T'

MOV DPTR,#DIGIT3

MOVX @DPTR,A

MOV DPTR,#TT

MOVX @DPTR,A

;afiseaza temperatura 

et13: MOV R1,A

ANL A,#0Fh

LCALL BCD_7_SEGMENTE

MOV DPTR,#DIGIT0

MOVX @DPTR,A

LD A,R1

SWAP A

LCALL BCD_7_SEGMENTE

MOV DPTR,#DIGIT1

MOVX @DPTR,A

;ultimii 2 digiti sunt stinsi

CLR A

MOV DPTR,#DIGIT4

MOVX @DPTR,A

MOV DPTR,#DIGIT5

MOVX @DPTR,A

RET

BCD_7_SEGMENTE:

CJNE A,#00h,et1

MOV A,#3Fh

RET

et1: CJNE A,#01h,et2

MOV A,#06h

RET

et2: CJNE A,#02h,et3

MOV A,#5Bh

RET

et3: CJNE A,#03h,et4

MOV A,#4Fh

RET

et4: CJNE A,#04h,et5

MOV A,#66h

RET

et5: CJNE A,#05h,et6

MOV A,#6Dh

RET

et6: CJNE A,#06h,et7

MOV A,#7Dh

RET

et7: CJNE A,#07h,et8

MOV A,#07h

RET

et8: CJNE A,#08h,et9

MOV A,#7Fh

RET

et9: MOV A,#6Fh

RET

SETARE_TIMP_FC1:MOV DPTR,#TF

MOVX A,@DPTR

CJNE A,#30h,et19

MOV A,#40h

MOVX @DPTR,A

RET

et19:  CJNE A,#40h,et20

MOV A,#55h

MOVX @DPTR,A

RET

et20:  MOV A,#30h

MOVX @DPTR,A

RET

SETARE_TIMP_FC2:MOV DPTR,#TD

MOVX A,@DPTR

CJNE A,#40h,et21

MOV A,#50h

MOVX @DPTR,A

RET

et21:  CJNE A,#50h,et22

MOV A,#70h

MOVX @DPTR,A

RET

et22: MOV A,#40h

MOVX @DPTR,A

RET

SETARE_TIMP_FC3:MOV DPTR,#TC

MOVX A,@DPTR

CJNE A,#45h,et23

MOV A,#65h

MOVX @DPTR,A

RET

et23:  MOV A,#450h

MOVX @DPTR,A

RET

MODIFICA_TIMPUL:

DEC A

DA A

RET

TEST_TEMPERATURA:

MOV A,P1

MOV DPTR,#TEMP11

MOVX @DPTR,A

CLR A

MOV DPTR,#TEMP12

MOVX @DPTR,A

MOV DPTR,#TEMP11

MOVX A,@DPTR

CLR C

RLC A

MOV R1,A

CLR A

RLC A

MOV R2,A

MOV A,R1

RLC A

MOVX @DPTR,A

MOV A,R2

RLC A

MOV DPTR,#TEMP12

MOVX @DPTR,A

MOV DPTR,#FUNCTION

MOVX A,@DPTR

CJNE A,#03h,et30

MOV DPTR,#ST_REZ2

MOVX A,@DPTR

CJNE A,#01h,et31

MOV DPTR,#TEMP12

MOVX A,@DPTR

MOV DPTR,#TEMP_HIGH2

MOV R1,A

MOVX A,@DPTR

MOV 00h,A

MOV A,R1

CJNE A,00h,et34

JC et34

JMP et35

et34:  MOV DPTR,#TEMP11

MOVX A,@DPTR

MOV DPTR,#TEMP_HIGH1

MOV R1,A

MOVX A,@DPTR

MOV 00h,A

MOV A,R1

CJNE A,00h,et35

JC et36

JMP et35

et35:  MOV A,#05h

MOV DPTR,#STARE

MOVX @DPTR,A

MOV A,#01h

MOV DPTR,#SEM_CHANGE

MOVX @DPTR,A

et36:  RET

; GESTIUNE AFISAJ MULTIPLEXAT

; TEST CONTOR_AFISAJ

MOV DPTR,#CONTOR_TIMER

MOVX @DPTR,A

CJNE A,00h,et50

MOV A,#01h

MOV DPTR,#CONTOR_TIMER

MOVX @DPTR,A

CLR A

MOV DPTR,#2001h

MOVX @DPTR,A

MOV DPTR,#SEM_CHANGE

MOVX A,@DPTR

CJNE A,00h,et51

CALL INTERPRETARE_STARE

et51: MOV DPTR,#DIGIT

MOVX A,@DPTR

CJNE A,00h,et52

MOV A,#04h

MOVX @DPTR,A

MOV DPTR,#DIGIT0

MOVX A,@DPTR

MOV DPTR,#2000h

MOVX @DPTR,A

MOV A,#01h

MOV DPTR,#2001h

MOVX @DPTR,A

JMP TASTATURA

et52: CJNE A,01h,et53

MOV DPTR,#DIGIT

MOVX A,@DPTR

DEC A

MOVX @DPTR,A

MOV DPTR,#DIGIT1

MOVX A,@DPTR

MOV DPTR,#2000h

MOVX @DPTR,A

MOV A,#02h

MOV DPTR,#2001h

MOVX @DPTR,A

JMP TASTATURA

et53: CJNE A,02h,et54

MOV DPTR,#DIGIT

MOVX A,@DPTR

DEC A

MOVX @DPTR,A

MOV DPTR,#DIGIT2

MOVX A,@DPTR

MOV DPTR,#2000h

MOVX @DPTR,A

MOV A,#04h

MOV DPTR,#2001h

MOVX @DPTR,A

JMP TASTATURA

et54: CJNE A,03h,et55

MOV DPTR,#DIGIT

MOVX A,@DPTR

DEC A

MOVX @DPTR,A

MOV DPTR,#DIGIT3

MOVX A,@DPTR

MOV DPTR,#2000h

MOVX @DPTR,A

MOV A,#08h

MOV DPTR,#2001h

MOVX @DPTR,A

JMP TASTATURA

et55: CJNE A,04h,et56

MOV DPTR,#DIGIT

MOVX A,@DPTR

DEC A

MOVX @DPTR,A

MOV DPTR,#DIGIT4

MOVX A,@DPTR

MOV DPTR,#2000h

MOVX @DPTR,A

MOV A,#10h

MOV DPTR,#2001h

MOVX @DPTR,A

JMP TASTATURA

et56: MOV DPTR,#DIGIT

MOVX A,@DPTR

DEC A

MOVX @DPTR,A

MOV DPTR,#DIGIT5

MOVX A,@DPTR

MOV DPTR,#2000h

MOVX @DPTR,A

MOV A,#20h

MOV DPTR,#2001h

MOVX @DPTR,A

TASTATURA: MOV DPTR,#PRES

MOVX A,@DPTR

MOV R1,#22h

CJNE A,#00h,et69

MOV DPTR,#TASTA_PRES

MOVX A,@DPTR

CJNE A,#00h,et70

MOV DPTR,#00h

MOVX A,@DPTR

MOVX @R1,A

MOVX A,@R1

ANL A,#7Fh

MOV R3,A

ANL A,#70h

CJNE A,#70h,et71

MOVX A,@DPTR

SETB C

RLC A

MOVX @DPTR,A

CJNE A,#0EFh,et72

MOV A,#0FEh

MOVX @DPTR,A

RET

et71: MOV A,R3

MOV DPTR,#MEM_TASTA

MOVX @DPTR,A

MOV DPTR,#CONTOR_PRES

MOV A,#08h

MOVX @DPTR,A

MOV DPTR,#TASTA_PRES

MOV A,#01h

MOVX @DPTR,A

RET

et70: MOV DPTR,#CONTOR_PRES

MOVX A,@DPTR

DEC A

MOVX @DPTR,A

CJNE A,#00h,et72

MOVX A,@R1

ANL A,#7Fh

MOV R2,A

MOV DPTR,#MEM_TASTA

MOVX A,@DPTR

CJNE A,02h,et73

MOV DPTR,#COD_ID_TASTA

MOVX @DPTR,A

MOV DPTR,#SEMAFOR_TASTA

MOV A,#01h

MOVX @DPTR,A

MOV DPTR,#PRES

MOVX @DPTR,A

MOV DPTR,#TASTA_PRES

CLR A

MOVX @DPTR,A

RET

et73: MOV DPTR,#TASTA_PRES

CLR A

MOVX @DPTR,A

RET

et69: MOV DPTR,#TASTA_REL

MOVX A,@DPTR

CJNE A,#00h,et74

MOVX A,@R1

ANL A,7Fh

CJNE A,#7Fh,et72

MOV DPTR,#CONTOR_PRES

MOV A,#08h

MOVX @DPTR,A

MOV DPTR,#TASTA_REL

MOV A,#01h

MOVX @DPTR,A

RET

et74: MOV DPTR,#CONTOR_PRES

MOVX A,@DPTR

DEC A

MOVX @DPTR,A

CJNE A,#00h,et72

MOVX A,@R1

ANL A,7FH

CJNE A,#7Fh,et75

MOV DPTR,#PRES

CLR A

MOVX @DPTR,A

MOV DPTR,#TASTA_REL

MOVX @DPTR,A

RET

et75: MOV DPTR,#TASTA_REL

CLR A

MOVX @DPTR,A

et72: RET

END

INTERPRETARE_STARE:

MOV DPTR,#STARE

MOVX A,@DPTR

CJNE A,#00h,et60

MOV A,#0Ah

MOV DPTR,#2003h

MOVX @DPTR,A

MOV A,#05h

MOV DPTR,#2000h

MOVX @DPTR,A

MOV A,#00h

MOV DPTR,#2003h

MOVX @DPTR,A

RET

et60: CJNE A,#01h,et61

MOV A,#08h

MOV DPTR,#2003h

MOVX @DPTR,A

MOV A,#00h

MOV DPTR,#2000h

MOVX @DPTR,A

MOV DPTR,#2003h

MOVX @DPTR,A

RET

et61: CJNE A,#02h,et62

MOV A,#04h

MOV DPTR,#2003h

MOVX @DPTR,A

MOV A,#02h

MOV DPTR,#2000h

MOVX @DPTR,A

CLR A

MOV DPTR,#2003h

MOVX @DPTR,A

RET

et62: CJNE A,#03h,et63

MOV A,#04h

MOV DPTR,#2003h

MOVX @DPTR,A

MOV A,#00h

MOV DPTR,#2000h

MOVX @DPTR,A

MOV DPTR,#2003h

MOVX @DPTR,A

RET

et63: CJNE A,#04h,et64

MOV A,#02h

MOV DPTR,#2003h

MOVX @DPTR,A

MOV A,#00h

MOV DPTR,#2000h

MOVX @DPTR,A

MOV DPTR,#2003h

MOVX @DPTR,A

RET

et64: MOV DPTR,#FUNCTION

MOVX A,@DPTR

CJNE A,#03h,et65

MOV DPTR,#ST_REZ2

MOVX A,@DPTR

CJNE A,#01h,et66

CLR A

MOVX @DPTR,A

et66: MOV A,#01h

MOVX @DPTR,A

RET

et65: MOV DPTR,#ST_REZ1

MOVX A,@DPTR

CJNE A,#01h,et67

CLR A

MOVX @DPTR,A

et67: MOV A,#01h

MOVX @DPTR,A

RET





Politica de confidentialitate


creeaza logo.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.