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

Przetłumaczenie kodu w C na język Basic

cassey 19 Gru 2009 18:05 864 0
REKLAMA
  • #1 7410078
    cassey
    Poziom 2  
    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;

    }
    }
    }
  • REKLAMA
REKLAMA