uControl
Agosto 01, 2014, 04:47:18 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
   Inicio   Ayuda Buscar Ingresar Registrarse  

La gente de Niple nos ofrece un descuento especial para usuarios de uControl.
Entérate de como puedes aprovechar esta oferta haciendo click aqui.

Súmate, y ayuda a uControl con tu participación en esta interesante oportunidad que nos oferece Niple.

Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: Ayuda con Teclado Matricial+LCD 2x16 con PIC16F877A  (Leído 8647 veces)
0 Usuarios y 1 Visitante están viendo este tema.
mundotronic
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 167



WWW
« : Septiembre 05, 2009, 01:02:36 »

Buenos dias  un muchachos, despues de una larga ausencia y volviendo a programar en PBP para estos integrados que nos solucionan la vida (a veces Grin), tengo una duda sobre un pequeño proyecto que estoy llevando a cabo y es el siguiente:

Estoy diseñando una maquina termoformadora semi-automatica (para trabajar con plasticos) y en el momento de realizar el panel de control decidi utilizar un PIC16F877A tanto para el control de un teclado matricial 4x3 (o 4x4, no lo tengo definido todavia) como para un LCD 2x16, algunos sensores de ranura, de temperatura y de vacio.
Estoy programando en PicBasic Pro.
Lo que quiero saber mas especificamente es como hacer que en el LCD, a medida que presiono una tecla en el teclado aparezca, por ejemplo, lo siguiente:

Supongamos que ingreso el numero 348 en el teclado entonces...

Presiono el 3
Linea1: "Numero ingresado:"
Linea2: " 3"

Presiono el 4
Linea1: "Numero ingresado:"
Linea2: " 34"

Presiono el 8
Linea1: "Numero ingresado:"
Linea2: " 348"

Cuando presione "#" por ejemplo que almacene ese numero ingresado de 3 digitos en una variable.

Aca dejo el codigo, hay partes que estan como comentario, pero si se les quita la camilla pueden verlo funcionar en proteus, esa parte funciona pero era solo para probar el teclado.


Código:
'****************************************************************
'*  Name    : TERMOFORMADORA.BAS                                *
'*  Author  : MUNDOTRONIC CNC                                   *
'*  Notice  : Copyright (c) 2009                                *
'*          : All Rights Reserved                               *
'*  Date    : 04/09/2009                                        *
'*  Version : 1.0                                               *
'*  Notes   : PROGRAMA PARA EL CONTROL DE MAQUINA TERMOFORMADORA*
'*          : SEMI-AUTOMATICA, BAJA Y MEDIA PRODUCCION          *
'****************************************************************
' Define LCD registers and bits
Define LCD_DREG PORTD
Define LCD_DBIT 0
Define LCD_RSREG PORTD
Define LCD_RSBIT 4
Define LCD_EREG PORTD
Define LCD_EBIT 5
DEFINE  LCD_RWREG   PORTD
DEFINE  LCD_RWBIT   6  
DEFINE  OSC         4

TRISA=%00000000
TRISB=%00011111

TRISE=%111

INTCON=%10010000 'INTERRUPCION POR RB0, E-STOP
ON INTERRUPT GOTO ESTOP

'VARIABLES PARA COLUMNAS Y FILAS DEL TECLADO
FIL1 VAR PORTB.1
FIL2 VAR PORTB.2
FIL3 VAR PORTB.3
FIL4 VAR PORTB.4
COL1 VAR PORTB.5
COL2 VAR PORTB.6
COL3 VAR PORTB.7

'VARIABLES PARA PROCESAR LOS DATOS INGRESADOS Y ACTUAR EN CONSECUENCIA
TECLA VAR BYTE          'TECLA PRESIONADA
THORNO VAR BYTE         'TIEMPO DE ENCENDIDO DEL HORNO
TVACIO VAR BYTE         'TIEMPO DE ENCENDIDO DE LA BOMBA DE VACIO
SWVACIO VAR PORTE.2     'SENSOR DE RANURA DE FINAL PARA LA BANDEJA, LADO MOLDE
SWHORNO VAR PORTE.1     'SENSOR DE RANURA DE FINAL PARA LA BANDEJA, LADO HORNO
SWMEDIO VAR PORTE.0     'SENSOR DE RANURA MEDIO PARA CARGA DE MATERIAL

D1 VAR BYTE         'PRIMER DIGITO
D2 VAR BYTE         'SEGUNDO DIGITO
D3 VAR BYTE         'TERCER DIGITO
B VAR BYTE          'BANDERA

B=0
D1=0
D2=0
D3=0
THORNO=0
TVACIO=0

PAUSE 500

Lcdout $fe, 1            ' LIMPIO LCD
PAUSE 100                      
LCDout " TERMOFORMADORA "
Lcdout $FE, $C0
LCDout "   VERSION 1.0"
PAUSE 2000
Lcdout $fe, 1            ' LIMPIO LCD
PAUSE 50
LCDout "Inicializando"
Lcdout $FE, $C0
LCDout "Espere..."
PAUSE 2000

TECLA="@"
PRINCIPAL:

lcdout $fe,1
lcdout "    * PARA"
LCDOUT $FE,$C0
LCDOUT "   CONFIGURAR"
pause 50

GOSUB TECLADO

'IF TECLA=10 THEN
'LCDOUT $FE,1
'GOSUB CONFIG
'ENDIF

'IF TECLA="#" THEN
'LCDOUT $FE,1            
'LCDOUT "TECLA PRESIONADA"
'LCDOUT $FE,$C0
'LCDOUT "       #"
'PAUSE 2000
'TECLA="@"
'ENDIF

'IF TECLA="*" THEN
'LCDOUT $FE,1            
'LCDOUT "TECLA PRESIONADA"
'LCDOUT $FE,$C0
'LCDOUT "       *"
'PAUSE 2000
'TECLA="@"
'ENDIF

'IF TECLA<>"@" AND TECLA<>10 AND TECLA<>12 THEN
'LCDOUT $FE,1            
'LCDOUT "TECLA PRESIONADA"
'LCDOUT $FE,$C0
'LCDOUT "       ", DEC TECLA
'PAUSE 2000
'TECLA="@"
'ENDIF
gosub config

GOTO PRINCIPAL

'RECORRIDA DEL TECLADO PARA DETECTAR QUE TECLA FUE PRESIONADA
TECLADO:
HIGH COL1
IF FIL1=1 THEN TECLA=1
IF FIL2=1 THEN TECLA=4
IF FIL3=1 THEN TECLA=7
IF FIL4=1 THEN TECLA="*"

LOW COL1                  
HIGH COL2
IF FIL1=1 THEN TECLA=2
IF FIL2=1 THEN TECLA=5
IF FIL3=1 THEN TECLA=8
IF FIL4=1 THEN TECLA=0
LOW COL2

HIGH COL3
IF FIL1=1 THEN TECLA=3
IF FIL2=1 THEN TECLA=6
IF FIL3=1 THEN TECLA=9
IF FIL4=1 THEN TECLA="#"
LOW COL3

RETURN

'RUTINA PARA CONFIGURACION DE TIEMPOS DE CALENTAMIENTO Y BOMBA DE VACIO
CONFIG:
LCDOUT $FE,1
LCDOUT "TIEMPO HORNO?"
LCDOUT $FE,$C0
LCDOUT $FE, $0E

GOSUB TECLADO
IF TECLA<>"@" AND TECLA<>10 AND TECLA<>12 THEN
IF B=0 THEN D1=TECLA
IF B=1 THEN D2=TECLA
IF B=2 THEN D3=TECLA
B=B+1
TECLA="@"
D1=D1*100
D2=D2*10
THORNO=D1+D2+D3
LCDOUT "    ", DEC THORNO
LCDOUT $FE, $14
ENDIF
GOTO CONFIG


DISABLE
'INTERRUPCION POR RB0 SI SE PRESIONA LA PARADA DE EMERGENCIA
ESTOP:

WHILE PORTB.0=1
LCDOUT $FE,1
LCDOUT "E-STOP ACTIVADO"
PAUSE 1000
WEND
RESUME
ENABLE
END

Espero que alguno de los genios me pueda dar una mano, tengan en cuenta que hace muy poco empece con el tema de los microcontroladores y obviamente no soy experto, por lo tanto seguramente encontraran errores o cosas por mejorar en el codigo, ya que esta hecho a modo de prueba.


Saludos y gracias de antemano! rolleyes2



EDITO: Dejo la simulacion en Proteus por si ayuda.

* Termoformadora - PIC16F877A - 4MHZ.DSN (88.16 KB - descargado 441 veces.)
En línea

Emiliano
Moderador
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 877


'67 Caprice


« Respuesta #1 : Septiembre 05, 2009, 02:15:34 »

