TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: cortocircuito en 16 de Julio de 2004, 01:04:00
-
Hola a todos, estoy comenzando pequeño proyecto de practicas y me gustaría hacerlo con un teclado 4x4 y un LCD de 16x2, el mayor problema es que estoy empezando con PBP y no tengo ni idea de por donde empezar, agradeceria una pequeña ayuda, muchas gracias de antemano.
Saludos.
-
hola cortocircuito
mira he intentado hacer una cerradura electronica utilizando estos dos elementos pero no he podido si tu sabes algo me podrias ayudar????
bye
leo
-
Hola leo, veo que ya somos dos con un problema muy parecido, estoy intentando introducir una cantidad por teclado, visualizarla en el LCD y enviarla a un motor paso a paso para decirle cuantos pasos debe realizar, creo que debemos esperar a que algún amable compañero del foro nos pueda ayudar. Si consigo alguna información ya te comentaré.
Saludos,
Cortocircuito.
-
hola a todos
yo trabaje hace como 3 anos en varios tipos de programas con cerradura electronica basandome en el pic 16f84 una lcd 16x2 y un teclado 4x4, encontre un programa en en el libro microcontroladores
pic diseno practico,y aplicaciones es el que es azul y creo que es la primera edicion y se comercia al fondo de esta misma pagina.
viene con un CD y tiene varios programas pero con algunos errores
intencionares para que el estudiante los corrija.
voy a tratar de subir los programas correjidos ya que son 3, uno es el de control de la LCD el otro del teclado 4X4 y el programa pricipal que puede ser cambiado para cuarquiel uso.
saludos desde Rep. Dom.

-
estos son los asm de la lcd del teclado y la cerradula

