Autor Tema: Rutina LCD 4 Bits  (Leído 34426 veces)

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

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Rutina LCD 4 Bits
« Respuesta #75 en: 21 de Julio de 2006, 06:55:33 »
Picto debo estar quedandome ciego :D, no veo el archivo

Que tonto... :(

Te adjunto los archivos.

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Rutina LCD 4 Bits
« Respuesta #76 en: 21 de Julio de 2006, 07:05:22 »
Manofwar, al compilar el asm. Me dá error en 2 líneas del LCD_MENS... y es justamente aquí:

LCD_Mensaje
   movwf   LCD_ApuntaCaracter   ; Posición del primer carácter del mensaje.
   movlw   Mensajes      ; Halla la posición relativa del primer carácter
   subwf   LCD_ApuntaCaracter,F   ; del mensaje respecto de etiqueta "Mensajes".
   decf   LCD_ApuntaCaracter,F   ; Compensa la posición que ocupa "addwf PCL,F".
LCD_VisualizaOtroCaracter
   movf   LCD_ApuntaCaracter,W
   call   Mensajes      ; Obtiene el código ASCII del carácter apuntado.
   movwf   LCD_ValorCaracter   ; Guarda el valor de carácter.
   movf   LCD_ValorCaracter,F   ; Lo único que hace es posicionar flag Z. En caso
   btfsc   STATUS,Z      ; que sea "0x00", que es código indicador final   
   goto   LCD_FinMensaje   ; de mensaje, sale fuera.
LCD_NoUltimoCaracter
   call   LCD_Caracter   ; Visualiza el carácter ASCII leído.
   incf   LCD_ApuntaCaracter,F   ; Apunta a la posición del siguiente carácter
   goto   LCD_VisualizaOtroCaracter ; dentro del mensaje.
LCD_FinMensaje
   return            ; Vuelve al programa principal.

El Fallo lo dá en la línea donde pone movlw   Mensajes, yo creo que ahora tengo bien el ASM, pero la librería tendría que retocarla no? Porque dentro de la etiqueta Mensajes hasta FinMensajes hay tablas en diferentes pagínas no?

Saludos

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Rutina LCD 4 Bits
« Respuesta #77 en: 21 de Julio de 2006, 08:31:44 »
Maunix, que es eso de macros?

Es una forma de 'repetir código' de una forma mas legible, versátil y veloz.

Si por ejemplo necesitas hacer

Código: ASM
  1. movlw   .20
  2.         movwf   TEMP1
  3.         call    SUBRUTINA1
  4.         movlw   .21
  5.         movwf   TEMP1
  6.         call    SUBRUTINA1
  7.         movlw   .30
  8.         movwf   TEMP1
  9.         call    SUBRUTINA1
  10.         movlw   .32
  11.         movwf   TEMP1
  12.         call    SUBRUTINA1
  13.         movlw   .33
  14.         movwf   TEMP1
  15.         call    SUBRUTINA1
  16.         movlw   .34
  17.         movwf   TEMP1
  18.         call    SUBRUTINA1
  19.         movlw   .36
  20.         movwf   TEMP1
  21.         call    SUBRUTINA1
  22.         movlw   .38
  23.         movwf   TEMP1
  24.         call    SUBRUTINA1

En ese caso, se me ocurre de inmediato hacer un macro, que me ahorre escribir tanto y que además me haga más legible al código (por ser mas breve). 

Entonces hago.

Código: ASM
  1. preloadsubrutina1    macro    __dato
  2.  
  3.         movlw   __dato
  4.         movwf   TEMP1
  5.         call    SUBRUTINA1
  6.  
  7.         endm
  8.  
  9.  
  10.         preloadsubrutina1 .20
  11.         preloadsubrutina1 .21
  12.         preloadsubrutina1 .30
  13.         preloadsubrutina1 .32
  14.         preloadsubrutina1 .33
  15.         preloadsubrutina1 .34
  16.         preloadsubrutina1 .36
  17.         preloadsubrutina1 .38

En el manual del Assembler está bien explicado como se usan los macros.   Se pueden usar muchos parámetros, incluso variables locales que tengan vida solo dentro del macro, etc.  Pero bueno, no quiero confundir con cosas como esta.  Lo mejor es empezar por algo, si es que consideras que hacer macros te es útil para luego ir complicándolos.  No siempre hace falta hacer un macro y también es cierto que en mis primeros códigos nunca usé un macro, ni sabía como hacerlos, jeje. 

Asi que bueno, lo mejor sería que comiences por hacerlos bien fáciles para luego comenzar a detectar lugares donde te parece que serán útiles.

El código que ocupan en la memoria de programa ambos códigos es exactamente el mismo, pero el segundo código, a mi modo de verlo es más legible y mas breve.

Es una forma que se usa mucho cuando hay que repetir código tantas veces.  De esta forma te olvidas de tener en cuenta muchas cosas y agilizas el proceso de codificación.

Y recalco lo siguiente:  Esto no ahorra código en memoria de programa, solo ahorra tiempo a la hora de escribirlo.


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Rutina LCD 4 Bits
« Respuesta #78 en: 21 de Julio de 2006, 09:35:09 »
maunix, eres la máquina! Esque en uno de tus ejemplos he visto que comentabas algo de usar macros, de ahí la prgunta.
Gracias

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Rutina LCD 4 Bits
« Respuesta #79 en: 21 de Julio de 2006, 13:21:02 »
maunix, eres la máquina! Esque en uno de tus ejemplos he visto que comentabas algo de usar macros, de ahí la prgunta.
Gracias

Supuse que lo habría sacado de ahí.  :) :)

