Hola Miltonmc, he recibido tu esquema del teclado y LCD, ya decía yo que me faltaba algo, en fin muchísimas gracias. Estoy buscando un hueco y cacharrear un poco con asm. De momento estoy practicando con PBP y quiero aprender a intercalar alguna subrutina en asm.
Hola RGL, he mirado en la dirección que me diste y encontré lo que buscaba, he realizado una pequeña modificación y ¡¡¡Funciona!!!. Muchas gracias.
Hola Ejmc, lo siento he intentado hacer funcionar mi placa con el código que me enviaste y no he podido hacerla funcionar, soy un poco torpe la verdad, en fin soy novato y cuando se sale uno de lo normal cuesta asimilarlo, mira que es sencillo el código.
Hola Leobiofa, supongo que será algo parecido o igual que lo que envió Miltonmc, de todas formas si me lo puedes enviar te lo agradecería, muchísimas gracias.
Voy a intentar poner adjunto el archivo PBP que descargué y las modificaciones hechas para un Pic 16F84A, el LCD está conectado a 4 Bits DB4...RB4 A DB7...RB7, DB0...DB3 A MASA, E...RA1, R/W...MASA, RS...RA0. El teclado fila 1 a 4...RB4 A RB7, columna 1 a 4...RB0 A RB3 con una resistencia de 2k2 intercalada en cada una de las líneas de las columnas.
"**************************************
"* Cambia las lineas de datos del LCD
"**************************************
DEFINE LCD_DREG PORTB "Declara el port de datos del LCD
DEFINE LCD_BITS 4 "Declara Tamaño del bus LCD 4 u 8 bits
DEFINE LCD_DBIT 4 "Declara el bit de comienzo de datos (0 o 4) si el bus es de 4 bit
DEFINE LCD_RSREG PORTA "Declara el port LCD register select y enable
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 1
DEFINE LCD_LINES 2 "Declara número de líneas del LCD
"****************************************************
"* Define las variables del teclado 4x4
"****************************************************
col var bYTE "Columna del teclado
row var bYTE "Fila del teclado
key var bYTE "Valor de tecla
b0 var byte
b1 var byte
"****************************************************
"* Inicio del programa y ejecución de comandos
"****************************************************
Pause 500 "Espera de arranque del LCD
GOSUB INICIO "Inicia el Proceso
INICIO:
gosub MENU_PRIN
PAUSE 250
GOTO INICIO
end
"****************************************************
"* Subrutinas de programa
"****************************************************
"****************************************************
"* Muestra el menú principal en el LCD
"****************************************************
MENU_PRIN: "ENTRADA DE DATOS POR TECLADO
Lcdout $fe, 1 " Borra LCD
Lcdout $fe, 2 " Vuelve al comienzo de la primera linea
Lcdout "FILA UNO: "
Lcdout $fe, $C0 " Mueve el cursor a la segunda linea
Lcdout "FILA DOS: "
gosub getkey
Lcdout $fe, 1 " Borra LCD
Lcdout $fe, 2 " Vuelve al comienzo de la primera linea
Lcdout "FILA UNO: ",key "#key
Pause 25
Lcdout $fe, $C0 " Mueve el cursor a la segunda linea
Lcdout "FILA DOS: "
Lcdout $fe, $C0 " Mueve el cursor a la segunda linea
gosub getkey
Lcdout "FILA DOS: ",key "#key
Key = 0
return
"****************************************************
"* Subrutinas de Entrada de datos mediante teclado 4x4 -2
"****************************************************
" Subroutine to get a key from keypad
getkey:
Poke OPTION_REG, 127 " Enable internal pullups on PORTB
b1 = 1
For row = 0 TO 3 " Loop for 4 rows in keypad
Poke PORTB, 0 " All output pins low
b0 = b1 ^ $ff " Prepare value with 0 in one bit
Poke TRISB, b0 " Set one row pin to output
Peek PORTB, b0 " Read column pins
col = b0 / 16 " Shift right 4 places
IF col <> $0F Then gotkey " Check if key is pressed
b1 = b1 * 2 " Shift left one place
Next row " Repeat for the next row
key = $FF " No keys down, set key to $FF
Return " Return to main loop
gotkey: " Change row and column to key number 0 - 15
Pause 15 " Debounce
" Wait for all keys up
Poke PORTB, 0 " All output pins low
Poke TRISB, $F0 " Least significant 4 pins out, top 4 pins in
Peek PORTB, b0 " Read column pins
b0 = b0 / 16 " Shift right 4 places
IF b0 <> $0F Then gotkey " If any keys down, loop
b0 = col^$0F " Invert the column data
b1 = 0 " Clear b1 for use as a loop counter
one_more:
b1 = b1 + 1 " Count loop iterations (represents highest bit set)
b0 = b0 / 2 " Shift b0 right on each loop
IF b0 <> 0 Then one_more " If b0 still has a logic high, try again
b0 = row * 4 " Combine row and column into one number
b0 = b0 + b1 - 1
"Opciones de lectura de las teclas:
"Opcin 1, devuelve el número de posición de la tecla.
"key=b0
"Opcin 2, devuelve el valor de la tecla según tabla.
LookUp b0, ["147A2580369BFEDC"], key " Convert key number into display value
Return
No he podidoadjuntar el archivo, lo pogo aquí mismo.
Saludos para todos, Cortocircuito.
