Autor Tema: Teclado 3x4 con interrupciones  (Leído 2220 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Teclado 3x4 con interrupciones
« en: 28 de Abril de 2008, 19:13:31 »
Hola muchachos del foro.

Casi siempre tuve problemas con el teclado para asignar variables en bucles muuuy largos (y no me agradaba la idea de estar colocando el kbd_getc() a cada nada en el codigo :D), asi que realice un teclado con interrupciones, del TIMER1 y las del puerto b.

Con el timer1 genero la secuencia de desplazamiento del "0" cada milisegundo y segun la tecla pulsada detecto la interrupcion y asigno el valor a una variable global. De esta manera cuando hay rutinas que tengan loops y necesitemos un flag para salir de ellas sin detener el loop.......pues ya sera mas facil hacerlo.

Hasta el momento, corre muy bien :mrgreen: .

Código: [Seleccionar]
#include<18F452.h>
#fuses XT, NOWDT
#use delay(clock=4M)
#include "lcdd.c"

#define on output_high
#define off output_low
#define col0 pin_b3
#define col1 pin_b4
#define col2 pin_b5
#define col3 pin_b6

int8 rows=0, keypress=0;
char col_1[4]={'1','2','3','4'};
char col_2[4]={'5','6','7','8'};
char col_3[4]={'*','0','9','#'};

#int_EXT
void RB0_isr(void)
{
keypress = col_1[rows-1];
}

#int_EXT1
void RB1_isr(void)
{
keypress = col_2[rows-1];
}

#int_EXT2
void RB2_isr(void)
{
keypress = col_3[rows-1];
}

#int_TIMER1
void sweep_kbd_isr(void)
{
set_timer1(0xe000);
++rows;
if(rows==1)
{
off(col0);
}
if(rows==2)
{
on(col0);
off(col1);
}
if(rows==3)
{
on(col1);
off(col2);
}
if(rows==4)
{
on(col2);
off(col3);
}
if(rows>4)
{
on(col3);
rows=0;
}
}

void main (void)
{
ext_int_edge(H_TO_L);
ext_int_edge(1,H_TO_L);
ext_int_edge(2,H_TO_L);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
enable_interrupts(INT_EXT2);
enable_interrupts(GLOBAL);
on(pin_b3);
on(pin_b4);
on(pin_b5);
on(pin_b6);
on(pin_b7);
port_b_pullups(TRUE);
lcd_init();

 while(true)
 {
lcd_gotoxy(1,1);
lcd_putc(keypress);
if(keypress=='#')
lcd_putc("\nHola mundo");
if(keypress=='*')
{
lcd_putc("\f");
keypress=0;
}
 }

}

No use las funciones rotate_left() y rotate_right() y asignar el valor del byte al portb, porque se me deshabilitaban las interrupciones (creo que habria que colocar el #use fixed_io), pero ya que funciono asi...... lo dejo asi.... :lol:.

Creo que ya era hora de aportar con algo, aunque sea pequeno .... pero con mucha alegria de poder devolver en algo la ayuda que me han brindado en este foro.

Chao
El papel lo aguanta todo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Teclado 3x4 con interrupciones
« Respuesta #1 en: 29 de Abril de 2008, 01:44:44 »
Muy interesante tu solución, MLO. Muchas gracias por compartirla.


 

anything