Hola leyenda, veo que te estas iniciando a lo mejor no entendes el concepto de funciones todavia o el de las interrupciones..
no se como insertar esas tres secuencias en una sola programación
Estan bien las secuencias que haz hecho pero tienes 3 programas, ¿usas assembler? bueno una función es algo asi como una subrutina, es un procedimiento al que tu puedes invocar en cualquier punto de un programa, como un call, te explique en el otro mensaje como es la estructura básica de un programa en C para micros,debes acostumbrarte a respetar esa estructura..
Bueno entonces tu tienes por ejemplo la secuencia
Código:
{
signed char i; //variable indice
int leds[8]={0b10000000,0b01000000,0b00100000,0b00010000,0b00001000,0b00000100,0b00000010,0b00000001}; //led"s
do{ //bucle...
for(i=8;i>-1;i--){ //led"s on dentro-fuera
output_b(leds[ i ]); //ilumino led"s correspondientes
delay_ms(100);
}
}while(TRUE); //...infinito
la llamas asi por ej:
void secuencia_arriba_abajo (void):asi la función es una función vacia:ni recibe ni devuelve ningún parametro ,bien lo que esta arriba seria el cuerpo de tu función (o sea lo que hace) ,para que el procedimiento se pueda ejecutar en tu programa primero se debe declarar la función tambien llamada cabecera de la funcion antes de donde va el main de la siguiente forma:
void secuencia_arriba_abajo (void);
despues del main pones el cuerpo de la funcion tal cual como te puse arriba.. y en el main que es el programa principal puedes invocar a la función en cualquier punto...de la siguiente manera
secuencia_arriba_abajo();
bla
bla
bla
Bien..ahora entiendes lo que es una interrupción?, una interrupcion es una función fuera del main que se dispara eventualmente como por ej. ante la pulsación de un switch y su proposito es "liberar" al programa principal de estar constantemente escaneando si se pulso o no un switch ya que el programa principal atiende ese asunto cuando ocurre el evento solamente,si tienes un switch no es tanto problema si tienes 5 ya si y debes haces otras cosas el programa se vuelve engorroso,asique bueno la idea con la interrupción es liberar al programa principal de escanear los switch para que pueda hacer otra cosa,el dia de mañana que le quieras agregar mas complejidad a tu programa, bueno el pic16f877 tiene 14 posibles eventos que pueden disparar una interrupción entre ellas esta la llamada "interrupcion por cambio de estado del portb",este puerto trae de las patitas B4 a B7 resistencia de pull-ups internas que debes activar o sea que tienen un 1 permanente (o 5 V si mides con un tester) salvo que mandes a masa cualquiera de esas patitas,ahi es donde pones tus switch,si cualquiera de esas patitas se manda a masa o se presiona cualquier pulsador se dispara la interrupción,ahi una vez dentro determinas cual ha sido el pulsador que se ha oprimido y se sale rapido (es recomendable hacer las interrupciones cortas y rapidas) y en base a eso se decide que función de luces se ejecuta, esta es la estructura:
Código:
#include <pic16f877a>
#fuses XT,PUT,BROWNOUT,NOPROTECT
#use delay(clock=4000000)
//Declaracion de funciones.
int8 secuencia=0;
void secuencia_arriba_abajo(void); //Declaracion o cabecera de funcion no devuelve parametros ni los recibe
void secuencia_luces2(void);
void secuencia_lucesx(void);
//Variables globales
//Aqui declaras y/o inicializas tus variables globales
//Rutina de interrupcion por cambio de estado PORTB
#int_rb
RSI_RB()
{
if(!input(PIN_B4))
{
secuencia=1;
}
if (!input(PIN_B5))
{
secuencia=2;
}
if (!input(PIN_B6))
{
secuencia=3;
}
if (!input (PIN_B7))
{
secuencia=4;
}
delay_ms(20); //Esto es un retardo antirrebotes del pulsador
}
void main ()
{
set_tris_x(xxxx);
enable_interrupts(GLOBAL); //Habilitas interrupciones
enable_interrupts(INT_RB); //Habilitas especificamente interrupcion por cambio de estado
port_b_pull_ups(TRUE); //Aqui le "dices" al pic que use sus R de pull-up internas
while(1)
{
switch (secuencia) //Aqui segun el pulsador que hayas oprimido invoca la funcion
//de luces deseada...y no sale de ella hasta no se oprima un
// pulsador diferente...
{
case 1:
{
secuencia_arriba_abajo(); //aqui ejecutas tu secuencia de luces arriba/abajo
break;
}
case 2:
{
secuencia_luces2();
break;
}
case x:
{
secuencia_lucesx();
break;
}
}
}
}
//Aqui pones el cuerpo de las funciones de secuencias de luces
secuencia_arriba_abajo()
{
do{ //bucle...
for(i=8;i>-1;i--){ //led"s on dentro-fuera
output_b(leds[ i ]); //ilumino led"s correspondientes
delay_ms(100);
}
}while(TRUE); //...infinito
}
secuencia_lucesx()
{
bla
bla
bla
}
Bue..espero hayas entendido,si entendiste sabrás agregar lo que falta un saludo!!
Hola por si no te quede claro te voy a subir el DSN que yo hice y el archivo cof. para que lo veas..