desktop

Ordenar tres números (Programa en MPLAB) Pic 16F886

Hola compañero me dejaron realizar un programa dónde tengo que ordenar tres numeros de menor a menor realize en siguente programa pero no me funciono uso esamblador de mplab trabajando la pic 16f886 alguien tiene alguna otra idea de como hacerlo o me podrían decir en que estoy mal gracias

Código:
list        p=16f886    ; list directive to define processor
    #include    <p16f886.inc>   ; processor specific variable definitions

    __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
    __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

RESET_VECTOR    CODE    0x0000 ; processor reset vector

    nop
    goto    start              ; go to beginning of program

	
MAIN_PROG       CODE 0X06

	start
 
 
	;NÚMERO 1
	CLRF 0X30
	INCF 0X30
	MOVFW 0X21
	SUBWF 0X20,0
	BTFSC STATUS,0
	INCF 0X30,1
	MOVFW 0X22
	SUBWF 0X20,0
	BTFSC STATUS,0
	INCF 0X30,1
	MOVFW 0X23
	SUBWF 0X20,0
	BTFSC STATUS,0
	INCF 0X30,1
	MOVFW 0X24
	SUBWF 0X20,0
	BTFSC STATUS,0
	INCF 0X30,1
	MOVFW 0X20
	CALL OPERACION

	;NÚMERO 2

	CLRF 0X30
	INCF 0X30
	MOVFW 0X20
	SUBWF 0X21,0
	BTFSC STATUS,0
	INCF 0X30,1
	MOVFW 0X22
	SUBWF 0X21,0
	BTFSC STATUS,0
	INCF 0X30,1
	MOVFW 0X23
	SUBWF 0X21,0
	BTFSC STATUS,0
	INCF 0X30,1
	MOVFW 0X24
	SUBWF 0X21,0
	BTFSC STATUS,0
	INCF 0X30,1
	MOVFW 0X21
	CALL OPERACION

	;NÚMERO 3

	CLRF 0X30
	INCF 0X30
	MOVFW 0X21
	SUBWF 0X22,0
	BTFSC STATUS,0
	INCF 0X30,1
	MOVFW 0X20
	SUBWF 0X22,0
	BTFSC STATUS,0
	INCF 0X30,1
	MOVFW 0X23
	SUBWF 0X22,0
	BTFSC STATUS,0
	INCF 0X30,1
	MOVFW 0X24
	SUBWF 0X22,0
	BTFSC STATUS,0
	INCF 0X30,1
	MOVFW 0X22
	CALL OPERACION
	
	GOTO SETERMINO

	OPERACION
	DECF 0X30
	BTFSC STATUS,2
	MOVWF 0X50
	DECF 0X30
	BTFSC STATUS,2
	MOVWF 0X51
	DECF 0X30
	BTFSC STATUS,2
	MOVWF 0X52
	DECF 0X30

	
	RETURN
	SETERMINO

    END                       ; directive \'end of program\'
...
 
La forma más simple por el método de ordenación de la burbuja. Aquí tienes la forma de hacerlo para un número de valores definido por CUENTA (en realidad son CUENTA+1 valores lo que se ordenan). Por ejemplo, como CUENTA es 10, se ordenan de mayor a menor 11 valores a partir de la dirección ARRAY. Se utiliza direccionamiento indirecto:

Código:
		list        p=16f886    ; list directive to define processor
    	#include    <p16f886.inc>;   ; processor specific variable definitions
    __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
    __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

CNT1	EQU 0x20
CNT2	EQU 0x21
ARRAY	EQU 0x22
CUENTA	EQU	.10

inicio	code 0x0000
		nop
		MOVLW CUENTA
		MOVWF CNT1
BUCLE1		MOVLW CUENTA
		MOVWF CNT2
		MOVLW ARRAY
		MOVWF FSR
BUCLE2
		CALL ORDENADOS
		INCF FSR
		DECFSZ CNT2
		GOTO BUCLE2
		DECFSZ CNT1
		GOTO BUCLE1
SALIDA		GOTO HACIAFUERA

ORDENADOS
		MOVF INDF,W
		INCF FSR
		SUBWF INDF,W
		BTFSS STATUS,C
		GOTO NOHACERNADA
		MOVF INDF,W
		DECF FSR
		XORWF INDF,F
		XORWF INDF,W
		XORWF INDF,F
		INCF FSR
		MOVWF INDF
NOHACERNADA
		DECF FSR
		RETURN

HACIAFUERA
		NOP
end

CUENTA puede valer hasta 93, y se ordenarán 94 números en el vector.
 
Última edición:
Atrás
Arriba