Problema con programa cuenta regresiva en ccs

#1
Que tal, estoy haciendo un programa el cual muestre un mensaje de Activado en la primera fila del LCD cuando detecta un 1 en el BT1 que es el E0, y mientras en la segunda fila muestre una cuenta regresiva de 30 seg. El problema es que nose como hacer para que cuando oprima la tecla '*' de un teclado matricial 3x4 esta se interrumpa y me aparesca un mensaje en LCD de Descativado. Espero y me puedan ayudar dejo el codigo que he realizado.

Código:
#include <16F887.h>
#fuses XT,NOWDT,NOPROTECT,PUT

#use delay(clock=4M)

#define use_portb_lcd TRUE
#include <lcd.c>
#include <kbd.c>

#use fast_io(C)
#use fast_io(E)

#byte portc = 0x07
#byte porte = 0x09

#bit BT1 = 0x09.0

int    a=1,d=29;
char k;

void inicializar(void)
{
   setup_adc_ports(NO_ANALOGS);
   set_tris_e(0b11111111);
   lcd_init();
   kbd_init();
}

void main(void)
{
   inicializar();
   for(;;)
   {
      if(BT1==1)
      {
         lcd_gotoxy(1,1);
         printf(lcd_putc,"ACTIVADO");
         do
         {
            output_C(0x1);
            delay_ms(500);
            output_C(0x0);
            delay_ms(500);
            lcd_gotoxy(1,2);
            printf(lcd_putc,"Tiempo Desc: %d\r",d);
            a++;
            d--;
         }
	 while(a<=30);
	}
    }
}
 
Última edición por un moderador:
#2
Para empezar, para la próxima introduce el código envuelto en las etiquetas
Código:
, así se ve mejor.

Ahora al grano, si abres la librería kbc.c, verás que en la cabecera te indica cómo utilizarla. Explica que para retornar el carácter pulsado tienes que usar "kbd_getc(c)".
En tu programa podría ser algo así:

Código:
#include <16F887.h>
#fuses XT,NOWDT,NOPROTECT,PUT

#use delay(clock=4M)

#define use_portb_lcd TRUE
#include <lcd.c>
#include <kbd.c>

#use fast_io(C)
#use fast_io(E)

#byte portc = 0x07
#byte porte = 0x09

#bit BT1 = 0x09.0

int a=1,d=29;
char k;

void inicializar(void)
{
setup_adc_ports(NO_ANALOGS);
set_tris_e(0b11111111);
lcd_init();
kbd_init();
}

void main(void)
{

inicializar();
for(;
{
if(BT1==1)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"ACTIVADO");
do
{
if(kbd_getc()=='*') desactiva();
output_C(0x1);
delay_ms(500);
if(kbd_getc()=='*') desactiva();
output_C(0x0);
delay_ms(500);
if(kbd_getc()=='*') desactiva();
lcd_gotoxy(1,2);
printf(lcd_putc,"Tiempo Desc: %d\r",d);
a++;
d--;
if(kbd_getc()=='*') desactiva();
}
while(a<=30);
}
}
}

En mi ejemplo deberías hacer otra funcion a la que saldrías cuando se pulsara *, la función desactiva();
 
Arriba