Hola mundotronic,
podes, por ejemplo, correr el La posicion del cursor un lugar despues de que escribis un numero en el LCD asi el siguiente lo al lado del digito anterior.
Si no tambien podes guardar el valor en la variable y mostrarlo cada vez, quizas te sea mas sencillo pero te va a generar un parpadeo en el display.
Saludos  Wink
En línea
mundotronic
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 167



WWW
« Respuesta #2 : Septiembre 05, 2009, 03:22:04 »

Gracias Fluf por la respuesta, yo lo que hago es multiplicar el primer digito por 100 (centenas), el segundo por 10 (decenas) y por ultimo sumar el resultado de cada digito, D1+D2+D3 y de esta manera quedaria formado el numero en la variable y mostrada en el LCD. Pero cuando lo simulo no lo hace, solo destella mostrando "Tiempo Horno?" en la primer linea.

Alguna otra sugerencia?.

Saludos y gracias! rolleyes2
En línea

mundotronic
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 167



WWW
« Respuesta #3 : Septiembre 05, 2009, 04:17:56 »

Solucionado en gran parte, aca dejo el codigo por si a alguien le interesa o le es util para algun proyecto. El codigo lee un teclado 4x3 y muestra cada digito que se presione en el lcd, es simple... es CLARO  Idiota


Código:
'****************************************************************
'*  Name    : TERMOFORMADORA.BAS                                *
'*  Author  : MUNDOTRONIC CNC                                   *
'*  Notice  : Copyright (c) 2009                                *
'*          : All Rights Reserved                               *
'*  Date    : 04/09/2009                                        *
'*  Version : 1.0                                               *
'*  Notes   : PROGRAMA PARA EL CONTROL DE MAQUINA TERMOFORMADORA*
'*          : SEMI-AUTOMATICA, BAJA Y MEDIA PRODUCCION          *
'****************************************************************
' Define LCD registers and bits
Define LCD_DREG PORTD
Define LCD_DBIT 0
Define LCD_RSREG PORTD
Define LCD_RSBIT 4
Define LCD_EREG PORTD
Define LCD_EBIT 5
DEFINE  LCD_RWREG   PORTD
DEFINE  LCD_RWBIT   6   
DEFINE  OSC         4

TRISA=%00000000
TRISB=%00011111

TRISE=%111

'VARIABLES PARA COLUMNAS Y FILAS DEL TECLADO
FIL1 VAR PORTB.1
FIL2 VAR PORTB.2
FIL3 VAR PORTB.3
FIL4 VAR PORTB.4
COL1 VAR PORTB.5
COL2 VAR PORTB.6
COL3 VAR PORTB.7

'VARIABLES PARA PROCESAR LOS DATOS INGRESADOS Y ACTUAR EN CONSECUENCIA
TECLA VAR BYTE          'TECLA PRESIONADA
THORNO VAR BYTE         'TIEMPO DE ENCENDIDO DEL HORNO
TVACIO VAR BYTE         'TIEMPO DE ENCENDIDO DE LA BOMBA DE VACIO
SWVACIO VAR PORTE.2     'SENSOR DE RANURA DE FINAL PARA LA BANDEJA, LADO MOLDE
SWHORNO VAR PORTE.1     'SENSOR DE RANURA DE FINAL PARA LA BANDEJA, LADO HORNO
SWMEDIO VAR PORTE.0     'SENSOR DE RANURA MEDIO PARA CARGA DE MATERIAL

D1 VAR BYTE         'PRIMER DIGITO
D2 VAR BYTE         'SEGUNDO DIGITO
D3 VAR BYTE         'TERCER DIGITO
B VAR BYTE          'BANDERA

B=0
D1=0
D2=0
D3=0
THORNO=0
TVACIO=0

PAUSE 500

Lcdout $fe, 1             ' LIMPIO LCD
PAUSE 100                       
LCDout " TERMOFORMADORA "
Lcdout $FE, $C0
LCDout "   VERSION 1.0"
PAUSE 2000
Lcdout $fe, 1             ' LIMPIO LCD
PAUSE 50
LCDout "Inicializando"
Lcdout $FE, $C0
LCDout "Espere..."
PAUSE 2000

TECLA="@"
LCDOUT $FE, 1
LCDOUT $FE,$0F
PRINCIPAL:
GOSUB TECLADO

if tecla<>"@"  then
if tecla="*" or tecla ="#" then
LCDOUT TECLA
LCDOUT $FE,$14
TECLA="@"
PAUSE 10
else
lcdout dec TECLA
LCDOUT $FE,$14
TECLA="@"
PAUSE 10
endif
ENDIF
LCDOUT $FE,$10
GOTO PRINCIPAL

