;------------------------------------------------------------
; Código assembler generado por Niple V4.0.0
; Nombre del Proyecto: Ejemplo 4
; Autor: Juan Ramon Castillo (PC1).
; Fecha: 20/08/2006
; PIC: 16F873
; Velocidad de reloj: 4 Mhz
; Descripcion: Medir una temperatura cada un segundo y mostrar el resultado en una pantalla LCD. 
;------------------------------------------------------------


 LIST    P=PIC16F873


_XT_OSC          EQU  0x3FFD
_DEBUG_OFF       EQU  0x3FFF
_WDT_OFF         EQU  0x3FFB
_PWRTE_ON        EQU  0x3FF7
_BODEN_OFF       EQU  0x3FBF
_LVP_OFF         EQU  0x3F7F
_CPD_OFF         EQU  0x3FFF
_CP_OFF          EQU  0x3FFF
_WRT_ENABLE_OFF  EQU  0x3DFF

 __config _XT_OSC & _DEBUG_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_ENABLE_OFF & _CP_OFF


;------------------------------------------------------------
;                  Declaración de Registros
;------------------------------------------------------------
w                     equ  00h
status                equ  0x03
fsr                   equ  0x04
portb                 equ  0x06
pclath                equ  0x0a
opcion                equ  0x181
trisb                 equ  0x186
adresh                equ  0x1e
adcon0                equ  0x1f
_np_nro_lcd           equ  0x20
_np_lcd_1             equ  0x21
_np_temp1             equ  0x22
_np_temp2             equ  0x23
_np_tiempo            equ  0x24
_np_tiempo1           equ  0x26
_np_tiempo2           equ  0x27
_np_nro_msj           equ  0x28
_np_msj_act           equ  0x29
_np_tiempo3           equ  0x2a
tempe1                equ  0x2b
tempe2                equ  0x2c
_np_temp3             equ  0x2d
_np_temp4             equ  0x2e
_np_temp5             equ  0x2f
unidad                equ  0x30
decena                equ  0x31
centena               equ  0x32
u_mil                 equ  0x33
_np_temp6             equ  0x34
_np_temp7             equ  0x35
_np_temp8             equ  0x36
_np_temp9             equ  0x37
_np_temp10            equ  0x38
_np_temp11            equ  0x39
_np_temp12            equ  0x3a
trisa                 equ  0x85
adresl                equ  0x9e
adcon1                equ  0x9f


;------------------------------------------------------------
;                  Declaración de Bits
;------------------------------------------------------------
adfm            equ  7   ;
adon            equ  0   ;
c               equ  0   ;carry / borrow bit
go_done         equ  2   ;
rp0             equ  5   ;registrer bank select bit
rp1             equ  6   ;registrer bank select bit
z               equ  2   ;bit cero


;------------------------------------------------------------
;                        Inicio
;------------------------------------------------------------

reset   org 0
   goto paso2
   org 4
   retfie


;------------------------------------------------------------
;                      programa principal
;------------------------------------------------------------
paso2
   movlw b'00000001'                ;configurar el puerto a como xxsssssa
   bsf status,rp0                   ;cambiar a banco 1
   bcf status,rp1
   movwf trisa
   movlw b'10001110'                ;configuracion a/d = dddda
   movwf adcon1
   bcf status,rp0                   ;cambiar a banco 0
   bsf adcon0,adon                  ;activar activar el conversor a/d.
   movlw b'00000000'                ;configurar el puerto b como ssssssss
   bsf status,rp0                   ;cambiar a banco 3
   bsf status,rp1
   movwf trisb
   movlw b'00000001'                ;seleccionar el lcd 1
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_nro_lcd
   clrf _np_lcd_1
   call lcd_inicio
   movlw b'00000001'                ;seleccionar el lcd 1
   movwf _np_nro_lcd
   call usr_lcd_bienvenida
   ;temporizador 3 seg
   movlw .3
   call tiempo_1_255_seg
   ;fin del temporizador 3 seg
paso9
   movlw b'10000001'                ;conversión 
   movwf adcon0
   bsf status,rp0                   ;cambiar a banco 1
   bsf adcon1,adfm                  ;alinear el resultado a la derecha
   bcf status,rp0                   ;cambiar a banco 0
   clrf _np_temp3
   clrf _np_temp4
   movlw .16
   movwf _np_temp5
paso9_ciclos
   call leer_ad
   bsf status,rp0                   ;cambiar a banco 1
   movf adresl,w                    ;recuperar el registro bajo de la conversion a/d
   bcf status,rp0                   ;cambiar a banco 0
   movwf tempe2
   movf adresh,w                    ;recuperar el registro alto de la conversion a/d
   movwf tempe1
   movf tempe2,w
   addwf _np_temp4,1
   btfsc status,c
   incf _np_temp3,1
   movf tempe1,w
   addwf _np_temp3,1
   decfsz _np_temp5,1
   goto paso9_ciclos
   bcf status,c
   rrf _np_temp3,1
   rrf _np_temp4,1
   bcf status,c
   rrf _np_temp3,1
   rrf _np_temp4,1
   bcf status,c
   rrf _np_temp3,1
   rrf _np_temp4,1
   bcf status,c
   rrf _np_temp3,1
   rrf _np_temp4,1
   movf _np_temp3,w
   movwf tempe1
   movf _np_temp4,w
   movwf tempe2
   ;convertir un registro (16) a bcd
   movf tempe1,w                    ;cargar el byte alto
   movwf _np_temp1
   movf tempe2,w                    ;cargar el byte bajo
   movwf _np_temp2
   call conv_16_bcd
   movf _np_temp8,w                 ;unidad
   movwf unidad
   movf _np_temp9,w                 ;decena
   movwf decena
   movf _np_temp10,w                ;centena
   movwf centena
   movf _np_temp11,w                ;unidad de mil
   movwf u_mil
   movlw b'00000001'                ;seleccionar el lcd 1
   movwf _np_nro_lcd
   call usr_lcd_temperatura
   ;temporizador 1 seg
   movlw .1
   call tiempo_1_255_seg
   ;fin del temporizador 1 seg
   goto paso9                       ;cierra el ciclo


;------------------------------------------------------------
;                  Declaración de Subrutinas
;------------------------------------------------------------

usr_lcd_bienvenida
   movlw .1
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_nro_msj
   call lcd_mensaje_actual
   btfss _np_msj_act,0
   goto usr_lcd_bienvenida2_no_config
   movlw b'00001100'
   call lcd_comando
   movlw b'00000001'
   call lcd_comando
usr_lcd_bienvenida2_no_config
   movlw b'10000011'
   call lcd_comando
   movlw .74                        ;j
   call lcd_caracter
   movlw .85                        ;u
   call lcd_caracter
   movlw .65                        ;a
   call lcd_caracter
   movlw .78                        ;n
   call lcd_caracter
   movlw .32                        ;espacio
   call lcd_caracter
   movlw .82                        ;r
   call lcd_caracter
   movlw .65                        ;a
   call lcd_caracter
   movlw .77                        ;m
   call lcd_caracter
   movlw .79                        ;o
   call lcd_caracter
   movlw .78                        ;n
   call lcd_caracter
   movlw b'11000011'
   call lcd_comando
   movlw .66                        ;b
   call lcd_caracter
   movlw .73                        ;i
   call lcd_caracter
   movlw .69                        ;e
   call lcd_caracter
   movlw .78                        ;n
   call lcd_caracter
   movlw .86                        ;v
   call lcd_caracter
   movlw .69                        ;e
   call lcd_caracter
   movlw .78                        ;n
   call lcd_caracter
   movlw .73                        ;i
   call lcd_caracter
   movlw .68                        ;d
   call lcd_caracter
   movlw .79                        ;o
   call lcd_caracter
   goto usr_lcd_bienvenida_salir
   goto usr_lcd_bienvenida_salir
