Buenas tarde amigos por curiocidad escribi un programa para manejo de LCD a 20Mhz usando el TMR0 como temporizador pues lor programas que he visto solo generan temporizacion por una rutina y quise probar otra opcion.
Lo logre pero no se por que no puedo cambiar a la segunda linea pues cuando elimino el TMR0 y uso una rutina que haga el trabajo de temporizacion funciona de maravilla.............ahora les muestro el codigo espero me ayuden y les doy las gracias de antemano.
; ------------------------------------------------------------
; Programa para uso de LCD con PIC 16F876A a 20 Mhz
; utilizando el TMR0 como temporizacion
; ------------------------------------------------------------
processor 16F876A
include <P16F876A.INC>
errorlevel -302
; -----------------------------------------
; Variables para DELAY
; -----------------------------------------
cblock 0x20
TMP_LCD ; Variable para Dato temporal del LCD
VECTOR ; Vector para manejo de Temporizacion
VEC_TMP ; Registro de almacenamiento del Vector
COMAN_T ; Variable para Registar comandos internor
endc
; -----------------------------------------
; Definiciones
; -----------------------------------------
#define RS 4 ; RESET de la LCD
#define E 5 ; ENABLE de la LCD
Org 0 ; Vector de RESET
goto INICIO
Org 4 ; Vector de INTERRUPCIONES
goto Inter
; -----------------------------------------
; configuracion de puertos
; -----------------------------------------
INICIO:
clrf PORTA ; Limpia PORTA
clrf PORTB ; Limpia PORTB
bsf STATUS, RP0
movlw b'11000000'
movwf TRISA ; Configura PORTA
clrf TRISB ; Configura PORTB como salida
movlw b'00000100' ; presscaler TMR0 1:32
movwf OPTION_REG
bcf STATUS, RP0 ; Regresa al banco 0
movlw D'200
movwf TMR0
bsf INTCON, T0IE ; Habilitacion de Interrupcion por TMR0
bsf INTCON, GIE ; Habilitacion general de Interrupciones
movlw D'30'
movwf TMP_LCD ; Valor de Temporizacion del LCD para 20 ms
movlw B'00000010'
movwf VEC_TMP
movwf VECTOR
; -----------------------------------------
; configuracion de puertos
; -----------------------------------------
call INICIO_LCD ; Configura el LCD
call M1 ; Muestra Mensaje
call LINEA2 ; Configura linea 2
call M2 ; Muestra Mensaje
Seguir:
nop
goto $-1
; -----------------------------------------
; Mensajes a Mostrar
; -----------------------------------------
M1:
movlw 'H' ; Mueve 'H' a W
movwf PORTB ; Mueve lo que hay en W a PORTB
call ENVIA ; Imprime en LCD
movlw 'o'
movwf PORTB
call ENVIA
movlw 'l'
movwf PORTB
call ENVIA
movlw 'a'
movwf PORTB
call ENVIA
movlw ' '
movwf PORTB
call ENVIA
movlw 'L'
movwf PORTB
call ENVIA
movlw 'i'
movwf PORTB
call ENVIA
movlw 'n'
movwf PORTB
call ENVIA
movlw '1'
movwf PORTB
call ENVIA
return
; -----------------------------------------
M2:
movlw 'H' ; Mueve 'I' a W
movwf PORTB ; Mueve lo que hay en W a PORTB
call ENVIA ; Imprime en LCD
movlw 'o'
movwf PORTB
call ENVIA
movlw 'l'
movwf PORTB
call ENVIA
movlw 'a'
movwf PORTB
call ENVIA
movlw ' '
movwf PORTB
call ENVIA
movlw 'L'
movwf PORTB
call ENVIA
movlw 'i'
movwf PORTB
call ENVIA
movlw 'n'
movwf PORTB
call ENVIA
movlw '2'
movwf PORTB
call ENVIA
return
; -----------------------------------------
; Subrutina para inicializar el lcd
; -----------------------------------------
INICIO_LCD:
bcf PORTA, RS ; RS=0 MODO INSTRUCCION
movlw 0x01 ; El comando 0x01 limpia la pantalla en el LCD
movwf PORTB
call COMANDO ; Se da de alta el comando
movlw 0x0C ; Selecciona la primera línea
movwf PORTB
goto COMANDO ; Se da de alta el comando
movlw 0x3C ; Se configura el cursor
movwf PORTB
goto COMANDO ; Se da de alta el comando
bsf PORTA, RS ; Rs=1 MODO DATO
return
; -----------------------------------------
; Rutina para enviar comandos al LCD
; -----------------------------------------
COMANDO:
bsf PORTA, E ; Pone la E=1
bsf COMAN_T,0 ; Activa la Temporizacion
Retardo:
btfsc VECTOR, 1 ; Vector de Retardo 1 de Comando
goto Retardo_1
btfsc VECTOR, 2 ; Vector de Retardo 2 de Comando
goto Retardo_2
btfsc VECTOR, 3 ; Vector de Retardo 2 de Comando
goto Retardo_3
goto Retardo
; -----------------------------------------
; Rutina para enviar Datos a vizualizar en el LCD
; -----------------------------------------
ENVIA:
bsf PORTA, RS ; RS=1 MODO DATO
nop
nop
nop
call COMANDO ; Se da de alta el comando
Return
; -----------------------------------------
; Rutina para cambiar a la Lineal 2 del LCD
; -----------------------------------------
LINEA2:
nop
nop
nop
nop
bcf PORTA, RS ; RS=0 MODO INSTRUCCION
nop
nop
nop
movlw 0xC0 ; Selecciona linea 2 pantalla en el LCD
movwf PORTB
call COMANDO ; Se da de alta el comando
Return
Retardo_1:
;call DELAY
btfss VECTOR, 1 ; Vector de Temporizacion 1
goto Retardo
clrf VECTOR
Retardo_2:
;call DELAY
btfss VECTOR, 2 ; Vector de Temporizacion 2
goto Retardo
clrf VECTOR
bcf PORTA, E ; Pone la E=0
Retardo_3:
;call DELAY
btfss VECTOR, 3 ; Vector de Temporizacion 3
goto Retardo
clrf VECTOR
movlw B'00000010' ; Preparacion de Reinicio de Vectores
movwf VEC_TMP ; necesarios para la Rutina COMANDO
movwf VECTOR
bcf COMAN_T,0 ; Rompe la Temporizacion
Return
; -----------------------------------------
; Rutina de atencion de Interrupciones
; -----------------------------------------
Inter:
btfss INTCON, T0IF; Pregunta si el TMR0 se Reboso
Retfie
bcf INTCON, T0IF
movlw D'200'
movwf TMR0
btfss COMAN_T,0 ; Pregunta si el TMR0 se Reboso
goto Salir_T
decfsz TMP_LCD,F
goto Salir_T
movlw D'30' ; Valor de Tempozacion del LCD
movwf TMP_LCD
rlf VEC_TMP,F
movf VEC_TMP,W
movwf VECTOR
Salir_T
Retfie
END