'RECORRIDA DEL TECLADO PARA DETECTAR QUE TECLA FUE PRESIONADA
TECLADO:
HIGH COL1
IF FIL1=1 THEN TECLA=1
PAUSE 10
IF FIL2=1 THEN TECLA=4
PAUSE 20
IF FIL3=1 THEN TECLA=7
PAUSE 20
IF FIL4=1 THEN TECLA="*"
PAUSE 20
LOW COL1                 

HIGH COL2
IF FIL1=1 THEN TECLA=2
PAUSE 20
IF FIL2=1 THEN TECLA=5
PAUSE 20
IF FIL3=1 THEN TECLA=8
PAUSE 20
IF FIL4=1 THEN TECLA=0
LOW COL2
PAUSE 20

HIGH COL3
IF FIL1=1 THEN TECLA=3
PAUSE 20
IF FIL2=1 THEN TECLA=6
PAUSE 20
IF FIL3=1 THEN TECLA=9
PAUSE 20
IF FIL4=1 THEN TECLA="#"
LOW COL3
pause 10

IF TECLA<>"@" THEN
RETURN
ELSE
GOTO TECLADO
ENDIF

Pueden simularlo con el mismo archivo de Proteus que esta en la primer entrada.
Voy a seguir con esto a ver que tal me va y cualquier duda sigo preguntando.


Saludos! rolleyes2
En línea

Emiliano
Moderador
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 877


'67 Caprice


« Respuesta #4 : Septiembre 05, 2009, 07:17:55 »

Era exactamente lo que te iba a sugerir, usar una variable para cada digito y luego sumarlas, en una nueva variable o sobre alguna de ellas.
Veo que lo has resuelto con exito.
Saludos y suerte con esa termoformadora  Wink
« Última modificación: Septiembre 05, 2009, 07:20:14 por El fluf » En línea
mundotronic
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 167



WWW
« Respuesta #5 : Septiembre 06, 2009, 01:33:42 »

Gracias muchachos por la ayuda, en cuanto tenga algo mas avanzado voy colocando el codigo aca por si a alguien le llega a ser util.

Saludos! rolleyes2
En línea

minssss
PIC10F
*
Desconectado Desconectado

Mensajes: 3


« Respuesta #6 : Noviembre 08, 2009, 10:14:30 »

hola estoy haciendo una calculadora con las operaciones basicas de cuatro digitos pero cuando coloco la operacio con el resultado mas grande 9999*9999 me da 37 mil lo cual no es correcto, lo mismo ocurre con operaciones de resultados muy altos, donde guardo la multiplicacion es una variable de tipo word lo estoy haciendo en picbasic que puedo hacer, estare agradecido saludos
En línea
mundotronic
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 167



WWW
« Respuesta #7 : Diciembre 07, 2009, 02:02:32 »

hola minssss, es raro que te de 37000 porque deberia darte una relacion con la capacidad de una variable word y el resto de esa division.
De todas maneras, puedes poner el codigo para entender y poder ayudarte?.
Saludos!
En línea

geronimox
Moderator
PIC18F
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 1175



WWW
« Respuesta #8 : Diciembre 07, 2009, 06:16:28 »

hola estoy haciendo una calculadora con las operaciones basicas de cuatro digitos pero cuando coloco la operacio con el resultado mas grande 9999*9999 me da 37 mil lo cual no es correcto, lo mismo ocurre con operaciones de resultados muy altos, donde guardo la multiplicacion es una variable de tipo word lo estoy haciendo en picbasic que puedo hacer, estare agradecido saludos

9999 * 9999 = 99980001
Pero si usas variables de 16 bits (max=65536), entonces el resultado se trunca a 16 bits, por lo tanto
99980001 mod 65536 = 37601
Solucion? Usa variables mas grandes que 16 bits, como double word.
En línea

Gero. Divide & Conquer.>----.
^-------------------------------|
-'-------------------------------'
mundotronic
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 167



WWW
« Respuesta #9 : Diciembre 08, 2009, 04:15:13 »

Ahi tenes minssss lo que te decia yo en numeros, tiene que ser doble word o encararlo de a digitos y guardar cada uno en una variable y despues mostrar todo junto, igualmente vas a necesitar double word.

Saludos. rolleyes2
En línea

Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.19 | SMF © 2011, Simple Machines
SMFAds for Free Forums
XHTML 1.0 válido! CSS válido!
Página creada en 0.145 segundos con 30 consultas. (Pretty URLs adds 0.023s, 3q)