;------------------------------------------------------------
; Código assembler 
; Proyecto: Rutinas para Nextion
; Autor: Esteban Mariano Folcher Cividini
; Colaboración; KILLERJC de todopic
;		Pinonillo 16 de todopic
;	
; Fecha: 27/08/2018
; PIC: 16F877A
; Velocidad de reloj: 4 Mhz
;------------------------------------------------------------
PUERTO_TX	    EQU		6	;PIN DE TRANSMICION
PUERTO_RC	    EQU		7	;PINDE RECEPCION			
O_Text		    EQU	d'1'
O_Scrolling_Text    EQU d'2'
O_123_Number	    EQU	d'3'
O_Button	    EQU	d'4'	
O_Progress_Bar	    EQU	d'5'	
O_Picture	    EQU	d'6'	
O_Crop		    EQU	d'7'
O_Hotspot	    EQU	d'8'
O_Gauge		    EQU	d'9'
O_waveform	    EQU	d'10'
O_Sider		    EQU	d'11'
O_Timer		    EQU	d'12' 
O_Variavle	    EQU	d'13'
O_Dual_State_Button EQU	d'14'
O_Checkbox	    EQU	d'15'
O_Radio		    EQU	d'16'
O_QRcode	    EQU	d'17'
F_en		    EQU	d'1'
F_pw		    EQU	d'2'
F_fin		    EQU	d'3'
F_bco		    EQU	d'4'
F_pco		    EQU	d'5'
F_txt		    EQU	d'6'
F_dir		    EQU	d'7'
F_tim		    EQU	d'8'
F_dis		    EQU	d'9'
F_val		    EQU	d'10'
F_pic		    EQU	d'11' 
F_hig		    EQU	d'12'  
F_wid		    EQU	d'13'
F_gdc		    EQU	d'14'   
F_gdw		    EQU	d'15'
F_gdh		    EQU	d'16'
F_pco0		    EQU	d'17'
F_isbr		    EQU	d'18'
F_bco0		    EQU	d'19'
F_bco1		    EQU	d'20'
F_font		    EQU	d'21'
F_xcen		    EQU	d'22'
F_ycen		    EQU	d'23'
F_bco2		    EQU	d'24'
F_pco2		    EQU	d'25'
F_picc		    EQU	d'26'
F_maxval	    EQU	d'27'
F_minval	    EQU	d'28'
S_igual		    EQU d'1'
S_punto		    EQU d'2'
S_comillas	    EQU d'3'
		    CBLOCK 0x20
		    Temporal_1
		    Temporal_2
		    Temporal_3
		    N_OBJETO
		    AUX_PCLATH
;-------------------Multiplica			
		    MULTI_DATO_1
		    MULTI_DATO_2
		    MULTI_8x8_BITS_L
		    MULTI_8x8_BITS_H
		    MULTI_T_1
		    MULTI_T_2
		    MULTI_T_5
		    MULTI_T_6
		    MULTI_T_9
		    MULTI_T_10
		    MULTI_T_11
		    MULTI_T_12
		    MULTI_T_13
;------------------ Objeto, Funcion, Simbolo			
		    ORIGEN_DATO_H
		    ORIGEN_DATO_L
;------------------ Administra_envia			
		    DATO_O_F_S
		    TEMP_DATO_H
		    TEMP_DATO_L
		    DATO_TABLA
;-------------------N_Objeto
		    NUM_OBJETO_UNI
		    NUM_OBJETO_DEC
		    NUM_OBJETO_CEN
		    AUX_OBJETO
;-------------------BIN_a_BCD_16
		    BIN_BCD_16_DEC_MIL
		    BIN_BCD_16_UNI_MIL
		    BIN_BCD_16_CEN
		    BIN_BCD_16_DEC
		    BIN_BCD_16_UNI
		    AUX_BCD_16_L
		    AUX_BCD_16_H
;-------------------Prepara_Envia_Mensaje
		    MENSAJE_MEMORISA        
		    GUARDA_CARACTER
		    AUX_SALVA_MENSAJE
		    ENDC


;--------------------CONFIGURA COMUNICACION U USART-----------------------------
		   			
