TEMA DE PROIECTARE:
Se va proiecta un calculator electronic care efectueaza înmultirea a doua numere cu afisarea rezultatului, si cu o tastatura folosita la introducerea operanzilor si la configurari de lucru.
DATE DE PROIECTARE:
Se va folosi un microcontroler din seria 8051 a carui frecventa de ceas va fi 20MHz. Afisarea datelor va fi facuta prin tehnica multiplexarii. Primul operand va fi pe 4 digiti, respectiv al 2-lea operand pe 2 digiti. Se va folosi un numar de 4 taste.
CAP I Proiectare hardware
Microsistemul va fi compus din doua parti principale:
Unitatea de calcul si de preluare a comenzilor ( tastatura ).
Este organizata în jurul unui controler din familia 8051 produs de INTEL. Aceasta are rolul de preluare a informatiei de la tastatura, procesarea soft a acesteia si gestionare a sistemului de afisare. Toate aceste operatii sunt efectuate conform unui program de lucru înscris in memoria ROM interna a microcontrolerului.
Unitatea de afisare
Aceasta cuprinde o tabela cu celule elementare de afisare cu leduri precum si circuitele de comanda ale acestora.
Proiectarea unitatii de afisare
Se foloseste tehnica afisarii multiplexate. Este o metoda eficienta din punct de vedere al consumului si al reducerii complexitatii circuitelor de comanda. Tehnica se bazeaza pe efectul de integrare al ochiului uman la stimuli luminosi cu frecventa ridicata.
Se utilizeaza un numar de 12 celule de afisare, pe care se reprezinta cei doi operanzi si rezultatul operatiei de înmultire. Primului operand îi revin 4 celule de afisare, celui de-al doi-lea operand - 2 celule si rezultatlui - 6 celule de afisare, conform urmatorului calcul :
6 celule
Dispunerea celulelor de afisare se face pe doua linii si sase coloane, conform schemei :
Conform logicii de afisare multiplexata, la un anumit moment trebuie sa fie activata doar o singura coloana. Forma de unda prezentata mai jos arata faptul ca fiecare celula de afisare se aprinde cu o frecventa de 50Hz, astfel ochiul va sesiza celula aprinsa tot timpul.
Celulele de afisare folosite sunt cu catod comun, produse de LITEON. Principalele caracteristici sunt :
Curent prin segment in regim continuu 25mA
Curent prin segment in regim de impulsuri 90mA
Caderea de tensiune pe segment 2V
Comanda liniilor si coloanelor este realizata de circuite speciale de comutatie cu tranzistoare. Este nevoie de doua astfel de circuite de comanda corespunzator activarii unei coloane (circuit ce trebuie sa asigure un curent relativ mai mare avand in vedere ca trebuie sa suporte consumul de 1,260A al tuturor segmentelor de pe coloana in starea ON), si un circuit corespunzator activarii unui singur segment ( el trebuie sa suporte curentul maxim prin segment in starea ON )
Aceste structuri vor interactiona cu trei dintre porturile controlerulului 8051. Având in vedere ca 8051 poate sustine pe port un curent de numai 2mA, rezulta ca o conditie de proiectare a circuitelor de comanda este ca intarea lor sa consume cat mai putin curent dintr-un astfel de port.
Schema circuitului de comanda pentru o celula de afisare:
Functionare :
Ledurile din cadrul celulei de afisare sunt comandate prin intermediul unui tranzistor BC177 care lucreaza in regim de comutatie. Fiecare segment al celulei este inseriat cu o rezistenta in vederea limitarii curentului maxim prin aceasta la valoarea recomandata in foaia de catalog, de 90mA. Organizarea afisajului prezentata anterior face ca tranzistorul raspunz& 515w2215f #259;tor de comanda coloanelor sa trebuiasca sa suporte un curent maxim de 2x7x90mA=1,260A. Interfata circuitelor de comanda la porturile controlerului se face cu buffere 7404.
Tranzistorul BC177 se blocheaza daca iesirea portii 7404 corespunzatoare trece în « 1 » logic. Rezistentele din baza vor fi in paralel si prin ele nu va circula curent deoarece curentul Ib este 0 la blocare. Caderea de tensiune de pe resistente va fi 0 iar in baza vom avea 5V. Deci Veb=0 si BC177 blocat. Daca la iesirea portii 7404 este nivel « 0 »logic, baza tranzistorului este polarizata prin divizorul resistiv astel încât Veb=0.7V si tranzistorul sa se deschida. Deci aprinderea unui segment se face aplicând pe portul de iesire al microcontrolerului un semnal cu nivel « 1 »logic. Pentru stingere « 0 »logic.
Comanda coloanelor este facuta de tranzistorul MOS FDS6680, care primeste comanda o tensiune cu nivel logic TTL. Trecerea din conductie in bocare si invers a acestui tranzistor presupune incarcarea si descarcarea capacitatii Vgs.
Componenete folosite :
BC177 - Vce(sat)=0.95V
Icmax=100mA
Pdmax=300mW
FDS6680 (Logic level MOSFET canal N)
Rds(on)=0.013Ω
Id(max puls)=50A
Pdmax=2,5W
Calculul elementelor de circuit :
Aleg Ir2=1mA
Vr2=0,7V Aleg R2=680Ω, 0.125W RPC
TKI:
TKII:
Aleg R1=470Ω, 0,125W RPC
Calculul rezistentei de limitare a curentului prin segment :
Aleg R2=24 , 0.25W RPC
Rezistenta din grila MOS are rolul de a limita curentul de incarcare/descarcare absorbit in momentele de comutatie directa si inversa. Având in vedere ca limita de curent pe portul de iesire al microcontrolerului este de 2mA, curentul de grila va trebui limitat la o valoare cel mult egala cu 2mA. Alegem pentru acesta o valoare de 1mA. Aceasta valoare va determina insa o comutatie mai lenta. Capacitatea Ggs se va incarca mai lent. Acesta nu constituie insa un dezavantaj deoarece pentru 1mA timpii de comutatie (us) ramân mult mai mici decât timpii de conductie (3.3ms) si de blocare (16.7ms)
Calculul rezistentei de limitare :
Simulare ORCAD Pspice
Se simuleaza comutatia tranzistorului BC177. Sarcina acestuia este o rezistenta echivalenta (led+R4+RdsON). Se urmareste variatia curentului de colector si tensiunea pe sarcina la comutatia directa si inversa.
Simularea circuitului de control coloane
Se urmareste variatia in timp a curentului de drena (Id), a curentului de grila (Ig) si a tensiunii pe sarcina. Grupul BC177+led+Rled s-a înlocuit cu o rezistenta echivalenta de 3.88Ω:
Schema folosita in simulare :
Tastatura
Rolul tastelor T1,T2,T3,T4:
1.3 Circuit de RESET:
La punerea in functie a microcontrolerului, circuitul de reset trebuie sa actioneze un timp de cel putin 24 perioade ale semnalului de ceas. Înaintea conectarii tensiunii de alimentare condensatorul C este descarcat, tensiunea la borne fiind "0". Dupa alimentare, condensatorul scurtcircuiteaza intrarea RESET la tensiunea de alimentare. Timpul de scurtcircuitare este dependent de viteza de încarcare a condensatorului prin rezistorul R.
Aleg R=1k
Deci capacitatea minima necesara mentinerii intrarii RESET in "1" pe durata 24*Tosc este C=1nF
Se alege pentru C o valoare mai mare: C=1uF
Dioda D realizeaza descarcarea rapida a condensatorului la deconectarea alimentarii pentru ca resetul circuitului sa lucreze corect la urmatoarea conectare a tensiunii de alimentare.
Cap II Interfata software
Programul ce se înscrie în memoria microcontrolerului va realiza gestionarea tastaturii, a afisajului multiplexat, si va efectua operatia de înmultire în conformitate cu setarea modului de lucru ales de operator.
Softul este împartit in program principal si rutina timer:
Programul principal verifica in permanenta semaforul modului de lucru (prog), si daca acesta este gasit setat se trece in regim de programare, verificându-se daca a fost apasata o tasta. Când semaforul nu este gasit setat, programul reia testul acestuia pâna la îndeplinirea conditiei.
Schema bloc a programului principal este:
Functionare: Programul începe prin initializarea registrilor si a variabilelor de lucru, configurarea porturilor si a registrilor speciali din zona SFR referitori la gestiunea intreruperii.
Dupa aceste configurari initiale, se trece la testul regimului de lucru prin interogarea semaforului "prog". Daca acesta este gasit setat (ca in cadrul rutinei timer s-a detectat apasarea tastei T1) programul trece la resetarea registrilor de lucru in care se vor prelua date in vederea efectuarii operatiei de inmultire (câmpul registrilor de afisare si al celor de programare). Aceasta operatie este efectuata in urma testarii indicatorului "init_var", si este facuta doar la prima intrare in regimul de programare prin apelarea rutinei "init_nr". Semaforul este setat la detectia apasarii tastei T1 si resetat dupa operatia de resetare.
Dupa resetarea registrilor de lucru programul testeaza indicatoarele de apasare ale celor doua taste T2 si T3: "stare_t2" si "stare_t3"
Daca "stare_t2" este gasit "1"(rutina timer a detectat apasarea tastei T2) se efectueaza deplasarea unui pointer R1 in cadrul câmpului de digiti programabili (dig_prog_XX), si al unui pointer de stare Flash: R0 in cadrul câmpului de digiti pentru afisare (dig_afis_XX).
Daca "stare_t3" este gasit setat, este incrementat continutul locatiei RAM a carei adresa este pastrata in pointerul de programare R1, apoi se extrage din tabela de conversie BCD-7segmente codul 7segmente al numarului curent înscris in registru pentru a fi înscris in locatia corespunzatoare din câmpul variabilelor de afisare.
Dupa iesirea din gestionare a regimului de programare este interogat semaforul "executa". Iesirea din acest regim de lucru este facuta de apasarea tastei T4, care implicit seteaza si acest semafor. Setarea acestuia va declansa in programul principal apelarea rutinei care este responsabila cu efectuarea operatiilor de conversii si de inmultire.
In regimul normal de lucru se efectueaza doar testul celor doua flaguri: "prog" si "executa" .
2.11 Rutina de reset a operanzilor:
2.12 Rutina de calcul a produsului
În cadrul acesteia se preiau numerele reprezentate in cod BCD de la adresele digitilor programabili, se convertesc in binar apoi este efectuata înmultirea si conversiile binar-bcd si bcd-7segmente:
Conversia BCD_BINAR
Se realizeaza înainte o concatenare a octetilor in format BCD in registrii R2 si R3, cu acestia se va porni in efectuarea conversiei. Pentru operandul 1 numarul in binar se va obtine in registrii R4(ocms) si R5(ocmps), iar pentru al doilea in registrul R2.
Numarul maxim ce va fi convertit este 9999=270Fh (pe doi octeti: R4=27h R5=0Fh)
Operatia de inmultire
Operanzii se preiau din registrii R4 si R5 respectiv R2. rezultatul se obtine in registrii bin1(ocms), bin2, bin3(ocmps). Registrul R2 se initializeaza in vederea operatiilor de rotire a lui R4 si R5. Rezultatul va fi pe trei octeti: 270Fh*63h=F1ACDh. bin1=0Fh; bin2=1Ah; bin3=CDh.
Conversia binar-bcd
Se preia rezultatul înmultirii din registrii bin1, bin2, bin3 si se transforma in cod bcd, in registrii R2(ocms), R3, R4(ocmps). Se initializeaza registrul "cont_bcd" cu numarul de pasi ce reprezinta numarul de biti ai rezultatului: 2410=18h (trei registrii).
Conversia bcd-7segmente
Se preia pe pozitia cmps a registrului A câte un nyble din registrii R2, R3, R4 ce contin codul BCD al rezultatului. Cu registrul A se va face apelarea indirecta a tabelei de conversie BCD-7SEGMENE ce se afla scrisa in zona memoriei de date. Dupa fiecare apelare, rezultatul se transfera in zona RAM rezervata octetilor ce se vor prelua in vederea afisarii.
La apelare se foloseste registrul DPTR pe 16 biti initializat cu adresa de început a tabelei de conversie. Tabela se depune in memoria de programe, intr-o zona ulterioara celei in care se scrie programul principal.
Subrutina de intreruperi de la TMER 0
Aceasta parte a programului este responsabila de gestionarea apasarii celor 4 taste, de controlul afisarii multiplexate si de controlul starii FLASH.
Subrutina contine doua parti:
Intr-o prima faza se trateaza logica de afisare (trimiterea pe coloana activa a codurilor 7 segmente ce trebuie afisate in cadrul acesteia) si gestionarea apasarii tastei T1 cu care se face intrarea in regim de programare. Daca tasta T1 este apasata, rutina se comuta pe faza 2 dupa ce este tratata partea de afisare multiplexata.
In faza a doua se intra doar la detectia apasarii tastei T1. In aceasta faza se trateaza pa rând tastele T2 (pentru incrementarea adresei digitului programabil) tasta T3 (pentru incrementarea digitului programabil) si tasta T4 (care permite iesirea din regimul de programare). Apasarea tastei T4 declanseaza de asemenea in programul principal si executia operatiei de înmultire (cu conversiile corespunzatoare).
Schema bloc a subrutinei:
Calculul constatei de numarare a canalului TIMER0:
Rutina ISR este apelata la fiecare 3.3ms (perioada de refresh la circuitele de afisare). Temporizarea de 3.3ms este realizata prin incrementarea constantei înscrise in registrii TH0 si TL0. Se pleaca de la frecventa de baza a cristalului de cuart: 20MHz. Timerul primeste impulsurile CLK divizate cu 12.
TH0=EAh ; TL0=84h
Constata de numarare se reîncarca în registrii corespunzatori TH0 si TL0 la fiecare început de gestionre a rutinei de întreruperi.
Configurarea registrului IE:
EA |
X |
X |
ES |
ET1 |
EX1 |
ET0 |
EX0 |
|
|
|
|
|
|
|
|
IE=82h
Configurarea registrului TMOD:
Gate1 |
C/T 1 |
M1 |
M0 |
Gate2 |
C/T2 |
M1 |
M0 |
|
|
|
|
|
|
|
|
IE=21h
Configurarea registrului TCON:
TF1 |
TR1 |
TF0 |
TR0 |
IE1 |
IT1 |
IE0 |
IT0 |
|
|
|
|
|
|
|
|
IE=10H
Cap III Lista de variabile
variabila |
adresa |
val initiala |
semnificatie |
DIG_AFIS_11 |
30h |
7Eh |
Pastreaza codul 7SEG al primei cifre din operandul 1 |
DIG_AFIS_12 |
31h |
7Eh |
Pastreaza codul 7SEG al cifrei 2 din operandul 1 |
DIG_AFIS_13 |
32h |
7Eh |
Pastreaza codul 7SEG al cifrei 3 din operandul 1 |
DIG_AFIS_14 |
33h |
7Eh |
Pastreaza codul 7SEG al cifrei 4 din operandul 1 |
DIG_AFIS_21 |
34h |
7Eh |
Pastreaza codul 7SEG al primei cifre din operandul 2 |
DIG_AFIS_22 |
35h |
7Eh |
Pastreaza codul 7SEG al cifrei 2 din operandul 2 |
DIG_AFIS_31 |
36h |
7Eh |
Pastreaza codul 7SEG al primei cifre din rezultat |
DIG_AFIS_32 |
37h |
7Eh |
Pastreaza codul 7SEG al cifrei 2 din rezultat |
DIG_AFIS_33 |
38h |
7Eh |
Pastreaza codul 7SEG al cifrei 3 din rezultat |
DIG_AFIS_34 |
39h |
7Eh |
Pastreaza codul 7SEG al cifrei 4 din rezultat |
DIG_AFIS_35 |
3Ah |
7Eh |
Pastreaza codul 7SEG al cifrei 5 din rezultat |
DIG_AFIS_36 |
3Bh |
7Eh |
Pastreaza codul 7SEG al cifrei 6 din rezultat |
dig_prog_11 |
3Ch |
00h |
Pastreaza codul BCD al primei cifre din primul operand |
dig_prog_12 |
3Dh |
00h |
Pastreaza codul BCD al cifrei 2 din primul operand |
dig_prog_13 |
3Eh |
00h |
Pastreaza codul BCD al cifrei 3 din primul operand |
dig_prog_14 |
3Fh |
00h |
Pastreaza codul BCD al cifrei 4 din primul operand |
dig_prog_21 |
40h |
00h |
Pastreaza codul BCD al primei cifre din al doilea operand |
dig_prog_22 |
41h |
00h |
Pastreaza codul BCD al cifrei 2 din al doilea operand |
COL |
42h |
01h |
Registru folosit in rutina ISR. El memoreaza codul coloanei de afisare activa pe durata dintre întreruperi |
IMG_COL |
43h |
|
Registru folosit in rutina ISR. Are rolul de buffer pentru registrul COL pe durata cât acesta este testat in rutina de tratare a afisarii multiplexate |
cont_t1,2,3,4 |
44h, 45h,46h, 47h |
|
Registrii folositi la contorizarea rutinelor timer ce trebuie sa se scurga in vederea realizarii temporizarii de 10ms necesare in procesul de deboncing la apasarea si relaxarea tastelor T1, T2, T3, T4. |
cont_flash |
48h |
00h |
Contor de numarare a rutinelor timer in vederea realizarii temporizarii de 500ms necesare in realizarea efectului de flash la celula de afisare ce se programeaza |
cont_bcd |
4Ah |
|
Contor de numarare al pasilor de lucru necesari in rutinele de conversie binar_bcd si bcd_binar. |
buffer |
49h |
00h |
Are rol de memorare al continutului registrului ce se programeaza in perioadele in care celula corespunzatoare este stinsa in starea de lucru flash |
Temp, temp1 |
4Bh,4Ch |
|
Registrii folositi la stocari temporare de date. |
bin1 |
4Dh |
|
Registru in care se depune OCMS al rezultatului inmultirii |
bin2 |
4Eh |
|
Memoreaza octetul al doilea din rezultatul inmultirii |
bin3 |
4Fh |
|
Memoreaza OCMPS din rezultatul înmultirii |
rdy_t1,2,3,4 |
00h, 01h, 02h, 03h |
|
Semafor ce valideaza începerea citirii starii tastei T1,2,3,4 in rutina ISR rdy_tX=0- în acest caz tasta tX este apasata si programul nu va mai putea citi starea ei decât dupa relaxarea ei, când rdy_tX va fi facut "1". Valoarea la initializare este "1", adica toate tastele pot fi citite. Daca se apasa o tasta. A doua citire a ei se face doar dupa o relaxare si o apasare. |
init_t1,2,3,4 |
04h, 05h, 06h, 07h, |
|
Semafor care se seteaza la începutul detectarii apasarii unei taste si declanseaza procesul de deboncing prin încarcarea contorului de deboncing. El este resetat imediat dupa sfârsitul acestui proces. Valoarea la initializare este "0", adica nici o tasta nu a fost initiata in apasare. |
rls_t1,2,3,4 |
08h, 09h, 0Ah, 0Bh |
|
Semafor care se seteaza la începutul detectarii relaxarii unei taste si declanseaza procesul de deboncing prin încarcarea contorului de deboncing. El este resetat imediat dupa sfârsitul acestui proces. Valoarea la initializare este "0' |
Prog |
0Ch |
|
Semafor care stabileste regimul de lucru. El este setat la apasrea tastei T1, si intrându-se in regimul de programare, si este resetat la apasarea tastei T4 când se trece in regim normal de functionare.Valoarea la initializare este "0" intrându-se in regim normal de functionare |
OFF |
0Dh |
|
Semafor ce indica starea aprins(OFF=0) sau starea stins(OFF=1) pentru digitul ce efectueaza flash |
stare_t2 |
0Eh |
|
Semafor ce se seteaza la apasarea tastei T2. El se transmite in programul principal si declanseaza incrementatrea adresei digitului ce se programeaza |
stare_t3 |
0Fh |
|
Semafor ce se seteaza la apasarea tastei T3. El se transmite in programul principal si declanseaza incrementatrea continutului digitului ce se programeaza |
Executa |
10h |
|
Semafor care se seteaza la apasarea tastei T4 si declanseaza in programul principal initierea efectuarii operatiei de inmultire. Valoarea la initializare este "0" |
init_var |
11h |
|
Semafor folosit in programul principal. El declanseaza golirea registrilor de lucru (folositi la afisare si programare) la prima intrare in bucla ce trarteaza functionarea in regim de programare. |
Cap IV Codul sursa
;soare adrian 2001 pitesti PROIECT SEP
;calculator pentru inmultirea a doi operanzi
;unul pe 4 octeti(bcd)celalalt pe doi octeti(bcd)
; declaratii registrii ram
DIG_AFIS_11 equ 30h ;pastreaza codul 7seg. pt OP11
DIG_AFIS_12 equ 31h ;pastreaza codul 7seg. pt OP12
DIG_AFIS_13 equ 32h ;pastreaza codul 7seg. pt OP13
DIG_AFIS_14 equ 33h ;pastreaza codul 7seg. pt OP14
DIG_AFIS_21 equ 34h ;pastreaza codul 7seg. pt OP21
DIG_AFIS_22 equ 35h ;pastreaza codul 7seg. pt OP22
DIG_AFIS_31 equ 36h ;pastreaza codul 7seg. pt rez31
DIG_AFIS_32 equ 37h ;pastreaza codul 7seg. pt rez32
DIG_AFIS_33 equ 38h ;pastreaza codul 7seg. pt rez33
DIG_AFIS_34 equ 39h ;pastreaza codul 7seg. pt rez34
DIG_AFIS_35 equ 3Ah ;pastreaza codul 7seg. pt rez35
DIG_AFIS_36 equ 3Bh ;pastreaza codul 7seg. pt rez36
dig_prog_11 equ 3Ch ;pastreaza codul BCD pt OP11
dig_prog_12 equ 3Dh ;pastreaza codul BCD pt OP12
dig_prog_13 equ 3Eh ;pastreaza codul BCD pt OP13
dig_prog_14 equ 3Fh ;pastreaza codul BCD pt OP14
dig_prog_21 equ 40h ;pastreaza codul BCD pt OP21
dig_prog_22 equ 41h ;pastreaza codul BCD pt OP22
COL equ 42h ;codul coloanei active in ISR
IMG_COL equ 43h ;buffer pt codul coloanei active in ISR
cont_t1 equ 44h ;contor debug pentru tasta T1
cont_t2 equ 45h ;contor debug pentru tasta T2
cont_t3 equ 46h ;contor debug pentru tasta T3
cont_t4 equ 47h ;contor debug pentru tasta T4
cont_flash equ 48h ;contor FLASH ( pt temporizarea flash de 500ms )
buffer equ 49h ;buffer de restaurare al cifrei care efectueaza flash
cont_bcd equ 4Ah ;contor de nr de pasi pt conversii
temp equ 4Bh ;pemntru stocari temporare de date
temp1 equ 4Ch ;pentru stocari temporare de date
bin1 equ 4Dh ;ocms rezultat inmultire
bin2 equ 4Eh
bin3 equ 4Fh ;ocmps rezultat inmultire
; declaratii variabile BIT in RAM
rdy_t1 equ 00h ;semafor de validare a citirii dupa relaxarea tastei t1
rdy_t2 equ 01h ;semafor de validare a citirii dupa relaxarea tastei t2
rdy_t3 equ 02h ;semafor de validare a citirii dupa relaxarea tastei t3
rdy_t4 equ 03h ;semafor de validare a citirii dupa relaxarea tastei t4
init_t1 equ 04h ;semafor de initializare a apasarii tastei t1
init_t2 equ 05h ;semafor de initializare a apasarii tastei t2
init_t3 equ 06h ;semafor de initializare a apasarii tastei t3
init_t4 equ 07h ;semafor de initializare a apasarii tastei t4
rls_t1 equ 08h ;semafor de relaxare a tastei t1
rls_t2 equ 09h ;semafor de relaxare a tastei t2
rls_t3 equ 0Ah ;semafor de relaxare a tastei t3
rls_t4 equ 0Bh ;semafor de relaxare a tastei t4
prog equ 0Ch ;semafor de intrare in regim de programare
OFF equ 0Dh ;semafor de stare STINS/APRINS in tratarea FLASH
stare_t2 equ 0Eh ;spune daca tasta t2 a fost apasata
stare_t3 equ 0Fh ;spune daca tasta t3 a fost apasata
executa equ 10h ;spune daca tasta t4 a fost apasata in vederea executiei
init_var equ 11h
; program principal
org 0000h
jmp start
org 0Bh ;vectorul de intrerupere de la TMR0
call ISR
reti
; initializare variabile
start: mov P3,#00h ;sting coloanele la inceputul functionarii
mov SP,#08h
mov R0,#30h ;pastreaza adresa digitului FLASH
mov R1,#3Ch ;pastreaza adresa digitului ce se programeaza
mov buffer,#00h
mov COL,#01h ;se incepe cu activarea coloanei 2
setb rdy_t1
setb rdy_t2
setb rdy_t3
setb rdy_t4
clr init_t1
clr init_t2
clr init_t3
clr init_t4
clr rls_t1
clr rls_t2
clr rls_t3
clr rls_t4
clr executa
setb OFF
clr prog
call init_nr ;initializare a operanzilor
; initializari registrii SFR
mov IE,#82h ;activarea intreruperilor la canalul TMR0
mov TMOD,#21h ;TMR0 pe modul 1 de functionare cu numarare pe 16 biti
mov TCON,#10h
mov TH0,#0EAh ;TH0(0EA)*256+TL0(84)=3300us=3.3ms
mov TL0,#084h ; 234 *256+ 132=60036
mov DPH,#03h ;pointer catre tabela de conversie BCD_7SEG
mov DPL,#0F0h
; inceput de program
intrare: jnb prog,eti1 ;testez daca am voie sa intru in regim de programare
jnb init_var,eti2 ;la prima intrare
call init_nr ;golesc registrii de date la afisare si de lucru
clr init_var
; tratare apasare t2
eti2: jnb stare_t2,eti3
clr stare_t2
mov @R0,buffer ;restaurez digitul ce FLASH
inc R0 ;incrementez adresa digitului flash
inc R1 ;incrementez adresa digitului programabil
cjne R0,#37h,eti3 ;test daca am depasit campul de valori
mov R0,#30h ;prima valoare in cod 7segm. ce efectueaza flash
mov R1,#3Ch ;primul operand (11) ce se incrementeaza
; tratare apasare tasta T3
eti3: jnb stare_t3,eti1 ;nu s-a apasat t2, testez t3
clr stare_t3
inc @R1 ;incrementez continutul digitului programabil
cjne @R1,#0Ah,eti4 ;testez depasire valoare permisa(09h)
mov @R1,#00h
eti4: mov A,@R1 ;copiez in A numarul BCD introdus de curand
movc A,@A+DPTR ;chem rutina conversie BCD_7seg
mov @R0,A ;returnez in R0 numarul in cod 7SEG
mov buffer,@R0
; testul executiei programului
eti1: jnb executa,intrare
clr executa
call MULT
jmp intrare
; rutina de initializare a operanzilor
init_nr: mov R0,#30h ;initializare pointer R0 cu adresa primului digit ce se afiseaza
eti40: mov @R0,#7Eh ;cifra 0 in cod 7seg
inc R0
cjne R0,#3Ch,eti40
mov R1,#3Ch ; initializare pointer R1 cu adresa primului digit ce se programeaza
eti41: mov @R1,#00h
inc R1
cjne R1,#42h,eti41
mov R0,#30h
mov R1,#3Ch
ret
;------------- rutina timer -------------
ISR: push ACC
push PSW
mov TH0,#0EAh
mov TL0,#84h
; gestionare afisaj multiplexat
mov A,COL
RL A
mov COL,A
cjne A,#40h,eti5
mov COL,#01h
eti5: mov IMG_COL,COL
mov COL,#00h
mov P3,COL
; verific daca trebuie sa activez coloana 1
mov A,IMG_COL
cjne A,#01h,eti6
mov P1,DIG_AFIS_11
mov P2,DIG_AFIS_31
jmp eti11
; verific daca trebuie sa activez coloana 2
eti6: cjne A,#02h,eti7
mov P1,DIG_AFIS_12
mov P2,DIG_AFIS_32
jmp eti11
; verifica daca trebuie sa aprind coloana 3
eti7: cjne A,#04h,eti8
mov P1,DIG_AFIS_13
mov P2,DIG_AFIS_33
jmp eti11
; verific daca trebuie sa aprind coloana 4
eti8: cjne A,#08h,eti9
mov P1,DIG_AFIS_14
mov P2,DIG_AFIS_34
jmp eti11
; verific daca trebuie sa aprind coloana 5
eti9: cjne A,#10h,eti10
mov P1,DIG_AFIS_21
mov P2,DIG_AFIS_35
jmp eti11
; aprind coloana 6
eti10: mov P1,DIG_AFIS_22
mov P2,DIG_AFIS_36
eti11: mov COL,IMG_COL
mov P3,COL
; gestionare apasare tasta T1
jb prog,eti12
jnb rdy_t1,eti13
jb init_t1,eti14
jb P0.0,eti15
mov cont_t1,#03h
setb init_t1
jmp eti15
eti14: djnz cont_t1,eti15
jnb P0.0,eti16
clr init_t1
jmp eti15
eti16: setb prog
setb init_var
clr init_t1
clr rdy_t1
jmp eti15
eti13: jb rls_t1,eti17
jnb P0.0,eti15
setb rls_t1
mov cont_t1,#03h
jmp eti15
eti17: djnz cont_t1,eti15
jb P0.0,eti18
clr rls_t1
jmp eti15
eti18: clr rls_t1
setb rdy_t1
eti15: pop PSW
pop ACC
reti
; gestionare flash
eti12: mov A,cont_flash
cjne A,#00,eti19
cpl OFF
mov cont_flash,#98h ; temporizare flash de 500ms. Rutina se apeleaza de 152de ori(98h)la fiecare 3,3ms
jnb OFF,eti21
mov buffer,@R0 ;salvare continut al locatiei flash pe durata cat este stins
;R0 din bank1 pastreaza ADR_DIG_FLASH
mov @R0,#0FFh ;valoarea 0FFh stinge celula flash
jmp eti20
eti19: dec cont_flash
jmp eti20
eti21: mov @R0,buffer
; gestionare apasare tasta T2
eti20: jnb rdy_t2,eti22
jb init_t2,eti23
jb P0.1,eti24
mov cont_t2,#03h
setb init_t2
jmp eti24
eti23: djnz cont_t2,eti24
jnb P0.1,eti25
clr init_t2
jmp eti24
eti25: setb stare_t2
clr init_t2
clr rdy_t2
jmp eti24
eti22: jb rls_t2,eti26
jnb P0.1,eti24
setb rls_t2
mov cont_t2,#03h
jmp eti24
eti26: djnz cont_t2,eti24
jb P0.1,eti27
clr rls_t2
jmp eti24
eti27: clr rls_t2
setb rdy_t2
; gestionare apasare tasta T3
eti24: jnb rdy_t3,eti28
jb init_t3,eti29
jb P0.2,eti30
mov cont_t3,#03h
setb init_t3
jmp eti30
eti29: djnz cont_t3,eti30
jnb P0.2,eti31
clr init_t3
jmp eti30
eti31: setb stare_t3
clr init_t3
clr rdy_t3
jmp eti30
eti28: jb rls_t3,eti32
jnb P0.2,eti30
setb rls_t3
mov cont_t3,#03h
jmp eti30
eti32: djnz cont_t3,eti30
jb P0.2,eti33
clr rls_t3
jmp eti30
eti33: clr rls_t3
setb rdy_t3
; gestionare apasare tasta T4
eti30: jnb rdy_t4,eti34
jb init_t4,eti35
jb P0.3,eti39
mov cont_t4,#03h
setb init_t4
jmp eti39
eti35: djnz cont_t4,eti39
jnb P0.3,eti36
clr init_t4
jmp eti39
eti36: setb executa ;declansez executia in programul principal
clr prog ;ies din regimul de programare
clr init_t4
clr rdy_t4
jmp eti39
eti34: jb rls_t4,eti37
jnb P0.3,eti39
setb rls_t4
mov cont_t4,#03h
jmp eti39
eti37: djnz cont_t4,eti39
jb P0.3,eti38
clr rls_t4
jmp eti15
eti38: clr rls_t4
setb rdy_t4
; sfarsit rutina intrerupere
eti39: pop PSW
pop ACC
ret
;----- ----- ----- ----- ----- RUTINA CONVERSIE BCD_BIN ----- ----- --------- ----- --------
; se obtin codurile binare: operand 1 =R4(OCMS) R5(OCMPS) maxim=270Fh
operand 2 =R3 maxim=63h
; concatenare operanzi BCD in registrii R2 si R3
MULT: mov A,dig_prog_11 ; dig_prog_1=0000XXXX
swap A
orl A,dig_prog_12
mov R2,A
mov A,dig_prog_13
swap A
orl A,dig_prog_14
mov R3,A
;conversie BCD_binar
mov cont_bcd,#10h
mov R4,#00h ;initializarea registrilor pt numarul binar in vederea rotirilor
mov R5,#00h
eti42: clr C ;rotatie initiala a lui R2 si R3 in R4 shi R5
mov A,R2
rrc A
mov R2,A
mov A,R3
rrc A
mov R3,A
mov A,R4
rrc A
mov R4,A
mov A,R5
rrc A
mov R5,A
;testez daca cmps NYB din R3 este >= cu 08h
mov A,R3
anl A,#0Fh ;maschez CMS NYB
mov temp,A ;salvez A in temp
clr C ;Cy=0
subb A,#08h ;Daca A>08h voi avea CY=0 si voi aduna 05h; Daca A<08H
; Cy=1(am imprumut) shi trec mai departe
jc eti43
add A,#05h
jmp eti44
eti43: mov A,temp
eti44: mov temp1,A
;repet acelasi pt NYB2
mov A,R3
anl A,#0F0h
mov temp,A
clr C
subb A,#80h
jc eti45
add A,#50h
jmp eti46
eti45: mov A,temp
eti46: orl A,temp1
mov R3,A
;reiau pt R2 CMPS
mov A,R2
anl A,#0Fh
mov temp,A
clr C
subb A,#08h
jc eti47
add A,#05h
jmp eti48
eti47: mov A,temp
eti48: mov temp1,A
mov A,R2
anl A,#0F0h
orl A,temp1
mov R2,A
djnz cont_bcd,eti42
; pentrul operandul al 2-lea
;concatenare a octetilor in R3
mov A,dig_prog_21
anl A,#0Fh
swap A
orl A,dig_prog_22
mov R3,A
;conversie
mov cont_bcd,#08h ; 99=63h = 0110 0011
mov R2,#00h ;R2 va pastra numarul in binar
eti51: clr C
mov A,R3
rrc A
mov R3,A
mov A,R2
rrc A
mov R2,A
mov A,R3
anl A,#0Fh
mov temp,A
clr C
subb A,#08h
jc eti49
add A,#05h
jmp eti50
eti49: mov A,temp
eti50: mov temp1,A
mov A,R3
anl A,#0F0h
orl A,temp1
mov R3,A
djnz cont_bcd,eti51
; rutina de inmultire a operandului de la R4,R5 cu operandul de la R2
;rezultatul(maxim F1ACD )se depune in registrii bin1, bin2, bin3, incepand cu ocms
mov bin1,#00h
mov bin2,#00h
mov bin3,#00h
mov R3,#00h ;vor urma roiri cu acest registru
eti53: clr C
mov A,R2
rrc A
mov R2,A
jnc eti52
clr C
mov A,bin3
addc A,R5
mov bin3,A
mov A,bin2
addc A,R4
mov bin2,A
mov A,bin1
addc A,R3
mov bin1,A
eti52: clr C
mov A,R5
rlc A
mov R5,A
mov A,R4
rlc A
mov R4,A
mov A,R3
rlc A
mov R3,A
mov A,R2
cjne A,#00h,eti53 ;numerele in binar sunt in registrii bin1,bin2,bin3
;rutina de conversie binar-bcd a octetilor din registrii bin1, bin2, bin3 cu
;depunerea rezultatului in registrii R2,R3,R4
mov R2,#00h
mov R3,#00h
mov R4,#00h
mov cont_bcd,#18h ;3octeti=24biti(18h)
eti54: mov A,R4
add A,R4
da A
mov R4,A
mov A,R3
addc A,R3
da A
mov R3,A
mov A,R2
addc A,R2
da A
mov R2,A
clr C
mov A,bin3
rlc A
mov bin3,A
mov A,bin2
rlc A
mov bin2,A
mov A,bin1
rlc A
mov bin1,A
mov A,R4
addc A,#00h
mov R4,A
djnz cont_bcd,eti54
;octetii in format BCD ramain in registrii R0, R1, R2
;------- rutina de conversie BCD 7SEG cu transfer in locatiile de afisare ---------
mov A,R2
anl A,#0F0h
swap A
movc A,@A+DPTR
mov DIG_AFIS_31,A
mov A,R2
anl A,#0Fh
movc A,@A+DPTR
mov DIG_AFIS_32,A
mov A,R3
anl A,#0F0h
swap A
movc A,@A+DPTR
mov DIG_AFIS_33,A
mov A,R3
anl A,#0Fh
movc A,@A+DPTR
mov DIG_AFIS_34,A
mov A,R4
anl A,#0F0h
swap A
movc A,@A+DPTR
mov DIG_AFIS_35,A
mov A,R4
anl A,#0Fh
movc A,@A+DPTR
mov DIG_AFIS_36,A
ret
; tabela BCD_7SEG
org 03F0h
db 07Eh
db 030h
db 06Dh
db 079h
db 033h
db 05Bh
db 05Fh
db 070h
db 07Fh
db 07Bh
end
|