oferta

miércoles, 1 de junio de 2011

LCD con pic16f84a

Haremos el programa para controlar  un LCD con un pic16f84a con 8 lineas de datos, pondremos el programa completo para no confundir al lector  con las librerias que tendria que convertirlas en archivo de tipo .INC


list p=16f84                                       ;Procesador PIC16f84
#include "pic16f84"

DATO_A equ 0xc                               ;Registro del dato A
DATO_B equ 0xd                               ;Registro del dato B
RESUL equ 0xe                                   ;Registro de resultados
TEMPO1 equ 0xf                                 ;Registro temporal 1
TEMPO2 equ 0x10                              ;Registro temporal 2
OFFSET equ 0x11                               ;Variable de desplazamientos de mensajes
Digito EQU 1Fh                                   ;Cursor para leer la tabla de datos.

ORG 00h                                             ;Direccion del Vector de RESET
GOTO INICIO                                   ;Comienza el programa
ORG 05h                                             ;detras del Vector Interrupcion

;-------CONFIGURACION LCD-----------
LCD_E          BSF PORTA,2          ;Activa señal E
                     NOP                          ;Espera 1uS
                     BCF PORTA,2          ;Desactiva señal E
                     RETURN
LCD_BUSY  BSF PORTA,1          ;Pone el LCD en modo lectura
                      BSF STATUS,5        ;Selecciona el Banco 1
                      MOVLW 0xFF
                      MOVWF TRISB       ;Puerta B actua de entrada
                      BCF STATUS,5        ;Selecciona el Banco 0
                      BSF PORTA,2          ;Activa el LCD (Señal E)
                      NOP
L_BUSY       BTFSC PORTB,7     ;Chequea el bit BUSY
                     GOTO L_BUSY       ;Est a "1" (Ocupado)
                     BCF PORTA,2         ;Desactiva el LCD (Se¤al E)
                     BSF STATUS,5        ;Selecciona el Banco 1
                     CLRF TRISB            ;Puerta B actua como salida
                     BCF STATUS,5        ;Selecciona el Banco 0
                     BCF PORTA,1          ;Pone el LCD en modo escritura
                     RETURN

LCD_REG  BCF PORTA,0          ;Desactiva RS (Modo instruccion)
                   MOVWF PORTB      ;Saca el codigo de instruccion
                   CALL LCD_BUSY    ;Espera a que se libere el LCD
                   GOTO LCD_E           ;Genera pulso en señal E
LCD_DATOS BCF PORTA,0     ;Desactiva RS (Modo instrucci¢n)
                   MOVWF PORTB      ;Valor ASCII a sacar por RB
                   CALL LCD_BUSY    ;Espera a que se libere el LCD
                   BSF PORTA,0            ;Activa RS (Modo dato)
                   GOTO LCD_E           ;Genera pulso en señal E
LCD_INI   MOVLW b'00111000'
                  CALL LCD_REG       ;Codigo de instruccion
                  CALL DELAY_5MS  ;Temporiza 5 mS.
                  MOVLW b'00111000'
                  CALL LCD_REG        ;Codigo de instruccion
                  CALL DELAY_5MS   ;Temporiza 5 mS.
                  MOVLW b'00111000'
                  CALL LCD_REG        ;Codigo de instruccion
                  CALL DELAY_5MS   ;Temporiza 5 mS.
                  RETURN
LCD_PORT   BSF STATUS,5              ;Selecciona el banco 1 de datos
                      CLRF TRISB                   ;RB se programa como salida
                       MOVLW b'00011000'   ;RA4, RA3 son entradas
                       MOVWF TRISA            ;el resto como salidas
                       BCF STATUS,5             ;Selecciona el banco 0 de datos
                       BCF PORTA,0               ;Desactiva RS del modulo LCD
                       BCF PORTA,2               ;Desactiva E del modulo LCD
DELAY_5MS  movlw 0x1a                   ;retardo de 5ms
                        movwf DATO_B
                        clrf DATO_A
                        DELAY_1 decfsz DATO_A,1
                        goto DELAY_1
                        decfsz DATO_B,1
                        goto DELAY_1
                        return

