przesiadka z RIDE na SDCC
Masz problem? Zapytaj na forum elektroda.pl
From: "Grodo" <(zamienXna2000)grodoX_at_nospam_poczta.onet.pl>
Subject: przesiadka z RIDE na SDCC
Date: Tue, 14 Jun 2005 13:33:08 +0200
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<a;i++){}
}
void strobe()
{
P2=P2|0x04; //set bit E
P2=(P2)&(0xFB); //clr bit E
waste(11);
}
void write(char a)
{
int flag=1;
P2=(((int)a)|0x01)&(~(0x06));
strobe();
P2=((((int)a)<<4)|0x01)&~(0x06);
strobe();
P2=0xF2; //prepare to read the flag
while(flag)
{
P2=P2|0x04; //set bit E
flag=P2>>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)
{
}
}