oferta

sábado, 18 de junio de 2011

PIC con LCD 4bit

Para tener mas  pines libres de salida de un pic es preferible usar la interfaz al LCD con 4 bits, en este ejemplo usamos el puerto B con los 4 bits mas altos(RB4-RB7) conectados a los pines mas altos (D4-D7)del  LCD, de igual forma pongo todo el programa completo sin uso librerias.
;*******************************************

; 4 BIT LCD CON PIC16F84A
; RB7-RB4 = DB7-DB4 ; E=RB3 ; RW= RB2 ; RS=RB1
;*******************************************
list p=PIC16F84A
include "p16f84a.inc"
BIT_E          EQU 3
BIT_RW      EQU 2
BIT_RS       EQU 1
TEMP          EQU 0x020
reg1             EQU 0x021
reg2             EQU 0x022

org 0h
goto START

INITPIC                                  ;Configuracion de puertos
            bsf STATUS,RP0        ; vamos bank 1
           movlw b'00000000'
           movwf TRISB              ;puerto b salida
           bcf STATUS,RP0        ; vamos bank 0
          clrf PORTB
          return

INITLCD                                 ;inicializar LCD
              MOVLW 0xFE
              CALL retardo1
              MOVLW B'00111000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW 0x0A               ;retardo 5ms
              CALL retardo1
              MOVLW B'00111000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW 0x02
              CALL retardo1
              MOVLW B'00111000'
              MOVWF PORTB
              BCF PORTB,BIT_E
             CALL LCDBUSY
              MOVLW B'00101000'
              MOVWF PORTB
              BCF PORTB,BIT_E
             CALL LCDBUSY
             MOVLW B'00101000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW B'10001000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              CALL LCDBUSY
              MOVLW B'00001000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW B'11111000'
              MOVWF PORTB
             BCF PORTB,BIT_E
              CALL LCDBUSY
              MOVLW B'00001000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW B'00011000'
              MOVWF PORTB
             BCF PORTB,BIT_E
             CALL LCDBUSY
             MOVLW B'00001000'
             MOVWF PORTB
             BCF PORTB,BIT_E
             MOVLW B'01101000'
             MOVWF PORTB
             BCF PORTB,BIT_E
             RETURN
LCDBUSY
             BSF STATUS,RP0
             MOVLW B'11110000'
             MOVWF TRISB
             BCF STATUS,RP0
             BSF PORTB,BIT_RW
             BCF PORTB,BIT_RS
             BSF PORTB,BIT_E
             MOVF PORTB,W
            BCF PORTB,BIT_E
            BSF PORTB,BIT_RW
            BCF PORTB,BIT_RS
            BSF PORTB,BIT_E
            NOP
            BCF PORTB,BIT_E
            ANDLW 0x80
            BTFSS STATUS,Z
           GOTO LCDBUSY
            BCF PORTB,BIT_RW
            BSF STATUS,RP0
            MOVLW 0x000
            MOVWF TRISB
            BCF STATUS,RP0
             RETURN

LINE2       
          MOVLW B'11001000'
          MOVWF PORTB
          BCF PORTB,BIT_E
          MOVLW B'00001000'
          MOVWF PORTB
          BCF PORTB,BIT_E
          RETURN

LCDWRITE
           MOVWF TEMP
           CALL LCDBUSY
           MOVF TEMP,W
            ANDLW B'11110000'
            IORLW B'00001010'
            MOVWF PORTB
            BCF PORTB,BIT_E
            SWAPF TEMP,W
           ANDLW B'11110000'
            IORLW B'00001010'
            MOVWF PORTB
           BCF PORTB,BIT_E
           RETURN
DEMORA                    ;retardo 500uS con xt 4MHz

            MOVLW D'165'
            MOVWF reg1
DEMORA1
            DECFSZ reg1, F
            GOTO DEMORA1
            RETURN
retardo1
            MOVLW D'255'
            MOVWF reg2
DEMORA2
            CALL DEMORA
            DECFSZ reg2, F
            GOTO DEMORA2
            RETURN

START
CALL INITPIC               ;inicializar PIC
CALL INITLCD              ;inicializar LCD
inicio
               call retardo1
               MOVLW D'80'              ;P
               CALL LCDWRITE
               MOVLW D'82'              ;R
               CALL LCDWRITE
               MOVLW D'79'              ;O
               CALL LCDWRITE
               MOVLW D'89'              ;Y
               CALL LCDWRITE
               MOVLW D'69'              ;E
              CALL LCDWRITE
              MOVLW D'67'               ;C
              CALL LCDWRITE
              MOVLW D'84'               ;T
              CALL LCDWRITE
              MOVLW D'79'               ;O
              CALL LCDWRITE
              MOVLW D'83'              ;S
             CALL LCDWRITE
              MOVLW D'32'              ;espacio en blanco
              CALL LCDWRITE
               MOVLW D'50'             ;2
               CALL LCDWRITE
               MOVLW D'48'             ;0
               CALL LCDWRITE
               MOVLW D'49'             ;1
               CALL LCDWRITE
              MOVLW D'49'              ;1
              CALL LCDWRITE
              MOVLW D'32'              ;espacio en blanco
              CALL LCDWRITE
              SLEEP
               END

El archivo HeX. probado y comprobado lo pueden bajar de este enlace:
http://www.4shared.com/file/SBnq3pu0/lcd4bit.html


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