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) {
} }