Autorul poate fi contactat la adresa: Login pentru adresa
Proiectul consta in realizarea unui calculator aritmetic.
Scopul proiectului este unul didactic, deoarece intotdeauna mi-am dorit sa stiu cum se construieste un calculator de buzunar.
Consider acest proiect a fi foarte util pentru mine, in mod special, prin acumularea de noi cunostiinte în domeniul embedded.
Pe langa componentele de baza, am mai avut nevoie si de:
Schema electrica ce include LCD-ul si tastatura conectate la ATMEGA324:
Am lucrat in Ubuntu 15.04 x64. A trebuit sa instalez avr-gcc, iar ca mediu de dezvoltare am folosit editorul de text Atom.
Pentru interfatarea LCD-ului m-am folosit de API-ul pus la dispozitie in laboratorul 1. La pornirea aplicatiei, utilizatorul introduce o expresie matematica pe care aplicatia o interpreteaza si ii afiseaza rezultatul pe LCD.
Pentru a evalua expresia matematica am folosit algoritmul shunting yard putin modificat.
Functia main arata asa:
int main() { IO_init(); LCD_init(); sei(); timer1_init(); calculator_init(); LCD_print("Calculator"); LCD_writeInstr(LCD_INSTR_nextLine); LCD_print("Radu Neagoe"); clear_display = 1; while (1) { /* * Verific daca am deja rezultatul si trebuie sa curat display-ul, * sau daca am deja un operator pe LCD si trebuie sa introduc un numar. */ check_blocked(); /* * A fost apasata o tasta de pe keypad. */ int8_t key = get_keypad_index(); if (key != -1) { /* * Aprinde led. */ PORTD |= (1 << PD7); /* * Verific ce tasta a fost apasata. * * A doua conditie din primul if este pentru cazul in care primul numar vreau sa fie negativ. */ if (isdigit(keypad[key]) || (a_digits == 0 && keypad[key] == '-')) { get_digit(keypad[key]); } else if (keypad[key] == '/' || keypad[key] == '*' || keypad[key] == '+' || keypad[key] == '-') { get_operator(keypad[key]); if (oper == 0) continue; } else if (keypad[key] == '=') { get_result(); } /* * Afisez caracterul primit de la keypad pe LCD. */ print_key_to_LCD(keypad[key]); /* * Delay-ul este necesar pentru a evita debouncing-ul de la taste. */ _delay_ms(100); /* * Stinge led. */ PORTD &= ~(1 << PD7); } } return 0; }
Calculatorul functioneaza bine, insa, deoarece LCD-ul este de 16 caractere pe linie, lungimea expresiei este limitata.
Am realizat tot ceea ce mi-am propus la inceputul proiectului. A fost un proiect interesant si am avut multe de invatat. Poate pentru viitor ar mai putea fi adaugate butoane pentru expresii matematice complexe si poate chiar si o baterie pentru o alimentare independenta.
Arhiva contine un script pentru incarcarea pe placuta, biblioteca LCD (lcd.c si lcd.h) si fisierele stack.h si pocket_calculator_interpreter.c: