Advertisement
AguHDz

PicPas_Multiplicacion_HEX_16F877

Jun 7th, 2017
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 3.15 KB | None | 0 0
  1. {
  2. *  (C) AguHDz 05-JUN-2017
  3. *  Ultima Actualizacion: 14-JUN-2017
  4. *
  5. *  Compilador PicPas v.0.6.9 (https://github.com/t-edson/PicPas)
  6. *
  7. *  MULTIPLICACION DOS VALORES DE UN BYTE CON RESULTADO EN 2 BYTES
  8. *  PicPas aun no ha implementado la operacion de multiplicacion,
  9. *  el siguiente procedimiento en escrito en ensamblador permite
  10. *  realizar operaciones de multiplicacion.
  11. *
  12. *  El ejemplo de aplicacion corre sobre un PIC16F877A, y multiplica
  13. *  el valor introducido por los puertos RA0..RA5 y RE0..RE1 = variable auxiliar
  14. *  por el valor leido en el puerto B (RB0..RB7). El resultado es de 2 bytes y
  15. *  se muestra como salida digital por los puertos C y D.
  16. }
  17.  
  18. {$PROCESSOR PIC16F877A}
  19. {$FREQUENCY 8Mhz}
  20. {$MODE PICPAS}
  21. program Multipl_HEX_ASM;
  22.  
  23. uses PIC16F877A;
  24.  
  25. var
  26.   resultado : word; // Variable global con resultado de multiplicacion que se mostrara en el display.
  27.   auxiliar  : byte; // Variable auxiliar para operar con los valores leidos de entrada
  28.                     // en los puertos A y E.
  29.  
  30. //***********************************************************************
  31. //  PROCEDIMIENTO: Multiplicar
  32. //  Multiplica dos valores de 8 bits.
  33. //  Devuelve el resultado en variable tipo word de 16 bits.
  34. //***********************************************************************
  35. procedure Multiplicar (multiplicando, multiplicador : byte);
  36. begin
  37.   ASM
  38.     ;----Inicializacion de Registros
  39.       BCF     STATUS_RP0          ; Trabajamos en el Banco de memoria 0.
  40.       CLRF    resultado.LOW       ; Limpia el byte bajo de la variable global resultado.
  41.       CLRF    resultado.HIGH      ; Limpia el byte alto de la variable global resultado.
  42.     ;----Comprueba multiplicacion por cero.
  43.       MOVLW   $00
  44.       SUBWF   multiplicador,W
  45.       BTFSC   STATUS_Z
  46.       GOTO    MULT_FIN            ; Si multiplicador = 0 entonces acabar.
  47.     ;----LOOP de multiplicacion
  48.     MULT_LOOP:
  49.       MOVF    multiplicando,W     ; Carga el multiplicador en el registro W.
  50.       ADDWF   resultado.LOW,F     ; Suma el valor de multiplicando al byte bajo de la variable global resultado
  51.       BTFSC   STATUS_C            ; Comprueba el bit CARRY del registro STATUS.
  52.       INCF    resultado.HIGH,F    ; Si CARRY es 0 resultado.LOW se ha desbordado se incrementa resultado.HIGH
  53.       DECFSZ  multiplicador,F     ; Decrementa multiplicador y comprueba si ha llegado a cero.
  54.       GOTO    MULT_LOOP           ; nuevo paso del bucle de multiplicacion.
  55.     MULT_FIN:
  56.   END
  57. end;
  58.  
  59. //***********************************************************************
  60. // PROGRAMA PRINCIPAL ***************************************************
  61. //***********************************************************************
  62. begin
  63.   ADCON1 := $07;           // Todos los pines configurados como digitales.
  64.   ADCON0 := $00;           // Desactiva conversor A/D.
  65.   SetAsInput(PORTA);
  66.   SetAsInput(PORTB);
  67.   SetAsInput(PORTE.0);
  68.   SetAsInput(PORTE.1);
  69.   SetAsOutput(PORTC);
  70.   SetAsOutput(PORTD);
  71.   repeat  
  72.     auxiliar   := PORTA;
  73.     auxiliar.6 := PORTE.0;
  74.     auxiliar.7 := PORTE.1;
  75.     Multiplicar(auxiliar,PORTB);
  76.     PORTC      := resultado.LOW;
  77.     PORTD      := resultado.HIGH;
  78.   until false;
  79. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement