Personalmente no lo hice en el momento por que no uso Hitech (me parece anticuado), y seguro que no disponia el tiempo en ese momento,y luego se me paso con algunas otras cosas, yo solo use XC8, que recomiendo que lo uses ya que microchip da soporte a XC8.
Asi que por ejemplo todos tus
RA0=1;
RB4=1;
//en XC8 es distinto
PORTAbits.RA0=1;
PORTBbits.RB0=1;
o si queres utilizar algo mas "comun" y no depender de la definicion de cada pin, ejemplo para hacer un toggle de RA0 y RA3
PORTA ^= ((1<<0) | (1<<3)); // Es decir 1 desplazado a la izquierda 0 veces y un 1 desplazado 3 veces, esto seria igual a PORTA = PORTA ^ 0b00001001;
Igual eso depende del compilador y el archivo que posea.
En fin aca te voy a dar una ayuda.
1- El puerto A no solo es digital sino tambien analogico, por lo que tambien debes modificar el registro ADCON1. En el reset todos los pines comienzan como analogicos.
ADCON1 = 0x07; // Esto haria que esten todos como digitales los PORTA
2- Esto es innecesario:
Reemplazalo por un
Asi no tenes que usar un espacio para una variable (me refiero a la variable t)
3- No se para que declaras esto:
Si no lo estas usando. Al menos no en el main() que es donde esta definido. Y esta en ese "scope"
4- tiempototal y k es un int, suponiendo que sea de 16bits (en ese compilador) eso lo lleva a poder representar como maximo un numero de 65536
Esto te trae problemas en tu "retardo" , ya que no vas a estar lo que vos queres que haga.
Ejemplo 600 * 40000 = 24000000 (24 millones)
Eso en hexadecimal 0x16E3600
Si tratas de meter ese numero en uno de 16bits lo mas seguro es que solo se guarde: 0x3600 (13824) y lo demas se pierda. Y tu for solo cuente de 0 a 13824 ( y no 24 millones). Era esto lo que querias hacer?
Quedan 2 opciones. utilizar una variable que lo pueda tener (32bits- unsigned long en XC8) o hacer de otra forma el programa. es decir:
unsigned long k,tiempototal;
Ventajas: no modificas mucho tu codigo.
Desventajas: usas 2 variables de 32bits, estoy mas que seguro que vas a tener que modificar esos 40000 por un numero mas epqueño, ya que se tiene que realizar 4 sumas de 8 bytes y luego 4 comparaciones de 8bytes.
o
void RETARDO(int milisegundos)
{
int j,k;
for(k=0; k<milisegundos;k++)
{
for(j=0;j<40000;j++){ }
}
}
Ventajas: Menor cantidad de uso de memoria, ya que solo son 2 bytes cada una de las variables.
Desventajas: Modificar el codigo
Ambas opciones son un delay simple pero no preciso, si queres algo preciso deberias hacerlo con ASM o alguna funcion del hitech.
El resto del programa quedaria:
void main(void)
{
TRISB = 0B0010000; //1 representa entrada y 0 representa salida
TRISA = 0B0000001;
ADCON1 = 0x07; // Digital
while(1) // Loop que se ejecuta siempre
{
if(!RB4) // hacer !RB4 es parecido a hacer RB4 == 0, no es lo mismo conceptualmente. pero se puede hacer el mismo uso. Asi te vas acostumbrando a verlo
{
while(!RB4);
RB1 ^= 1; //Toggle de RB1
}
if(!RA0)
{
while(!RA0);
RB1 ^= 1;
}
RB0^=1;
RETARDO(600);
}
}
Una cosa que no entendi es que ambos botones manejan el mismo led. No se si querias hacerlo asi o fue un error.
Espero que esto solucione los problemas que tenes