Autor Tema: lcd pic 16f84  (Leído 5214 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Pepe

  • PIC10
  • *
  • Mensajes: 19
lcd pic 16f84
« en: 13 de Diciembre de 2014, 02:19:15 »
Buenas amigos

Me encuentro realizando un proyecto con un lcd 16x2 con el pic 16f84a en ensamblador en el cual tengo cuatro pulsadores son decremento,  incremento, derecha y izquierda esto para ir escribiendo letra por letra y llenar la pantalla solo de la "a" a la 'z" si alguien me puede ayudar 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: lcd pic 16f84
« Respuesta #1 en: 13 de Diciembre de 2014, 04:01:36 »
LCD y el ejemplo de Teclado Matricial ( para que veas como hacer funcionar los botones con las interrupciones de RB4 a RB7, obviamente tiene mas codigo que tendrias que sacar )
http://www.todopic.com.ar/foros/index.php?topic=858.0

Si no te manejaste nunca con interrupciones entonces te recomiendo que hagas primero lo de las mismas aprendas a usarlas, luego continuas con el LCD mostrando algo nomas y por fin uniendo ambos proyectos.

Desconectado Pepe

  • PIC10
  • *
  • Mensajes: 19
Re: lcd pic 16f84
« Respuesta #2 en: 14 de Diciembre de 2014, 21:07:39 »
Buenas empece así solo con el de incrementar  y después le voy agregar los demás pero tengo varias dudas
1 como hago para que empiece en a y termine en z minusculas yo lo intente con un contador pero no se si esta bien
   LIST      P=16F84A
   INCLUDE      <P16F84A.INC>
   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

   CBLOCK  0x0C
   Contador                  
   ENDC

#DEFINE Incremente     PORTA,4         

 
; ZONA DE CÓDIGOS ********************************************************************

Inicio EQU  0x61
    call    LCD_Inicializa
     bsf      STATUS,RP0            ; Acceso al Banco 1.
   bsf      Incremente
      bcf      STATUS,RP0            

Principal
   btfsc   Incremente            ; ¿Pulsador presionado?, ¿(Pulsador)=0?
   goto   Fin                  ; No. Vuelve a leerlo.
   call   Retardo_20ms         ; Espera que se estabilicen los niveles de tensión.
   btfsc   Incremente            ; Comprueba si es un rebote.
   goto   Fin                  ; Era un rebote y sale fuera.
   call   IncrementaVisualiza      ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
   btfss   Incremente            ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
   goto   EsperaDejePulsar      ; No. Espera que deje de pulsar.
Fin   goto   Principal

; Subrutina "IncrementaVisualiza" ---------------------------------------------------------

IncrementaVisualiza
   incf   Contador,F            ; Incrementa el contador y comprueba si ha
   movlw    0x7A               ; llegado a su valor máximo mediante una
   subwf   Contador,W            
   btfsc   STATUS,C            
InicializaContador
   clrf   Contador            ; No, era igual o mayor. Por tanto, resetea.
LCD
   movf   Contador,W
   call   LCD_Caracter      
   return

   INCLUDE <LCD_4BIT.INC>      
   INCLUDE <RETARDOS.INC>         ; Subrutinas de retardo.
   END                        ; Fin del programa.
   
  lo probé pero no me funciona

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: lcd pic 16f84
« Respuesta #3 en: 14 de Diciembre de 2014, 22:59:02 »
en tu LCD tenes un codigo para cada caracter



Esa es una de las tantas tablas que hay, algunos LCD tiene mas caracteres que otros, si te fijas la "a" es el 0110 0001 ( 0x61 ) y asi aumenta hasta la "z" que es 0111 1010 ( 0x7A ) asi que tu contador deberia ser desde 0x61 a 0x7A + el caracter vacio (como para borrar).

Esto esta simple si tenes 1 solo dato, pero por ejemplo si te moves a la segunda posicion y luego volves, te quedan 2 opciones para saber que habia en ese lugar (en la primera posicion).

1- Guardarla en el micro, es decir tener una "copia" de la memoria del LCD. ( Recorda que son 32 registro de 8 bits como minimo, no se si le da al 16f84 para esto )
2- Leer el LCD para saber que hay guardado en ese punto.

En el primer caso puede ser algo simple por que tu programa solo haria lo de "modificar" la memoria dentro del micro y luego cada tanto solo el micro ejecute una actualizacion del LCD en todas sus posiciones de memoria.
En el otro bueno cuando te muevas tanto para adelante o hacia atras deberias leer, montar ese valor en tu contador asi se modifica y luego escribirlo de nuevo.

---

Otra cosa, por que tenes los include debajo ? deberias tenerlo junto con el de p16f84.inc
« Última modificación: 14 de Diciembre de 2014, 23:03:04 por KILLERJC »

Desconectado Pepe

  • PIC10
  • *
  • Mensajes: 19
Re: lcd pic 16f84
« Respuesta #4 en: 14 de Diciembre de 2014, 23:38:25 »
Buenas gracias por la ayuda. si eso intento pero no se hacer que el contador me empiece de 0x61 y que me termine 0x7A, estoy utilizando un 16f84 A y el libro con el que estoy estudiando lo pone al final inc. y segun entiendo si yo pongo 0x61 ya me sale la a entonces no entiendo bien como guardar otra vez la tabla  :(
 

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: lcd pic 16f84
« Respuesta #5 en: 15 de Diciembre de 2014, 00:13:24 »
borrar
gracias
« Última modificación: 15 de Diciembre de 2014, 00:17:29 por Darkman_A »

Desconectado Pepe

  • PIC10
  • *
  • Mensajes: 19
Re: lcd pic 16f84
« Respuesta #6 en: 15 de Diciembre de 2014, 00:22:55 »
Gracias pero 0x30 es el 0 en numero y lo que ocupo es de 'a' a la 'z'

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: lcd pic 16f84
« Respuesta #7 en: 15 de Diciembre de 2014, 01:24:41 »
Código: [Seleccionar]
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

CBLOCK  0x0C
Contador
ENDC

#DEFINE Incremente  PORTA,4

 
; ZONA DE CÓDIGOS ********************************************************************

Inicio EQU  0x61
    call    LCD_Inicializa
   bsf STATUS,RP0 ; Acceso al Banco 1.
bsf Incremente
   bcf STATUS,RP0

Principal
btfsc Incremente ; ¿Pulsador presionado?, ¿(Pulsador)=0?
goto Fin ; No. Vuelve a leerlo.
call Retardo_20ms ; Espera que se estabilicen los niveles de tensión.
btfsc Incremente ; Comprueba si es un rebote.
goto Fin ; Era un rebote y sale fuera.
call IncrementaVisualiza ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
btfss Incremente ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
goto EsperaDejePulsar ; No. Espera que deje de pulsar.
Fin goto Principal

; Subrutina "IncrementaVisualiza" ---------------------------------------------------------

IncrementaVisualiza
incf Contador,F ; Incrementa el contador y comprueba si ha
movlw 0x7A ; llegado a su valor máximo mediante una
subwf Contador,W
btfsc STATUS,C
InicializaContador
clrf Contador ; No, era igual o mayor. Por tanto, resetea.
LCD
movf Contador,W
call LCD_Caracter
return

INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC> ; Subrutinas de retardo.
END ; Fin del programa.

Voy a decirte algunas cosas que estan mal/ o me parecen mal.

Citar
    bsf      STATUS,RP0            ; Acceso al Banco 1.
   bsf      Incremente
      bcf      STATUS,RP0   

Esta mal eso, acordate que el PORTA se encuentra en el banco 0, no se por que estas accediendo al banco 1. Ademas de intentar poner un 1 en una entrada.

Citar
Principal
   btfsc   Incremente            ; ¿Pulsador presionado?, ¿(Pulsador)=0?
   goto   Fin
   call   Retardo_20ms         ; Espera que se estabilicen los niveles de tensión.
   btfsc   Incremente            ; Comprueba si es un rebote.
   goto   Fin                  ; Era un rebote y sale fuera.
   call   IncrementaVisualiza      ; Incrementa el contador y lo visualiza
        ..........
        ..........
Fin   goto   Principal

Directamente pones goto Principal y listo no haces 2 saltos. Lo mismo con el otro goto Fin.

Citar
IncrementaVisualiza
   incf   Contador,F            ; Incrementa el contador y comprueba si ha
   movlw    0x7A               ; llegado a su valor máximo mediante una
   subwf   Contador,W            
   btfsc   STATUS,C
InicializaContador
   clrf   Contador            ; No, era igual o mayor. Por tanto, resetea.
LCD
   movf   Contador,W
   call   LCD_Caracter      
   return

Contador tiene un valor que desconosco por que jamas se le asigno ningun valor a ese registro. Por lo que deberias al comienzo de tu programa ( cuando definis tus TRIS, INTCON, etc) poner el contador con un valor 0x61

MOVLW 0x61
MOVWF Contador

Luego ahora si dentro de la funcion no deberias de limpiarlo con el CLRF ya que estarias borrando todo, es decir poniendo a 0. Por lo que deberias reemplazar ese CLRF por lo mismo que pase antes, asi cuando sobrepasa el 0x7A el valor queda en 0x61.

Finalmente no encuentro donde definis tus TRIS no se si LCD_4BIT.inc ya los define y los usa. Pero al menos en tu codigo no lo veo. Y esto esta realizado sin interrupciones que obviamente lo podes hacer tranquilamente de esa forma (pero soy un fanatico de las mismas), y tambien te hubieras ahorrado codigo si tuvieras antirebote en hardware.
« Última modificación: 15 de Diciembre de 2014, 01:29:03 por KILLERJC »

Desconectado Pepe

  • PIC10
  • *
  • Mensajes: 19
Re: lcd pic 16f84
« Respuesta #8 en: 15 de Diciembre de 2014, 22:01:51 »
   LIST         P=16F84A
         INCLUDE      <P16F84A.INC>
         __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

         CBLOCK  0x0C
         Contador   
         ENDC

#DEFINE Incremente    PORTA,4
#DEFINE Decremente    PORTA,3               
#DEFINE Derecha      PORTA,2
#DEFINE Izquierda    PORTA,1
 
; ZONA DE CÓDIGOS ********************************************************************

Inicio
   call      LCD_Inicializa
     bsf      STATUS,RP0      
   bsf      Incremente
   bsf      Decremente
   bsf      Derecha
   bsf      Izquierda
      bcf      STATUS,RP0
   movlw   0X61         
                     
   movwf   Contador         
   

   CALL    LCD_LINEA1


Principal
   btfsc   Incremente      ; ¿Incremente presionado?, ¿(Incremente)=0?
   goto   FinIncremente      ; No. Lee el siguiente.
   call   Retardo_20ms      ; Espera que se estabilicen los niveles de tensión.
   btfsc   Incremente      ; Comprueba si es un rebote.
   goto   FinIncremente      ; Era un rebote y sale fuera.
   goto   SePulsoIncremente   
                     
FinIncremente
   btfsc   Decremente      ; ¿Decremente presionado?, ¿(Decremente)=0?
   goto   FinDecremente   ; No. Lee el siguiente.
   call   Retardo_20ms      ; Espera que se estabilicen los niveles de tensión.
   btfsc   Decremente      ; Comprueba si es un rebote.
   goto   FinDecremente   ; Era un rebote y sale fuera.
   goto   SePulsoDecremente;
FinDecremente
    btfsc  Derecha
    goto   FinDerecha
    call   Retardo_20ms
    btfsc  Derecha
    goto   FinDerecha
    goto   SePulsoDerecha
FinDerecha
    btfsc  Izquierda
    goto   Principal
    call   Retardo_20ms
    btfsc  Izquierda
    goto   SePulsoIzquierda





SePulsoIncremente


   incf      Contador,F      ; Al valor de contador se le suma 1 y lo guarda en sí mismo.
        movlw    0x7B               
   subwf   Contador,W         
   btfsc   STATUS,C   
Incializar Contador
   movlw   0X61
        movwf   Contador
   
         call      LCD_Caracter      ; Llama a esta subrutina de la librería para que muestre Caracter con su nuevo valor.
   

   INCLUDE <LCD_4BIT.INC>   
   INCLUDE <RETARDOS.INC>   ; Subrutinas de retardo.
   END                  ; Fin del programa.

Buenas ahora esta asi me falta el resto de los pulsadores sepulso..... pero quiero saber si el reset del contador esta bien asíy si se mostraria

Desconectado Pepe

  • PIC10
  • *
  • Mensajes: 19
Re: lcd pic 16f84
« Respuesta #9 en: 15 de Diciembre de 2014, 22:29:34 »
   incf      Contador,F      ; Al valor de contador se le suma 1 y lo guarda en sí mismo.
        goto Prueba
Prueba
   movlw    0x7B               
   subwf   Contador,W         
   btfsc   STATUS,Z
        goto InicializarContador
        call LCD_Caracter   
IncializarContador
   movlw   0X61
        movwf   Contador
   
SePulsoDecremente   
  decf  Contador,F
  goto  Prueba
Prueba
  movlw 0x60
  subwf Contador,W
  btfsc STATUS,C
Inicializar Contador
  movlw 0x7B
  movwf Contador
  call LCD_Caracter

Bueno lo cambie asi y agrege decremente

Desconectado Pepe

  • PIC10
  • *
  • Mensajes: 19
Re: lcd pic 16f84
« Respuesta #10 en: 15 de Diciembre de 2014, 22:47:42 »
bueno tambien cambie decremento muy parecido a incremento pero como hago para pasar a la derecha y izquierda??? :(

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: lcd pic 16f84
« Respuesta #11 en: 15 de Diciembre de 2014, 23:10:16 »
exactamente no se cuales son las funciones en LCD_4bits.inc

Pero sino me equivoco deberias usar LCD_EnviaComando
Donde el comando se almacena en W.

Para setear la posicion de la DDRAM se usa el comando
"1AAAAAAA" Donde A es la direccion.

La primer linea comienza en 00h y terminaria en 0Fh
La segunda linea comenzaria en 40h y terminaria en 4Fh

Aca tenes el datasheet del controlador del LCD: https://www.sparkfun.com/datasheets/LCD/HD44780.pdf
Ahi en la pagina 24 tenes todos los comandos.

en fin si quisieras ir a la cuarta columna de la primer fila entonces deberias cargar en W: 0x04  y usar LCD_EnviaComando

Código: [Seleccionar]
Inicializar Contador
  movlw 0x7B
  movwf Contador
  call LCD_Caracter

Deberias poner 0x7A en esa parte del decrementar sino estarias mandando un "{" y no una "z"


Y perdon en el primer post yo puse sobre el teclado y el lcd y pense que habia copiado el siguiente link:
http://www.todopic.com.ar/foros/index.php?topic=24720.0
Pero termine copiando otro :/
« Última modificación: 15 de Diciembre de 2014, 23:13:33 por KILLERJC »

Desconectado Pepe

  • PIC10
  • *
  • Mensajes: 19
Re: lcd pic 16f84
« Respuesta #12 en: 16 de Diciembre de 2014, 01:07:21 »
   LIST         P=16F84A
         INCLUDE      <P16F84A.INC>
         __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

         CBLOCK  0x0C
         Contador   
         ENDC

#DEFINE Incremente    PORTA,4
#DEFINE Decremente    PORTA,3               
#DEFINE Derecha      PORTA,2
#DEFINE Izquierda    PORTA,1
 
; ZONA DE CÓDIGOS ********************************************************************

Inicio
   call      LCD_Inicializa
     bsf      STATUS,RP0      
   bsf      Incremente
   bsf      Decremente
   bsf      Derecha
   bsf      Izquierda
      bcf      STATUS,RP0
   movlw   0X61      
   movwf   Contador         
   
   
Principal
   btfsc   Incremente
   goto   FinIncremente      
   call   Retardo_20ms      
   btfsc   Incremente      
   goto   FinIncremente   
   goto   SePulsoIncremente   
FinIncremente
   btfsc   Decremente      
   goto   FinDecremente   
   call   Retardo_20ms
   btfsc   Decremente      
   goto   FinDecremente   
   goto   SePulsoDecremente
FinDecremente
    btfsc  Derecha
    goto   FinDerecha
    call   Retardo_20ms
    btfsc  Derecha
    goto   FinDerecha
    goto   SePulsoDerecha
FinDerecha
    btfsc  Izquierda
    goto   Principal
    call   Retardo_20ms
    btfsc  Izquierda
    goto   SePulsoIzquierda

SePulsoIncremente
   incf   Contador,F      
    goto   Prueba
 Prueba
   movlw  0x7B               
   subwf  Contador,W            
   btfsc  STATUS,Z
    goto   InicializarContador
    call   LCD_Caracter   
IncializarContador
   movlw  0X61
    movwf  Contador
   
SePulsoDecremente   
    decf  Contador,F
    goto  Prueba2
Prueba2
    movlw 0x60
    subwf Contador,W
    btfsc STATUS,Z
    call LCD_Caracter
Inicializar Contador
    movlw 0x7B
    movwf Contador
 
SePulsoDerecha
    incf Contador,F
    goto Prueba3
Prueba3
    movlw 0x00
    subwf Contador,W
    btfsc STATUS,Z
    call LCD_posicionlinea1
Inicializar Contador
    movlw 0x4F
    movwf Contador
 
SePulsoIzquierda   
    decf  Contador,F
    goto  Prueba4
Prueba4
    movlw 0x4F
    subwf Contador,W
    btfsc STATUS,Z
    call LCD_posicionlinea1
Inicializar Contador
    movlw 0x00
    movwf Contador
 
   INCLUDE <LCD_4BIT.INC>   
   INCLUDE <RETARDOS.INC>   
   END                  

esta librerias las tome de Microcontrolador Pic 16f84 de la editorial Alfaomega

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: lcd pic 16f84
« Respuesta #13 en: 16 de Diciembre de 2014, 02:18:25 »
Código: [Seleccionar]
SePulsoDerecha
    incf Contador,F
    goto Prueba3
Prueba3
    movlw 0x00
    subwf Contador,W
    btfsc STATUS,Z
    call LCD_posicionlinea1
Inicializar Contador
    movlw 0x4F
    movwf Contador
  
SePulsoIzquierda    
    decf  Contador,F
    goto  Prueba4
Prueba4
    movlw 0x4F
    subwf Contador,W
    btfsc STATUS,Z
    call LCD_posicionlinea1
Inicializar Contador
    movlw 0x00
    movwf Contador

No deberias usar la variable contador. Deberias tener otra variable para la posicion.
Como dije de 0x00 a 0x0F es 1era linea si aumentas uno mas pasarias a 0x10 pero tendrias que modificarlo ya que la segunda linea comienza con 0x40

Pienso que podes hacerlo de 2 formas:

Tener 2 variables: Fila y Columna
De esa manera aumentas y decrementas Columna y luego revisas, si se paso de 0x00 o si supero a 0x0F para sumar o restar a fila
Y luego para formar la direccion es ( Fila * 0x40 ) + Columna . Donde Fila vale 0 y 1.

La otra que se me ocurre es implementar solo una variable: Posicion
limitas tu derecha e izquierda de 0x00 a 0x1F Y pones a 0 o a 1 el bit5 de Posicion si se supera cualquiera de los limites. Te haces una funcion que envie la direccion, en esa funcion harias algo asi
Bit5 de Posicion = 1 ? SI: Posicion XOR 0x50 -> W
NO: Posicion -> W
Envio
Vuelvo

Y faltaria algo aca ( lo pongo en negrita):
Citar
   btfsc  Izquierda
    goto   SePulsoIzquierda
   goto   Principal

SePulsoIncremente
   incf   Contador,F    

Otra cosa que esta haciendo no se por que es ese salto sin sentido, en casi todos:
Citar
SePulsoIzquierda    
    decf  Contador,F
    goto  Prueba4
Prueba4

Y los call serian a esta funcion: LCD_EnviaComando

Cuando pongas un codigo ponelo dentro de  (code) (/code )  con corchetes  [  ], es el que aparece como signo numeral en el foro.

A todo esto.... lo estas simulando o probando en una placa ?

Desconectado Pepe

  • PIC10
  • *
  • Mensajes: 19
Re: lcd pic 16f84
« Respuesta #14 en: 16 de Diciembre de 2014, 10:49:52 »
Código: [Seleccionar]
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

CBLOCK  0x0C
Contador
Cursor
ENDC

#DEFINE Incremente PORTB,0
#DEFINE Decremente PORTB,1
#DEFINE Derecha      PORTB,2
#DEFINE Izquierda    PORTB,3
 
; ZONA DE CÓDIGOS ********************************************************************

Inicio
call LCD_Inicializa
  bsf STATUS,RP0
bsf Incremente
bsf Decremente
bsf Derecha
bsf Izquierda
    bcf STATUS,RP0
movlw 0X61
movwf Contador


Principal
btfsc Incremente
goto FinIncremente
call Retardo_20ms
btfsc Incremente
goto FinIncremente
goto SePulsoIncremente
FinIncremente
btfsc Decremente
goto FinDecremente
call Retardo_20ms
btfsc Decremente
goto FinDecremente
goto SePulsoDecremente
FinDecremente
    btfsc  Derecha
    goto   FinDerecha
    call   Retardo_20ms
    btfsc  Derecha
    goto   FinDerecha
    goto   SePulsoDerecha
FinDerecha
    btfsc  Izquierda
    goto   Principal
    call   Retardo_20ms
    btfsc  Izquierda
    goto   Principal
    goto   SePulsoIzquierda

SePulsoIncremente
incf   Contador,F
movlw  0x7B
subwf  Contador,W
btfsc  STATUS,Z
    goto   InicializarContador1
movlw Caracter
    call   LCD_Caracter
goto Principal

InicializarContador1
movlw  0X61
    movwf  Contador
    movwf  Caracter ;/este tambien lo tengo que cargar caracter para que lo muestre
    call   LCD_Caracter
goto Principal
   
SePulsoDecremente
    decf  Contador,F
    movlw 0x60
    subwf Contador,W
    btfsc STATUS,Z
    goto InicializarContador2
    movlw Caracter
call   LCD_Caracter
goto Principal
InicializarContador2
    movlw 0x7A
    movwf Contador
    movwf Caracter
    call   LCD_Caracter
goto Principal
 
SePulsoDerecha
    incf Cursor,F ;Por qué si uno se mueve a la derecha incrementa el caracter que se ve?
    movlw 0X10
    subwf Cursor,W
    btfsc STATUS,Z
goto MuestraLinea1
movlw 0X00
    goto MuestraLinea1
   
SePulsoIzquierda   
    decf  Cursor,F
    movlw 0xFF
    subwf Cursor,W
    btfsc STATUS,Z
goto MuestraLinea1
    movlw 0x0F
    goto MuestraLinea1
 
MuestraLinea1
movfw Cursor
call LCD_PosicionLinea1
movfw Caracter
call LCD_Caracter
goto Principal

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


Es para simular en proteus