Configura_USART	    BSF	STATUS,RP0				
		    BCF	TRISC,PUERTO_TX	;PONE A (0) ESTE PIN COMO SALIDA 
		    BSF	TRISC,PUERTO_RC	;PONE A (1) ESTE PIN COMO ENTRADA
		    MOVLW   0x24		;TX HABILITADA, MODO ASINCRON0
		    MOVWF   TXSTA		;CON 8 BITS Y ALTA VELOCIDAD
		    MOVLW   0x19		;SET BAUDIOS A 9600  0x19 
		    MOVWF   SPBRG		;CON Fosc = 4MHz
		    BCF	STATUS,RP0	;ENTRO EN BANCO 0
		    MOVLW   0x90		;AJUSTA RECEPTOR A 8 BITS, RECEPCION
		    MOVWF   RCSTA		;CONTINUA HABILITADA USART EN ON
		    RETURN			;RETORNA
Envia_USART	    BSF	STATUS,RP0
		    BCF	STATUS,RP1
		    BTFSS   TXSTA,TRMT
		    GOTO    Envia_USART
		    BCF	STATUS,RP0
		    MOVWF	TXREG
		    BCF	STATUS,RP0
		    BCF	STATUS,RP1
		    RETURN
Recibe_USART	    BCF	STATUS,RP0
		    BTFSS   PIR1,RCIF
		    GOTO    Recibe_USART
		    MOVF    RCREG,W
DATO		    BCF	PIR1,RCIF
		    BSF	STATUS,RP0
		    RETURN
;------------------ESTA RUTINA LE BYT A BYT EL MENSAJE Y LO ENVIA 
			
;Prepara_Envia_Mensaje	MOVF	AUX_SALVA_MENSAJE,W			
Envia_Mensaje		MOVWF	MENSAJE_MEMORISA   
Envia_Mensaje_1		MOVF	MENSAJE_MEMORISA,W
			CALL	Mensajes_Nextion
			MOVWF	GUARDA_CARACTER
			MOVF	GUARDA_CARACTER,F
			BTFSS	STATUS,Z
			GOTO	Envia_Mensaje_2
			RETURN	
Envia_Mensaje_2		CALL	Envia_USART
			INCF	MENSAJE_MEMORISA,F
			GOTO    Envia_Mensaje_1
;--------------------CRIBA DE CEROS PARA EL NUMERO DE OBJETO--------------------
;		    EN NEXTION EL NUMERO DE OBJETO NO PERMITE CEROS POR DELANTE
Numero_Objeto		MOVWF	AUX_OBJETO
			MOVLW	d'0'
			CALL	BIN_a_BCD_16_H
			MOVF	AUX_OBJETO,W
			CALL	BIN_a_BCD_16_L	    ;SOLO NOS INTERESA LA PARETE
			MOVF	BIN_BCD_16_CEN,W    ;BAJA	    
			SUBLW	d'0'
			BTFSS	STATUS,Z
			GOTO	Todo_UDC
			GOTO	Pregunta_Dec
Todo_UDC		MOVLW	d'48'
			ADDWF	BIN_BCD_16_UNI,F
			ADDWF	BIN_BCD_16_DEC,F
			ADDWF	BIN_BCD_16_CEN,F
			MOVF	BIN_BCD_16_UNI,W
			MOVWF	NUM_OBJETO_UNI
			MOVF	BIN_BCD_16_DEC,W
		    	MOVWF	NUM_OBJETO_DEC
			MOVF	BIN_BCD_16_CEN,W
			MOVWF	NUM_OBJETO_CEN
			BCF	STATUS,Z
			BCF	STATUS,C
			RETURN
Pregunta_Dec		MOVF	BIN_BCD_16_DEC,W	    
			SUBLW	d'0'
			BTFSS	STATUS,Z
			GOTO	Todo_UD
			GOTO	Solo_Uni
Todo_UD			MOVLW	d'48'
			ADDWF	BIN_BCD_16_UNI,F
			ADDWF	BIN_BCD_16_DEC,F
			MOVF	BIN_BCD_16_UNI,W
			MOVWF	NUM_OBJETO_UNI
			MOVF	BIN_BCD_16_DEC,W
			MOVWF	NUM_OBJETO_DEC
			MOVLW	d'0'
			MOVWF	NUM_OBJETO_CEN
			BCF	STATUS,Z
			BCF	STATUS,C
			RETURN
Solo_Uni		MOVLW	d'48'
			ADDWF	BIN_BCD_16_UNI,F
			MOVF	BIN_BCD_16_UNI,W
			MOVWF	NUM_OBJETO_UNI
			MOVLW	d'0'
			MOVWF	NUM_OBJETO_DEC
			MOVLW	d'0'
			MOVWF	NUM_OBJETO_CEN
			RETURN

Envia_Numero_Objeto	BCF	STATUS,RP0
			MOVF	NUM_OBJETO_CEN,W
			SUBLW	d'0'	
			BTFSS	STATUS,Z
			GOTO	Aux_Envia_1
Sigue_En_Nu_ob_2	MOVF	NUM_OBJETO_DEC,W
			SUBLW	d'0'	
			BTFSS	STATUS,Z
			GOTO	Aux_Envia_2
Sigue_En_Nu_ob_3	MOVF	NUM_OBJETO_UNI,W
			CALL	Envia_USART
			RETURN

Aux_Envia_1		MOVF	NUM_OBJETO_CEN,W
			CALL	Envia_USART
			GOTO	Sigue_En_Nu_ob_2
Aux_Envia_2		MOVF	NUM_OBJETO_DEC,W
			CALL	Envia_USART
			GOTO	Sigue_En_Nu_ob_3
;--------------------COMBERTIDOR DE BINARIO A BCD Y PASA A ASCII----------------

BIN_a_BCD_16_H		CLRF	AUX_BCD_16_H
			MOVWF	AUX_BCD_16_H
			RETURN
BIN_a_BCD_16_L		CLRF	AUX_BCD_16_L
			MOVWF	AUX_BCD_16_L
			swapf 	AUX_BCD_16_H,w
			andlw 	0x0F
			addlw 	0xF0
			movwf 	BIN_BCD_16_UNI_MIL
			addwf 	BIN_BCD_16_UNI_MIL,f
			addlw 	0xE2
			movwf 	BIN_BCD_16_CEN
			addlw 	0x32
			movwf 	BIN_BCD_16_UNI
			movf 	AUX_BCD_16_H,w
			andlw 	0x0F
			addwf 	BIN_BCD_16_CEN,f
			addwf 	BIN_BCD_16_CEN,f
			addwf 	BIN_BCD_16_UNI,f
			addlw 	0xE9
			movwf 	BIN_BCD_16_DEC
			addwf 	BIN_BCD_16_DEC,f
			addwf 	BIN_BCD_16_DEC,f
			swapf 	AUX_BCD_16_L,w
			andlw 	0x0F
			addwf 	BIN_BCD_16_DEC,f
			addwf 	BIN_BCD_16_UNI,f
			rlf 	BIN_BCD_16_DEC,f
			rlf 	BIN_BCD_16_UNI,f
			comf 	BIN_BCD_16_UNI,f
			rlf 	BIN_BCD_16_UNI,f
			movf 	AUX_BCD_16_L,w
			andlw 	0x0F
			addwf 	BIN_BCD_16_UNI,f
			rlf 	BIN_BCD_16_UNI_MIL,f
			movlw 	0x07
			movwf 	BIN_BCD_16_DEC_MIL
			movlw 	0x0A
Lb1	
			addwf 	BIN_BCD_16_UNI,f
			decf 	BIN_BCD_16_DEC,f
			btfss	STATUS,C
			goto 	Lb1
Lb2
			addwf 	BIN_BCD_16_DEC,f
			decf 	BIN_BCD_16_CEN,f
			btfss 	STATUS,C
			goto 	Lb2
Lb3
			addwf 	BIN_BCD_16_CEN,f
			decf 	BIN_BCD_16_UNI_MIL,f
			btfss 	STATUS,C
			goto 	Lb3
Lb4
			addwf 	BIN_BCD_16_UNI_MIL,f
			decf 	BIN_BCD_16_DEC_MIL,f
			btfss 	STATUS,C
			goto 	Lb4
			BCF	STATUS,Z
			BCF	STATUS,C
			RETURN
;--------------------BCD A ASCII------------------------------------------------
Envia_Variable_BDC	MOVF	BIN_BCD_16_DEC_MIL,W
			ADDLW	d'48'
			CALL	Envia_USART
			MOVF	BIN_BCD_16_UNI_MIL,W
			ADDLW	d'48'
			CALL	Envia_USART
			MOVF	BIN_BCD_16_CEN,W
			ADDLW	d'48'
			CALL	Envia_USART
			MOVF	BIN_BCD_16_DEC,W
			ADDLW	d'48'
			CALL	Envia_USART
			MOVF	BIN_BCD_16_UNI,W
			ADDLW	d'48'
			CALL	Envia_USART
			RETURN
			
;--------------------MULTIPLICA 8 BITS POR 8 BITS RESULTADO 16 BITS-------------			
			
Multiplicacion_1    MOVWF  MULTI_DATO_1
		    RETURN
Multiplicacion_2    MOVWF  MULTI_DATO_2	    
		    movf MULTI_DATO_1,W; 
		    btfsc STATUS,Z	    ; SI EL CONTENIDO DE COLUMNA ES 0 ATIVA FAG Z A 1 
		    goto Multiplica_da_0    ; PREGUNTA SI FLAG Z ES 0, SI SALTA NO CONTINUA 
paso5_d		    movf MULTI_DATO_2,W
		    btfsc STATUS,Z
		    goto Multiplica_da_0
paso5_c		    movf MULTI_DATO_1,W
		    movwf MULTI_T_1
		    clrf MULTI_T_2
		    movf MULTI_DATO_2,W
		    movwf MULTI_T_5
		    clrf MULTI_T_6
		    clrf MULTI_8x8_BITS_L
		    clrf MULTI_8x8_BITS_H
		    clrf MULTI_T_10
		    clrf MULTI_T_11
		    clrf MULTI_T_12
		    clrf MULTI_T_13
		    movlw .8
		    movwf MULTI_T_9
paso5_a		    btfss MULTI_T_5,0
		    goto paso5_b
		    movf MULTI_T_1,W
		    addwf MULTI_T_10,1
		    bcf STATUS,Z
		    btfsc STATUS,C
		    incf MULTI_T_11,1
		    movf MULTI_T_2,W
		    addwf MULTI_T_11,1
paso5_b		    bcf STATUS,C
		    rlf MULTI_T_1,1
		    rlf MULTI_T_2,1
		    bcf STATUS,C
		    btfsc MULTI_T_5,0
		    bsf STATUS,C
		    rrf MULTI_T_6,1
		    rrf MULTI_T_5,1
		    decfsz MULTI_T_9,1
		    goto paso5_a
		    movf MULTI_T_10,W
		    movwf MULTI_8x8_BITS_L
		    movf MULTI_T_11,W
		    movwf MULTI_8x8_BITS_H
		    goto paso5_s
Multiplica_da_0	    clrf MULTI_8x8_BITS_L
		    clrf MULTI_8x8_BITS_H
paso5_s		    return
;--------------------TRABAJAMOS SOBRE LA TABLA FUNCION--------------------------		    
Funcion		    MOVWF   DATO_O_F_S
		    MOVLW   HIGH    Tabla_Funcion
		    MOVWF   ORIGEN_DATO_H
		    MOVLW   LOW	    Tabla_Funcion
		    MOVWF   ORIGEN_DATO_L
		    CLRF    TEMP_DATO_H
		    CLRF    TEMP_DATO_L
		    MOVF    PCLATH,W		;--
		    MOVWF   AUX_PCLATH		;--
		    CALL    Administra_Tablas
		    MOVWF   DATO_TABLA		;--
		    MOVF    AUX_PCLATH,W	;--
		    MOVWF   PCLATH		;--
		    MOVF    DATO_TABLA,W	;--
		    CALL    Administra_envia
		    RETURN
;--------------------TRABAJAMOS SOBRE LA TABLA SIMBOLO--------------------------		    
Simbolo		    MOVWF   DATO_O_F_S
		    MOVLW   HIGH    Tabla_Operadores
		    MOVWF   ORIGEN_DATO_H
		    MOVLW   LOW	    Tabla_Operadores
		    MOVWF   ORIGEN_DATO_L
		    CLRF    TEMP_DATO_H
		    CLRF    TEMP_DATO_L
		    MOVF    PCLATH,W		;--
		    MOVWF   AUX_PCLATH		;--
		    CALL    Administra_Tablas
		    MOVWF   DATO_TABLA		;--
		    MOVF    AUX_PCLATH,W	;--
		    MOVWF   PCLATH		;--
		    MOVF    DATO_TABLA,W	;--
		    CALL    Administra_envia
		    RETURN
;-------------------TRABAJAMOS SOBRE LA TABLA OBJETO----------------------------
Objeto		    MOVWF   DATO_O_F_S
		    MOVLW   HIGH    Tabla_Objeto
		    MOVWF   ORIGEN_DATO_H
		    MOVLW   LOW	    Tabla_Objeto
		    MOVWF   ORIGEN_DATO_L
		    CLRF    TEMP_DATO_H
		    CLRF    TEMP_DATO_L
		    MOVF    PCLATH,W		;--
		    MOVWF   AUX_PCLATH		;--
		    CALL    Administra_Tablas
		    MOVWF   DATO_TABLA		;--
		    MOVF    AUX_PCLATH,W	;--
		    MOVWF   PCLATH		;--
		    MOVF    DATO_TABLA,W	;--
		    CALL    Administra_envia
		    RETURN
