Table of Contents

Radu NEAGOE (24965) - Calculator de Buzunar

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

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.:-D

Descriere generală

Hardware Design

Pe langa componentele de baza, am mai avut nevoie si de:

Schema electrica ce include LCD-ul si tastatura conectate la ATMEGA324:

Software Design

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;
}

Rezultate Obţinute

Calculatorul functioneaza bine, insa, deoarece LCD-ul este de 16 caractere pe linie, lungimea expresiei este limitata.

Concluzii

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.

Download

Arhiva contine un script pentru incarcarea pe placuta, biblioteca LCD (lcd.c si lcd.h) si fisierele stack.h si pocket_calculator_interpreter.c:

calculator_de_buzunar_radu_neagoe_334ca.zip

Jurnal

ASCII

Bibliografie/Resurse