usr_lcd_bienvenida_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


usr_lcd_temperatura
   movlw .2
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_nro_msj
   call lcd_mensaje_actual
   btfss _np_msj_act,0
   goto usr_lcd_temperatura2_no_config
   movlw b'00001100'
   call lcd_comando
   movlw b'00000001'
   call lcd_comando
usr_lcd_temperatura2_no_config
   movlw b'10000010'
   call lcd_comando
   movlw .84                        ;t
   call lcd_caracter
   movlw .101                       ;e
   call lcd_caracter
   movlw .109                       ;m
   call lcd_caracter
   movlw .112                       ;p
   call lcd_caracter
   movlw .101                       ;e
   call lcd_caracter
   movlw .114                       ;r
   call lcd_caracter
   movlw .97                        ;a
   call lcd_caracter
   movlw .116                       ;t
   call lcd_caracter
   movlw .117                       ;u
   call lcd_caracter
   movlw .114                       ;r
   call lcd_caracter
   movlw .97                        ;a
   call lcd_caracter
   movlw .58                        ;:
   call lcd_caracter
   movlw b'11001011'
   call lcd_comando
   movlw .46                        ;.
   call lcd_caracter
usr_lcd_temperatura2_var
   movlw b'11001000'
   call lcd_comando
   movf u_mil,w                     ;enviar la variable u_mil al lcd.
   addlw .48
   call lcd_caracter
   movlw b'11001001'
   call lcd_comando
   movf decena,w                    ;enviar la variable decena al lcd.
   addlw .48
   call lcd_caracter
   movlw b'11001010'
   call lcd_comando
   movf decena,w                    ;enviar la variable decena al lcd.
   addlw .48
   call lcd_caracter
   movlw b'11001100'
   call lcd_comando
   movf unidad,w                    ;enviar la variable unidad al lcd.
   addlw .48
   call lcd_caracter
   goto usr_lcd_temperatura_salir
   goto usr_lcd_temperatura_salir
usr_lcd_temperatura_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


lcd_inicio
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   clrf _np_lcd_1
   movlw d'2'
   call tiempo_1_100_ms
   movlw b'00101000'
   call lcd_comando
   movlw b'00101000'
   call lcd_comando
   return
lcd_busy
   bsf status,rp0                   ;cambiar a banco 3
   bsf status,rp1
   bsf trisb,7
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf portb,1
   bsf portb,2
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bsf portb,3
   btfsc portb,7
   goto lcd_busy
   bcf portb,1
   bsf portb,2
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf portb,3
   bsf status,rp0                   ;cambiar a banco 3
   bsf status,rp1
   bcf trisb,7
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return
lcd_comando
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf portb,1
   bcf portb,2
   goto lcd_enviar
lcd_caracter
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bsf portb,1
   bcf portb,2
lcd_enviar
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bsf portb,3
   movwf _np_temp1
   bcf portb,4
   bcf portb,5
   bcf portb,6
   bcf portb,7
   btfsc _np_temp1,4
   bsf portb,4
   btfsc _np_temp1,5
   bsf portb,5
   btfsc _np_temp1,6
   bsf portb,6
   btfsc _np_temp1,7
   bsf portb,7
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf portb,3
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bsf portb,3
   bcf portb,4
   bcf portb,5
   bcf portb,6
   bcf portb,7
   btfsc _np_temp1,0
   bsf portb,4
   btfsc _np_temp1,1
   bsf portb,5
   btfsc _np_temp1,2
   bsf portb,6
   btfsc _np_temp1,3
   bsf portb,7
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf portb,3
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bsf portb,3
   call lcd_busy
   return
