Autor Tema: Duda tecladosmatriciales.....  (Leído 3799 veces)

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

Desconectado mallorca_vale

  • PIC10
  • *
  • Mensajes: 17
Duda tecladosmatriciales.....
« en: 29 de Enero de 2005, 03:25:00 »
Bueno... el caso es que he demontar un teclado matricial con pulsadores para unirlos a un pic16f877 y bueno... tengo dudas con la conexion y el funcionamiento de dicho...

bueno... a ver si me explico con el dibujo Sonrisa los cuadrados raros son pulsadores XD ya se que no es su simbolo, pero era para hacerlo mas claro Sonrisa



el conexionado seria asi?

Luego la duda, me viene en el funcionamiento, si es asi... no tengo muy claro como se sabe el boton que se pulsa... me lo podriais explicar? y bueno... si el diseño esta mal por algun motivo corregidme que estoy para aprender Sonrisa Gigante

ASIASSSSSSSSSSSSSSSSSSSS

Desconectado roc364

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 108
RE: Duda tecladosmatriciales.....
« Respuesta #1 en: 29 de Enero de 2005, 16:45:00 »
Mira mallorca, creo que te esta faltando algo en el planito... yo diria que una alimentacion de +5v en algun lado, y otras resistencias en los demas pines del puerto B. De modo que cuando presiones un boton, se pongan a 1 dos pines, luego es cuestion de hacer una tablita donde segun el valor que lees en el puerto, puedas saber que boton se encuentra presionado.
Creo que algo asi funcionaria...  ¿En que lenguaje lo estas programando?

Suerte!
Hay solo 10 tipos de personas, los que entienden el codigo binario, y los que no.

Viva La Patagonia Argentina!!

Desconectado roc364

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 108
RE: Duda tecladosmatriciales.....
« Respuesta #2 en: 29 de Enero de 2005, 17:22:00 »
Pensandolo bien, creo que si podes leer las teclas con el planito que pusiste, solo que deberias configurar 4 de los pines como salidas, y por medio del programa ir prendiendo de a un pin, y asu vez ir leyendo las entradas, entonces si lees algo en  algun pin de entrada, es que se presiono una tecla. Luego sabiendo cual era el pin de salida que estaba prendido en ese momento, sabremos cual fue el boton presionado.
uffffffffffffff... complicado.
Hay solo 10 tipos de personas, los que entienden el codigo binario, y los que no.

Viva La Patagonia Argentina!!

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
RE: Duda tecladosmatriciales.....
« Respuesta #3 en: 29 de Enero de 2005, 19:52:00 »
Sonrisa Gigante si si... es asi... se envia un uno (o cero) a cada uno de los 4 pines, y por el otro lado se lee cual es...
para que el programita sea corto, se asigna un valor a un acumulador o registro, por cada pin que envia el uno... empieza en cero,cuatro , ocho
se leen los 4 pines, y al valor que tienen, se le suma el valor del registro
asi por ejemplo, la lectura es 3, mas cero, pulsador 3
si fuese la segunda columna, seria 3 mas 4=7
se entiende?

Suerte!

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado mallorca_vale

  • PIC10
  • *
  • Mensajes: 17
RE: Duda tecladosmatriciales.....
« Respuesta #4 en: 30 de Enero de 2005, 03:35:00 »
Bueno... buscando cosas de teclados me he encontrado con esto, y parece que es lo que me haveis comentado mas arriba, pero aun tengo alguna duda :$



Funcionamiento: En la siguiente figura vemos el esquema de conexionado interno del teclado matricial y sus correspondientes pines de salida numerados de izquierda a derecha mirando el teclado tal y como se ve en la foto anterior. Cuando se presiona un pulsador se conecta una fila con una columna, teniendo en cuenta este hecho es muy fácil averiguar que tecla fue pulsada. También podemos ver el conexionado típico con el puerto B del µC PIC.     
Las resistencias de 2k2 son necesarias para poder compartir el puerto del pic independientemente del teclado y por ejemplo poder conectar un LCD o una barra de leds al mismo tiempo. Durante la fase de lectura del teclado la mitad de la puerta B es configurada como entrada y la otra mitad como lectura y durante la escritura en el lcd o otro sistema, la puerta B es configurada como salidas. Entonces se podrían cortocircuitar accidentalmente las salidas de los puertos provocando su destrucción, si pulsásemos alguna tecla es ese momento con lo que al poner estas resistencias evitamos este hecho y así si se produjera el cortocircuito tan solo circularía una pequeña corriente y el puerto del µC no correría ningún riesgo.

Ahora para saber que tecla esta siendo pulsada necesitamos escanear el teclado, y esto se consigue mediante la siguiente rutina que consiste en ir poniendo una a una las líneas RB0 a RB3 (conectadas a las filas del teclado) a nivel bajo ya que estas salidas tienen conectada la resistencia de polarización a Vcc y por lo tanto están siempre a nivel lógico alto. Cada vez que una fila se pone a nivel bajo se hacen 4 comprobaciones para ver si una de las cuatro columnas se a puesto a nivel bajo y así saber la tecla pulsada. Para ver la rutina aqui esta la pagina de donde he sacado la informacion ID a la seccion rutinas, apartado teclado matricial

La parte subrrayada no la entiendo mucho.. me la podeis explicar? y por utimo, el esquema de los pulsadores, es el mismo que el mio no? es decir estan bien conectados los pulsadores no?
ASIASSSSSSSS  y siento ser tan novato en esto Enfurruñado

Desconectado Gokuden

  • PIC16
  • ***
  • Mensajes: 100
RE: Duda tecladosmatriciales.....
« Respuesta #5 en: 30 de Enero de 2005, 15:46:00 »
es realmente facil!. fijate esta explicacion!.

cuando vayas a usar el teclado, configuras los pines donde esta conectado las filas como salida y las columnas como entradas!.

tu vas a crear una rutina de teclado que va a estar escaneando seguidamente los ptos donde esta conectado el teclado!

el asunto trabaja asi:

primero pones en alto el bit de la fila 1, y pregutas si te lee un alto en el bit columna 1, si  es te sales de la rutina de teclado y pones un "UNO" en el Work   o acumulador o en una variable que tu poseas o  como desees pero en el teclado apretaron un 1, sino es alto, preguntas por columna 2, si es te sales y es un dos, sino, preguntas por columna 3, si es es un 3. si no pones preguntas por la columna 4, si es es esa tecla, sino. bajas el bit de la fila 1 y levantas fila 2, y vuelves a levantar cada uno de los pines de las columnas pero ahora sera 4,5,6 y tecla adicional, etc etc. si no entiendes.. pregunta!!! te doy mas detalles.

Desconectado roc364

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 108
RE: Duda tecladosmatriciales.....
« Respuesta #6 en: 30 de Enero de 2005, 15:50:00 »
Ok, mallorca, a no desesperar, que no es tan complicado...
Si volvemos a tu planito, imaginate que tenes configurados los pines RB0 RB1 RB2 y RB3, como salidas, y los restantes como entradas.
Para leer el teclado tenes que hacer una rutina que vaya prendiendo de a una esas salidas, es decir , por ejemplo, prende la salida RB0 primero.
Aca, es cuando tenes que fijarte si alguna de las entradas (que estaban en cero 0) cambio a 1 uno, si es asi, es porque se presiono una tecla en la primer fila de botones, dado que solo hay positivo en RB0. Entonces ya sabemos que puede ser cualquier boton de la primer fila, luego viendo cual es la entrada que se puso a 1, digamos que fue la RB5, entonces ya esta, es el segundo boton de la primer fila.
(se entiende, no???)
Asi iremos "escaneando el teclado" digamos que cada 100 mseg prendemos una salida, luego otra, y asi y siempre leyendo las entradas luego de prender cada salida.

espero te sirva esta explicacion tan burda...  si tenes algun trozo de codigo ya hecho, lo podemos revisar entre todos y ver que pasa...
Saludos!!
Hay solo 10 tipos de personas, los que entienden el codigo binario, y los que no.

Viva La Patagonia Argentina!!

Desconectado roc364

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 108
RE: Duda tecladosmatriciales.....
« Respuesta #7 en: 30 de Enero de 2005, 15:52:00 »
Me ganaste Gokuden!!!
jejejej
Hay solo 10 tipos de personas, los que entienden el codigo binario, y los que no.

Viva La Patagonia Argentina!!

