¿Cómo lo puedo hacer funcionar?
	
	
	
		
				
			
		PHP:
	
	LIST P=18F4550, F=INHX32    ;directive to define processor
    #include <P18F4550.INC>    ;processor specific variable definitions
;******************************************************************************
;Configuration bits
;Microchip has changed the format for defining the configuration bits, please 
;see the .inc file for futher details on notation.  Below are a few examples.
;   Oscillator Selection:
 CONFIG    FOSC = INTOSCIO_EC         ;XT oscillator, XT used by USB
 CONFIG  PWRT = ON
 CONFIG  BOR = OFF
 CONFIG  WDT = OFF
 CONFIG  MCLRE = OFF ;
 CONFIG  PBADEN = OFF
 CONFIG  LVP = OFF
 CONFIG  DEBUG = OFF
 CONFIG  XINST = OFF
;******************************************************************************
;Variable definitions
; These variables are only needed if low priority interrupts are used. 
; More variables may be needed to store other special function registers used
; in the interrupt routines.
;        UDATA
;WREG_TEMP    RES    1    ;variable in RAM for context saving 
;STATUS_TEMP    RES    1    ;variable in RAM for context saving
;BSR_TEMP    RES    1    ;variable in RAM for context saving
    ;    UDATA_ACS
;Conta1        RES    1    ;example of a variable in access RAM
;Conta2        RES 1
;Conta3        RES 1
;COUNT        RES 1
;******************************************************************************
;EEPROM data
; Data to be programmed into the Data EEPROM is defined here
;DATA_EEPROM    CODE    0xf00000
;        DE "Test Data",0,1,2,3,4,5
;******************************************************************************
;Reset vector
; This code will start executing when a reset occurs.
;RESET_VECTOR    CODE    0x0000
;        goto    Main        ;go to start of main code
;******************************************************************************
;High priority interrupt vector
; This code will start executing when a high priority interrupt occurs or
; when any interrupt occurs if interrupt priorities are not enabled.
;HI_INT_VECTOR    CODE    0x0008
;        bra    HighInt        ;go to high priority interrupt routine
;******************************************************************************
;Low priority interrupt vector and routine
; This code will start executing when a low priority interrupt occurs.
; This code can be removed if low priority interrupts are not used.
;LOW_INT_VECTOR    CODE    0x0018
;        bra    LowInt        ;go to low priority interrupt routine
;******************************************************************************
;High priority interrupt routine
; The high priority interrupt code is placed here to avoid conflicting with
; the low priority interrupt vector.
;        CODE
;HighInt:
;    *** high priority interrupt code goes here ***
;        retfie    FAST
;******************************************************************************
;Low priority interrupt routine
; The low priority interrupt code is placed here.
; This code can be removed if low priority interrupts are not used.
;LowInt:
;        movff    STATUS,STATUS_TEMP    ;save STATUS register
;        movff    WREG,WREG_TEMP        ;save working register
;        movff    BSR,BSR_TEMP        ;save BSR register
;    *** low priority interrupt code goes here ***
;        movff    BSR_TEMP,BSR        ;restore BSR register
;        movff    WREG_TEMP,WREG        ;restore working register
;        movff    STATUS_TEMP,STATUS    ;restore STATUS register
;        retfie
;******************************************************************************
;Start of main program
; The main program code is placed here.
;Variable para el DELAY del ADC
val equ h\'20\'
  ;Variables para el DELAY del ENABLE LCD
val2 equ 0x30
val1 equ 0x31
  ;Variables para separar el resultado de ADC
  ; en valor BCD
Unidades equ 0x32     
Decenas equ 0x33      
Centenas equ 0x34   
Resto equ 0x35
        ORG     0X1000
      
        goto INICIO
      
INICIO:
      clrf PORTA        ;Limpia el puerto A
      clrf PORTB        ;Limpia el puerto B
      clrf PORTC        ;Limpia el puerto C    
      clrf PORTD        ;Limpia el puerto D
      bsf STATUS,5   
      bcf STATUS,6    ;Cambio al banco 1
      
      ;Configuración de puertos C-D para el LCD
      clrf TRISC        ;Configura PORTC como salida
      clrf TRISD        ;Configura PORTD como salida
      
      ;Configuración del puerto A para ADC
      movlw 00h         
      movwf ADCON1      ;Configura puerto A y E como analógicos
      movlw 3fh         
      movwf TRISA       ;Configura el puerto A como entrada
      movlw h\'0\'
      
      ;Configuración del puerto B para mostrar el resultado ADC
      movwf TRISB       ;Configura puerto B como salida
      bcf STATUS,5    ;Regresa al banco 0
      
      ;Inicio del programa
START
      call START_LCD   ;Inicializa LCD
      goto START_ADC   ;Comienza la lectura del Conv. A/D
      
      ;Inicia LCD
START_LCD:
      bcf PORTC,0      ; RS=0 MODO INSTRUCCION
      movlw 0x01       ; 0x01 limpia la pantalla en el LCD
      movwf PORTD
      call COMANDO     ; Se da de alta el comando
      movlw 0x0C       ; Selecciona la primera línea
      movwf PORTD
      call COMANDO     ; Se da de alta el comando
      movlw 0x3C       ; Se configura el cursor
      movwf PORTD
      call COMANDO     ; Se da de alta el comando
      bsf PORTC, 0     ; Rs=1 MODO DATO
      return
      
      ;Rutina para enviar un dato
