;--------------------------------------------------------------------
;* MANEJO DEL MODULO DISPLAY LCD
;--------------------------------------------------------------------
;*
;* ESCUELA DE INGENIERIA SENATI
;*
;* 23 MAYO 2009
;*
;--------------------------------------------------------------------
LIST P=16F877
INCLUDE <P16F877.INC>
;--------------------------------------------------------------------
;* SE DEFINEN PINES DEL PORTB
;--------------------------------------------------------------------
dat0 EQU 0 ; D4 LCD
dat1 EQU 1 ; D5 LCD
dat2 EQU 2 ; D6 LCD
dat3 EQU 3 ; D7 LCD
e EQU 4 ; ENABLE LCD
rs EQU 5 ; COMANDO/CARACTER
;--------------------------------------------------------------------
;* REGISTROS GENERALES DE LA MEMORIA RAM
;--------------------------------------------------------------------
CBLOCK 0x20
UNID
DEC
CENT
MIL
TEMP
CNTSEG
OVFLW
CNT_LCD
CHAR
ENDC
;--------------------------------------------------------------------
;* INICIALIZA VECTOR DE RESET
;--------------------------------------------------------------------
ORG 0x000
goto inicio
;--------------------------------------------------------------------
;* RUTINAS
;--------------------------------------------------------------------
;* RUTINA DE TIT 1
;--------------------------------------------------------------------
conv_asc addwf PCL,F ; (PCL)+(w)->(PCL)
retlw '0' ; (CNT_LCD) = (W)=0
retlw '1' ; (CNT_LCD) = (W)=1
retlw '2' ; (CNT_LCD) = (W)=2
retlw '3' ; (CNT_LCD) = (W)=3
retlw '4' ; (CNT_LCD) = (W)=4
retlw '5' ; (CNT_LCD) = (W)=5
retlw '6' ; (CNT_LCD) = (W)=6
retlw '7' ; (CNT_LCD) = (W)=7
retlw '8' ; (CNT_LCD) = (W)=8
retlw '9' ; (CNT_LCD) = (W)=9
;--------------------------------------------------------------------
;* RUTINA DE TIT 1
;--------------------------------------------------------------------
tit1 movfw CNT_LCD ; (CNT_LCD)->(W)
addwf PCL,F ; (PCL)+(w)->(PCL)
DT " HORA ACTUAL "
;--------------------------------------------------------------------
;* RUTINA DE TIT 2
;--------------------------------------------------------------------
tit2 movfw CNT_LCD
addwf PCL,F
DT " 03:25:00 "
;--------------------------------------------------------------------
;* ACLARA PINES DE DATOS DEL LCD
;--------------------------------------------------------------------
clrbits bcf PORTB,dat0
bcf PORTB,dat1
bcf PORTB,dat2
bcf PORTB,dat3
return
;--------------------------------------------------------------------
;* ENVIA CARACTER AL MODULO
;--------------------------------------------------------------------
send_char movwf CHAR
bsf PORTB,rs ; CARACTER
call ms_2
call clrbits
btfsc CHAR,4
bsf PORTB,dat0
btfsc CHAR,5
bsf PORTB,dat1
btfsc CHAR,6
bsf PORTB,dat2
btfsc CHAR,7
bsf PORTB,dat3
bsf PORTB,e
nop
bcf PORTB,e
call clrbits
btfsc CHAR,0
bsf PORTB,dat0
btfsc CHAR,1
bsf PORTB,dat1
btfsc CHAR,2
bsf PORTB,dat2
btfsc CHAR,3
bsf PORTB,dat3
bsf PORTB,e
nop
bcf PORTB,e
return
;--------------------------------------------------------------------
;* ENVIA COMANDO AL MODULO
;--------------------------------------------------------------------
send_cmd movwf CHAR
bcf PORTB,rs ; COMANDO
call ms_2
call clrbits
btfsc CHAR,4
bsf PORTB,dat0
btfsc CHAR,5
bsf PORTB,dat1
btfsc CHAR,6
bsf PORTB,dat2
btfsc CHAR,7
bsf PORTB,dat3
bsf PORTB,e
nop
bcf PORTB,e
call clrbits
btfsc CHAR,0
bsf PORTB,dat0
btfsc CHAR,1
bsf PORTB,dat1
btfsc CHAR,2
bsf PORTB,dat2
btfsc CHAR,3
bsf PORTB,dat3
bsf PORTB,e
nop
bcf PORTB,e
return
;--------------------------------------------------------------------
;* RUTINA INCREMENTAR
;--------------------------------------------------------------------
incr movlw .9
xorwf UNID,W
btfsc STATUS,Z
goto inc1
incf UNID,F
return
inc1 clrf UNID
movlw .5
xorwf DEC,W
btfsc STATUS,Z
goto inc2
incf DEC,F
return
inc2 clrf DEC
movlw .9
xorwf CENT,W
btfsc STATUS,Z
goto inc3
incf CENT,F
return
inc3 clrf CENT
movlw .5
xorwf MIL,W
btfsc STATUS,Z
goto inc4
incf MIL,F
return
inc4 clrf MIL
return
;--------------------------------------------------------------------
;* PONE EN CERO REGISTROS DE TIEMPOS
;--------------------------------------------------------------------
tau0 movlw .39
movwf TMR0
clrf OVFLW
clrf CNTSEG
return
;--------------------------------------------------------------------
;* RUTINA DE CONTEO
;--------------------------------------------------------------------
;* FREC.= 4.00 MHz, PREESC.= 256
;--------------------------------------------------------------------
conteo movfw TMR0
btfss STATUS,Z
return
decf TEMP,F
movlw .39
movwf TMR0
incf OVFLW,F
movlw .18
xorwf OVFLW,W
btfss STATUS,Z
return
clrf OVFLW
incf CNTSEG,F
return
;--------------------------------------------------------------------
;* RUTINA DE RETARDO 2 ms
;--------------------------------------------------------------------
ms_2 clrf TMR0
movlw .8 ; 8 * 0.256 ms = 2 ms
xorwf TMR0,W
bnz $-3
return
;--------------------------------------------------------------------
;* RUTINA DE INICIALIZACION DEL MODULO DISPLAY LCD
;--------------------------------------------------------------------
LCD_inc bcf PORTB,rs
bcf PORTB,dat3
bcf PORTB,dat2
bsf PORTB,dat1
bcf PORTB,dat0
bsf PORTB,e
nop
bcf PORTB,e
;--------------------------------------------------------------------
movlw 0x28
call send_cmd
movlw 0x0C
call send_cmd
movlw 0x06
call send_cmd
movlw 0x01
call send_cmd
return
;--------------------------------------------------------------------
;********************** PROGRAMA PRINCIPAL ************************
;--------------------------------------------------------------------
inicio bsf STATUS,RP0 ; BANK 1
movlw B'00000000'
movwf TRISB
movlw B'00000111' ; N=4, TIMER; PULLUP:ON
movwf OPTION_REG
bcf STATUS,RP0 ; BANK 0
;--------------------------------------------------------------------
;* INICIALIZACION
;--------------------------------------------------------------------
;* CONFIGURA EL MODULO DISPLAY LCD: MODO 4 BITS
;--------------------------------------------------------------------
call LCD_inc ; CONFIGURA EL DISPLAY LCD
movlw .2
movwf MIL
movlw .5
movwf CENT
movlw .0
movwf DEC
movlw .0
movwf UNID
;--------------------------------------------------------------------
;* PRESENTACION DE MENSAJES INICIALES
;--------------------------------------------------------------------
;* PRESENTACION DE TITULO 1 FILA 1
;--------------------------------------------------------------------
m0 movlw 0x80
call send_cmd
clrf CNT_LCD
call tit1 ; "ING. ELECTRONICA"
call send_char
incf CNT_LCD,F
movlw .16 ; 16 CARACTERES
xorwf CNT_LCD,w
btfss STATUS,Z
goto $-6
;--------------------------------------------------------------------
;* PRESENTACION DE TITULO 2 FILA 2
;---------------------------------------------------