logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Kalkulator ATmega32 (problem)

BigStarOzw 19 Maj 2010 15:39 1419 2
REKLAMA
  • #1 8094407
    BigStarOzw
    Poziom 2  
    Witam, na zajęciach otrzymaliśmy projekt "kalkulator z wykorzystaniem klawiatury 4x4" ma to być najnormalniejszy w świecie kalkulator a klawiatura ma odpowiadać za klawiaturę numeryczna + wybór działania(czyli np 2+2 =) powiem szczerze że już nie mam pojęcia, doszedłem do punktu wrzenia.

    Proszę o pomoc, jak na razie mam tyle :/

    Cytat:
    #include <avr\io.h>
    #include <avr\signal.h>
    #include <avr\interrupt.h>



    /*Liczba cyfr wyswietlacza*/
    #define LED8SEGDIGITS 4

    /*Definicje kodow cyfr szesnastkowych
    zakladajace podlaczenie takie, ze segment a - Px0,...*/

    const char LED8SEG[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
    0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};


    unsigned int timecounter=0;
    char chartab[LED8SEGDIGITS]; /*tablica kodow dla wysw. 7-seg. */


    char keypressed=0; /*potwierdzenie wcisniecia klawisza*/
    char keybuffer; /*bufor przechowujacy kod wcisnietego klawisza*/


    /*Inicjalizacja timera T0*/
    void init_timer0()
    {
    TCCR0=0x02; /*zrodlo sygnalu zegarowego i tryb pracy T0*/
    // TCCR0=0x9A; /*zrodlo sygnalu zegarowego i tryb pracy T0 umozliwiajacy generowanie sygnalu na OC0*/
    TCNT0=0x00; /*wartosc startowa*/
    TIMSK=0x01; /*odblokowanie przerwania od t0 */
    OCR0=0x80; /*wartosc porownywana ze stanem licznika */
    }


    /*Inicjalizacja przerwania zewnetrznego od klawiatury*/
    void init_ext_interrupt()
    {
    MCUCR=0x02; /*generowane zboczem opadajacym*/
    GICR=0x40; /*aktywacja przerwania*/
    }

    /*Obsluga wyswietlania znaku na wyswietlaczu w przerwaniu od timera */
    ISR(TIMER0_OVF_vect)
    {
    static char i, mask=0x80;


    PORTA=0xFF;
    PORTD=~mask;
    PORTA=chartab[i];

    if(i<LED8SEGDIGITS)
    { i++; mask=mask/2; }
    else
    { i=0; mask=0x80; }

    if(timecounter>0)
    timecounter--;
    }

    /*Obsluga odczytu klawiatury w przerwaniu zewnetrznym */
    ISR(INT0_vect)
    {
    unsigned char kolumna=0, wiersz, kolmask=0x01, wmask, pinccpy;
    unsigned i;

    for(i=0;i<100;i++) /*opoznienie na ustabilizowanie styku*/
    wmask=i;


    do
    {
    PORTB=0xF0;
    PORTB=0xF0;
    PORTB=0xF0;


    if(!(PIND & 0x04))
    {
    PORTB=0xF0 | ~kolmask;
    PORTB=0xF0 | ~kolmask;
    PORTB=0xF0 | ~kolmask;

    wiersz=0;
    wmask=0x10;

    do
    {
    pinccpy=PINB;
    pinccpy=PINB;
    pinccpy=PINB;
    pinccpy=PINB;

    if(!(pinccpy & wmask))
    {
    keybuffer=4*kolumna+wiersz;
    keypressed=1;
    }

    wiersz++;
    wmask=wmask*2;

    } while(wiersz<4);
    }

    kolumna++;
    kolmask=kolmask*2;

    } while(kolumna<4);

    PORTB=0xF0;
    PORTB=0xF0;
    PORTB=0xF0; /*wpisanie zer do kolumn zapewnia wygenerowanie przerwania*/
    /*po wcisnieciu dowolnego klawisza, ale wywoluje przerwanie */
    /*wskutek dalszego naciskania tego samego klawisza */
    GIFR=0x40; /*wykasowanie zgloszonego przerwania*/
    GIFR=0x40; /*wykasowanie zgloszonego przerwania*/

    }


    void delay(int time)
    {
    unsigned int a;
    timecounter=time;

    while(timecounter>0)
    a=timecounter;
    }


    void disp_ascii(char *a)
    {

    unsigned char i, tab[LED8SEGDIGITS];

    for(i=0;i<LED8SEGDIGITS;i++)
    // chartab[i]=LED8SEG[(*a++)-'0'];
    {
    if(*a==32)
    {
    chartab[i]=LED8SEG[16]; a++;
    }
    else
    chartab[i]=LED8SEG[(*a++)-'0'];

    }



    }


    void disp_hex(unsigned int hexval)
    {

    unsigned char i, t0[LED8SEGDIGITS];

    for(i=0;i<LED8SEGDIGITS;i++)
    {
    t0[LED8SEGDIGITS-i-1]=hexval & 0x000F;
    hexval=hexval/16;
    }

    for(i=0;i<LED8SEGDIGITS-1;i++)
    if(t0[i]==0)
    t0[i]=16;
    else break;

    for(i=0;i<LED8SEGDIGITS;i++)
    {
    chartab[i]=LED8SEG[t0[i]];
    }
    }



    void disp_dec(unsigned int decval)
    {

    unsigned char i, t0[LED8SEGDIGITS];

    for(i=0;i<LED8SEGDIGITS;i++)
    {
    t0[LED8SEGDIGITS-i-1]=decval % 10;
    decval=decval/10;
    }

    for(i=0;i<LED8SEGDIGITS-1;i++)
    if(t0[i]==0)
    t0[i]=16;
    else break;

    for(i=0;i<LED8SEGDIGITS;i++)
    {
    chartab[i]=LED8SEG[t0[i]];
    }
    }


    int tablica[]= {7,8,9,10,4,5,6,11,1,2,3,12,0,13,14,15};

    int i=0;
    int main(){
    }


    i jak na złość nic nie działa :/ bardzo byłbym wdzięczny za poprawę kodu i wklejenie go :/

    byłbym wdzięczny nawet, gdyby ktoś z was podzielił się kodem do takowego kalkulatora(bo mam świadomość że to co wyżej się może kompletnie nie nadawać)niestety mam tylko możliwość myślenia na wykładach, bo w domu nie posiadam takowego układu.

    z góry dziękuje
  • REKLAMA
  • Pomocny post
    #2 8136174
    28aug240
    Poziom 14  
    Cześć

    wydaje mi się że nie potrzebie komplikujesz sobie życie przerwaniami (przynajmniej do klawiatury)

    ustal jakieś główne założenie np.:

    podstawa to odczyt klawiatury
    a do przerwania daj LED8SEG

    niżej dodaje kod obsługi klawiatury 4x4 która zwraca 0xFF gdy żaden klawisz nie został wciśnięty

    korzystałem z tej procedury właśnie między innymi do kalkulatora binarnego który kiedyś popełniłem, nie używałem w moim projekcie przerwań tylko właśnie założyłem że w pętli głównej była procedura sterująca wyświetlaczem która wyświetlała zawartość tablicy. Natomiast procedura obliczająca sprawdzała czy został wciśnięty klawisz
    if (klawisz()!=0xFF) 
    to w zależności od klawisza albo wykonywał obliczenia albo dopisywał liczbę do tablicy

    Mam nadzieję że Ci to pomoże

    int klawisz(void)
    {
    
    	int k = 255;
    do {
    	PORTC |= 1 << 0;
    	if (!bit_is_clear(PINC, PC4)) {k=1;}
    	if (!bit_is_clear(PINC, PC5)) {k=2;}
    	if (!bit_is_clear(PINC, PC6)) {k=3;}
    	if (!bit_is_clear(PINC, PC7)) {k=10; }	//a
    	PORTC &= ~1 <<0;
    
    	PORTC |= 1 << 1;
    	if (bit_is_set(PINC, PC4)) {k=4;}
    	if (bit_is_set(PINC, PC5)) {k=5;}
    	if (bit_is_set(PINC, PC6)) {k=6;}
    	if (bit_is_set(PINC, PC7)) {k=11;}		//b
    	PORTC &= ~1 <<1;
    
    	PORTC |= 1 << 2;
    	if (bit_is_set(PINC, PC4)) {k=7;}
    	if (bit_is_set(PINC, PC5)) {k=8;}
    	if (bit_is_set(PINC, PC6)) {k=9;}
    	if (bit_is_set(PINC, PC7)) {k=12;} 	//c
    	PORTC &= ~1 <<2;
    
    	PORTC |= 1 << 3;
    	if (bit_is_set(PINC, PC4)) {k=15;}		//e
    	if (bit_is_set(PINC, PC5)) {k=0;} 
    	if (bit_is_set(PINC, PC6)) {k=14;}		//f
    	if (bit_is_set(PINC, PC7)) {k=13;} 	//d
    	PORTC &= ~1 <<3;
    	
    }while(k==255);
    return (k);
    }
  • #3 8171282
    BigStarOzw
    Poziom 2  
    niestety tak sobie wymyślił wykładowca :/, dziękuje za odpowiedź, niestety większość czasu mogę tylko w "teorii" sprawdzać te programy :( bo zajęcia mam tylko raz na tydzień :/ ale dziękuje za pomoc
REKLAMA