Desconectado mallorca_vale

  • PIC10
  • *
  • Mensajes: 17
RE: Duda tecladosmatriciales.....
« Respuesta #8 en: 31 de Enero de 2005, 07:38:00 »
Gracias a los 2, creo que estoy pillando el como va... la parte de software aun no la tenemos empezada, porque entre toda la clase estamos montando un entrenador/programador para el pic 16f877 y a mi me he tocado la parte de teclados, ahora estoy con lo del hexadecimal... y por lo que dice el profesor, le gustaria acabar configurando el teclado de forma que sea como los de moviles, es decir, que a un  boton le correspondan 3 letras, la abc, a otro otras tres, y asi sucesivamente, para poder mandar la informacion a un LCD.. y bueno, antes de ponerme con la parte de software, que por cierto no llevo muy bien Llorando mas bien, llevo mu mal Llorica queria tener sabido el funcionamiento de hardware.... pero eso si... no os preocupeis que seguro que tengo muchas dudas durante el proyecto ^^

Bueno, muchas gracias, y siento ser tan NOVATO en esto Enfurruñado pero apenas llevamos unos meses con pics, y se nos acaba el tiempo de clase... y bueno... tp es que hallamos dado mucho... pero weno es cuestion de ponerse un poco cada dia XD

Desconectado jdj

  • PIC10
  • *
  • Mensajes: 37
RE: Duda tecladosmatriciales.....
« Respuesta #9 en: 08 de Marzo de 2005, 03:25:00 »
Hola yo estoy haciendo las rutinas de control tanto de un teclado matricial como de una lcd en lenguaje C. Las rutinas en ensamblador son las que acontinuación muestro,pero necesito el programa en C.Vacilando
;LCD_CXX.ASM


;El conjunto de rutinas que se presentan a continuaci¢n permiten realizar
;las tareas básicas de control del m¢dulo de visualizaci¢n LCD. Se emplean
;con los PIC 16cxx. En el programa principal se deber  reservar memoria
;para el bloque de variables que utiliza el LCD del modo:
; LCD_VAR EQU dir_inicio_del_bloque

;BLOQUE DE ETIQUETAS


#define ENABLE bsf PORTA,2 ;Activa E
#define DISABLE bcf PORTA,2 ;Desactiva
#define LEER bsf PORTA,1 ;Pone LCD en Modo RD
#define ESCRIBIR bcf PORTA,1 ;Pone LCD en Modo WR
#define OFF_COMANDO bcf PORTA,0 ;Desactiva RS (modo comando)
#define ON_COMANDO bsf PORTA,0 ;Activa RS (modo datos)
CBLOCK LCD_VAR
LCD_TEMP_2 ;Inicio de las variables. Ser  la primera direcci¢n libre
; disponible
LCD_TEMP_1
ENDC


;RUTINA UP_LCD: Con esta rutina se configura el PIC para que trabaje con el LCD.


UP_LCD bsf STATUS,RP0 ;Banco 1
clrf PORTB ;RB <0-7> salidas digitales
clrf PORTA ;RA <0-4> salidas digitales
bcf STATUS,RP0 ;Banco 0
OFF_COMANDO ;RS=0
DISABLE ;E=0
return


;RUTINA LCD_BUSY: Con esta rutina se chequea el estado del
;flag BUSY del m¢dulo LCD, que indica, cuando est  activado, que el
;m¢dulo a£n no ha terminado el comando anterior. La rutina espera a
;que se complete cualquier comando anterior antes de retornar al
;programa principal, para poder enviar un nuevo comando.


LCD_BUSY LEER ;Pone el LCD en Modo RD
bsf STATUS,RP0
movlw H"FF"
movwf PORTB ;Puerta B como entrada
bcf STATUS,RP0 ;Selecciona el banco 0
ENABLE ;Activa el LCD
nop
L_BUSY btfsc PORTB,7 ;Chequea bit de Busy
goto L_BUSY
DISABLE ;Desactiva LCD
bsf STATUS,RP0
clrf PORTB ;Puerta B salida
bcf STATUS,RP0
ESCRIB ;Pone LCD en modo WR
return


