Proiectul meu isi propune sa realizeze un calculator care sa poata efectua operatiile aritmetice de baza: adunare, scadere, inmultire, impartire. Utilitatea acestui proiect nici nu mai trebuie mentionata, deoarece calculatorul de buzunar este unul din cele mai utilizate dispozitive electronice.
Schema bloc a proiectului este:
Cu ajutorul tastaturii vor fi introduse numerele si operatia care se doreste a realiza cu aceste numere. Operatia este apoi efectuata de catre microcontroller, iar rezultatul obtinut va fi afisat pe LCD.
Componente Hardware
Schema in Proteus care arata cum sunt conectate componentele este urmatoarea:
LCD-ul foloseste doar 4 pini de date (D4-D7) care sunt conectati la pinii PA0-PA4 ai portului A. pe langa acesti pini de date, LCD-ul mai foloseste si trei pini de control (RS,RW,E) care sunt conectati la pinii PA5-PA& ai portului A.
Tastatura este conectata la portul D. O tastatura este, in principiu, o matrice de butoane.Acest tip de organizare este necesar deoarece nu este fezabila conectarea unui numar mare de butoane la microcontroller(din lipsa de suficienti pini). In urma gruparii in o matrice, nu mai este necesara conectarea fiecarui buton individual la microcontroller, ci putem conecta doar liniile si coloanele matricii.
Partea de interactiune cu LCD-ul foloseste API-ul din Laboratorul 1.
API-ul contine functiile:
void LCD_init(); // Inițializare modul LCD. // Trebuie apelată înainte de a se face orice operație cu LCD-ul. // Inițializarea este făcută considerând o interfațare pe 4 fire. void LCD_writeInstruction(unsigned char _instruction); // Trimite o instrucțiune către l. void LCD_writeData(unsigned char _data); // Trimite date către LCD pentru afișare. void LCD_write(unsigned char _byte); // Trimite un byte către LCD pe pinii D4-7 în 2 timpi. // Se trimit întâi biții mai semnificativi și apoi cei mai puțin semnificativi. void LCD_waitNotBusy(); // Funcția așteaptă până când lcd-ul devine disponibil pt o nouă comandă. void LCD_print(char* _msg); // Afișează imformatia pe LCD (doar 1 linie, primele 16 caractere din msg) void LCD_print2(char* _msg1, char* _msg2); // Afișare pe 2 lini pe LCD. // Pe prima linie afișează _msg1 și pe a 2-a _msg2. void LCD_printDecimal2u(unsigned int _n); // Afișare număr în baza 10 pe LCD void LCD_printHexa(unsigned int _n); // Afișare număr în baza 16 pe LCD void LCD_waitInstructions(unsigned char _instructions); // Așteaptă un număr de cicli de ceas
Partea de interactiune cu tastatura foloseste 3 functii:
void key_init() //initializeaza porturile si tastatura unsigned char get_key() //citeste tastele apasate pe tastatura unsigned char get_val_key(unsigned char key) //intoarce valoarea corespunzatoare tastei apasate
Modul in care functia get_key() afla ce tasta a fost apasata este urmatoarul: La inceput, toate randurile tastaturii sunt pe high. Pentru a detecta daca o tasta a fost apasata, trebuie sa punem randurile pe low unul cate unul si apoi sa citim coloanele. Daca una din tastele care apartine randului pus pe low a fost apasata, coloana corespunzatoare acelei taste se va afla si ea pe low si astfel putem detecta care tasta a fost apasata.
Modul de functionare al calculatorului:
Programul foloseste doua variabile ,nr1 si nr2, pentru a memora operanzii operatiei care urmeaza sa fie realizata, si o variabila op care memoreaza operatia care trebuie realizata. nr1 este folosit pentru a memora operandul curent care este modificat de fiecare data cand apasam o tasta numerica. In momentul in care este apasata o tasta corespunzatoare unei operatii, daca op nu contine un operator, vom memora in acesta tasta apasata, nr2 va lua valoarea lui nr1 deoarece introducerea unui operator marcheaza schimbarea operandului curent, iar nr1 va deveni 0 pentru a putea memora noul operand curent. Daca op contine un operator, nr2 va lua valoarea aplicarii operatiei memorate anterior in op intre vechea valoare a lui nr2 si nr1.
Am reusit sa fac sa functioneze partea de software a programului, insa, din lipsa de timp, nu am reusit sa implementez si partea hardware.
geosu_catalin_334cc_proiect_calculator.zip
Arhiva contine atat codul sursa al programului, cat schema in Proteus pe care aplicatia poate fi simulata.