Anda di halaman 1dari 3

LIST P=16F877A #INCLUDE<P16F877A.

INC> ORG 0X0000 goto inicio ORG 0X0005 inicio BCF STATUS,RP0 BCF STATUS,RP1 MOVLW .133 XORWF 0x30,0 w BTFSS STATUS,Z GOTO comparacion GOTO resta comparacion BCF STATUS,RP0 BCF STATUS,RP1 MOVLW .65 XORWF 0x30,0 w BTFSC STATUS,Z GOTO suma GOTO inicio suma BSF 0x0A,3 BCF 0x0A,4 GOTO suma_indirecta resta BSF 0x0A,3 BSF 0x0A,4 GOTO resta_directa ORG 0x18AA resta_directa BSF STATUS,RP0 BCF STATUS,RP1 MOVF 0xA1,0 BSF STATUS,RP1 BCF STATUS,RP0 SUBWF 0x121,0 BCF STATUS,RP0 BCF STATUS,RP1 MOVWF 0x22 BSF STATUS,RP0 BCF STATUS,RP1 MOVF 0xA0,0 BTFSS STATUS,C ADDLW .1 BSF STATUS,RP1 BCF STATUS,RP0 SUBWF 0x120,0 BCF STATUS,RP0 BCF STATUS,RP1 MOVWF 0x23 BTFSS STATUS,C ;memoria room 18AAh pgina3 ;bits 3 y 4 del pclath ;memoria room 08FA pagina1 ;bits 3 y 4 del pclath

;ubicacin bank0 del registro 0x30h ;chequeo primer caso ;comparacin del contenido en 0x30h con lo que tiene ;z=1? ;no z=0 ir a comparacin con el siguiente codigo ;s son iguales ir a resta ;bank0 del registro 0x30h ;chequeo segundo caso ;comparacin del contenido en 0x30h con lo que tiene ;z=0? ;no z=1 son iguales ir a suma ;s son diferentes entonces me devuelvo

;ubicacion bank1 ;contenido de num1l ;ubicacion bank2 ;num2l-num1l resto parte 1 de 16 bits f-w ;ubicacion bank0 para resultadol ;s guardar contenido de w en resultado_bajo ;ubicacion bank1 ;contenido de num1h ;c=1? ;no.resta(-) sumo 1 para seguir la resta ;si.resta(+) ;ubicacion bank2 ;num2h-num1h resto parte 2 de 16 bits f-w ;ubicacion bank0 para resultadol ;si guardar contenido de w en resultado_alto ;c=1?

GOTO negativo verdadero valor positivo CLRF PCLATH GOTO inicio negativo BCF STATUS,RP0 ento a 2 BCF STATUS,RP1 COMF 0X22,F INCF 0X22,F MOVF 0X23,W BTFSS STATUS,C ADDLW .1 MOVWF 0X23 CLRF PCLATH goto inicio ORG 0x08FA suma_indirecta MOVLW 0XA1 BCF STATUS,IRP MOVWF FSR MOVF INDF,W BCF FSR,7 iva de 0xA1 BSF STATUS,IRP ADDWF INDF,W BCF STATUS,IRP BSF FSR,1 BCF FSR,0 r resultadol MOVWF INDF BTFSC CALL MOVLW MOVWF um1h STATUS,C aca 0XA0 FSR

;no.c=0 resta(-),ir a complementar a 2 para ver su ;si.resultado total (+), limpio pclath ;salir ;complemento a 1 el resultado y le sumo 1= complem ;complemento a 1 ;sumo 1 ;coloco el resultado ;c=1? ;si.coloco el valor arrojado ;limpio el pclath y vuelvo al inicio

;dir relativa a colocar en el FSR ;irp=0 indirectamente en el bank0 y 1 ;puntero esta ubicado en la dir correspondiente ;muevo su contenido a w ;cambio el bit 7 del fsr aprovechando la dir relat ;irp=1 indirectamente en el bank2 y 3 ;sumo la num2l+num1l ;irp=0 indirectamente en el bank0 y 1 ; ;ubico la direccion relativa de 0x22 para deposita ;indf contiene el resultado de resultado_bajo ;c=0? ;no. c=1 es decir, llevo 1 hay acarreo ;si c=0 ;el fsr esta apuntando a la dir 0xA0, donde esta n

MOVF INDF,W BCF FSR,7 ;aprovecho la dir relativa de 0xA0, modifico el bi t 7 del FSR para ubicarme en la dir 0x120h BSF STATUS,IRP ;colocando el irp=1 indirectamente estoy en el ban co2 y 3 ADDWF INDF,W ;sumo los valores de num2h+num1h BCF STATUS,IRP ;irp=0 indirectamente pase a los bancos 0 y 1 BSF FSR,1 ;aprovecho la direccion relatica que llevaba para ubicarme en 0x23h BSF FSR,0 MOVWF INDF ;indf contiene el resultado de resultado_alto CLRF PCLATH ;limpio el pclath, regreso a inicio GOTO inicio aca MOVLW 0XA0 ;aca sumo el acarreo que llevaba al num1h MOVWF FSR ;el fsr apunta a la dir.relativa 0xA0 INCF INDF,F ;incrementa el contenido de esta direccion a trave s del indf RETURN ;retorna el valor para seguir sumando la parte alt a

fin GOTO $ end ;finaliza el programa

Anda mungkin juga menyukai