;RUTINA LCD_E: Se trata de una peque¤a rutina que se encarga de generar
;un impulso de 1æ s (para una frecuencia de funcionamiento de 4 Mhz)
;por la patita de salida de la Puerta A RA2, que se halla conectada
;a la se¤al E (Enable) del m¢dulo LCD. Con esta rutina se pretende activar
;al m¢dulo LCD.


LCD_E ENABLE ;Activa E
nop
DISABLE ;Desactiva E
return


;RUTINA LCD_DATO: Es una rutina que pasa el contenido cargado en el
;registro W, el cual contiene un car cter ASCII, a la PUERTA B, para
;visualizarlo por el LCD o escribirlo en la CGRAM.


LCD_DATO OFF_COMANDO ;Desactiva RS (modo comando)
movwf PORTB ;Valor ASCII a sacar por PORTB
call LCD_BUSY ;Espera a que se libere el LCD
ON_COMANDO ;Activa RS (modo dato)
call LCD_E ;Genera pulso de E
return


;RUTINA LCD_REG: Rutina parecida a la anterior, pero el contenido de W
;ahora es el c¢digo de un comando para el LCD, que es necesario pasar
;tambi‚n a la PUERTA B para su ejecuci¢n.


LCD_REG OFF_COMANDO ;Desactiva RS (modo comando)
movwf PORTB ;C¢digo de comando
call LCD_BUSY ;LCD libre?.
call LCD_E ;S¡. Genera pulso de E.
return


;RUTINA LCD_INI: Esta rutina se encarga de realizar la secuencia de
;inicializaci¢n del m¢dulo LCD de acuerdo con los tiempos dados por
;el fabricante (15 ms). Se especifican los valores de DL, N y F,
;as¡ como la configuraci¢n de un interfaz de 8 l¡neas con el bus
;de datos del PIC, y 2 l¡neas de 16 caracteres de 5 x 7 pixels.


LCD_INI movlw b"00111000"
call LCD_REG ;C¢digo de instrucci¢n
call LCD_DELAY ;Temporiza
movlw b"00111000"
call LCD_REG ;C¢digo de instrucci¢n
call LCD_DELAY ;Temporiza
movlw b"00111000"
call LCD_REG ;C¢digo de instrucci¢n
call LCD_DELAY ;Temporiza
return


;RUTINA BORRA_Y_HOME: Borra el display y retorna el cursor a la posici¢n 0.


BORRA_Y_HOME movlw b"00000001" ;Borra LCD y Home.
call LCD_REG
return


;RUTINA DISPLAY_ON_CUR_OFF: Control del display y cursor.
;Activa el display y desactiva es cursor

DISPLAY_ON_CUR_OFF movlw b"00001100" ;LCD on, cursor off.
call LCD_REG
return


;RUTINA LCD_DELAY: Se trata de un rutina que implementa un retardo
;o temporizaci¢n de 5 ms. Utiliza dos variables llamadas LCD_TEMP_1
;y LCD_TEMP_2, que se van decrementando hasta alcanzar dicho tiempo.


LCD_DELAY clrwdt
movlw 10
movwf LCD_TEMP_1
clrf LCD_TEMP_2
LCD_DELAY_1 decfsz LCD_TEMP_2,F
goto LCD_DELAY_1
decfsz LCD_TEMP_1,F
goto LCD_DELAY_1
return

TECLADO.ASM


;Conjunto de rutinas para el manejo del teclado.
;No es un programa en s¡ mismo. Para utilizarlo hay que
;colocar en el programa principal:
;KEY_VAR EQU dir_inicio_del_bloque

;BLOQUE DE ETIQUETAS


CBLOCK KEY_VAR ;Inicio de las variables
TECLA ;Retorno del c¢digo de tecla
KEY_1 ;N§ de filas a explorar
KEY_2 ;Temporal de c¢digo
KEY_DELAY_1 ;Variable de temporizaci¢n
KEY_DELAY_2 ;Variable de temporizaci¢n
ENDC


;RUTINA KEY_SCAN: Rutina de exploraci¢n del teclado. La variable
;"Tecla" retorna con el c¢digo de la tecla pulsada o el c¢digo 0x80
;si no se pulsa ninguna.


KEY_SCAN bsf STATUS,RP0 ;Selecciona p gina 1
movlw b"00001111"
movwf PORTB ;RB7-RB4 salidas, RB3-RB0 entradas
bsf OPTION_REG,NOT_RBPU ;Activa cargas pull-up
bcf STATUS,RP0 ;Selecciona p gina 0
movlw 4
movwf KEY_1 ;N§ de columnas a explorar
movlw b"01111111"
movwf TECLA ;Columna a activar
KEY_SCAN_1 movf TECLA,W
movwf PORTB ;Activa fila
nop
movf PORTB,W
movwf KEY_2
subwf TECLA,W ;Lee las columnas
btfss STATUS,Z ;Hay alguna pulsada ?
goto KEY_SCAN_2 ;Si hay alguna pulsada
bsf STATUS,C ;No hay ninguna en esa fila
rrf TECLA,F ;Selecciona siguiente fila
decfsz KEY_1,F ;Salta si se han terminado las filas
goto KEY_SCAN_1
movlw 0x80
goto VOLVER ;Retorna c¢digo 0x80 (no hay pulsaci¢n)

KEY_SCAN_2 movlw .100 ;Bucle de temporizaci¢n de unos 20 ms
movwf KEY_DELAY_1 ;para evitar el rebote de los pulsadores
KEY_SCAN_3 clrf KEY_DELAY_2
clrwdt
KEY_SCAN_4 decfsz KEY_DELAY_2,F
goto KEY_SCAN_4
decfsz KEY_DELAY_1,F
goto KEY_SCAN_3
movf TECLA,W ;Tras la temporizaci¢n se lee nuevamente
movwf PORTB ;si la tecla es la misma. As¡ se
nop ;evitan los rebotes.
movf PORTB,W
subwf KEY_2,W
btfss STATUS,Z ;Es la misma ??
goto KEY_SCAN_1 ;No, seguir con la exploraci¢n
movf KEY_2,W ;S¡, guardar en variable de salida TECLA el valor
; recogido
VOLVER movwf TECLA
return ;Fin de exploraci¢n

;RUTINA KEY_HEX: Convierte el c¢digo de tecla que haya en la variable
;"Tecla" a Hex. (0-F). El resultado se devuelve en la variable "Tecla".
;Usa como rutina auxiliar Key_tabla

KEY_TABLA movf KEY_1,W
addwf PCL,F ;Calcula desplazamiento
retlw 0x7D ;0
retlw 0xEE ;1
retlw 0xED ;2
retlw 0xEB ;3
retlw 0xDE ;4
retlw 0xDD ;5
retlw 0xDB ;6
retlw 0xBE ;7
retlw 0xBD ;8
retlw 0xBB ;9
retlw 0x7E ;A
retlw 0x7B ;B
retlw 0x77 ;C
retlw 0xB7 ;D
retlw 0xD7 ;E
retlw 0xE7 ;F

KEY_HEX movf TECLA,W
movwf KEY_2 ;Almacena el c¢digo temporalmente
clrf KEY_1 ;Contador HEX a 0
KEY_HEX_2 call KEY_TABLA ;Busca c¢digo en la tabla
subwf KEY_2,W ;Compara con el de la tecla
btfsc STATUS,Z ;Coincide ?
goto KEY_HEX_1 ;S¡
incf KEY_1,F ;No, incrementa contador HEX
goto KEY_HEX_2
KEY_HEX_1 movf KEY_1,W
movwf TECLA ;Carga contador HEX en la variable de salida
return




;RUTINA HEX_7SEG: Rutina de conversi¢n de HEX (0-F) a 7 segmentos.
;El acumulador W contiene, durante la llamada, el c¢digo HEX y, al retornar,
;el correspondiente a 7 segmentos


HEX_7SEG andlw b"00001111"
addwf PCL,F ;Desplazamiento sobre la tabla
retlw b"00111111" ;0
retlw b"00000110" ;1
retlw b"01011011" ;2
retlw b"01001111" ;3
retlw b"01100110" ;4
retlw b"01101101" ;5
retlw b"01111101" ;6
retlw b"00000111" ;7
retlw b"01111111" ;8
retlw b"01100111" ;9
retlw b"01110111" ;A
retlw b"01111100" ;B
retlw b"00111001" ;C
retlw b"01011110" ;D
retlw b"01111001" ;E
retlw b"01110001" ;F


gracias por tu aportación.


 

anything