Musze zaprogramować mikroprocesor AT89C2051 zeby diody na płytce pokazywały coś w rodzaju kalkulatora binarnego. Mamy 4 przyciski:
- przycisk 1 odpowiada 2^0
- przycisk 2 2^1
- przycisk 3 2^2
- przycisk 4 2^3
suma wynikow jest pokazywana na diodach w postaci mnozenia i dodawania; maksymalny wynik: 4 x 3 + 1
Mam program napisany w C, jak sie okazało ma to być napisane w BASCOMIE, ktorego nie znam, czy ktoś byłby w stanie przetłumaczyć ten kod na język BASCOMA ?
schemat ideowy: http://img19.imageshack.us/img19/5452/beztytuuslc.jpg
#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//#include <avr/wdt.h>
unsigned int wynik_0_0 = ~0x00; //0*0+0 ~0000 0000
unsigned int wynik_1_0 = ~0x80; //0*0+1 ~1000 0000
unsigned int wynik_1_1 = ~0x11; //1*1+0 ~0001 0001
unsigned int wynik_2_0 = ~0x31; //1*2+0 ~0011 0001
unsigned int wynik_2_1 = ~0x13; //2*1+0 ~0001 0011
unsigned int wynik_2_2 = ~0x91; //1*1+1 ~1001 0001
unsigned int wynik_3_0 = ~0x71; //1*3+0 ~0111 0001
unsigned int wynik_3_1 = ~0x17; //3*1+0 ~0001 0111
unsigned int wynik_3_2 = ~0xB1; //1*2+1 ~1011 0001
unsigned int wynik_3_3 = ~0x93; //2*1+1 ~1001 0011
unsigned int wynik_4_0 = ~0x1F; //4*1+0 ~0001 1111
unsigned int wynik_4_1 = ~0xF1; //1*3+1 ~1111 0001
unsigned int wynik_4_2 = ~0x97; //3*1+1 ~1001 0111
unsigned int wynik_4_3 = ~0x33; //2*2+0 ~0011 0011
unsigned int wynik_5_0 = ~0x9F; //4*1+1 ~1001 1111
unsigned int wynik_5_1 = ~0xB3; //2*2+1 ~1011 0011
unsigned int wynik_6_0 = ~0x37; //3*2+0 ~0011 0111
unsigned int wynik_6_1 = ~0x73; //2*3+0 ~0111 0011
unsigned int wynik_7_0 = ~0xB7; //3*2+1 ~1011 0111
unsigned int wynik_7_1 = ~0xF3; //2*3+1 ~1111 0011
unsigned int wynik_8_0 = ~0x3F; //4*2+0 ~0011 1111
unsigned int wynik_9_0 = ~0xBF; //4*2+1 ~1011 1111
unsigned int wynik_10_0 = ~0xF7; //3*3+1 ~1111 0111
unsigned int wynik_11_0 = ~0xFF; //4*3-1 ~1111 1111 // -
unsigned int wynik_12_0 = ~0x7F; //4*3+0 ~0111 1111
unsigned int wynik_13_0 = ~0xFF; //4*3+1 ~1111 1111
unsigned int wynik_14_0 = ~0xA0; //max ~1010 0000
unsigned int wynik_15_0 = ~0xA0; //max ~1010 0000
volatile unsigned int z_licz = 0; //zmienna globalna z_licz
volatile unsigned int z_g_opuz = 0;
void f_opuz0(void) // funkcja opuznienie
{
_delay_ms(80);
}
void f_opuz1(unsigned int z_p_opuz) // funkcja opuznienie
{
_delay_ms(z_p_opuz);
_delay_ms(z_p_opuz);
}
void reset (void)
{
asm("cli");
asm("rjmp 0");
}
SIGNAL (SIG_INTERRUPT0) // pierwsze przerwanie
{
if( ((PINC & 0x01)) && ((PINC & 0x02)) && ((PINC & 0x04)) && ((PINC & 0x08)) ) //0
z_licz = 0;
else if( (!(PINC & 0x01)) && ((PINC & 0x02)) && ((PINC & 0x04)) && ((PINC & 0x08)) ) //1
z_licz = 1;
else if( ((PINC & 0x01)) && (!(PINC & 0x02)) && ((PINC & 0x04)) && ((PINC & 0x08)) ) //2
z_licz = 2;
else if( (!(PINC & 0x01)) && (!(PINC & 0x02)) && ((PINC & 0x04)) && ((PINC & 0x08)) ) //3
z_licz = 3;
else if( ((PINC & 0x01)) && ((PINC & 0x02)) && (!(PINC & 0x04)) && ((PINC & 0x08)) ) //4
z_licz = 4;
else if( (!(PINC & 0x01)) && ((PINC & 0x02)) && (!(PINC & 0x04)) && ((PINC & 0x08)) ) //5
z_licz = 5;
else if( ((PINC & 0x01)) && (!(PINC & 0x02)) && (!(PINC & 0x04)) && ((PINC & 0x08)) ) //6
z_licz = 6;
else if( (!(PINC & 0x01)) && (!(PINC & 0x02)) && (!(PINC & 0x04)) && ((PINC & 0x08)) ) //7
z_licz = 7;
else if( ((PINC & 0x01)) && ((PINC & 0x02)) && ((PINC & 0x04)) && (!(PINC & 0x08)) ) //8
z_licz = 8;
else if( (!(PINC & 0x01)) && ((PINC & 0x02)) && ((PINC & 0x04)) && (!(PINC & 0x08)) ) //9
z_licz = 9;
else if( ((PINC & 0x01)) && (!(PINC & 0x02)) && ((PINC & 0x04)) && (!(PINC & 0x08)) ) //10
z_licz = 10;
else if( (!(PINC & 0x01)) && (!(PINC & 0x02)) && ((PINC & 0x04)) && (!(PINC & 0x08)) ) //11
z_licz = 11;
else if( ((PINC & 0x01)) && ((PINC & 0x02)) && (!(PINC & 0x04)) && (!(PINC & 0x08)) ) //12
z_licz = 12;
else if( (!(PINC & 0x01)) && ((PINC & 0x02)) && (!(PINC & 0x04)) && (!(PINC & 0x08)) ) //13
z_licz = 13;
else if( ((PINC & 0x01)) && (!(PINC & 0x02)) && (!(PINC & 0x04)) && (!(PINC & 0x08)) ) //14
z_licz = 14;
else if( (!(PINC & 0x01)) && (!(PINC & 0x02)) && (!(PINC & 0x04)) && (!(PINC & 0x08)) )//15
z_licz = 15;
//else
//z_licz = 15;
z_g_opuz = 0;
//reset();
}
SIGNAL (SIG_INTERRUPT1) // 2 przerwanie
{
reset();
}
int main(void)
{
DDRB = 0xFF; //PORTB jako wyjscia
PORTB = 0xFF;//1111 1111 podciagniecie do 1
DDRC = 0x00; //PORTC jako wejscia
PORTC = 0xFF;//wszystkie wejscia podciagniete do VCC
DDRD = 0x00; // wszystkie wejścia aktywowane
PORTD = 0x0C; // podciąganie bitów 3 i 4 PortD (przyciski)
GIMSK = _BV(INT0)|_BV(INT1);
//włącz obsługę przerwań Int0 i Int1
MCUCR = _BV(ISC01)|_BV(ISC11);
// włącz generowanie przerwań przez
// opadające zbocze na Int0 i Int1
sei(); // włącz obsługę przerwań
while(1)
{
z_g_opuz = 1000;
switch (z_licz)
{
case 0:
PORTB = wynik_0_0;
f_opuz1(z_g_opuz);
break;
case 1:
PORTB = wynik_1_0;
f_opuz1(z_g_opuz);
PORTB = wynik_1_1;
f_opuz1(z_g_opuz);
break;
case 2:
PORTB = wynik_2_0;
f_opuz1(z_g_opuz);
PORTB = wynik_2_1;
f_opuz1(z_g_opuz);
PORTB = wynik_2_2;
f_opuz1(z_g_opuz);
break;
case 3:
PORTB = wynik_3_0;
f_opuz1(z_g_opuz);
PORTB = wynik_3_1;
f_opuz1(z_g_opuz);
PORTB = wynik_3_2;
f_opuz1(z_g_opuz);
PORTB = wynik_3_3;
f_opuz1(z_g_opuz);
break;
case 4:
PORTB = wynik_4_0;
f_opuz1(z_g_opuz);
PORTB = wynik_4_1;
f_opuz1(z_g_opuz);
PORTB = wynik_4_2;
f_opuz1(z_g_opuz);
PORTB = wynik_4_3;
break;
case 5:
PORTB = wynik_5_0;
f_opuz1(z_g_opuz);
PORTB = wynik_5_1;
f_opuz1(z_g_opuz);
break;
case 6:
PORTB = wynik_6_0;
f_opuz1(z_g_opuz);
PORTB = wynik_6_1;
f_opuz1(z_g_opuz);
break;
case 7:
PORTB = wynik_7_0;
f_opuz1(z_g_opuz);
PORTB = wynik_7_1;
f_opuz1(z_g_opuz);
break;
case 8:
PORTB = wynik_8_0;
break;
case 9:
PORTB = wynik_9_0;
break;
case 10:
PORTB = wynik_10_0;
break;
case 11:
PORTB = wynik_11_0;
break;
case 12:
PORTB = wynik_12_0;
break;
case 13:
PORTB = wynik_13_0;
break;
case 14:
PORTB = wynik_14_0;
break;
case 15:
PORTB = wynik_15_0;
break;
}
}
}
- przycisk 1 odpowiada 2^0
- przycisk 2 2^1
- przycisk 3 2^2
- przycisk 4 2^3
suma wynikow jest pokazywana na diodach w postaci mnozenia i dodawania; maksymalny wynik: 4 x 3 + 1
Mam program napisany w C, jak sie okazało ma to być napisane w BASCOMIE, ktorego nie znam, czy ktoś byłby w stanie przetłumaczyć ten kod na język BASCOMA ?
schemat ideowy: http://img19.imageshack.us/img19/5452/beztytuuslc.jpg
#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//#include <avr/wdt.h>
unsigned int wynik_0_0 = ~0x00; //0*0+0 ~0000 0000
unsigned int wynik_1_0 = ~0x80; //0*0+1 ~1000 0000
unsigned int wynik_1_1 = ~0x11; //1*1+0 ~0001 0001
unsigned int wynik_2_0 = ~0x31; //1*2+0 ~0011 0001
unsigned int wynik_2_1 = ~0x13; //2*1+0 ~0001 0011
unsigned int wynik_2_2 = ~0x91; //1*1+1 ~1001 0001
unsigned int wynik_3_0 = ~0x71; //1*3+0 ~0111 0001
unsigned int wynik_3_1 = ~0x17; //3*1+0 ~0001 0111
unsigned int wynik_3_2 = ~0xB1; //1*2+1 ~1011 0001
unsigned int wynik_3_3 = ~0x93; //2*1+1 ~1001 0011
unsigned int wynik_4_0 = ~0x1F; //4*1+0 ~0001 1111
unsigned int wynik_4_1 = ~0xF1; //1*3+1 ~1111 0001
unsigned int wynik_4_2 = ~0x97; //3*1+1 ~1001 0111
unsigned int wynik_4_3 = ~0x33; //2*2+0 ~0011 0011
unsigned int wynik_5_0 = ~0x9F; //4*1+1 ~1001 1111
unsigned int wynik_5_1 = ~0xB3; //2*2+1 ~1011 0011
unsigned int wynik_6_0 = ~0x37; //3*2+0 ~0011 0111
unsigned int wynik_6_1 = ~0x73; //2*3+0 ~0111 0011
unsigned int wynik_7_0 = ~0xB7; //3*2+1 ~1011 0111
unsigned int wynik_7_1 = ~0xF3; //2*3+1 ~1111 0011
unsigned int wynik_8_0 = ~0x3F; //4*2+0 ~0011 1111
unsigned int wynik_9_0 = ~0xBF; //4*2+1 ~1011 1111
unsigned int wynik_10_0 = ~0xF7; //3*3+1 ~1111 0111
unsigned int wynik_11_0 = ~0xFF; //4*3-1 ~1111 1111 // -
unsigned int wynik_12_0 = ~0x7F; //4*3+0 ~0111 1111
unsigned int wynik_13_0 = ~0xFF; //4*3+1 ~1111 1111
unsigned int wynik_14_0 = ~0xA0; //max ~1010 0000
unsigned int wynik_15_0 = ~0xA0; //max ~1010 0000
volatile unsigned int z_licz = 0; //zmienna globalna z_licz
volatile unsigned int z_g_opuz = 0;
void f_opuz0(void) // funkcja opuznienie
{
_delay_ms(80);
}
void f_opuz1(unsigned int z_p_opuz) // funkcja opuznienie
{
_delay_ms(z_p_opuz);
_delay_ms(z_p_opuz);
}
void reset (void)
{
asm("cli");
asm("rjmp 0");
}
SIGNAL (SIG_INTERRUPT0) // pierwsze przerwanie
{
if( ((PINC & 0x01)) && ((PINC & 0x02)) && ((PINC & 0x04)) && ((PINC & 0x08)) ) //0
z_licz = 0;
else if( (!(PINC & 0x01)) && ((PINC & 0x02)) && ((PINC & 0x04)) && ((PINC & 0x08)) ) //1
z_licz = 1;
else if( ((PINC & 0x01)) && (!(PINC & 0x02)) && ((PINC & 0x04)) && ((PINC & 0x08)) ) //2
z_licz = 2;
else if( (!(PINC & 0x01)) && (!(PINC & 0x02)) && ((PINC & 0x04)) && ((PINC & 0x08)) ) //3
z_licz = 3;
else if( ((PINC & 0x01)) && ((PINC & 0x02)) && (!(PINC & 0x04)) && ((PINC & 0x08)) ) //4
z_licz = 4;
else if( (!(PINC & 0x01)) && ((PINC & 0x02)) && (!(PINC & 0x04)) && ((PINC & 0x08)) ) //5
z_licz = 5;
else if( ((PINC & 0x01)) && (!(PINC & 0x02)) && (!(PINC & 0x04)) && ((PINC & 0x08)) ) //6
z_licz = 6;
else if( (!(PINC & 0x01)) && (!(PINC & 0x02)) && (!(PINC & 0x04)) && ((PINC & 0x08)) ) //7
z_licz = 7;
else if( ((PINC & 0x01)) && ((PINC & 0x02)) && ((PINC & 0x04)) && (!(PINC & 0x08)) ) //8
z_licz = 8;
else if( (!(PINC & 0x01)) && ((PINC & 0x02)) && ((PINC & 0x04)) && (!(PINC & 0x08)) ) //9
z_licz = 9;
else if( ((PINC & 0x01)) && (!(PINC & 0x02)) && ((PINC & 0x04)) && (!(PINC & 0x08)) ) //10
z_licz = 10;
else if( (!(PINC & 0x01)) && (!(PINC & 0x02)) && ((PINC & 0x04)) && (!(PINC & 0x08)) ) //11
z_licz = 11;
else if( ((PINC & 0x01)) && ((PINC & 0x02)) && (!(PINC & 0x04)) && (!(PINC & 0x08)) ) //12
z_licz = 12;
else if( (!(PINC & 0x01)) && ((PINC & 0x02)) && (!(PINC & 0x04)) && (!(PINC & 0x08)) ) //13
z_licz = 13;
else if( ((PINC & 0x01)) && (!(PINC & 0x02)) && (!(PINC & 0x04)) && (!(PINC & 0x08)) ) //14
z_licz = 14;
else if( (!(PINC & 0x01)) && (!(PINC & 0x02)) && (!(PINC & 0x04)) && (!(PINC & 0x08)) )//15
z_licz = 15;
//else
//z_licz = 15;
z_g_opuz = 0;
//reset();
}
SIGNAL (SIG_INTERRUPT1) // 2 przerwanie
{
reset();
}
int main(void)
{
DDRB = 0xFF; //PORTB jako wyjscia
PORTB = 0xFF;//1111 1111 podciagniecie do 1
DDRC = 0x00; //PORTC jako wejscia
PORTC = 0xFF;//wszystkie wejscia podciagniete do VCC
DDRD = 0x00; // wszystkie wejścia aktywowane
PORTD = 0x0C; // podciąganie bitów 3 i 4 PortD (przyciski)
GIMSK = _BV(INT0)|_BV(INT1);
//włącz obsługę przerwań Int0 i Int1
MCUCR = _BV(ISC01)|_BV(ISC11);
// włącz generowanie przerwań przez
// opadające zbocze na Int0 i Int1
sei(); // włącz obsługę przerwań
while(1)
{
z_g_opuz = 1000;
switch (z_licz)
{
case 0:
PORTB = wynik_0_0;
f_opuz1(z_g_opuz);
break;
case 1:
PORTB = wynik_1_0;
f_opuz1(z_g_opuz);
PORTB = wynik_1_1;
f_opuz1(z_g_opuz);
break;
case 2:
PORTB = wynik_2_0;
f_opuz1(z_g_opuz);
PORTB = wynik_2_1;
f_opuz1(z_g_opuz);
PORTB = wynik_2_2;
f_opuz1(z_g_opuz);
break;
case 3:
PORTB = wynik_3_0;
f_opuz1(z_g_opuz);
PORTB = wynik_3_1;
f_opuz1(z_g_opuz);
PORTB = wynik_3_2;
f_opuz1(z_g_opuz);
PORTB = wynik_3_3;
f_opuz1(z_g_opuz);
break;
case 4:
PORTB = wynik_4_0;
f_opuz1(z_g_opuz);
PORTB = wynik_4_1;
f_opuz1(z_g_opuz);
PORTB = wynik_4_2;
f_opuz1(z_g_opuz);
PORTB = wynik_4_3;
break;
case 5:
PORTB = wynik_5_0;
f_opuz1(z_g_opuz);
PORTB = wynik_5_1;
f_opuz1(z_g_opuz);
break;
case 6:
PORTB = wynik_6_0;
f_opuz1(z_g_opuz);
PORTB = wynik_6_1;
f_opuz1(z_g_opuz);
break;
case 7:
PORTB = wynik_7_0;
f_opuz1(z_g_opuz);
PORTB = wynik_7_1;
f_opuz1(z_g_opuz);
break;
case 8:
PORTB = wynik_8_0;
break;
case 9:
PORTB = wynik_9_0;
break;
case 10:
PORTB = wynik_10_0;
break;
case 11:
PORTB = wynik_11_0;
break;
case 12:
PORTB = wynik_12_0;
break;
case 13:
PORTB = wynik_13_0;
break;
case 14:
PORTB = wynik_14_0;
break;
case 15:
PORTB = wynik_15_0;
break;
}
}
}