#INCLUDE "P16F1707.INC"
__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
__CONFIG _CONFIG2, _WRT_OFF & _PPS1WAY_ON & _ZCDDIS_OFF & _PLLEN_ON & _STVREN_ON & _BORV_LO & _LPBOR_OFF & _LVP_OFF
CBLOCK 0X020
RET
RET2
CONTADOR_BYTES
ADC_VALUE
GH
GL
CENTENAS
DECENAS
UNIDADES
BCD_AUX
X_POS
ENDC
;***********************************************************************************************
;********************************* VECTOR DE RESET DEL PIC *************************************
;***********************************************************************************************
ORG 0X00
GOTO CONFIGURA_PIC
;***********************************************************************************************
;***************************** VECTOR DE INTERRUPCION DEL PIC **********************************
;***********************************************************************************************
ORG 0X04
RETURN
;***********************************************************************************************
;********************************* CONFIGURACION DEL PIC ***************************************
;***********************************************************************************************
CONFIGURA_PIC
BANKSEL OSCCON
MOVLW B'11111011'
MOVWF OSCCON
MOVLW B'00011111'
MOVWF OSCTUNE
;***********************************************************************************************
;*************************** CONFIGURACION DE PUERTOS DEL PIC **********************************
;***********************************************************************************************
BANKSEL PORTA
CLRF PORTA
CLRF PORTB
CLRF PORTC
BANKSEL LATA
CLRF LATA
CLRF LATB
CLRF LATC
BANKSEL ANSELA
CLRF ANSELA
CLRF ANSELB
CLRF ANSELC
BANKSEL TRISA
CLRF TRISA
CLRF TRISB
CLRF TRISC
;CONFIGURAMOS ADC
BANKSEL ADCON1 ; El mismo que el de TRISx
MOVLW B'01100000'
MOVWF ADCON1
MOVLW B'00000001' ;Select channel AN0
MOVWF ADCON0 ;Turn ADC On
BSF TRISA,0
BANKSEL ANSELA ;
BSF ANSELA,0
; NOS POSICIONAMOS EN BANCO DE PPSLOCK
; PARA DELBLOQUEARLO
BANKSEL PPSLOCK
MOVLW 0X55
MOVWF PPSLOCK
MOVLW 0XAA
MOVWF PPSLOCK
BCF PPSLOCK,PPSLOCKED
BANKSEL RC0PPS
MOVLW B'00010010'
MOVWF RC0PPS
MOVLW B'00010000'
MOVWF RC1PPS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BANKSEL PPSLOCK
MOVLW 0X55
MOVWF PPSLOCK
MOVLW 0XAA
MOVWF PPSLOCK
BSF PPSLOCK,PPSLOCKED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BANKSEL SSP1CON1 ; ME HUBICO EN EL BANCO QUE CONTIENE EL REGISTRO SSP1CON
MOVLW B'00110000' ; CARGO EL VALOR DE CONFIGURACION PARA SPI
MOVWF SSP1CON1 ; LO GUARDO EN SSP1CON PARA PODER USAR EL MODO SPI
BANKSEL PORTB ; ME REGRESO AL BANCO 0
;***********************************************************************************************
;****************** DEFINICION DE LOS PINES DEL PROGRAMA ***************************************
;***********************************************************************************************
#DEFINE LCD_NOKIA PORTC,2 ; DEFINE EL PIN DEL CHIP SELECT
#DEFINE RST_NOKIA PORTC,3 ; DEFINE EL PIN DE RESET
#DEFINE DC_NOKIA PORTC,4 ; DEFINE EL PIN DE INSTRUCCION/DATO DE LA LCD
BSF RST_NOKIA ; PONGO EN ALTO EL RESET DE LA LCD
BSF LCD_NOKIA ; PONGO EN ALTO EL CHIP SELECT DE LA LCD
;***********************************************************************************************
;********************* RUTINIA DE INICIALIZACION DE LA LCD NOKIA 5110 **************************
;***********************************************************************************************
CALL INI_LCD_NOKIA
;***********************************************************************************************
;**************************** LOOP PRINCIPAL DE FUNCIONAMIENTO *********************************
;***********************************************************************************************
CLRF X_POS
PRINCIPAL
CALL RETARDO ; LLAMAMOS UN RETARDO
MOVLW .0 ; CARGO EL VALOR DEL RENGLON DONDE DESEO ESCRIBIR
CALL SET_Y ; LLAMO RUTINA DE SET POSICION EN Y
MOVLW .0 ; CARGO EL VALOR DE LA COLUMNA DONDE DESEO ESCRIBIR
CALL SET_X ; LLAMO RUTINA DE SET POSICION EN X
MOVLW LOW(ADC_TEXT) ; MUEVO LA DIRECCION DE LA TABLA ADC_TEXT (LOW)
MOVWF FSR0L ; A MI REGISTRO FSR0L
MOVLW HIGH(ADC_TEXT) ; MUEVO LA DIRECCION DE LA TABLA ADC_TEXT (HIGH)
MOVWF FSR0H ; AL REGISTRO FSR0H
MOVLW .17 ; NUMERO DE BYTES A TRANSMITIR
CALL MENSAJE_X_BYTES ; LLAMO A SUBRUTINA DE TRANSMISION DE BYTES
CALL MUESTRA_VALOR ; LLAMAMOS A SUBRUTINA QUE MOSTRARA EL VALOR CONTENIDO DEL ADC 8 BITS
MOVLW .2 ; MUEVO MI CURSOR A RENGLON 2
CALL SET_Y ; LLAMO MI SET POSICION Y
MOVF X_POS,W ; MUEVO MI CURSOR A COLUMNA 0
CALL SET_X ; LLAMO MI SET POSICION X
;***********************************************************************************************
;******************* RUTINA DE LECTURA Y PROCESAMIENTO DEL ADC CH=0 ****************************
;***********************************************************************************************
UPDATE_ADC
CALL CONV_ADC ; LLAMO A MI RUTINA DE CONVERSION ADC
MOVF ADC_VALUE,W ; REGRESA CON ADRESH CARGADO A W Y LO MOVEMOS A ADC_VALUE
CALL GRAFICA_ADC ; LLAMAMOS A LA RUTINA DE CONVERSION PARA LA LCD
CALL DATO_SPI ; LLAMAMOS LA TRANSMISION DEL DATO
INCF X_POS,F ; DESPUES DE ENVIAR DATO INCREMENTAMOS POS X PARA TENER MOVIMIENTO EN SEÑAL
MOVLW .84 ; DEBEMOS ASEGURAR NO PASAR DE 83
SUBWF X_POS,W ; PARA ELLO RESTAMOS 84 PARA SABER SI HA LLEGADO Y REINICIAR POSICION
BTFSS STATUS,Z ; SI HA LLEGADO LA RESTA ARROJARA 0 Y PODREMOS REINICIAR
GOTO PRINCIPAL ; NO FUE CERO REGRESO A PRINCIPAL
CLRF X_POS ; YA LLEGO AL LIMITE REINICIO VARIABLE
GOTO PRINCIPAL ; NOS REGRESAMOS A PRINCIPAL
;***********************************************************************************************
;************************ RUTINA PARA MOSTRAR VALOR ADC 8 BITS *********************************
;***********************************************************************************************
MUESTRA_VALOR
BANKSEL ADC_VALUE ; ME ASEGURO ESTAR EN BANCO DONDE ESTA ADC_VALUE (MI REGISTRO)
MOVF ADC_VALUE,W ; MOVEMOS ADC_VALUE A W PARA OBTENER 3 BYTES CON EL DATO
CALL CONVERSION_BCD ; RUTINA DE CONVERISON BINARIO>>BCD
MOVF CENTENAS,W ; MOVEMOS CENTENAS A W PARA SABER CON QUE NÚMERO QUEDO
CALL ENVIA_NUMERO ; RUTINA DE ESCRITURA DE NUMEROS EN LCD
MOVF DECENAS,W ; MOVEMOS CENTENAS A W PARA SABER CON QUE NÚMERO QUEDO
CALL ENVIA_NUMERO ; RUTINA DE ESCRITURA DE NUMEROS EN LCD
MOVF UNIDADES,W ; MOVEMOS CENTENAS A W PARA SABER CON QUE NÚMERO QUEDO
CALL ENVIA_NUMERO ; RUTINA DE ESCRITURA DE NUMEROS EN LCD
RETURN
ENVIA_NUMERO
BRW ; INSTRUCCION CON FUNCION A TABLA SIN PCL
GOTO SEND0 ;
GOTO SEND1
GOTO SEND2
GOTO SEND3
GOTO SEND4
GOTO SEND5
GOTO SEND6
GOTO SEND7
GOTO SEND8
GOTO SEND9
;***********************************************************************************************
;***************************** RUTINAS PARA MANDAR VALORES EN LCD ******************************
;***********************************************************************************************
SEND9
MOVLW B'01001100' ; CONSTRUIMOS CON 4 BYTES
CALL DATO_SPI ; EL NUMERO 9
MOVLW B'10010010' ; DEJANDO UN ESPACIO
CALL DATO_SPI ; AL FINAL DEL NUMERO
MOVLW B'10010010' ; DADO POR 0X00
CALL DATO_SPI ; MANDAMOS 5 BYTES SEGUIDOS POR
MOVLW B'01111100' ; EL CANAL SPI
CALL DATO_SPI ; PARA CONSTRUIR COMPLETO EL NUMERO
MOVLW B'00000000' ; SIN PERDER FORMA
CALL DATO_SPI
RETURN
SEND8
MOVLW B'01101100' ; CONSTRUIMOS CON 4 BYTES
CALL DATO_SPI ; EL NUMERO 8
MOVLW B'10010010' ; DEJANDO UN ESPACIO
CALL DATO_SPI ; AL FINAL DEL NUMERO
MOVLW B'10010010' ; DADO POR 0X00
CALL DATO_SPI ; MANDAMOS 5 BYTES SEGUIDOS POR
MOVLW B'01101100' ; EL CANAL SPI
CALL DATO_SPI ; PARA CONSTRUIR COMPLETO EL NUMERO
MOVLW B'00000000' ; SIN PERDER FORMA
CALL DATO_SPI
RETURN
SEND7
MOVLW B'01100010' ; CONSTRUIMOS CON 4 BYTES
CALL DATO_SPI ; EL NUMERO 7
MOVLW B'00010010' ; DEJANDO UN ESPACIO
CALL DATO_SPI ; AL FINAL DEL NUMERO
MOVLW B'00001010' ; DADO POR 0X00
CALL DATO_SPI ; MANDAMOS 5 BYTES SEGUIDOS POR
MOVLW B'00000110' ; EL CANAL SPI
CALL DATO_SPI ; PARA CONSTRUIR COMPLETO EL NUMERO
MOVLW B'00000000' ; SIN PERDER FORMA
CALL DATO_SPI
RETURN
SEND6
MOVLW B'01111100' ; CONSTRUIMOS CON 4 BYTES
CALL DATO_SPI ; EL NUMERO 6
MOVLW B'10010010' ; DEJANDO UN ESPACIO
CALL DATO_SPI ; AL FINAL DEL NUMERO
MOVLW B'10010010' ; DADO POR 0X00
CALL DATO_SPI ; MANDAMOS 5 BYTES SEGUIDOS POR
MOVLW B'01100100' ; EL CANAL SPI
CALL DATO_SPI ; PARA CONSTRUIR COMPLETO EL NUMERO
MOVLW B'00000000' ; SIN PERDER FORMA
CALL DATO_SPI
RETURN
SEND5
MOVLW B'01001110' ; CONSTRUIMOS CON 4 BYTES
CALL DATO_SPI ; EL NUMERO 5
MOVLW B'10001010' ; DEJANDO UN ESPACIO
CALL DATO_SPI ; AL FINAL DEL NUMERO
MOVLW B'10001010' ; DADO POR 0X00
CALL DATO_SPI ; MANDAMOS 5 BYTES SEGUIDOS POR
MOVLW B'01110010' ; EL CANAL SPI
CALL DATO_SPI ; PARA CONSTRUIR COMPLETO EL NUMERO
MOVLW B'00000000' ; SIN PERDER FORMA
CALL DATO_SPI
RETURN
SEND4
MOVLW B'00110000' ; CONSTRUIMOS CON 4 BYTES
CALL DATO_SPI ; EL NUMERO 3
MOVLW B'00101000' ; DEJANDO UN ESPACIO
CALL DATO_SPI ; AL FINAL DEL NUMERO
MOVLW B'00100100' ; DADO POR 0X00
CALL DATO_SPI ; MANDAMOS 5 BYTES SEGUIDOS POR
MOVLW B'11111110' ; EL CANAL SPI
CALL DATO_SPI ; PARA CONSTRUIR COMPLETO EL NUMERO
MOVLW B'00000000' ; SIN PERDER FORMA
CALL DATO_SPI
RETURN
SEND3
MOVLW B'01000100' ; CONSTRUIMOS CON 4 BYTES
CALL DATO_SPI ; EL NUMERO 3
MOVLW B'10010010' ; DEJANDO UN ESPACIO
CALL DATO_SPI ; AL FINAL DEL NUMERO
MOVLW B'10010010' ; DADO POR 0X00
CALL DATO_SPI ; MANDAMOS 5 BYTES SEGUIDOS POR
MOVLW B'01101100' ; EL CANAL SPI
CALL DATO_SPI ; PARA CONSTRUIR COMPLETO EL NUMERO
MOVLW B'00000000' ; SIN PERDER FORMA
CALL DATO_SPI
RETURN
SEND2
MOVLW B'11000100' ; CONSTRUIMOS CON 4 BYTES
CALL DATO_SPI ; EL NUMERO 2
MOVLW B'10100010' ; DEJANDO UN ESPACIO
CALL DATO_SPI ; AL FINAL DEL NUMERO
MOVLW B'10010010' ; DADO POR 0X00
CALL DATO_SPI ; MANDAMOS 5 BYTES SEGUIDOS POR
MOVLW B'10001100' ; EL CANAL SPI
CALL DATO_SPI ; PARA CONSTRUIR COMPLETO EL NUMERO
MOVLW B'00000000' ; SIN PERDER FORMA
CALL DATO_SPI
RETURN
SEND1
MOVLW B'00000000' ; CONSTRUIMOS CON 4 BYTES
CALL DATO_SPI ; EL NUMERO 1
MOVLW B'10000100' ; DEJANDO UN ESPACIO
CALL DATO_SPI ; AL FINAL DEL NUMERO
MOVLW B'11111110' ; DADO POR 0X00
CALL DATO_SPI ; MANDAMOS 5 BYTES SEGUIDOS POR
MOVLW B'10000000' ; EL CANAL SPI
CALL DATO_SPI ; PARA CONSTRUIR COMPLETO EL NUMERO
MOVLW B'00000000' ; SIN PERDER FORMA
CALL DATO_SPI
RETURN
SEND0
MOVLW B'01111100' ; CONSTRUIMOS CON 4 BYTES
CALL DATO_SPI ; EL NUMERO 0
MOVLW B'10000010' ; DEJANDO UN ESPACIO
CALL DATO_SPI ; AL FINAL DEL NUMERO
MOVLW B'10000010' ; DADO POR 0X00
CALL DATO_SPI ; MANDAMOS 5 BYTES SEGUIDOS POR
MOVLW B'01111100' ; EL CANAL SPI
CALL DATO_SPI ; PARA CONSTRUIR COMPLETO EL NUMERO
MOVLW B'00000000' ; SIN PERDER FORMA
CALL DATO_SPI
RETURN
;***********************************************************************************************
;***************************** RUTINA PARA CONVERTIR BIN A BCD *********************************
;***********************************************************************************************
CONVERSION_BCD
MOVWF BCD_AUX ; MUEVO EL VALOR DE W A BCD_AUX
CLRF UNIDADES ; LIMPIO REGISTRO UNIDADES
CLRF DECENAS ; LIMPIO REGISTRO DECENAS
CLRF CENTENAS ; LIMPIO REGISTRO CENTENAS
S_CENTENAS
MOVLW .100 ; CARGO 100 A W
SUBWF BCD_AUX,W ; LE RESTO LOS 100 PARA SABER SI ES MAYOR O MENOR
BTFSC STATUS,C ; PREGUNTO SI HUBO ACARREO
GOTO SUMA_CENTENAS ; SI ES MAYOR SUMO CENTENAS
GOTO S_DECENAS ; SI ES MENOR DEJO EN 0 CENTENAS Y ACTUALIZO DECENAS
SUMA_CENTENAS
MOVWF BCD_AUX ; GUARDAMOS EL ULTIMO VALOR
INCF CENTENAS,F ; INCREMENTO CENTENAS Y GUARDO
GOTO S_CENTENAS ; REGRESO A SUMAR SI ES AUN MAS GRANDE
S_DECENAS
MOVLW .10 ; CARGO 10 A W
SUBWF BCD_AUX,W ; LE RESTO 10 PARA SABER SI ES MAYOR O MENOR
BTFSC STATUS,C ; PREGUNTAMOS SI HAY ACARREO
GOTO SUMA_DECENAS ; SI HUBO VAMOS A SUMAR DECENAS
GOTO SUMA_UNIDADES ; SI NO VAMOS A SUMAR UNIDADES
SUMA_DECENAS
MOVWF BCD_AUX ; GUARDAMOS VALOR
INCF DECENAS,1 ; INCREMENTAMOS DECENAS EN 1 Y GUARDAMOS
GOTO S_DECENAS ; REGRESAMOS PARA SABER SI HAY MAS DECENAS EN VARIABLE
SUMA_UNIDADES
MOVF BCD_AUX,W ; MOVEMOS AUXILIAR A UNIDADES
MOVWF UNIDADES ; YA QUE ES EL ÚLTIMO VALOR QUE NOS QUEDA
RETURN
;***********************************************************************************************
;****************************** RUTINA PARA GRAFICAR 1 RENGLON *********************************
;***********************************************************************************************
GRAFICA_ADC
SWAPF ADC_VALUE, F ; INTERCAMBIAMOS NIBLES
LSRF ADC_VALUE, W ; ROTAMOS A LA IZQUIERDA
SWAPF ADC_VALUE, F ; REGRESAMOS ADC_VALUE A SU VALOR ORIGINAL PARA POST PROCESAMIENTOS
ANDLW 0x07 ; ANDEAMOS EL VALOR DADO PARA RESTRINGIR A 8 VALORES B'XXXXX111'
BRW ;
RETLW .128 ; W=0
RETLW .64 ; W=1
RETLW .32 ; W=2
RETLW .16 ; W=3
RETLW .8 ; W=4
RETLW .4 ; W=5
RETLW .2 ; W=6
RETLW .1 ; W=7
;***********************************************************************************************
;*************************************** RUTINA CONVERSION ADC *********************************
;***********************************************************************************************
CONV_ADC
BANKSEL ADCON0 ; NOS UBICAMOS EN EL BANCO QUE CONTIENE A ADCON0
BSF ADCON0,ADGO ; PRENDEMOS EL BIT GO PARA INICIAR LA CONVERSION ADC
BTFSC ADCON0,ADGO ; SALTAMOS UNA INSTRUCCION SI ES QUE YA TERMINO LA CONVERSION ADC
GOTO $-1 ; REGRESAMOS UNA LINEA DE CODIGO PARA SABER SI YA TERMINO CONVERSION ADC
MOVF ADRESH,W ; MOVEMOS ADRESH A W UNA VEZ ACABADA LA CONVERSION
BANKSEL ADC_VALUE ; NOS UBICAMOS EN BANCO QUE CONTIENE A VARIABLE DECLARADA
MOVWF ADC_VALUE ; MOVEMOS EL RESULTADO DE ADRESH A NUESTRA VARIABLE
RETURN
;***********************************************************************************************
;******************************* RUTINA DE ESCRITURA SPI X BYTES *******************************
;***********************************************************************************************
MENSAJE_X_BYTES
MOVWF CONTADOR_BYTES ; MOVEMOS A NUESTRO REGISTRO CONTADOR BYTES EL # EN W
WRITING_LCD
MOVIW FSR0++ ; MOVEMOS INDF A W E INCREMENTAMOS FSR0 EN 1
CALL DATO_SPI ; TRASNMITIMOS VIA SPI EL BYTE EN W
DECFSZ CONTADOR_BYTES,F ; DECREMENTAMOS 1 EL CONTADOR Y SALTAMOS HASTA 0
GOTO WRITING_LCD ; REGRESAMOS A SEGUIR ESCRIBIENDO LA LCD
RETURN
;***********************************************************************************************
;************************** RUTINA DE INICIALIZACION DE LCD NOKIA5110 **************************
;***********************************************************************************************
INI_LCD_NOKIA
BCF RST_NOKIA ; CREAMOS UN SOFTWARE POR RESET EN LA LCD
NOP ; PERDEMOS UN CICLO DE INSTRUCCION
BSF RST_NOKIA ; REGRESAMOS DEL RESET
MOVLW LOW(INICIA_NOKIA)
MOVWF FSR0L
MOVLW HIGH(INICIA_NOKIA)
MOVWF FSR0H
INIT_NOKIA
MOVIW FSR0++
CALL COMANDO_SPI
MOVIW [FSR0]
BTFSS STATUS,Z
GOTO INIT_NOKIA
RETURN
;***********************************************************************************************
;************************** RUTINA DE POSICIONAMIENTO EN Y (RENGLONES) *************************
;***********************************************************************************************
SET_Y
ADDLW B'01000000'
CALL COMANDO_SPI
RETURN
;***********************************************************************************************
;************************** RUTINA DE POSICIONAMIENTO EN X (COLUMNAS) **************************
;***********************************************************************************************
SET_X
ADDLW B'10000000'
CALL COMANDO_SPI
RETURN
;***********************************************************************************************
;*************************** ZONA DE DECLARACION DE TABLAS PARA DATOS **************************
;***********************************************************************************************
INICIA_NOKIA: dt 0X21,0XCF,0X20,0X0C,0X00
ADC_TEXT: dt 0XFC,0X12,0X12,0XFC,0X00,0XFE,0X82,0X82,0X7C,0X00,0X7C,0X82,0X82,0X44,0X00,0X14,0X00
HOLA_MENSAJE: dt 0XFE,0X10,0X10,0XFE,0X00,0X7C,0X82,0X82,0X7C,0X00,0XFE,0X80,0X80,0X80,0X00,0XFC,0X12,0X12,0XFC,0X00;A
TODO_MENSAJE: dt 0X02,0X02,0XFE,0X02,0X02,0X00,0X7C,0X82,0X82,0X7C,0X00,0XFE,0X82,0X82,0X7C,0X00,0X7C,0X82,0X82,0X7C,0X00
PIC_MENSAJE: dt 0X00,0X00,0XFE,0X12,0X12,0X0C,0X00,0XFE,0X00,0X7C,0X82,0X82,0X44,0X00
DATO_SPI
BSF DC_NOKIA
BCF LCD_NOKIA
BANKSEL SSP1BUF
MOVWF SSP1BUF
BANKSEL PIR1
BCF PIR1,SSP1IF
WSPI
BTFSS PIR1,SSP1IF
GOTO WSPI
BCF PIR1,SSP1IF
BANKSEL PORTA
BSF LCD_NOKIA
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
COMANDO_SPI
BCF DC_NOKIA
BCF LCD_NOKIA
BANKSEL SSP1BUF
MOVWF SSP1BUF
BANKSEL PIR1
BCF PIR1,SSP1IF
WSPIC
BTFSS PIR1,SSP1IF
GOTO WSPIC
BCF PIR1,SSP1IF
BANKSEL PORTA
BSF LCD_NOKIA
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RETARDO
MOVLW 0X3F
MOVWF RET
MOVWF RET2
ESP
DECFSZ RET,F
GOTO ESP
MOVLW 0XFF
MOVWF RET
DECFSZ RET2,F
GOTO ESP
RETURN
END