
;
;PROPIETARIO:			RUBEN DARIO FIGUEREDO
;						
;FECHA:					02 OCTUBRE DE 2010 13:58 HS
;PROFESOR:				
;VERSION DEFINITIVA:		MICRO 16F877A 
;GRABAR CON:			WDT=				OFF
;						POWER UP TIMER=		OFF
;						BROWN OUT DETECT=	OFF
;						CODE PROTECT=		ON
;**************************************************************************
                     list p=16f877a	
                     #include <p16f877a.inc> 
;*************************************************************************************************************
;FUSIBLES DE PROGRAMACIÓN, EVITA TENER QUE ESCRIBIRLOS CADA VEZ QUE SE EJECUTA EL PROGRAMA WINPICPROG O IC-PROG
;*************************************************************************************************************
 #define		FOSC	D'4000000'  

;*************************************************************************************************************
	
__CONFIG  _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC  & _LVP_OFF & _CPD_ON
;********************************************************************

;*******************************************************************************
;----Definiciones de RAM-------
	CBLOCK	0X20

GRAL1,GRAL2,GRAL3,FLAG,TGRAL,DECE,CENTE,UNID,UNID1,DECE1,TGRAL1,TEMP,NUMERO,NUMERO1,COCIENTE,COCIENTE1,NUM,NUM1,DIRECCION
DATOAGUARDAR,CALLE,DATOLEIDO,AUXILIAR,AUXILIAR1,PDel0,PDel1,PDel2,PDel01,PDel11,PDel21,PDel02,PDel12,PDel22 , letra ,TOTO ,
CACA , POSIC
	ENDC
;*************************************************************************
CARRY   		equ     1
C				EQU		0
Z       		equ     2
pcl				equ		3
PULSADOR		EQU		4
;*************************************************************************
;BANCOS PARA CAMBIO DE PAGINA - para 16f877
;***********************************************************************
BANK0      MACRO
      BCF   STATUS,RP0
      BCF   STATUS,RP1
      ENDM

BANK1      MACRO
      BSF   STATUS,RP0
      BCF   STATUS,RP1
      ENDM

BANK2      MACRO
      BSF   STATUS,RP1
      BCF   STATUS,RP0
      ENDM

BANK3      MACRO
      BSF   STATUS,RP1
      BSF   STATUS,RP0
      ENDM
;*****************************************************************************
;DEFINICION DE PUERTOS
;******************************************************************************
;*****************************************************************************

	#DEFINE	E		PORTE,0
	#DEFINE	RS		PORTE,2
;*****************************************************************************
;*****************************************************************************	 	
 		ORG		000H
		CALL	SETUP
;*****************************************************************************
;MENU RUTINA PPAL DEL PROGRAMA
;*****************************************************************************
MENU 	

		CALL		INI_LCD		
	
	

;******************************************************************************
;DELAY 1 MS
;******************************************************************************
DEMORA 	

	 	MOVLW		.255 	;CARGO 255 A W
		MOVWF		GRAL1	;DESCARGO 4 EN GRAL1	
BN		MOVLW		.255		;CARGO 255 A W
		MOVWF		GRAL2	;DESCARGO EN GRAL2
NM		NOP					;NOP, UN CICLO DE MÁQUINA, UN BYTE
		DECFSZ		GRAL2	;DECREMENTO GRAL2, SALTO SI ES CERO
		GOTO		NM		;VOY A NM
		DECFSZ		GRAL1	;DECREMENTO GRAL1 SALTO SI ES CERO
		GOTO		BN		;VOY A BN
		RETURN				;RETORNO


;-------------------------------------------------------------
;DEMORA DE 25 SEGUNDOS
;-------------------------------------------------------------
; Generado con PDEL ver SP  r 1.0  el 30/09/2014 Hs 8:58:18
; Descripcion: Delay 25000000 ciclos
;-------------------------------------------------------------
DEMORA2  movlw     .106      ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .135      ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .249      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  clrwdt              ; 1 ciclo delay
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
        clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;-------------------------------------------------------------
;******************************************************************************
DELAY	MOVLW		.255		;1535 uS
		MOVWF		TOTO
AA		NOP
		NOP
		NOP
		DECFSZ	TOTO
		GOTO		AA	
		RETURN
;******************************************************************************
;******************************************************************************
;           	SETUP DE LCD DISPLAY 16 X 2
;                BASADO EN uC PIC16f873               
;*****************************************************************************
;               DISPLAY SUBROUTINA DISPLAY LCD
;*****************************************************************************
;'FUNTION SET' FUNCION
;8 BIT INTERFACE, 2 LINEA , 5 X 7 DOTS
;*************************************
FUNC    	
			MOVLW   	B'00111100'
       		MOVWF   	PORTD
        	CALL    	PULSOE
        	CALL		DELAY
        	RETURN
;*******************************
;'DISPLAY ON FUNCION
;DISPLAY ON, CURSOR ? BLINKING ?
;*******************************
DIS_ON 
			BCF			RS
			MOVLW   	B'00001110'
        	MOVWF   	PORTD
        	CALL    	PULSOE
			BSF			RS
        	CALL    	DELAY
        	RETURN
;*******************************
;'DISPLAY OFF' FUNCION
; CURSOR Y BLINKING
;*******************************
DIS_OFF
			BCF			RS
			MOVLW   	B'00001010'
        	MOVWF   	PORTD
        	CALL    	PULSOE
        	BSF			RS
			CALL    	DELAY
        	RETURN
;*******************************
;'ENTRY MODE SET' FUNCION
;DIRECCION DEL CURSOR,  INCREASE,  SHIFT DISPLAY
;*******************************
ENTMOD  
			MOVLW   	B'00000110'
      		MOVWF   	PORTD
      		CALL    	PULSOE
      		CALL    	DELAY
      		RETURN
