Proiectul ales se numeste Calculatorul aritmetic; in cadrul lui se va realiza un calculator numeric cu afisaj LCD care sa dispuna de urmatoarele functii:
1. Operatii aritmetice simple: adunare, scadere, inmultire, impartire
2. Radical
3. Ridicare la putere
4. Logaritm
5. Conversie zecimal-binar/hexazecimal/octal
Schema bloc a proiectului este:
Input: datele furnizate de la cele doua tastaturi;
Output: rezultatul calculului aritmetic va fi afisat pe LCD.
Piesele necesare acestui proiect, pe langa cele pentru etapa 1, sunt:
- doua tastaturi 4×4
- un display LCD 16×2
Atat pentru conectarea tastaturilor cat si a LCD-ului am folosit barete SIL si banda de cablu, deoarece aceasta solutie este mai practica si mai lipsita de riscuri (daca cele trei componente ar fi legate direct la pinii microcontrolerului, s-ar putea face conexiuni nedorite intre pini).
Schema electrica a componentelor este:
Conectarea LCD-ului (pin LCD – pin Atmega16):
- Pinul 4 (RS)- pinul 40(PA0)
- Pinul 5 (RW)– pinul 39(PA1)
- Pinul 6 (E) - pinul 38(PA2)
- Pinul 11(D4)– pinul 36(PA4)
- Pinul 12(D5)– pinul 35(PA5)
- Pinul 13(D6)– pinul 34(PA6)
- Pinul 14(D7)– pinul 33(PA7)
Conectarea tastaturii (pin tastatura – pin Atmega16):
- Pinul A – pinul 5 (PB4, pentru a doua tastatura PC4)
- Pinul B – pinul 6 (PB5, pentru a doua tastatura PC5)
- Pinul C – pinul 7 (PB6, pentru a doua tastatura PC6)
- Pinul D – pinul 8 (PB7, pentru a doua tastatura PC7)
- Pinul 1 – pinul 1 (PB0, pentru a doua tastatura PC0)
- Pinul 2 – pinul 2 (PB1, pentru a doua tastatura PC1)
- Pinul 3 – pinul 3 (PB2, pentru a doua tastatura PC2)
- Pinul 4 – pinul 4 (PB3, pentru a doua tastatura PC3)
Implementarea software a proiectului am realizat-o in limbajul C folosind AVR Studio. Am folosit acest software deoarece este un program destul de practic.
Diagrama de stari
Pentru functionarea calculatorului am implementat atat functii pentru afisare pe LCD, cat si functii de citire a tastelor apasate si pentru prelucrarea datelor si intoarcerea rezulatelor corespunzatoare functiilor matematice selectate.
Afisare LCD:
void LCD_init(); // Initializare modul LCD.Trebuie apelata inainte de a se face orice operatie cu LCD-ul void LCD_writeInstruction(unsigned char _instruction); // Trimite o instructiune catre LCD void LCD_writeData(unsigned char _data); // Trimite date catre LCD pentru afisare void LCD_write(unsigned char _byte); // trimite un bute catre LCD la modul general (nu conteaza daca e instructiune sau date) void LCD_waitNotBusy(); // Asteptam pana cand lcd-ul devine disponibil pt o noua comanda void LCD_waitInstructions(unsigned char _instructions); // Asteapta un numar de cicli de ceas. void LCD_print(char* _msg); // Afiseaza imformatia pe LCD (doar 1 linie, primele 16 caractere) void LCD_print2(char* _msg1, char* _msg2); // Afisare pe 2 lini pe LCD void LCD_printDecimal2u(unsigned int _n); // Afisare numar in baza 10 pe LCD void LCD_printHexa(unsigned int _n); // Afisare numar in baza 16 pe LCD
Citire taste si prelucrare date:
void key_init(); // Initializare taste unsigned char get_key(); // Citire taste apasate void processDigit(char input); // Procesarea cifrelor selectate void processOperator(char input); // Procesarea operatorilor(+,-, x, /, %, etc) void processEqual(); // Procesare = void plus(float x, float y, char* result) // Adunarea a doua numere void minus(float x, float y, char* result) // Diferenta a doua numere ...
Proiectul a fost unul foarte interesant si, in final, am reusit sa realizez ceee ce mi-am propus: un calculator aritmetic care executa atat operatii simple(+, -, /, x), dar si mai dificile (radical, conversie dintr-o baza in alta, ridicare la putere). Pentru imbunatatirea proiectului se poate achizitioana o tastatura cu mai multe butoane pentru a-i adauga si alte functii mai complicate.