Skocz do zawartości

konwersja programu pisanego w C na BASCOM


Pomocna odpowiedź

Napisano

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:

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

		}
}
}

hm.. nie za wiele mi to pomogło jak nie znam basica.. Dałoby rade zrealizować tą opcje "pomyślimy" 😉 ? Ładnie prosze 😃😃

'51 to było dawno i nieprawda (i tylko asembler) 😉

Mogę pomóc napisać program dla jakiegoś AVR, np. Attiny2313 - też ma 20 wyprowadzeń, choć chyba nieco inaczej rozmieszczonych. Ale myślę, że basic dla obu rodzajów strasznie się nie różni..

Nie masz żadnego pojęcia o programowaniu uC?

nie.. dopiero zaczynam swoją przygode z elektronika.. myslalam ze to kwestia przerobienia tego na basic...

[ Dodano: 19 Gru 09 09:58 ]

chociaz zebym zobaczyła jak wyglada sprawa dołączania do tego przycisków, może wtedy jakoś sobie poradze..

Nawyk, wydaje mi się, że prostszym sposobem do sumowania wyniku byłoby po prostu

wynik = wynik*10 + wcisniety_przycisk

Pozdr.

A czy mogłabym prosić kogoś chociaż o powiedzenie jak napisać takie proste przykładowe programiki. Mogłabym wtedy jakoś dalej ruszyć z pisaniem tego całego programu...

Pierwszy, gdzie przełącznik w stanie niskim powoduje nieświecenie, przełącznik w stanie wysokim powoduje świecenie diody.

Drugi, gdzie po podaniu stanu niskiego na przerwanie INT0 dioda ma się świecić przez 5s.

Dzieki wielkie z góry

próbowalam cos robic sama... iiii czy to tak działa ?

' informuję kompilator, dla jakiego mikrokontrolera piszę program
$regfile = "89C2051.dat"
' informuję kompilator o częstotliwości zegara mikrokontrolera
$crystal = 12000000
' konfiguruję PORTB do pracy w trybie wyjściowym
Config P3 = Input
' konfiguruję P1 do pracy w trybie wyjściowym
Config P1 = Output

P1 = &HFF
P3 = &HFF


' pętla nieskończona, koniec programu
Do


    If P3.0 = 0 And P3.1 = 0 And P3.2 = 0 And P3.3 = 0 Then       '0 0000
     P1 = &H00
     Wait 1                                                  '0*0+0  ~0000 0000
    End If

    If P3.0 = 0 And P3.1 = 0 And P3.2 = 0 And P3.3 = 1 Then       '1 0001
     P1 = &H80                                               '0*0+1  ~1000 0000
     Wait 1
     P1 = &H11                                               '1*1+0 ~0001 0001
     Wait 1
    End If

    If P3.0 = 0 And P3.1 = 0 And P3.2 = 1 And P3.3 = 0 Then       '2 0010
     P1 = &H31                                               '1*2+0 ~0011 0001
     Wait 1
     P1 = &H13                                               '2*1+0 ~0001 0011
     Wait 1
     P1 = &H91                                               '1*1+1 ~1001 0001
     Wait 1
    End If

    If P3.0 = 0 And P3.1 = 0 And P3.2 = 1 And P3.3 = 1 Then       '3 0011
     P1 = &H71                                               '1*3+0 ~0111 0001
     Wait 1
     P1 = &H17                                               '3*1+0 ~0001 0111
     Wait 1
     P1 = &HB1                                               '1*2+1 ~1011 0001
     Wait 1
     P1 = &H93                                               '2*1+1 ~1001 0011
     Wait 1
    End If

    If P3.0 = 0 And P3.1 = 1 And P3.2 = 0 And P3.3 = 0 Then       '4 0100
     P1 = &H1F                                               '4*1+0 ~0001 1111
     Wait 1
     P1 = &HF1                                               '1*3+1 ~1111 0001
     Wait 1
     P1 = &H97                                               '3*1+1 ~1001 0111
     Wait 1
     P1 = &H33                                               '2*2+0 ~0011 0011
     Wait 1
    End If

    If P3.0 = 0 And P3.1 = 1 And P3.2 = 0 And P3.3 = 1 Then       '5 0101
     P1 = &H9F                                               '4*1+1 ~1001 1111
     Wait 1
     P1 = &HB3                                               '2*2+1 ~1011 0011
     Wait 1
    End If

    If P3.0 = 0 And P3.1 = 1 And P3.2 = 1 And P3.3 = 0 Then       '6 0110
     P1 = &H37                                               '3*2+0 ~0011 0111
     Wait 1
     P1 = &H73                                               '2*3+0 ~0111 0011
     Wait 1
    End If

    If P3.0 = 0 And P3.1 = 1 And P3.2 = 1 And P3.3 = 1 Then       '7 0111
     P1 = &HB7                                               '3*2+1 ~1011 0111
     Wait 1
     P1 = &HF3                                               '2*3+1 ~1111 0011
     Wait 1
    End If

    If P3.0 = 1 And P3.1 = 0 And P3.2 = 0 And P3.3 = 0 Then       '8 1000
     P1 = &H3F                                               '4*2+0 ~0011 1111
     Wait 1
    End If

    If P3.0 = 1 And P3.1 = 0 And P3.2 = 0 And P3.3 = 1 Then       '9 1001
     P1 = &HBF                                               '4*2+1 ~1011 1111
     Wait 1
    End If

    If P3.0 = 1 And P3.1 = 0 And P3.2 = 1 And P3.3 = 0 Then       '10 1010
     P1 = &HF7                                               '3*3+1 ~1111 0111
     Wait 1
    End If

    If P3.0 = 1 And P3.1 = 0 And P3.2 = 1 And P3.3 = 1 Then       '11 1011 //-
     P1 = &HFF                                               '4*3-1 ~1111 1111
     Wait 1
    End If

    If P3.0 = 1 And P3.1 = 1 And P3.2 = 0 And P3.3 = 0 Then       '12 1100
     P1 = &H7F                                               '4*3+0 ~0111 1111
     Wait 1
    End If

    If P3.0 = 1 And P3.1 = 1 And P3.2 = 0 And P3.3 = 1 Then       '13 1101
     P1 = &HFF                                               '4*3+1 ~1111 1111
     Wait 1
    End If

    If P3.0 = 1 And P3.1 = 1 And P3.2 = 1 And P3.3 = 0 Then       '14 1110
     P1 = &HA0                                               'max ~1010 0000
     Wait 1
    End If

    If P3.0 = 1 And P3.1 = 1 And P3.2 = 1 And P3.3 = 1 Then       '15 1111
     P1 = &HA0                                               'max ~1010 0000
     Wait 1
    End If
Loop

End

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...