Professional Documents
Culture Documents
Tabla de Conversin
mV
0
2.450
4.902
7.353
9.802
Conversion de mV/Kgs
Peso (g)
0
250
500
750
1000
Programacion
LIST P=16F877 ; Tipo de procesador
#include p16f877.inc ; Definiciones de registros internos
__config _XT_OSC & _WDT_OFF & _PWRTE_ON &_LVP_OFF
PCL equ 0x02
DATO_H equ 0x20 ; Localidad para almacenamiento de la conversin los 8 bits ms altos
(ADRESH)
DATO_L equ 0x21 ; Almacenamiento de la conversin de los 2 bits MSB de la parte baja
(ADRESL)
CONT1 equ 0x22 ; Retardos para la adquisicin de la conversin analgica a digital.
;*******************************************************************
; CONFIGURACIN DE PUERTOS.
;*******************************************************************
bsf STATUS,5 ; Seleccin del banco 1.
movlw 0x00
movwf PORTB ; Configura puerto B como salida.
Movlw 0xF8
movwf PORTC ; Configura Pines C3 y C4 como entradas para el RTC y C5, C6 Y C7 para
los botones.
Bcf STATUS,5 ; Regresa al banco 0.
;*******************************************************************
; LLAMA RUTINAS DE CONFIGURACIN DE PANTALLA.
;*******************************************************************
call INIT_DISP
call LIMPIA_DISP
call DUAL_LINE
call LIMPIA_DISP
call CLC_CONV ; Configuracin del REG. ADCON1 (config. de las lneas del conv. A/D).
call MENSAJE ; Llama al mensaje Hola Bienvenido.
;*******************************************************************
; MANDA MENSAJE DE BIENVENIDA A LA PANTALLA.
;*******************************************************************
MENSAJE:
movlw ' '
call DATO
movlw ' '
call DATO
movlw ' '
call DATO
movlw ' '
call DATO
movlw ' '
call DATO
movlw ' '
call DATO
movlw 'H'
call DATO
movlw 'O'
call DATO
movlw 'L'
call DATO
movlw 'A'
call DATO
call LINEA2 ; Llama rutina para brincar a la segunda lnea.
movlw ' '
call DATO
movlw ' '
call DATO
movlw ' '
call DATO
movlw 'B'
call DATO
movlw 'I'
call DATO
movlw 'E'
call DATO
movlw 'N'
call DATO
movlw 'V'
call DATO
movlw 'E'
call DATO
movlw 'N'
call DATO
movlw 'I'
call DATO
movlw 'D'
call DATO
movlw 'O'
call DATO
call RET100
call RET100
call RET100
call RET100
call RET100
call RET100
call RET100
call RET100
call CONFI ; Llama rutina de parmetros para inicializacin del RTC.
;*******************************************************************
; RUTINA DE FUNCIONAMIENTO GENERAL.
;*******************************************************************
BUCLE
call LEE_SENSOR ; No, Se va a leer el sensor.
movlw 0x08 ; Carga el numero 5-9 que es el valor que representa 1Kg.
subwf ADRESH,W ; Resta/compara con ADRESH.
btfsc STATUS,Z ; Son iguales (Z=1)??.
goto NEWPESO ; Si.
btfsc STATUS,C ; No. ADRESH > 5 (C=1)?.
goto NEWPESO ; Si.
call REIREL ; No.
btfsc PORTC,5 ; Checa si el bit 5 = 1 del puerto C.
goto MINUTOS ; Si, se va a modificar datos del reloj.
call MODREC ; Configura PIC en modo de recepcin.
LIM
;CALL CPARO
movlw 00h
call LCDIR ; Direcciona cursor de la pantalla en la posicin h80.
call MOSTRAR ; Muestra en pantalla tiempo y fecha.
btfsc PORTC,6
call CHECA
btfsc PORTC,7
call CHECA1
CHB5
btfsc PORTC,5 ; Checa si el bit 5 = 1 del puerto C.
goto MINUTOS ; Si, se va a modificar datos del reloj.
goto BUCLE ; No, Se va a leer el sensor.
;*******************************************************************
; RUTINA PARA CONFIGURAR AL PIC EN MODO DE RECEPCIN.
;*******************************************************************
MODREC
call CINI ; Llama la rutina para enviar la condicin de inicio de transmisin.
movlw 0xD1 ; Carga la direccin del esclavo (D0 para CI DS1307).
call ENVDATO ; Llama a la rutina para envo de un byte de datos.
LEEOTR
bcf PIR1,3 ; Apaga bit 3 del registro PIR1.
call ENVDATO
movf DIAS,0 ; Carga da de la semana.
call ENVDATO
movf FECHAS,0 ; Manda da del mes.
call ENVDATO
movf MESES,0 ; Manda mes.
call E NVDATO
movf AOS,0 ; Manda ao.
call ENVDATO
movlw 0x10 ; Configura la lnea de salida (SQW/OUT) de reloj para dar pulso de 1 seg.
call ENVDATO
call CPARO ; Llama a la rutina para enviar la condicin de PARO.
return
;*******************************************************************
; RUTINA PARA ENVO DE CONDICIN DE PARO.
CPARO
bcf PIR1,3
bsf STATUS,5 ; Cambio al banco 1.
bcf STATUS,6
bsf SSPCON2,2 ; Pone en alto el bit PEN para la condicin de paro.
bcf STATUS,5 ; Cambia al banco 0.
ESPER2
btfss PIR1,SSPIF ; Espera que halla finalizado la operacin.
goto ESPER2
return
;*******************************************************************
; RUTINA PARA EL ENVIO DE LA CONDICION DE INICIO DE TRANSMISION.
;*******************************************************************
CINI
bcf PIR1,3 ; Limpia la bandera de fin de transmisin de dato (SSPIF).
bsf STATUS,5 ; Cambio al banco 1.
bcf STATUS,6
bsf SSPCON2,0 ; Coloca en alto el bit SEN para dar la transicin de inicio.
bcf STATUS,5 ; Regreso al banco 0.
ciclo
btfss PIR1,SSPIF ; Espera que halla terminado la operacin.
goto ciclo
return
;*******************************************************************
; RUTINA PARA ENVIAR DATOS AL RELOJ.
;*******************************************************************
ENVDATO
bcf PIR1,3 ; Limpia la bandera de fin de transmisin.
movwf SSPBUF ; Manda el byte al buffer de salida.
ESPER1
btfss PIR1,3 ; Espera que halla terminado la transmisin del byte.
goto ESPER1
return
;*******************************************************************
; RUTINA PARA MANDAR LOS PARAMETROS DE INICIALIZACIN DEL RTC.
;*******************************************************************
CONFI
bsf STATUS,5 ; Cambio al banco 1.
bcf STATUS,6
movlw 0x80
movwf SSPSTAT ; Configuracin de velocidad estndar con nivel I2C.
movlw 0x09
movwf SSPADD ; Velocidad del bus I2C = 100 KHZ.
goto LEEOTR
;************************************************************************
; RUTINA PARA MOSTRAR DIA, DIA DEL MES Y EL MES EN LA LCD EN 1erLINEA.
;************************************************************************
MOSTRAR
call DESPDIA ; llamamos rutina para desplegar el da de la semana.
movlw 0x00
addlw 0x8A ; direcciona el cursor en la lnea 1 direccin 10 de la LCD.
call MANDA
movf FECHAS,0 ; movemos lo que hay en fechas a W.
movwf TEMP1 ; movemos W a TEMP1.
call UNOX1 ; llamamos la rutina para enviar el dato de fecha digito x digito.
call DESPMES ; llamamos la rutina para desplegar el mes.
call LINEA2 ; rutina para pasar a la segunda lnea de la LCD.
call LCDIR2 ; rutina para que ponga en la lnea 2 posicin 0.
movlw '2'
call DATO
movlw '0'
call DATO
movf AOS,0 ; movemos lo que hay en aos a W.
movwf TEMP1 ; movemos W a TEMP1.
call UNOX1 ; llamamos la rutina para enviar el dato del ao digito x digito.
movlw ' '
call DATO
movf HORA,0 ; movemos lo que hay en hora a W.
movwf DATEMP
btfsc HORA,6
bcf DATEMP,5
bcf DATEMP,6
movf DATEMP,0
movwf TEMP1 ; movemos W a TEMP1.
call UNOX1 ; llamamos la rutina para enviar el dato de la hora digito x digito.
movlw ':'
call DATO
movf MINUTO,0 ; movemos lo que hay en minuto a W.
movwf TEMP1 ; movemos W a TEMP1.
call UNOX1 ; llamamos la rutina para enviar el dato de los minutos digito x digito.
movlw ':'
call DATO
movf SEGUNDO,0 ; movemos lo que hay en segundos a W.
movwf TEMP1 ; movemos W a TEMP1.
call UNOX1 ; llamamos la rutina para enviar el dato de los segundos digito x digito.
btfsc HORA,6
goto MODO12
goto MODO24
MODO12
movlw ' '
call DATO
btfsc HORA,5
goto PM
goto AM
FUERA
return
;*******************************************************************
; RUTINA PARA DESPLEGUE DEL DA DE LA SEMANA.
;*******************************************************************
DESPDIA
movf STATUS,W
movwf Estatus_Temp ; Salva temporalmente el carry
rrf Multiplicador,F ; Desplaza a la derecha el multiplicador
movf Estatus_Temp,W
movwf STATUS ; Recupera el carry original
decfsz Contador,F ; Repite el bucle 8 veces
goto Bucle
movfw Resultado_H ; Mueve lo que hay en Resultado_H a W
addwf Resultado_L,W ; Suma el Resultado_L (+) W=Resultado_H
movwf Residuo ; El resultado de la suma que en Residuo
movlw 0xFF ; Carga W con 255
subwf Residuo,0 ; Se le resta al resultado alto+el bajo el valor W=255 y resultado=W
btfss STATUS,Z ; checa si Z=1, si si salta goto Rutina
goto Rutina
movwf Residuo ; El resultado de la resta queda en Residuo=0
movf Resultado_H,W
movwf Resultado2 ; Copea lo que esta Resultado_H en Resultado2
incf Resultado2,1 ; Si la resta=0 se incrementa lo que esta en Resultado2 una vez
goto sigue
Rutina
movf Resultado_H,W
movwf Resultado2
movf Residuo,W ; Lo que sobro de la divisin se graba en W
movwf Minuendo ; Minuendo se carga con este valor = W
movlw 0x1A ; Se carga Sustraendo con el valor de 26 para as poder sacar el Decimal
movwf Sustraendo ; que va ha ser el resultado de Minuendo (-) Sustraendo
clrf Decimal ; Se limpia lo que hay en Decimal "por si hay algo"
bcf STATUS,C ; Se limpia el carry = 0 "por si estaba en 1"
Otra
subwf Minuendo,1 ; Se empieza la resta entre el minuendo y el sustraendo=(26)
btfsc STATUS,C ; Checa si el resultado de la resta fue negativa si si salta a sigue
goto In ; Si el resultado fue positivo va a incrementar el contador que va
ha dar el decimal
goto sigue ; Salto a la rutina de sigue que continua con la conversin de
binario a BCD luego a ASSCI
In
incf Decimal,1 ; Incrementa Decimal en 1 indicando que Sustraendo cupo otra
vez en Minuendo
goto Otra ; Se realiza otra vez la resta por si cabe otra vez
sigue
movf Resultado2,w
movlw 3
addwf 0,W
movwf TEMPESO
btfsc TEMPESO,3 ;pregunta si el resultado es mayor que 7
movwf 0
movlw 30
addwf 0,W
movwf TEMPESO
btfsc TEMPESO,7 ;pregunta si el resultado es mayor que 7
movwf 0
retlw 0
return
;*******************************************************************
; RETARDO DE 100mS
;*******************************************************************
RETADQ
movlw 0X01 ; debe ser 0X01 Retardo para la adquisicin de la conversin A/D
ret3
movlw 0x04
movwf CONT2
decf CONT1
ret4
decf CONT2
nop
nop
nop
nop
nop
nop
movf CONT2,1
btfss STATUS,2
goto ret4
movf CONT1,1
btfss STATUS,2
goto ret3
return
RETARDO1:
movlw d'250';
movwf J
jloop1:
movwf K
kloop1:
decfsz K,f
goto kloop1
decfsz J,f
goto jloop1
return
end ; Fin de programa.