;-------------------------------------------------------------------------------		    
Administra_envia    CALL    Multiplicacion_1
		    MOVF    DATO_O_F_S,W
		    CALL    Multiplicacion_2
		    MOVF    MULTI_8x8_BITS_H,W  
		    MOVWF   TEMP_DATO_H
		    MOVF    MULTI_8x8_BITS_L,W  
		    MOVWF   TEMP_DATO_L
		    
Sigue_o_Fin	    MOVF    PCLATH,W		;--
		    MOVWF   AUX_PCLATH		;--
		    CALL    Administra_Tablas
		    MOVWF   DATO_TABLA
		    MOVF    AUX_PCLATH,W	;--
		    MOVWF   PCLATH		;--
		    MOVF    DATO_TABLA,W	    ;SI EL CONTENIDO DE 
		    BTFSC   STATUS,Z		    ;DATO_TABLA ES CERO (NO ASCII)
		    GOTO    Fin_Administra_Envia    ;CONTINUA POR GOTO FIN
		    CALL    Envia_USART		    ;ASI FINALIZO EL ENVIO
		    INCF    TEMP_DATO_L
		    GOTO    Sigue_o_Fin
Fin_Administra_Envia
		    RETURN
Administra_Tablas      
		    MOVF    ORIGEN_DATO_H,W
		    ADDWF   TEMP_DATO_H,W   
		    MOVWF   PCLATH
		    MOVF    ORIGEN_DATO_L,W
		    ADDWF   TEMP_DATO_L,W
		    BTFSC   STATUS, C
		    INCF    PCLATH,F
		    MOVWF   PCL
;-------------------------------------------------------------------------------
		    ORG 0X1900	
Tabla_Objeto	    DT	.3,.0,.0		;NUMERO DE COLUBMAS (MULTIPLICADOR)
	    	    DT  't',.0,.0		;OBJETO TEXTO
		    DT	'g',.0,.0
		    DT	'n',.0,.0
		    DT	'b',.0,.0
		    DT	'j',.0,.0
		    DT	'p',.0,.0
		    DT	'q',.0,.0
		    DT	'm',.0,.0
		    DT	'z',.0,.0
		    DT	's',.0,.0
		    DT	'h',.0,.0
		    DT	't','m',.0
		    DT	'v','a',.0
		    DT	'b','t',.0
		    DT	'c',.0,.0
		    DT	'r',.0,.0
		    DT	'q','r',.0

Tabla_Funcion	    DT	.7,.0,.0,.0,.0,.0,.0	;NUMERO DE COLUBMAS (MULTIPLICADOR)
		    DT	'e','n',.0,.0,.0,.0,.0
		    DT	'p','w',.0,.0,.0,.0,.0
		    DT	'˙','˙','˙',.0,.0,.0,.0
		    DT	'b','c','o',.0,.0,.0,.0
		    DT	'p','c','o',.0,.0,.0,.0
		    DT	't','x','t',.0,.0,.0,.0
		    DT	'd','i','r',.0,.0,.0,.0
		    DT	't','i','m',.0,.0,.0,.0
		    DT	'd','i','s',.0,.0,.0,.0
		    DT	'v','a','l',.0,.0,.0,.0
		    DT	'p','i','c',.0,.0,.0,.0
		    DT	'h','i','g',.0,.0,.0,.0
		    DT	'w','i','d',.0,.0,.0,.0
		    DT	'g','d','c',.0,.0,.0,.0
		    DT	'g','d','w',.0,.0,.0,.0
		    DT	'g','d','h',.0,.0,.0,.0
		    DT	'p','c','o','0',.0,.0,.0
		    DT	'i','s','b','r',.0,.0,.0
		    DT	'b','c','o','0',.0,.0,.0
		    DT	'b','c','o','1',.0,.0,.0
		    DT	'f','o','n','t',.0,.0,.0
		    DT	'x','c','e','n',.0,.0,.0
		    DT	'y','c','e','n',.0,.0,.0
		    DT	'b','c','o','2',.0,.0,.0
		    DT	'p','c','o','2',.0,.0,.0
		    DT	'p','i','c','c',.0,.0,.0
		    DT	'm','a','x','v','a','l',.0
		    DT	'm','i','n','v','o','l',.0
		    
Tabla_Operadores    DT	.2,.0			;NUMERO DE COLUBMAS (MULTIPLICADOR)
		    DT	'=',.0
		    DT	'.',.0
		    DT	'"',.0
		    
		    

			
			


	


			

	
			
			
			
			
			
