Buscar este blog

sábado, 28 de noviembre de 2015

Control de LCD (Desplegado, Corrimiento Derecha, Corrimiento Izquierda)

; Desplegar texto

PROCESSOR 16877
INCLUDE <P16F877.INC>

RDELAY EQU H'20'

ESTADO EQU 0X03
PUERTOB EQU 0X06
PUERTOD EQU 0X08

RS EQU 0
RW EQU 2
E  EQU 1

W EQU 0
F EQU 1

ORG 0
GOTO INICIO
ORG 5

; PROGRAMA PRINCIPAL

INICIO:
CLRF PORTB         ;Limpia PORTB
    CLRF PORTD         ;Limpia PORTD
    BSF STATUS, RP0
    BCF STATUS, RP1    ;Selecciona el banco 1
    CLRF TRISB         ;Configura PORTB como salida
    CLRF TRISA         ;Configura PORTA como salida
    BCF STATUS,RP0     ;Regresa al banco 0


; CODIGO DE DESPLIEGUE DE MENSAJES
DESPLEGAR:  
CALL INICIOLCD
CALL MENSAJE1
CALL R2
CALL MENSAJE2
GOTO DESPLEGAR


; SUBRUTINA DE MENSAJE 1
MENSAJE1:
    MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW 'M'          ;Mueve 'M' a W
    MOVWF PORTB        ;Mueve lo que hay en W a PORTB
    CALL ESCRIBE        ;Imprime en LCD
    MOVLW 'I'
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW 'C'
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW 'R'
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW 'O'
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW 'S'
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW ' '  
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
CALL RETARDO10
    RETURN    
MENSAJE2:
    MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW 'I'         ;Mueve 'I' a W
    MOVWF PORTB       ;Mueve lo que hay en W a PORTB
    CALL ESCRIBE        ;Imprime en LCD
    MOVLW 'T'
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW 'T'
    MOVWF PORTB
    CALL ESCRIBE
CALL RETARDO10
    RETURN  
; RENGLON 2
R2:
BCF PORTD,0 ; RS=0 MODO INST
MOVLW 0xC0  ;2da linea   USAR 0C
MOVWF PORTB
CALL COMANDO
    RETURN

; INICIALIZACION DE LA LCD
INICIOLCD:
CALL RETARDO100
MOVLW 30H
MOVWF PUERTOB
CALL RETARDO100
MOVLW 30H
MOVWF PUERTOB
CALL RETARDO100
MOVLW 38H
MOVWF PUERTOB
CALL COMANDO
MOVLW H'0C'
MOVWF PUERTOB
CALL COMANDO
MOVLW H'01'
MOVWF PUERTOB
CALL COMANDO
MOVLW H'06'
MOVWF PUERTOB
CALL COMANDO
MOVLW H'02'
MOVWF PUERTOB
CALL COMANDO
MOVLW H'80'
MOVWF PUERTOB
CALL COMANDO
RETURN

COMANDO:
CALL RETARDO10
BSF PUERTOD, E
BCF PUERTOD, RS
CALL RETARDO100
BCF PUERTOD, E
BCF PUERTOD, RS
CALL RETARDO10
CALL RETARDO10
RETURN

ESCRIBE:
CALL RETARDO10
BSF PUERTOD, RS
BSF PUERTOD, E
CALL RETARDO10
BCF PUERTOD, E
BCF PUERTOD, RS
CALL RETARDO10
CALL RETARDO10
RETURN

; RETARDO DE 255 MICROSEC
RETARDO255:
MOVLW 0XFF
MOVWF RDELAY
T1:
DECFSZ RDELAY, F
GOTO T1
RETURN

; RETARDO DE 100ms
RETARDO100:
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
RETURN

; RETARDO DE 10 ms
RETARDO10:
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
RETURN

END



; Desplazar a la derecha
processor 16f877
INCLUDE <P16f877.INC>

N EQU H'21'  ; asignamos direcciones.
M EQU H'22'
Q EQU H'23'

VAL1 EQU H'24'
VAL2 EQU H'25'
CONTA1 EQU 30H
CONTA2 EQU 30H

         org 0
    GOTO INICIO
         org 5  ; vector de reset, vector de interrupcion
       
INICIO

    clrf PORTB         ;Limpia PORTB
    clrf PORTA         ;Limpia PORTA
    bsf STATUS, RP0
    bcf STATUS, RP1    ;Selecciona el banco 1
    clrf TRISB         ;Configura PORTB como salida
    clrf TRISA         ;Configura PORTA como salida
    bcf STATUS,RP0     ;Regresa al banco 0


LCD_INICIAR

    CALL LCD_IN
    CALL I
    CALL F1
    CALL NEXT
    CALL I
    CALL F2
    GOTO LCD_INICIAR

I:
CALL DELAYL
    MOVLW 'E'
    CALL MANDAR
    MOVLW 'J'
    CALL MANDAR
    MOVLW 'E'
    CALL MANDAR
    MOVLW 'R'
    CALL MANDAR
    MOVLW 'C'
    CALL MANDAR
    MOVLW 'I'
    CALL MANDAR
    MOVLW 'C'
    CALL MANDAR
    MOVLW 'I'
    CALL MANDAR
    MOVLW 'O'
    CALL MANDAR
    MOVLW ' '
    CALL MANDAR
    MOVLW '2'
    CALL MANDAR
    MOVLW ' '
    CALL MANDAR
RETURN

F1:
    MOVLW 1CH    ;Desplazar 1C DERECHA    18 HIZQUIERDA
    CALL EJECUTA
    DECFSZ VAL1
    GOTO F1
RETURN

F2:
    MOVLW 1CH    ;Desplazar 1C DERECHA    18 HIZQUIERDA
    CALL EJECUTA
    DECFSZ VAL2
    GOTO F2
RETURN

NEXT:
    CALL LCD_IN
    MOVLW 0xD5    ;Ajusta la direccion de DD RAM
    CALL EJECUTA
RETURN

LCD_IN:
    MOVLW 30H    ;Activa funcion
    CALL EJECUTA
    CALL DELAY
    MOVLW 30H    ;Activa funcion
    CALL EJECUTA
    CALL DELAY
    MOVLW 38H    ;Activa funcion
    CALL EJECUTA
    MOVLW 0CH    ;Screen on/off cursor
    CALL EJECUTA
    MOVLW 01H    ;Borrar pantalla
    CALL EJECUTA
    MOVLW 06H    ;Direccion de movimiento
    CALL EJECUTA
    MOVLW 02H    ;Home
    CALL EJECUTA
    MOVLW 95H    ;Ajusta la direccion de DD RAM
    CALL EJECUTA
RETURN

EJECUTA:
MOVWF PORTB
CALL DELAY
MOVLW 02H
    MOVWF PORTA
    CALL DELAY
    MOVLW 00H
    MOVWF PORTA
    CALL DELAY
RETURN

MANDAR:
    MOVWF PORTB
    CALL DELAY
    MOVLW 03H
    MOVWF PORTA
    CALL DELAY
    MOVLW 01H
    MOVWF PORTA
    CALL DELAY
RETURN    


DELAY:
    movlw 10H
    movwf Q ;la CTE1 pasa a la direccion de VALOR1.    
TRES
    movlw 8H
    movwf M ;la CTE2 pasa a la direccion de VALOR2.
DOS
    movlw 255H
    movwf N ;la CTE3 pasa a la direccion de VALOR3.
UNO
    DECFSZ N,1
    GOTO UNO    
    DECFSZ M,1
    GOTO DOS    
    DECFSZ Q,1
    GOTO TRES  
    RETURN

DELAYL:
MOVLW CONTA1
    MOVWF VAL1
    MOVLW CONTA2
    MOVWF VAL2
RETURN

END


; Desplazar a la izquierda
processor 16f877
INCLUDE <P16f877.INC>

N EQU H'21'  ; asignamos direcciones.
M EQU H'22'
Q EQU H'23'

