TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pachopic en 14 de Abril de 2006, 23:53:30
-
HOLA A TODOS:
¿ALGUIEN TIENE UN CODIGO DE EJEMPLO,EN CCS DONDE SE MANEJE UN TECLADO MATRICIAL 4X4, CON INTERRUPCION POR CAMBIO EN LOS CUATRO ULTIMOS PINES DE PORTB?...
HE INTENTADO HACERLO CON LA LIBRERIA MODIFICADA PARA 4X4 Y NO ME FUNCIONA :( :( :( :( :( :( :(.....
MUCHISIMAS GRACIAS...
-
Quizá esto te sirva
http://www.todopic.com.ar/foros/index.php?topic=4807.0 (http://www.todopic.com.ar/foros/index.php?topic=4807.0)
-
Quizá esto te sirva
http://www.todopic.com.ar/foros/index.php?topic=4807.0 (http://www.todopic.com.ar/foros/index.php?topic=4807.0)
Ocurre lo de siempre, la libreria de CCS no esta preparada para hacerlo mediante la interrupción. Aunque tmpc creo que sea dificil adaptarla, yo esto lo hice en ASM cuando empezaba, pero como no lo he vuelto a necesitar pues no la rehice en C :S
-
Hola a tod@s
No merece la pena emplear 8 entradas del micro, es mucho mas practico y sencillo utilizar un expansor de bus PCF8574, y leer el teclado utilizando la linea I2C y la int RB0. Es mi consejo.
Saludos :mrgreen:
-
HOLA: GRACIAS POR LA AYUDA, MUY INTERESANTES LOS EJEMPLOS.....
juanelete ¿COMO SERIA EL CONTROL DEL TECLADO CON EL PCF8574?
¿TIENES EL EJEMPLO EN PROTEUS?
SALUDOS
-
Aquí tienes un ejemplo de manejo de teclado que te podría servir.
-
Podeis ver también el ejemplo de teclado 4x4 por interrupción en C que he dejado en el Ejemplito de Teclado de RedPic. El enlace es el puesto arriba por Modulay
Un saludo
-
HOLA A TODOS:
HE ESTUDIADO LOS CODIGOS DE LOS EJEMPLOS.... POCHER EN EL PROGRAMA DEL TECLADO POR INTERRUPCION EN CCS ¿PODRIA DETECTARSE ESTA , EN VEZ DE USAR LA VARIABLE "aux", USAR EL FLAG "RBIF" (INDICA SI HUBO CAMBIO EN RB4-RB7) ?
¿DONDE SE HARIA EL CAMBIO EN EL CODIGO?
SALUDOS
-
La variable AUX no sirve para nada, como pone en el código la utilicé solo en la depuración para hacer pruebas y ver si entraba en la interrupción. La puedes quitar tranquilamente, en la interrupción solo se entra para coger el código de la tecla pulsada y levantar la bandera a 1, para que así se active al if del while(1).
Un saludo
-
Hola a tod@s
Perdon por la tardanza pero es que he estado algo liado...
El funcionamiento es muy similar a si lo conectaras directamente el teclado al PIC
//////////////////////////////////////////////////////////////
// Libreria Teclado I2C Libreria_tecladoI2C.C //
// //
// Adaptacion: D. Sanchez 03/06 //
/////////////////////////////////////////////////////////////
/*
PCF8574 Resistencias TECLADO PIC
---------- ------------ ---------- -----
P0 ---------- R 330 -------- Fila 1
P1 ---------- R 330 -------- Fila 2
P2 ---------- R 330 -------- Fila 3
P3 ---------- R 330 -------- Fila 4
P4 -------------------------- Col 1
P5 -------------------------- Col 2
P6 -------------------------- Col 3
P7 -------------------------- Col 4
INT------------------------------------ RB0/INT
A0,A1,A2 conectar a masa.
*/
void PCF8574_Escribe(int8 dato);
int8 PCF8574_Lee(void);
void Teclado_ini(void)
{
port_b_pullups (0b00000001); // Activa la resitencia pull-up interna del pin RB0/INT
ext_int_edge( H_TO_L ); // La int. se activara por flanco de bajada
PCF8574_Escribe(0b11110000); // Pone como salida (0) las Lineas y como entrada (1) las Columnas
delay_ms(50);
}
void PCF8574_Escribe(int8 dato)
{
i2c_start(); // Start condition
i2c_write(PCF8574_Escritura);// Device address
i2c_write(dato);// dato
i2c_stop(); // Stop condition
}
int8 escanea_tecla(void)
{
int8 l,c;
signed int8 dato=-1;
int8 fila=0b11111110; // primera fila
for (l=0; l<=3; l++) // Recorre las 4 filas
{
PCF8574_Escribe(fila);
rotate_left(&fila, 1); // siguientes filas, va desplazando el 0 hacia la izquierda
delay_ms(20); // necesario antes de leer 20
dato=PCF8574_Lee();
c=0;
if (!bit_test(dato,4)) c=1; //Col 1
else if (!bit_test(dato,5)) c=2; //Col 2
else if (!bit_test(dato,6)) c=3; //Col 3
else if (!bit_test(dato,7)) c=4; //Col 4
if(c) break; // Si c es distinto de 0 sale del for
}
if(c)
dato=(l*4)+c;
else
dato=-1; //Ninguna tecla pulsada
PCF8574_Escribe(0b11110000); // Vuelve a poner como salida (0) las Lineas y como entrada (1) las Columnas
return dato;
}
char tecla_c(int8 codigo)
{
char tabla_tecla[17]={'1','2','3','F','4','5','6','E','7','8','9','D','A','0','B','C','Z'};
return tabla_tecla[codigo-1];
}
int8 lee_teclado(void)
{
int8 tecla_hex;
tecla_hex=escanea_tecla();
}
int8 PCF8574_Lee(void)
{
int8 dato;
i2c_start(); // Start condition
i2c_write(PCF8574_Lectura);// Device address
dato = i2c_read();
i2c_stop(); // Stop condition
return dato;
}
//////////////////////////////////////////////////////////////////////////////
Y aqui tienes un pequeño ejemplo
////////////////////////////////////////////////////////////////////////
//// Prueba Teclado I2C Pru_teclado_I2C.C ////
//// ////
////////////////////////////////////////////////////////////////////////
#INCLUDE <16F876.H>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#ORG 0x1F00,0x1FFF {} //Para 8k Pic 16F876/7 (necesario para bootloader)
#use delay(clock=20000000)
#include <LCD_CCS_4B16x2.c> // Libreria LCD.C modificada
#use I2C(master,sda=PIN_C4,scl=PIN_C3,FORCE_HW)
#define PCF8574_Lectura 0b01000001 // Fija=0100 A0-A1=000 Modo lectura=1
#define PCF8574_Escritura 0b01000000 // Fija=0100 A0-A1=000 Modo escritura=0
int8 conta=0;
signed int8 cod_tecla;
#include <Libreria_tecladoI2c.c>
#INT_EXT
void int_rb0()
{
cod_tecla=escanea_tecla();
}
void main()
{
lcd_init();
lcd_putc("\fTeclado I2C\n"); delay_ms(500);
Teclado_Ini();
enable_interrupts(int_ext);
enable_interrupts(global);
while(TRUE)
{
if(cod_tecla>=0)
{
output_high(PIN_A1);
printf(lcd_putc,"%d %c",cod_tecla,tecla_c(cod_tecla));
delay_ms(100);
output_low(PIN_A1);
cod_tecla=-1; // Necesario para evitar repetirse
}
delay_ms(25);
}
}
En proteus no tengo nada, sorry
Saludos :mrgreen:
-
HOLA A TODOS:
gracias pocher por la aclaracion :shock: :shock: :shock:, tu ejemplo funciona perfectamente en proteus,me he guiado bastante de el y he aprendido mucho :-/ :-/ :-/intente usar la libreria que trae el ccs y no funciona bien con la interrupcion..¿?
:( :( no devuelve ningun valor parece que el valor de la tecla se pierde al retornar de la interrupcion..
cuando tenga un poco de tiempo usare codigo de juanelete para ver como funciona, :-/ :-/ :-/
muchisimas gracias :-/ :-/ :-/ :-/ :-/