Skocz do zawartości

konwersja programu pisanego w C na BASCOM


cassey

Pomocna odpowiedź

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;

		}
}
}
Link do komentarza
Share on other sites

'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?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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..

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.