;quitndo el comentario podemos desplegar el mensaje en la parte alta del desplay
;VAL1 EQU H'60'
VAL2 EQU H'60'
;CONTA1 EQU 90H
CONTA2 EQU 90H

         org 0
    GOTO INICIO
         org 5  ; vector de reset, vector de interrupcion
       
INICIO

    clrf PORTB         ;Limpia PORTB
    clrf PORTD         ;Limpia PORTD
    bsf STATUS, RP0
    bcf STATUS, RP1    ;Selecciona el banco 1
    clrf TRISB         ;Configura PORTB como salida
    clrf TRISD         ;Configura PORTD como salida
    bcf STATUS,RP0     ;Regresa al banco 0


LCD_INICIAR
   ;quitndo el comentario podemos desplegar el mensaje en la parte alta del desplay
    CALL LCD_IN
    ;CALL I
    ;CALL F1
    ;CALL NEXT
    CALL I
    CALL F2
    GOTO LCD_INICIAR

I:
CALL DELAYL
    MOVLW 'E'
    CALL MANDAR
    MOVLW 'J'
    CALL MANDAR
    MOVLW 'E'
    CALL MANDAR
    MOVLW 'R'
    CALL MANDAR
    MOVLW 'C'
    CALL MANDAR
    MOVLW 'I'
    CALL MANDAR
    MOVLW 'C'
    CALL MANDAR
    MOVLW 'I'
    CALL MANDAR
    MOVLW 'O'
    CALL MANDAR
    MOVLW ' '
    CALL MANDAR
    MOVLW '3'
    CALL MANDAR
RETURN

;quitndo el comentario podemos desplegar el mensaje en la parte alta del desplay
;F1:
;    MOVLW 18H    ;Desplazar 1C DERECHA    18 HIZQUIERDA
;    CALL EJECUTA
;    DECFSZ VAL1
;    GOTO F1
;RETURN

F2:
    MOVLW 18H    ;Desplazar 1C DERECHA    18 HIZQUIERDA
    CALL EJECUTA
    DECFSZ VAL2
    GOTO F2
RETURN

NEXT:
    CALL LCD_IN
    MOVLW 0xD5    ;Ajusta la direccion de DD RAM
    CALL EJECUTA
RETURN

LCD_IN:
    MOVLW 30H    ;Activa funcion
    CALL EJECUTA
    CALL DELAY
    MOVLW 30H    ;Activa funcion
    CALL EJECUTA
    CALL DELAY
    MOVLW 38H    ;Activa funcion
    CALL EJECUTA
    MOVLW 0CH    ;Screen on/off cursor
    CALL EJECUTA
    MOVLW 01H    ;Borrar pantalla
    CALL EJECUTA
    MOVLW 06H    ;Direccion de movimiento
    CALL EJECUTA
    MOVLW 02H    ;Home
    CALL EJECUTA
    MOVLW 95H    ;Ajusta la direccion de DD RAM
    CALL EJECUTA
RETURN

EJECUTA:
MOVWF PORTB
CALL DELAY
MOVLW 02H
    MOVWF PORTD
    CALL DELAY
    MOVLW 00H
    MOVWF PORTD
    CALL DELAY
RETURN

MANDAR:
    MOVWF PORTB
    CALL DELAY
    MOVLW 03H
    MOVWF PORTD
    CALL DELAY
    MOVLW 01H
    MOVWF PORTD
    CALL DELAY
RETURN    


DELAY:
    movlw 20H
    movwf Q ;la CTE1 pasa a la direccion de VALOR1.    
TRES
    movlw 8H
    movwf M ;la CTE2 pasa a la direccion de VALOR2.
DOS
    movlw 255H
    movwf N ;la CTE3 pasa a la direccion de VALOR3.
UNO
    DECFSZ N,1
    GOTO UNO    
    DECFSZ M,1
    GOTO DOS    
    DECFSZ Q,1
    GOTO TRES  
    RETURN

DELAYL:
;quitndo el comentario podemos desplegar el mensaje en la parte alta del desplay
;MOVLW CONTA1
    ;MOVWF VAL1
    MOVLW CONTA2
    MOVWF VAL2
RETURN

END

No hay comentarios:

Publicar un comentario