;----PROGRAMA PRINCIPAL------

INICIO CLRF Digito                        ;Pone a 0 la variable digito
             CALL LCD_PORT              Puertos en modo LCD
             BCF PORTA,0                    ;Desactiva RS del modulo LCD
             BCF PORTA,2                    ;Desactiva E del modulo LCD
START CALL LCD_INI                  ;Inicia LCD (CFG puertos...)
START_1 MOVLW b'00000001'    ;Borrar LCD y Home
             CALL LCD_REG
             MOVLW b'00000110' ;
             CALL LCD_REG
             MOVLW b'00001100'         ;LCD On, cursor Off,Parpadeo Off
             CALL LCD_REG
             MOVLW 0x80                     ;Direccion caracter
             CALL LCD_REG
REPETIR MOVF Digito,w                ;W=Digito
             CALL DATO_1                  ;Coge el caracter
             IORLW 0                            ;Compara
             BTFSC STATUS,2              ;Es el ultimo?
             GOTO acabar                      ;Si
             CALL LCD_DATOS          ;Visualiza caracter
             INCF Digito,f                      ;Incrementa numero de Digito
            GOTO REPETIR                 ;Vuelve a escribir
            acabar nop
            goto acabar                           ;Buclee infinito

DATO_1 ADDWF PCL,1
RETLW 'p'
RETLW 'r'
RETLW 'o'
RETLW 'y'
RETLW 'e'
RETLW 'c'
RETLW 't'
RETLW 'o'
RETLW 's'
RETLW ' '
RETLW '2'
RETLW '0'
RETLW '1'
RETLW '1'
RETLW 0x00
END
Aqui esta el archivo HEX. probado , lo bajan del siguiente link:
http://www.4shared.com/file/37iqavfh/lcd.html


 

15 comentarios:

  1. de todas maneras muchas gracias, ha de ser un error pequeño.

    ResponderEliminar
  2. por si lo corriges mi e-mail:
    turbopascal1@hotmail.com

    muchas gracias de antemano

    ResponderEliminar
  3. ya lo hice funcionar, solo falta declarar unas variables, lo probe en isis proteus, pero:


    no funciona, se queda esperando la respuesta del display
    L_BUSY BTFSC PORTB,7 ;Chequea el bit BUSY
    GOTO L_BUSY ;Est a "1" (Ocupado)

    ahora en Pic simulator IDE funciona muy bien

    pienso que en la realidad si funcionara, pero no se, dime tu opinion.

    gracias por tu pronta respuesta.

    turbopascal1@hotmail.com

    ResponderEliminar
  4. lo importante es que funciona en maqueta real o protoboard, pero tambien corre en pic simulator IDE

    ResponderEliminar
  5. el archivo HEX. ya esta probado en protoboard es lo que cuenta , los problemas de otros simuladores no lo se , creo que a veces depende de q sistema operativo usan.

    ResponderEliminar
  6. HOLAA MARI NO ME LLEGA A FUNCIONAR ESTE PROGRAMA CREES QUE ME PUEDAS AYUDAR Y ENVIARME A CORREO OMARCH99@HOTMAIL.COM

    ResponderEliminar
  7. ok, solo dime q mensaje quieres visualizar

    ResponderEliminar
  8. ok, solo dime q mensaje quieres visualizar

    ResponderEliminar
  9. me gustaría agregarle una activación para algo de potencia, voy a probar con tu codigo
    :) gracias.

    ResponderEliminar
  10. Claro este circuito es lo basico con lcd y se le puede aumentar al programa lo q uds quieran, suerte.

    ResponderEliminar
  11. hola.. y para la segunda linea como ago? gracias

    ResponderEliminar
  12. Hola, una pregunta que especificaciones tiene el lcd???

    ResponderEliminar
  13. Es un Lcd comun de 2 lineas por 16 caracteres, puede ser de la marca hitachi o cualquier otra marca.

    ResponderEliminar
  14. que poca madre, no le entiendo nada

    ResponderEliminar