Autor Tema: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A  (Leído 9922 veces)

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

Desconectado cortocircuito

  • PIC10
  • *
  • Mensajes: 11
Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« 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.

Desconectado leobiofa

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 371
RE: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« Respuesta #1 en: 16 de Julio de 2004, 07:23:00 »
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

Desconectado cortocircuito

  • PIC10
  • *
  • Mensajes: 11
RE: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« Respuesta #2 en: 16 de Julio de 2004, 16:54:00 »
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.

Desconectado miltonmc

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 307
RE: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« Respuesta #3 en: 17 de Julio de 2004, 17:41:00 »
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.

Desconectado miltonmc

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 307
RE: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« Respuesta #4 en: 18 de Julio de 2004, 00:10:00 »
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

Desconectado cortocircuito

  • PIC10
  • *
  • Mensajes: 11
RE: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« Respuesta #5 en: 18 de Julio de 2004, 17:40:00 »
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.

Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
RE: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« Respuesta #6 en: 19 de Julio de 2004, 00:22:00 »
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

Desconectado cortocircuito

  • PIC10
  • *
  • Mensajes: 11
RE: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« Respuesta #7 en: 19 de Julio de 2004, 18:35:00 »
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?.




Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« Respuesta #8 en: 20 de Julio de 2004, 06:57:00 »
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

Desconectado cortocircuito

  • PIC10
  • *
  • Mensajes: 11
RE: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« Respuesta #9 en: 20 de Julio de 2004, 18:18:00 »
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.

Desconectado leobiofa

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 371
RE: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« Respuesta #10 en: 23 de Julio de 2004, 14:35:00 »
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.


Desconectado Dr.MT.Brown

  • PIC10
  • *
  • Mensajes: 13
RE: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« Respuesta #11 en: 24 de Julio de 2004, 07:23:00 »
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

Desconectado ejmc

  • PIC18
  • ****
  • Mensajes: 311
RE: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« Respuesta #12 en: 24 de Julio de 2004, 11:54:00 »
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

Desconectado cortocircuito

  • PIC10
  • *
  • Mensajes: 11
RE: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« Respuesta #13 en: 27 de Julio de 2004, 17:01:00 »
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.

Desconectado Dr.MT.Brown

  • PIC10
  • *
  • Mensajes: 13
RE: Prácticas de teclado 4x4 y LCD 16x2 con Pic 16f84A
« Respuesta #14 en: 28 de Julio de 2004, 08:11:00 »
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..