no puedo subirlo el folo no me deja lo voy a poner en el almacen
tampoco en el almacen lo pongo aqui mismo
tanpoco me deja ponerlo aqui se lo mando por privado.
gracias miltonmc
-
Hola Miltonmc, he recibido tu archivo y creo que al final alguien conseguirá que aprenda asembler, la verdad es que soy novato y no tengo ni idea de asembler.
Dado que alguien se ha tomado la molestia de ayudarme, lo intentaré, solamente por el hecho de aprender y poder ayudar en alguna ocasión a cualquie miembro del foro.
Me costará pero al final lo aprenderé, dame un poco de tiempo y te contestaré como ha salido todo. Muchisimas gracias por tu ayuda.
Saludos,
Cortocircuito.
-
Hola a todos; esta es una idea de como leer un teclado matricial de 3 x 4
aux var word
num var word
leds:gosub leetec
if num=1 then high porta.0
if num=2 then high porta.1
if num=3 then high porta.2
if num=4 then high porta.3
pause 1000
low porta.0 :low porta.1 :low porta.2 :low porta.3
goto leds
leetec:high portb.3 :low portb.4 :low portb.5 : low portb.6 : aux=0 : num=0
gosub columna
low portb.3 : high portb.4 : aux=3
gosub columna
low portb.4 : high portb.5 : aux=6
gosub columna
low portb.5 : high portb.6 : aux=9
gosub columna
if num=0 then leetec
return
columna:if (portb.0=0) and (portb.1=0) and (portb.2=0) then return
if portb.0=1 then num=aux+1
if portb.1=1 then num=aux+2
if portb.2=1 then num=aux+3
return
Y ESTE PARA MANDAR DATOS A UN LCD DE 2 X 16
ASM
device pic16F628a, intrc_osc, wdt_off, mclr_off, lvp_off, protect_off, pwrt_off
ENDASM
"Configuracion de los registros
CMCON = %00000111 "anula los comparadores
INTCON = %00000000 "desabilitacion general de las interrupciones (RB0 queda como I/O)
RCSTA[7]= 0 "desabilita el port serial,RB1 y RB2 quedan como I/O
CCP1CON = %00000000 "desabilita captura/compare/PWM , RB3 queda como I/O
TXSTA[5]= 0 "desabilita la transmicion USART(creo que no hace falta, ver dos lineas arriba)
define lcd_bits 4
define lcd_lines 2
i var byte
num var WORD
goto salto
Muestra: lcdout $fe,1 "BORRO EL DISPLAY
pause 1000
lcdout "Juan Manuel Cura" "ESCRIBO JUAN MANUEL CURA
pause 1000
lcdout $fe,1,"DE 192 A 223"
PAUSE 5000
lcdout $fe,1
for i=192 to 207 "ASI ESCIRBO EN ASCII
lcdout i
pause 1000
next i
salto: lcdout $fe,1
PAUSE 1000
num = 35
GOSUB lcd
PAUSE 1000
num= 54
GOSUB lcd
PAUSE 1000
num= 68
GOSUB lcd
PAUSE 1000
goto salto
Lcd: lcdout num
return
TAL VEZ LES SIRVA DE ALGO, A MODO DE EJEMPLO
-
Hola Juan, creo que has dado en el clavo, estoy aprendiendo a programar los Pic en PBP y para aprender como funcionan estos dispositivos de E/S quería hacerlo con una programación funcional y fácil de asimilar, lo que no quiere decir que abandone la idea de aprender en asembler, por supuesto que quiero aprender también.
Creo que el asembler se debe aprender cuando empiezas a conocer más fondo los Pic, hoy por hoy creo que aun no estoy preparado para entrar de lleno.
Muchísimas gracias por tu colaboración, creo que para un novato como yo los periféricos más complejos de manejar son los teclados, el LCD creo que es un poco más sencillo, digo yo.
Espero que estas practicas nos sirvan a más de uno.
Saludos,
Cortocircuito. 
Nota: Leobiofa ¿estas tomando nota de la ayuda de los compañeros de foro?.
-
Tambien puedes mirar en www.melabs.com
Tienes ejemplos cortos y muy ilustrativos de cómo actuar con estos dispositivos en PBP.
Saludos
Ricky
Madrid-España
-
Hola Ricky, Muchísimas gracias, sois estupendos. Disculpa que no me extienda mucho, hoy tengo poco tiempo, mañana pruebo algún ejemplo más en la dirección que me dices.
Saludos,
Cortocircuito.
-
hola cortocircuito
mira te cuento que he estado cachareando con ese teclado y me ha funcionado pero esta hecho en ensambler asi que si quieres te mando los ejemplos para que los mires.
-
hola ejm.-...
creo entender la rutina..., pero necesito saber como pongo el numero o los numeros que fueron pulsados en un display de 8x2...
Espero que me puedas contestar y te mando un abrazo..
Gracias...
Escrito originalmente por ejmc
Hola a todos; esta es una idea de como leer un teclado matricial de 3 x 4
aux var word
num var word
leds:gosub leetec
if num=1 then high porta.0
if num=2 then high porta.1
if num=3 then high porta.2
if num=4 then high porta.3
pause 1000
low porta.0 :low porta.1 :low porta.2 :low porta.3
goto leds
leetec:high portb.3 :low portb.4 :low portb.5 : low portb.6 : aux=0 : num=0
gosub columna
low portb.3 : high portb.4 : aux=3
gosub columna
low portb.4 : high portb.5 : aux=6
gosub columna
low portb.5 : high portb.6 : aux=9
gosub columna
if num=0 then leetec
return
columna:if (portb.0=0) and (portb.1=0) and (portb.2=0) then return
if portb.0=1 then num=aux+1
if portb.1=1 then num=aux+2
if portb.2=1 then num=aux+3
return
Y ESTE PARA MANDAR DATOS A UN LCD DE 2 X 16
ASM
device pic16F628a, intrc_osc, wdt_off, mclr_off, lvp_off, protect_off, pwrt_off
ENDASM
"Configuracion de los registros
CMCON = %00000111 "anula los comparadores
INTCON = %00000000 "desabilitacion general de las interrupciones (RB0 queda como I/O)
RCSTA[7]= 0 "desabilita el port serial,RB1 y RB2 quedan como I/O
CCP1CON = %00000000 "desabilita captura/compare/PWM , RB3 queda como I/O
TXSTA[5]= 0 "desabilita la transmicion USART(creo que no hace falta, ver dos lineas arriba)
define lcd_bits 4
define lcd_lines 2
i var byte
num var WORD
goto salto
Muestra: lcdout $fe,1 "BORRO EL DISPLAY
pause 1000
lcdout "Juan Manuel Cura" "ESCRIBO JUAN MANUEL CURA
pause 1000
lcdout $fe,1,"DE 192 A 223"
PAUSE 5000
lcdout $fe,1
for i=192 to 207 "ASI ESCIRBO EN ASCII
lcdout i
pause 1000
next i
salto: lcdout $fe,1
PAUSE 1000
num = 35
GOSUB lcd
PAUSE 1000
num= 54
GOSUB lcd
PAUSE 1000
num= 68
GOSUB lcd
PAUSE 1000
goto salto
Lcd: lcdout num
return
TAL VEZ LES SIRVA DE ALGO, A MODO DE EJEMPLO 
-
Hola Dr.MT.Brown

Nunca probe nada con un display de 8 caracteres, pero creo no necesitas cambiar nada, el caracter nº 9 te lo mostrara en en la segunda linea?
Para mostrar el numero pulsado en el teclado, deves de tener una variable en tu programa que almacene el numero y esa variable se la mandas al display con la instruccion LCDOUT
lcdout variable
Por casualidad te refieres a esto?
Ya me contaras
-
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. 
-
Gracias por tu respuesta..., lo pude hacer andar..., ahora el problema seria unificar las tres variables.., ya que deseo que exista un codigo de tres cifras que se guarde en una sola variable y luego publicar esta ultima en el display..., y ya probe con arrays de tres elementos..., pero no doy pie con bola...
Si alguien me puede ayudar se lo agradeceria mucho..


-
Hola Pablo, yo tambien tengo el mismo problema, estoy dandole vueltas a la cabeza y no se como introducir los números visualizados en una sola variable, espero que algun amable forista nos pueda contestar. Muchisimas gracias de anteano a todos.
Saludos, Cortocircuito.
-
Pueden porbar con un arreglo de variables (array creo)
seria asi
""clave var byte[3]""
y asi tienen un arreglo de 4 elementos
figence en el help que aparece