;*******************************
;'DISPLAY CLEAR' FUNCION
;LIMPIAR EL DISPLAY
;******************************* 
DISCLR 	
			CLRF    	PORTE          	; LIMPIAR RS, RS=0 PARA LOS COMANDOS
      		MOVLW   	B'00000001'
      		MOVWF   	PORTD
      		CALL    	PULSOE          	; LEVANTAR E, Y BAJARLO
      		CALL	   	DELAY		;1,64 ms mínimo
      		CALL		DELAY
			CALL		DELAY
      		RETURN
;************************************************************
;'DISPLAY HOME' FUNCION
;VUELVE AL HOME
;************************************************************
DISHOME
			MOVLW   	B'00000010'		
      		MOVWF   	PORTD
			CALL		DELAY			;1,64 ms
			CALL		DELAY
			CALL		DELAY
			CALL		DELAY
      		RETURN
;***********************************************************
CURSORSHIFT 
			MOVLW		B'00000000'
			MOVWF		PORTD
			CALL		PULSOE
			CALL		DELAY
			RETURN
;***********************************************************
;'SET DDRAM ADDRESS' FUNCION
;ELEGIR LA DIRECCION DE DDRAM MEDIANTE W
;***********************************************************
SETDD  ;			             	;              16 X 2
        	MOVF    	POSIC,W          	;  00	80H,81H,....................8FH
        	MOVWF   	PORTD             	;  40	C0H,C1H,....................CFH
       		CALL		PULSOE            	;
        	CALL		DELAY             	;
			RETURN			;
;**********************************************************
;'STROBE PULSE ROUTINE' 
;GENERAR EL PULSO VALIDO E PARA EL DISPLAY
;**********************************************************
PULSOE  
			BSF     	E
			nop
      		BCF     	E
      		RETURN
;****************************************
;PONE EL CURSOR A DIRECCION CERO
;****************************************
ACERO
			BCF			RS
			CALL		DISCLR
     		BSF			RS
			RETURN
;****************************************       	
SETDD2LINEA 
			BCF			RS
			MOVLW		0XC0
			MOVWF   	POSIC
			CALL		SETDD   
			BSF			RS
			RETURN	           	
;****************************************************************************              
MUESTRA 
			MOVWF		PORTD
			CALL		PULSOE
			CALL		DELAY
			RETURN                 
;****************************************************************************
DDRAM
			BCF			RS
			MOVLW		0x87
			MOVWF   	POSIC
			CALL		SETDD   
			BSF			RS
			RETURN	        
;****************************************************************************

;*****************************************************************************
;           LOS PASOS PARA INICIALIZAR LCD
;*****************************************************************************

INI_LCD

STEPS		MOVLW		.255		;RETARDO DE TIEMPO LUEGO DE POWER UP
        	MOVWF		CACA		;PARA DISPLAY. MINIMO 15 MS
SF1     	CALL		DELAY
        	DECFSZ		CACA
        	GOTO		SF1
;****************************************************************************
			BCF			RS			;MODO ENTRADA DE SETUP
			CALL    	FUNC		;8 BITS O 4 BITS?. 2 LÍNEAS O 1 LINEA? 5X7? FONT?
		
			CALL		DIS_ON		;ENCENDER DISPLAY
			CALL    	ENTMOD		;MODO ENTRADA
			CALL    	DISHOME		;CURSOR A HOME

			CALL		ACERO		
			BSF			RS 	
;****************************************************************************
;			AREA DE MENSAJES
;****************************************************************************
		
		MOVLW		'B'
		CALL		MUESTRA
		MOVLW		'I'
		CALL		MUESTRA
		MOVLW		'E'
		CALL		MUESTRA
		MOVLW		'N'
		CALL		MUESTRA	
		MOVLW		'V'
		CALL		MUESTRA
		MOVLW		'E'
		CALL		MUESTRA
		MOVLW		'N'
		CALL		MUESTRA
		MOVLW		'I'
		CALL		MUESTRA
		MOVLW		'D'
		CALL		MUESTRA
		MOVLW		'O'
		CALL		MUESTRA
		MOVLW		' '
	
		RETURN
	
	
;******************************************************************************


SETUP

		BANK1						;SUBO A BANCO1
	
		MOVLW		B'00000111'   	;1 input, 0 output
		MOVWF		TRISA			;DESCARGO EN TRISB
		MOVLW		B'00000000'   	;1 input, 0 output
		MOVWF		TRISB			;DESCARGO EN TRISB
		MOVLW		B'00000000' 	;1 input, 0 output
		MOVWF		TRISC			;DESCARGO EN TRISD
		MOVLW		B'00000000'   	;1 input, 0 output
		MOVWF		TRISD			;DESCARGO EN TRISB
		MOVLW		B'00000000' 	;1 input, 0 output
		MOVWF		TRISE
		
		MOVLW		.7
		MOVWF		ADCON1

		BANK0						;BAJO A BANCO 0
	
		CLRF		PORTA			;LIMPIO PORTA
		CLRF		PORTB			;LIMPIO PORTB
		CLRF		PORTC			;LIMPIO PORTC
		CLRF		PORTD			;LIMPIO PORTD
		CLRF		PORTE			;LIMPIO PORTE
		MOVLW		B'00000000'
		MOVWF		PORTB
		MOVLW		B'00000000'
		MOVWF		PORTC
		MOVLW		B'00000000'
		MOVWF		PORTD
		MOVLW		B'00000000'
		MOVWF		PORTE	
				
		RETURN						;RETORNO






	
END
