"Falla" al momento de correr un programa hecho en Keil C 8051

Buenas, vengo con un problema que me tiene a mal traer... Resulta que en la escuela yo aprendi a programar 8051 en el ide de MCS electronics, en basic... pero resulta que las rutinas se me hacen MUY lentas, entonces, decidi migrar al C de Keil utilizando el uVision. de C tengo alguna idea gracias a lo que aprendi de turboC en la facultad, pero el C de keil es un poco diferente. Resulta que arme la rutina que necesitaba en C y compile, me devolvio el .hex todo muy lindo, pero programo el 8051 (en realidad es un 89S51) y me encuentro con que no funciona. La misma rutina hecha en basic, funciona, lento para mi aplicacion pero funciona, a lo que descarte un problema de hardware o del micro... entonces, dejo aqui el codigo que arme, puede que haya alguna falla en el? o me estoy olvidando de inicializar algun registro?

Código:
#include <reg51.h>                             /* define 8051 registers */
#include <stdio.h>                             /* define I/O functions */     

void main(void){
char meter;
while(1){
	meter=P1;
	switch(meter>>3){
			case 0:		
			case 1:		
			case 2:		
			case 3:		
			case 4:		
			case 5:		
			case 6:		
			case 7:		
			case 8:		
				P2=0x07;
				break;
			case 9:		
				P2=0x06;
				break;
			case 10:		
				P2=0x05;
				break;
			case 11:		
			case 12:		
			case 13:		
			case 14:		
			case 15:		
			case 16:		
			case 17:		
			case 18:		
				P2=0x0B; 
				break;
			case 19:		
				P2=0x0A;
				break;
			case 20:		
				P2=0x09;
				break;
			case 21:		
			case 22:		
			case 23:		
			case 24:		
			case 25:		
			case 26:		
			case 27:		
			case 28:		
				P2=0x13;
				break;
			case 29:		
				P2=0x12;
				break;
			case 30:		
				P2=0x11;
				break;
			case 31:
				break;
	
			}
	switch (meter>>3){	
			case 0:		
				P0=0xFF;
				break;
			case 1:	
			case 11:	
			case 21:
				P0=0xFE;
				break;
			case 2:		
			case 12:
			case 22:
				P0=0xFD;
				break;
			case 3:		
			case 13:
			case 23:
				P0=0xFB;
				break;
			case 4:
			case 14:
			case 24:		
				P0=0xF7;
				break;
			case 5:		
			case 15:		
			case 25:		
				P0=0xEF;
				break;
			case 6:
			case 16:		
			case 26:				
				P0=0F;
				break;
			case 7:		
			case 17:		
			case 27:		
				P0=0xBF;
				break;
			case 8:		
			case 18:
			case 28:
				P0=0x7F; 
				break;
			case 9:		
			case 10:
			case 19:
			case 20:
			case 29:
			case 30:		
				P0=0xFF;
				break;
			
			}

	}
}

basicamente lo que hace es en funcion del dato que me entrega un A/D me activa ciertas salidas en un cierto orden, y esta constantemente polleando al a/d

agradeceria si alguien me da una pista! o algun programa hecho en keil C para comparar si me faltan registros o algo de eso... tengan en cuenta que de ASM no caso ni una liebre muerta

saludos
 
Atrás
Arriba