hola Suky,
tal como me dijise... ("Pregunta en el foro")
En este enlace a un compañero le indicas un codigo para el rastreo de teclado.
Respuesta 10 -13
he intentado analizar tu codigo y di algunas cosas por sentadas:
Asi que queria confirmarlas:
SI elegimos la respuesta 10, por ejemplo.
La libreria esta realizada para un teclado de 4x4 conectado a un puerto b de un pic.
De ese puesto B imagino que usaras la misma tecnica de una parte del puerto como entradas y otra parte como salida.
Cuando pulsas tecla pones un Cero en entrada y asi sabes si se pulso.
¿Como se sabe cuales son las filas y cuales las columnas?
la variable filas es el seteo del puerto
filas=0x0E 0000 1110
:: Preguntas ::
¿Por que te declaras un vector con una posición de más tiene que ver con el contador?
¿utilizas la variable filas para inicializar el puerto ?
¿a medida que verificas si se pulso cero vas contado teclas?
¿La rotacion a la derecha de fila, es para desplazar el cero a la izquierda?
¿esto de la rotacion tiene que ver con las mascaras que encontre en otras librerias?
¿para que se hace y cual es su utilidad?
La parte de la interrupcion no la entiendo pones el puerto como salidas
yo la quiero hacer con el la de externas(b0) se hace poniendola a 1.
Puedes responder a estas dudas.
Un saludo
Hola Suky
La funcion expan_bus_rw(0b11110000), te pone la parte alta del expansor como entradas a y y la baja como salidas a 0.
corrigeme si me quivoco, si pones a 1 un puerto es entrada o salida, ... es entrada seguro no.., ahora que dudo me estoy liando .
Como sabes con la función expan_bus_rw() cuando quieres configurar el "tris" y cuando quieres escribir en el puerto? :?
Ahora en el debug que realizas debes darte cuenta que P0-P3 en estado normal deberia estar en 1 y no en cero, o sino invertir la lógica, o sea:
if(EXPAN_P0==1){break;}t++; //verifico pulsacion de tecla; incremento contador
if(EXPAN_P1==1){break;}t++;
if(EXPAN_P2==1){break;}t++;
if(EXPAN_P3==1){break;}t++;
Saludos!
Respecto a esa pregunta del tris te refieres a decirle que pines son de entradas y cuales de salida?
, puedes describir lo de escribir en el puerto, no he comprendido, a lo mejor viene por ahi, el problema.... .
Solo me he mirado por encima los mensajes de este tema.
Añadir por si es de utilidad que cuando yo realicé el teclado con el PCF8574 en PROTEUS no funcionaba, lo probe en real y sí que funcionaba.
Primero, Proteus dibuja un cuadradito rojo cuando hay un estado alto y un cuadradito azul cuando hay un estado bajo.
No es que dibuje rojo cuando está como entrada y azul cuando está como salida.
Lo que hay que cambiar en los puertos no es que funcione como entrada o salida sino el dato que está saliendo del puerto. El dato de salida también dependerá si en las entradas se están utilizando resistencias de pull-up o resistencias de push-down
Siempre que simulé teclados lo hice conectándolos directamente al PIC. Pero la idea de funcionamiento es la misma....
Supongamos que utilizas resistencias de pull-up en los bits de entrada, por lo tanto, al hacer una lectura cuando no haya tecla presionada, todos los bits (de entrada) estarán en 1. Supongamos también que la filas son entradas y las columnas son salidas.
Configuración de puerto 11110000. El bit 0 correspondiendo a la primer columna, el bit 6 correspondiendo a la primer fila.
En primera instancia se dejan todos lo bits de salida en 0. Así cualquier tecla que se presione puede provocar un cambio de estado en las entradas.
Una vez que se detecta un cambio de estado (que indica que se presionó alguna tecla), se modifican las salidas para que sólo la columna 1 esté en 0. Se vuelve a leer las entradas, si se lee todo 1 nos indica que la tecla presionada no es de la columna 1. Entonces seguimos barriendo las columnas poniendo en 0 sólo la columna 2, se leen nuevamente las entradas y si es todo 1 la tecla presionada no pertenece a la columna 2. Repetimos el paso con la siguiente columna, poniendo en 0 sólo la columna 3 y leyendo nuevamente las entradas, si ahora encontramos un valor que no sea todo 1 (supongamos 0111) sabemos que la tecla presionada es la que se encuentra en la columna 3 y la fila 4.
si ponemos las filas como entrada (cuadrito rojo proteus )y las columnas como salida (Cuadrito azul proteus)
.............
He buscado el que me funcionaba físicamente (no funcionaba con PROTEUS) y te lo dejo.
............
ordenado por filas: =================== tecla - dato su binario 1 - ee 1110 1110 2 - ed 1110 1101 3 - eb 1110 1011 F - e7 1110 0111 4 - de 1101 1110 5 - dd 1101 1101 6 - db 1101 1011 E - d7 1101 0111 7 - be 1011 1110 8 - bd 1011 1101 9 - bb 1011 1011 D - b7 1011 0111 A - 7e 0111 1110 0 - 7d 0111 1101 B - 7b 0111 1011 C - 77 0111 0111 | ordenado por Columnas: =================== tecla - dato su binario 1 - ee 1110 1110 4 - de 1101 1110 7 - be 1011 1110 A - 7e 0111 1110 2 - ed 1110 1101 5 - dd 1101 1101 8 - bd 1011 1101 0 - 7d 0111 1101 3 - eb 1110 1011 6 - db 1101 1011 9 - bb 1011 1011 B - 7b 0111 1011 F - e7 1110 0111 E - d7 1101 0111 D - b7 1011 0111 C - 77 0111 0111 |
.............
esta linea
dato = i2c_read(0);
nos lee el dato ,pero la pregunta es
¿por donde empieza leyendo?
Algun amigo sabe que le esta ocurriendo...
Hola suky
El esquemita que tengo lo tengo como el archivo que adjunto
el programa principal tengoCódigo: C#
#include "main.h" #int_EXT void EXT_isr(void) { printf("\r %c",text_t()); printf("\r pines %d%d%d%d ",EXPAN_P7,EXPAN_P6,EXPAN_P5,EXPAN_P4); printf("%d%d%d%d ",EXPAN_P3,EXPAN_P2,EXPAN_P1,EXPAN_P0); } void main() { enable_interrupts(INT_EXT); ext_int_edge( H_TO_L ); enable_interrupts(GLOBAL); port_b_pullups (0b00000001); expan_bus_rw(0b00001111); while(true){ } }
en el la funcion de escane a tengoCódigo: C
char text_t(){ char tecla[17]={'1','2','3','F', '4','5','6','E', '7','8','9','D', 'A','0','B','C',' '}; int t,f,filas,ini_p; filas=0x0E; //xxxx1110 ini_p=0xF0; //inicializo varible para los puertos expan_bus_rw(ini_p); //configuro puerto del expansor 0b11110000 t=0; //inicio contador de tecla for( f=0; f<4; f++){ if(EXPAN_P0==0){break;}t++; //verifico pulsacion de tecla; incremento contador if(EXPAN_P1==0){break;}t++; if(EXPAN_P2==0){break;}t++; if(EXPAN_P3==0){break;}t++; rotate_left(&filas,1); //rota la fila expan_bus_rw(filas); // escribo fila rotada } return tecla[t]; }