Con respecto a tus elogios, se agradecen pero en mi opinión no me considero una máquina, solo se 'antes' algunas cosas.

Saludos


- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Rutina LCD 4 Bits
« Respuesta #80 en: 25 de Julio de 2006, 05:06:50 »
Bueno, he intentado probar varias opciones y creo que el problema que tengo está en la librería LCD_MENS a la hora de ejecutar la instrucción para escribir en el LCD.


Desconectado Manofwar

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 156
Re: Rutina LCD 4 Bits
« Respuesta #81 en: 25 de Julio de 2006, 20:36:36 »
Hola Picto, no he tenido tiempo de ver tu código hasta ahora, pero bueno mejor tarde que nunca.

He tenido que sustituir tu archivo P876ALCD_4B.INC por el original LCD_4BIT.INC para que funcionase. Adjunto te remito los que yo he utilizado.

He hecho unas modificaciones a tu código y al LCD_MENS.INC le he incluido un par de líneas y todo va bien.

Sería conveniente que leas lo que los compañeros te han dicho y así podrás entender lo que hace el código, pero si aún sigues con dudas sólo tienes que preguntar.

Saludos
Saludos desde Almería, España

Desconectado picto

  • PIC16
  • ***
  • Mensajes: 106
Re: Rutina LCD 4 Bits
« Respuesta #82 en: 26 de Julio de 2006, 09:19:20 »
Hola Picto, no he tenido tiempo de ver tu código hasta ahora, pero bueno mejor tarde que nunca.

He tenido que sustituir tu archivo P876ALCD_4B.INC por el original LCD_4BIT.INC para que funcionase. Adjunto te remito los que yo he utilizado.

He hecho unas modificaciones a tu código y al LCD_MENS.INC le he incluido un par de líneas y todo va bien.

Sería conveniente que leas lo que los compañeros te han dicho y así podrás entender lo que hace el código, pero si aún sigues con dudas sólo tienes que preguntar.

Saludos

Manofwar, muchas gracias de verdad...

Entre hoy y mañana probaré en el circuito, si consigo mostrar más allá de la página 1. Con vuestra ayuda, este es más fácil...

Gracias de nuevo, os diré como vá la cosa.  :-/

Desconectado miguel valdivia

  • PIC10
  • *
  • Mensajes: 46
Re: Rutina LCD 4 Bits
« Respuesta #83 en: 01 de Mayo de 2011, 11:47:53 »
Muchas gracias maunix , sabes que tenía el mismo problema que picto y no sabia que la librerias inc se ponian dentro de la carpeta del archivo asm a compilar y me dio varios dolores de cabeza.
tambien pongo una carpeta con un archivo proteus de un control de display lcd. Este quizas sirva al amigo picto

Desconectado nigromanteasesino

  • PIC10
  • *
  • Mensajes: 2
