ayuda, problemas con un semaforo

#1
hola a todos :)
Hay les vengo a pedir un poco de ayuda con un proyecto que estoy haciendo

Estoy haciendo un semaforo, este lo voy aa controlar con un pic 18f2620, porque no solo quiero que prenda unos leds, sino que dependiendo del tiempo que le meta con unos botones es el tiempo que me va a ir mostrando el semaforo. Por ejemplo: si al ponerle de tiempo 10 minutos, quiero que el 90% del tiempo sea verde, el otro el amarillo y al ultimo que prenda el rojo.

Esta es una imagen de mas o menos como es el circuito. Esta hecha en Proteus:



y este es el programa que llevo en PICC:

#include<18f2620.h>
#use delay(clock=2M)

int t;
int b;
int x;
int y;
int s;
float m;

int bcd_7seg(int bcd)
{
if(bcd==0) return 0b0111111;
else if(bcd==1) return 0b110;
else if(bcd==2) return 0b1011011;
else if(bcd==3) return 0b1001111;
else if(bcd==4) return 0b1100110;
else if(bcd==5) return 0b1101101;
else if(bcd==6) return 0b1111101;
else if(bcd==7) return 0b111;
else if(bcd==8) return 0b1111111;
else if(bcd==9) return 0b1100111;
}

void main()
{
setup_timer_0(RTCC_internal);
set_timer0(0);
t=0;
s=0;
m=0;

while(1)
{
if(input(pin_A2)) t=t+5;
while(input(pin_A2));
if(input(pin_A3)==1) t=t+1;
while(input(pin_A3));
if(input(pin_A4)==1) t=t-5;
while(input(pin_A4));

if(t<10)
{
b=128;
output_C(bcd_7seg(t)+b);
}

if(t>=10)
{
x=(float)t/10;
output_C(bcd_7seg(x));
y=t-(x*10);
delay_ms(30);
output_C(bcd_7seg(y)|128);
delay_ms(30);
}

if(input(pin_A1))
{
set_timer0(0);
if(get_timer0()>=50000)
{
set_timer0(0);
s=s+1;
}
if(s==300) m=m+1;
if(m<=(t*0.9)) output_B(2);
else if(m>(t*.9) && m<t) output_B(4);
else if(m==t) output_B(8);
}
while(input(pin_A1));
}

}

El problema es que el semaforo no pasa de verde. Segun yo el problema debe estar en la parte roja del codigo, pero por mas que reviso la logica de este, no veo nada mal. A lo mejor mi logica esta mal:chavo:

Haber si me podrian ayudar, y si encuentran alguna mejora que le pueda hacer, haganmela saber para agregarsela tambien.

Bueno saludos, y espero su respuesta:)
 
#2
ya cambie mi codigo a esto pero ahora en vez de empezar en verde empieza en el amarillo #include<18f2620.h>
#use delay(clock=2M)

int t;
int s;
int m;

int bcd [100]= {0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10,0x11,
0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,
0x27,0x28,0x29,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,0x42,
0x43,0x44,
0x45,0x46,0x47,0x48,0x49,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x70,0x71,
0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x88,0x89,0x90,
0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99
};

void main()
{
setup_timer_0(RTCC_INTERNAL);
set_timer0(0);
t=0;
s=0;
m=0;


while(1)
{
if(input(pin_A2)) t=t+5;
while(input(pin_A2));
if(input(pin_A3)==1) t=t+1;
while(input(pin_A3));
if(input(pin_A4)==1) t=t-5;
while(input(pin_A4));
output_c(bcd[t]);

if(input(pin_A1))
{
set_timer0(0);
if(get_timer0()>=5000)
{
set_timer0(0);
s=s+1;
}
if(s==3000) m=m+1;
if(m<=((float)t*0.9)) output_B(1);
else if(m>((float)t*.9) && m<t) output_B(2);
else output_B(4);
}
while(input(pin_A1));
}
}
 
Arriba