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: