przesiadka z RIDE na SDCC

Jun 14, 2005 0 Replies

Hej mam program, który dzia³a jak go skompilujê RIDE`m. A jak go skompilujê SDCC to nie dzia³a. Przesy³am ca³y. Jego zadaniem jest wy¶wietlenie liczby od 0 do 255 na wy¶wietlaczu i przerwania (od 4 przycisków) maj± j± zwiêkszaæ lub zmniejszaæ. G³ównie chodzi³o mi o dobry debouncing. Ale mniejsza o to. Dlaczego nie dzia³a? Sprawdzi³em, czy takie puste pêtle for dzia³aj±, (tzn., czy mi ich nie zoptymalizuje dziadostwo) - dzia³aj±. Wy¶wietlanie te¿ dzia³a, jak je wpiszê w mainie. Wiêc chyba nie dzia³aj± przerwania. Wie kto¶ dlaczego? Sk³adnia z tego co widzia³em jest taka sama. Pomó¿cie, przy okazji bêdê wdziêczny za wszelkie wskazówki, co to normalnie dzia³a, a co to sdcc mo¿e tak zoptymalizowaæ, ¿e przestaje.



Pozdrawiam



#include<8051.h>



char zmienna; int k; int t; char stara; int wait;



void waste(int a) { int i; for(i=0;i>7; P2=(P2)&(0xFB); //clr bit E P2=P2|0x04; //set bit E P2=(P2)&(0xFB); //clr bit E } }



void clr() { P2=0x00; strobe(); P2=0x01; strobe(); }



void home() { P2=0x00; strobe(); P2=0x10; strobe(); waste(1000); }



void init() { P2=0x20; strobe(); P2=0x20; strobe(); P2=0xC0; strobe(); P2=0x00; strobe(); P2=0xC0; //0xC0; cursor off 0xE0; cursor on strobe(); P2=0x00; strobe(); P2=0x60; strobe(); }


void disp(int a) { int digit; int tens=100; while(tens) { digit=a/tens; write(digit+48); a-=digit*tens; tens=tens/10; } }



void refresh() { if(stara!=zmienna) { clr(); home(); disp(stara=zmienna); } }


void klaw() interrupt 0 { IE &= ~0x01; wait = 32000;


if(!(P3 & 0x80)) //onclick for button 1 { if(zmienna) zmienna--; } if(!(P3 & 0x40)) //onclick for button 2 { if(zmienna>10) zmienna-=10; } if(!(P3 & 0x20)) //onclick for button 3 { if(zmienna<245) zmienna+=10; } if(!(P3 & 0x10)) //onclick for button 4 { if(zmienna<255) zmienna++; }



refresh();



while(((P3 & 0xF0)<0xF0) && wait) //check if any key is pressed and hold { wait--; }



while((!(P3 & 0x80))&&(!wait)) //onhold for button 1 { if(zmienna) { zmienna--; refresh(); waste(2500); } }



while((!(P3 & 0x40))&&(!wait)) //onhold for button 2 { if(zmienna>10) { zmienna-=10; refresh(); waste(2500); } }



while((!(P3 & 0x20))&&(!wait)) //onhold for button 3 { if(zmienna<245) { zmienna+=10; refresh(); waste(2500); } }



while((!(P3 & 0x10))&&(!wait)) //onhold for button 4 { if(zmienna<255) { zmienna++; refresh(); waste(2500); } }



TH1=0xB8; TL1=0; t=0; }



void timer1() interrupt 3 { t++; if(!(t%3)) IE |= 0x01;



}

void timer0() interrupt 1 {



}

void main() { IE=0x8B; TMOD = 0x12; IP=0x02; TR1 = 1; TR0=1; zmienna=0; stara=0; t=0; init(); clr(); home(); waste(15000); while(1) {



} }


Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required