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 :/
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
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