Re: Rutina LCD 4 Bits
« Respuesta #84 en: 09 de Mayo de 2011, 22:56:21 »
Hola, yo tambien tengo problmas para controlar una lcd con solo 4bits, pero no tengo prblemas con 8 jejeje, bueno yo me guien por la libreria que biene en el libro del pic 16f84 desarrollador de proyectos me lei todo el capitulo y no se si se me esta escapando algo, bueno basicamente el programa es este no se si me puedan ayudar, cualquier duda sobre mi problema no duden en avisarme porfavor.

Código: [Seleccionar]
list     p=16f84a
#include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _CP_OFF & _PWRTE_ON 



CBLOCK 0X0C
CONT
ENDC

ORG 0
BSF STATUS,5
MOVLW 0X18
MOVWF TRISA
MOVLW 0X0F
        MOVWF     TRISB
        BCF         STATUS,5     

OTRO BTFSS PORTA,3
GOTO OTRO
CALL LCD_Inicializa
CALL LCD_CursorOFF
MOVLW 'B'
CALL LCD_Caracter
MOVLW 'i'
CALL LCD_Caracter
MOVLW 'e'
CALL LCD_Caracter
MOVLW 'n'
CALL LCD_Caracter
MOVLW 'v'
CALL LCD_Caracter
MOVLW 'e'
CALL LCD_Caracter
MOVLW 'n'
CALL LCD_Caracter
MOVLW 'i'
CALL LCD_Caracter
MOVLW 'd'
CALL LCD_Caracter
MOVLW 'o'
CALL LCD_Caracter
MOVLW 4
CALL LCD_PosicionLinea2
        MOVLW 'M'
CALL LCD_Caracter
MOVLW 'e'
CALL LCD_Caracter
MOVLW 'c'
CALL LCD_Caracter
MOVLW 'a'
CALL LCD_Caracter
MOVLW 't'
CALL LCD_Caracter
MOVLW 'r'
CALL LCD_Caracter
MOVLW 'o'
CALL LCD_Caracter
MOVLW 'y'
CALL LCD_Caracter
MOVLW 'e'
CALL LCD_Caracter
MOVLW 'r'
CALL LCD_Caracter
BOTON BTFSS PORTB,0
GOTO BOTON
CALL LCD_Borra
MOVLW 'A' ;SEGUNDO MENSAJE
CALL LCD_Caracter
MOVLW 'u'
CALL LCD_Caracter
MOVLW 't'
CALL LCD_Caracter
MOVLW 'o'
CALL LCD_Caracter
MOVLW 'D'
CALL LCD_Caracter
MOVLW 'e'
CALL LCD_Caracter
MOVLW 's'
CALL LCD_Caracter
MOVLW 't'
CALL LCD_Caracter
MOVLW 'r'
CALL LCD_Caracter
MOVLW 'u'
CALL LCD_Caracter
MOVLW 'c'
CALL LCD_Caracter
MOVLW 'c'
CALL LCD_Caracter
MOVLW 'i'
CALL LCD_Caracter
MOVLW 'o'
CALL LCD_Caracter
MOVLW 'n'
CALL LCD_Caracter
MOVLW 6
CALL LCD_PosicionLinea2
MOVLW 'E'
CALL LCD_Caracter
MOVLW 'n'
CALL LCD_Caracter
MOVLW ':'
CALL LCD_Caracter
CALL LCD_UnEspacioBlanco
MOVLW 10
MOVWF CONT
MUGEN MOVLW 10
CALL LCD_PosicionLinea2
MOVF CONT,0
CALL TABLA
DECFSZ CONT,1
GOTO MUGEN
CALL LCD_Borra
MOVLW 8
CALL LCD_PosicionLinea1
MOVLW 'B'
CALL LCD_EscribeLCD
MOVLW 'Y'
CALL LCD_EscribeLCD
MOVLW 'E'
CALL LCD_EscribeLCD
CALL Retardo_1s
CALL LCD_OFF


TABLA addwf PCL,1
retlw 'S'
retlw '0'
retlw '1'
retlw '2'
retlw '3'
retlw '4'
retlw '5'
retlw '6'
retlw '7'
retlw '8'
retlw '9'

INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END
                   


   


 

anything