lcd_mensaje_actual
lcd_1
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   clrf _np_msj_act
   movf _np_nro_msj,w
   xorwf _np_lcd_1,w
   btfss status,z
   bsf _np_msj_act,0
   movf _np_nro_msj,w
   movwf _np_lcd_1
   return



tiempo_1_255_seg
   movwf _np_tiempo
   goto tiempo_1_255_seg_1
tiempo_1_255_seg_bucle2
   nop
   nop
   nop
   nop
   nop
   nop
   nop
tiempo_1_255_seg_1
   movlw .10
   movwf _np_tiempo1
tiempo_1_255_seg_bucle1
   nop
   nop
   movlw .99
   movwf _np_tiempo2
tiempo_1_255_seg_bucle0
   nop
   nop
   nop
   movlw .200
   movwf _np_tiempo3
tiempo_1_255_seg_bucle
   nop
   nop
   decfsz _np_tiempo3,1
   goto tiempo_1_255_seg_bucle
   nop
   nop
   nop
   decfsz _np_tiempo2,1
   goto tiempo_1_255_seg_bucle0
   nop
   nop
   nop
   decfsz _np_tiempo1,1
   goto tiempo_1_255_seg_bucle1
   decfsz _np_tiempo,1
   goto tiempo_1_255_seg_bucle2
   return




leer_ad
   ;realizar conversion a/d
   movlw .200
   movwf _np_temp1
leer_ad_esperar
   decfsz _np_temp1,1
   goto leer_ad_esperar
   bsf adcon0,go_done
   nop
   nop
leer_ad_esperar_fin
   btfsc adcon0,go_done
   goto leer_ad_esperar_fin
   return


conv_16_bcd
   ;convertir un registro (16 bits) a formato bcd (u, d, c, um y dm)
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   clrf _np_temp8
   clrf _np_temp9
   clrf _np_temp10
   clrf _np_temp11
   clrf _np_temp12
   movlw 0x10
   movwf _np_temp6
   clrf _np_temp3
   clrf _np_temp4
   clrf _np_temp5
conv_16_bcd_1
   rlf _np_temp2,1
   rlf _np_temp1,1
   rlf _np_temp5,1
   rlf _np_temp4,1
   rlf _np_temp3,1
   decfsz _np_temp6,1
   goto conv_16_bcd_2
   movf _np_temp5,w
   andlw 0x0f
   movwf _np_temp8
   movf _np_temp5,w
   andlw 0xf0
   movwf _np_temp9
   swapf _np_temp9,1
   movf _np_temp4,w
   andlw 0x0f
   movwf _np_temp10
   movf _np_temp4,w
   andlw 0xf0
   movwf _np_temp11
   swapf _np_temp11,1
   movf _np_temp3,w
   andlw 0x0f
   movwf _np_temp12
   return
conv_16_bcd_2
   movlw _np_temp5
   movwf fsr
   call conv_16_bcd_3
   movlw _np_temp4
   movwf fsr
   call conv_16_bcd_3
   movlw _np_temp3
   movwf fsr
   call conv_16_bcd_3
   goto conv_16_bcd_1
conv_16_bcd_3
   movlw d'03'
   addwf w,w
   movwf _np_temp7
   btfsc _np_temp7,3
   movwf w
   movlw 0x30
   addwf w,w
   movwf _np_temp7
   btfsc _np_temp7,7
   movwf w
   return




tiempo_1_100_ms
   movwf _np_tiempo
   goto tiempo_1_100_ms_1
tiempo_1_100_ms_bucle1
   nop
   nop
   nop
   nop
   nop
   nop
   nop
tiempo_1_100_ms_1
   movlw .246
   movwf _np_tiempo1
tiempo_1_100_ms_bucle2
   nop
   decfsz _np_tiempo1,1
   goto tiempo_1_100_ms_bucle2
   nop
   nop
   nop
   nop
   nop
   decfsz _np_tiempo,1
   goto tiempo_1_100_ms_bucle1
   return




 End