ENVIA:
      bsf PORTC, 0    ; RS=1 MODO DATO
      call COMANDO    ; Se da de alta el comando
      return 
       
      ;Rutina para enviar comandos
COMANDO:
      bsf PORTC, 1    ; Pone la señal ENABLE en 1
      call DELAY2     ; Tiempo de espera
      call DELAY2
      bcf PORTC, 1    ; ENABLE=0    
      call DELAY2
      return     
      
      ;Rutina para limpar pantalla LCD  
ERASE_LCD
      bcf PORTC,0      ; RS=0 MODO INSTRUCCION
      movlw 0x01       ; 0x01 limpia la pantalla en el LCD
      movwf PORTD
      call COMANDO     ; Se da de alta el comando
      bsf PORTC, 0     ; Rs=1 MODO DATO
      return
      
      ;Configuración Convertidor A/D
START_ADC
      movlw b\'11000001\' ;Configuración ADCON0 
      movwf ADCON0      ;ADCS1=1 ADCS0=1 CHS2=0 CHS1=0 
                        ;CHS0=0 GO/DONE=0 - ADON=1
CICLO: bsf ADCON0,2      ;Conversión en progreso GO=1
       call DELAY1       ;Espera que termine la conversión
ESPERA btfsc ADCON0,2    ;Pregunta por DONE=0?(Terminó conversión)
       goto ESPERA       ;No, vuelve a preguntar
       movf ADRESH,0     ;Si
       movwf PORTB       ;Muestra el resultado en PORTB
       
       ;Rutina que muestra temperatura
PRINT_TEMP
       call ERASE_LCD    ;Limpia LCD
       movlw \'T\'
       movwf PORTD
       call ENVIA
       movlw \'=\'
       movwf PORTD
       call ENVIA
       call READ_TEMP    ;Llamada a rutina que obtine el 
                         ;valor de la temperatura a partir
                         ;del  resultado del Conv a/D
       movf Centenas,W   ;Imprime el dígito de las centenas
       movwf PORTD
       call ENVIA
       movf Decenas,W    ;Imprime el dígito de las decenas
       movwf PORTD
       call ENVIA
       movf Unidades,W   ;Imprime el dígito de las unidades
       movwf PORTD
       call ENVIA
       movlw \' \'
       movwf PORTD
       call ENVIA
       movlw h\'DF\'       ;Imprime el simbolo "°"
       movwf PORTD
       call ENVIA 
       movlw \'C\'
       movwf PORTD
       call ENVIA 
       goto CICLO        ;Repite el ciclo de lectura ADC
       ;Rutina que obtine el valor de la temperatura
       ;a partir del  resultado del Conv a/D
READ_TEMP:
       clrf Centenas
       clrf Decenas
       clrf Unidades
      
       movf ADRESH,W   
       addwf ADRESH,W     ;Dupilca el valor de ADRESH para 
       ;obtener un valor de temperatura real aprox
       movwf Resto        ;Guarda el valor de ADRESH en Resto  
        
       ;Comienza el proceso de otención de valores BCD 
       ;para Centenas, Decenas y unidades atraves de restas
       ;sucesivas.
CENTENAS1
       movlw d\'100\'      ;W=d\'100\'
       subwf Resto,W     ;Resto - d\'100\' (W)
       btfss STATUS,C    ;Resto menor que d\'100\'?
       goto DECENAS1     ;SI
       movwf Resto       ;NO, Salva el resto
       incf Centenas,1   ;Incrementa el contador de centenas BCD
       goto CENTENAS1    ;Realiza otra resta
DECENAS1
       movlw d\'10\'       ;W=d\'10\'
       subwf Resto,W     ;Resto - d\'10\' (W)
       btfss STATUS,C    ;Resto menor que d\'10\'?
       goto UNIDADES1    ;Si
       movwf Resto       ;No, Salva el resto
       incf Decenas,1    ;Incrementa el contador de centenas BCD
       goto DECENAS1     ;Realiza otra resta
UNIDADES1
       movf Resto,W      ;El resto son la Unidades BCD
       movwf Unidades
       ;clrf Resto
       
       ;Rutina que obtiene el equivalente en ASCII       
OBTEN_ASCII
       movlw h\'30\' 
       iorwf Unidades,f      
       iorwf Decenas,f
       iorwf Centenas,f      
       return
;Rutina que genera un Delay de 20 microSeg aprox.
;para el Conv. A/D
DELAY1:             
       movlw h\'30\'
       movwf val
Loop   decfsz val,1
       goto Loop
       return
;Subrutina de retardo para ENABLE_LCD 
DELAY2:            
       movlw 0xFF
       movwf val1 
Loop1:
       movlw 0xFF
       movwf val2    
Loop2:
       decfsz val2,1
       goto Loop2
       decfsz val1,1
       goto Loop1
       return
    end
			
				Última edición por un moderador: 
			
		
	
								
								
									
	
								
							
							 
   
				 
						 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		