Advertisement
Guest User

Untitled

a guest
Mar 25th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  2. ;*              MODIFICAÇÕES PARA USO COM 12F675                   *
  3. ;*                FEITAS PELO PROF. MARDSON                        *
  4. ;*                    FEVEREIRO DE 2016                            *
  5. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  6.  
  7. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  8. ;*                       NOME DO PROJETO                           *
  9. ;*                           CLIENTE                               *
  10. ;*         DESENVOLVIDO PELA MOSAICO ENGENHARIA E CONSULTORIA      *
  11. ;*   VERSÃO: 1.0                           DATA: 17/06/03          *
  12. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  13. ;*                     DESCRIÇÃO DO ARQUIVO                        *
  14. ;*-----------------------------------------------------------------*
  15. ;*   MODELO PARA O PIC 12F675                                      *
  16. ;*                                                                 *
  17. ;*                                                                 *
  18. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  19.  
  20. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  21. ;*                     ARQUIVOS DE DEFINIÇÕES                      *
  22. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  23. #INCLUDE <p12f675.inc>  ;ARQUIVO PADRÃO MICROCHIP PARA 12F675
  24.  
  25.     __CONFIG _BODEN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT
  26.  
  27. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  28. ;*                    PAGINAÇÃO DE MEMÓRIA                         *
  29. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  30. ;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA
  31. #DEFINE BANK0   BCF STATUS,RP0  ;SETA BANK 0 DE MEMÓRIA
  32. #DEFINE BANK1   BSF STATUS,RP0  ;SETA BANK 1 DE MAMÓRIA
  33.  
  34. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  35. ;*                         VARIÁVEIS                               *
  36. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  37. ; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS
  38. ; PELO SISTEMA
  39.  
  40.     CBLOCK  0x20    ;ENDEREÇO INICIAL DA MEMÓRIA DE
  41.                     ;USUÁRIO
  42.         W_TEMP      ;REGISTRADORES TEMPORÁRIOS PARA USO
  43.         STATUS_TEMP ;JUNTO ÀS INTERRUPÇÕES
  44.         LOOP_VAL
  45.         AUX
  46.         ENTRADA_A
  47.         ENTRADA_B
  48.         RESTO
  49.         RESTO_TEMP
  50.         X
  51.         X_DECIMAL
  52.         Y
  53.         D1
  54.         D2
  55.         RESULTADO
  56.         NUM_DISPLAY
  57.         DENOMINADOR
  58.        
  59.         ; CONVERSÃO PARA BCD
  60.         FIRST_DIGIT
  61.         SECOND_DIGIT
  62.  
  63.     ENDC            ;FIM DO BLOCO DE MEMÓRIA
  64. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  65. ;*                        FLAGS INTERNOS                           *
  66. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  67. ; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA
  68.  
  69. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  70. ;*                         CONSTANTES                              *
  71. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  72. ; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA
  73.  
  74. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  75. ;*                           ENTRADAS                              *
  76. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  77. ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
  78. ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
  79.  
  80. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  81. ;*                           SAÍDAS                                *
  82. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  83. ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
  84. ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
  85.  
  86. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  87. ;*                       VETOR DE RESET                            *
  88. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  89.  
  90.     ORG 0x00            ;ENDEREÇO INICIAL DE PROCESSAMENTO
  91.     GOTO    INICIO
  92.    
  93. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  94. ;*                    INÍCIO DA INTERRUPÇÃO                        *
  95. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  96. ; ENDEREÇO DE DESVIO DAS INTERRUPÇÕES. A PRIMEIRA TAREFA É SALVAR OS
  97. ; VALORES DE "W" E "STATUS" PARA RECUPERAÇÃO FUTURA
  98.  
  99.     ORG 0x04            ;ENDEREÇO INICIAL DA INTERRUPÇÃO
  100.     MOVWF   W_TEMP      ;COPIA W PARA W_TEMP
  101.     SWAPF   STATUS,W
  102.     MOVWF   STATUS_TEMP ;COPIA STATUS PARA STATUS_TEMP
  103.  
  104. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  105. ;*                    ROTINA DE INTERRUPÇÃO                        *
  106. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  107. ; AQUI SERÁ ESCRITA AS ROTINAS DE RECONHECIMENTO E TRATAMENTO DAS
  108. ; INTERRUPÇÕES
  109.  
  110. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  111. ;*                 ROTINA DE SAÍDA DA INTERRUPÇÃO                  *
  112. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  113. ; OS VALORES DE "W" E "STATUS" DEVEM SER RECUPERADOS ANTES DE
  114. ; RETORNAR DA INTERRUPÇÃO
  115.  
  116. SAI_INT
  117.     SWAPF   STATUS_TEMP,W
  118.     MOVWF   STATUS      ;MOVE STATUS_TEMP PARA STATUS
  119.     SWAPF   W_TEMP,F
  120.     SWAPF   W_TEMP,W    ;MOVE W_TEMP PARA W
  121.     RETFIE
  122.  
  123. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  124. ;*                   ROTINAS E SUBROTINAS                      *
  125. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  126. ; CADA ROTINA OU SUBROTINA DEVE POSSUIR A DESCRIÇÃO DE FUNCIONAMENTO
  127. ; E UM NOME COERENTE ÀS SUAS FUNÇÕES.
  128.  
  129. ; ************************** DIVISÃO********************************
  130. ; Efetua a divisão de dois números, retornando também o resto.
  131. ;
  132. ; ENTRADAS: AUX (Numerador), DENOMINADOR (Denominador)
  133. ; SAÍDAS: W = QUOCIENTE, RESTO = resto da divisão
  134. ;
  135. ; TEMPORARIOS: RESULTADO
  136. DIVISAO
  137.     MOVFW DENOMINADOR ; COPIA O DENOMINADOR PRO WORK
  138.     SUBWF AUX, 0; SUBTRAI O DENOMINADOR DA VARIAVEL AUXILIAR (TOTAL)
  139.     BTFSC STATUS, C ; VERIFICA SE É POSSÍVEL DIVIDIR (AUX > DENOMINADOR)
  140.     GOTO DECREMENTA ; SE SIM, INCREMENTA O RESULTADO DA DIVISAO E ATUALIZA AUX
  141.    
  142.     ; FIM DA DIVISÃO (AUX < DENOMINADOR, NESSE MOMENTO)
  143.     MOVFW AUX ; COPIA O QUE SOBROU EM AUX
  144.     MOVWF RESTO ; E JOGA EM RESTO
  145.    
  146.     ; COPIA O RESULTADO PARA O WORK (SAIDA)
  147.     MOVFW RESULTADO
  148.     CLRF RESULTADO ; LIMPA O RESULTADO
  149.     RETURN
  150.    
  151. DECREMENTA ; INCREMENTA O RESULTADO DA DIVISAO E ATUALIZA AUX
  152.     MOVWF AUX ; AUX = AUX - DENOMINADOR
  153.     INCF RESULTADO, 1 ; INCREMENTA O RESULTADO DA DIVISAO EM 1 UNIDADE
  154.     GOTO DIVISAO ; VOLTA PARA VERIFICAR SE AINDA É POSSÍVEL DIVIDIR O NOVO VALOR DE AUX
  155.    
  156.  
  157. ; ************************** DIVISÃO DO RESTO****************************
  158. ; Verifica se a divisão possui resto. Multiplica por 10 o Resto e divide.
  159. ; Caso RESTO > 25, há um tratamento especial: o denominador é dividido por dez, ao invés de
  160. ; multiplicar o numerador por dez. Isto é feito para evitar o estouro do limite de 255 (1 byte)
  161. ;
  162. ; ENTRADAS: RESTO (Numerador), DENOMINADOR (Denominador)
  163. ; SAÍDAS: W = QUOCIENTE, RESTO = resto da divisão
  164. ;
  165. ; TEMPORARIOS: LOOP_VAL, AUX
  166.    
  167. DIVISAO_RESTO
  168.     CLRF AUX ; LIMPA A VARIAVEL AUXILIAR
  169.    
  170.     ; VERIFICA SE O RESTO É ZERO
  171.     MOVFW RESTO
  172.     XORLW .0 ; XOR(RESTO, 0) ATIVARÁ O FLAG STATUS,Z
  173.     BTFSC STATUS,Z ; VERIFICA SE EXISTE RESTO
  174.     RETURN ; SE Z = 1, ENTÃO RESTO = 0. RETORNA.
  175.    
  176.     ; VERIFICA SE O RESTO É >=26, POIS NESTE CASO NÃO DÁ PRA MULTIPLICAR POR DEZ
  177.     MOVLW .26
  178.     SUBWF RESTO,
  179.     BTFSC STATUS, C
  180.     GOTO DIVIDE_ESTOURO ; TRATAMENTO ESPECIAL PARA RESTO >= 26
  181.    
  182.     ; MULTIPLICA O RESTO POR DEZ
  183.     MOVFW RESTO
  184.     MOVWF AUX
  185.     CALL MULTIPLICA_10
  186.    
  187.     ; SE MESMO APÓS A MULTIPLICAÇÃO POR 0 NÃO FOR POSSÍVEL DIVIDIR
  188.     MOVFW DENOMINADOR
  189.     SUBWF RESTO, W; RESTO - DENOMINADOR
  190.     MOVLW .0
  191.     BTFSS STATUS, C ; VERIFICA SE MESMO APÓS A MULTIPLICAÇÃO, AINDA NÃO DÁ PRA DIVIDIR
  192.     RETURN ; RETORNA 0
  193.    
  194.     ; CASO SEJA POSSÍVEL DIVIDIR
  195.     CLRF RESULTADO ;LIMPA A VARIAVEL RESULTADO
  196.    
  197.     ; EFETUA A DIVISAO E RETORNA O RESULTADO
  198.     CALL DIVISAO
  199.     RETURN
  200.    
  201. DIVIDE_ESTOURO
  202.    
  203.     ; **** INICIO DA DIVISAO DO DENOMINADOIR POR DEZ ****
  204.     MOVFW DENOMINADOR ; COPIA O DENOMINADOR PRO NUMERADOR
  205.     MOVWF AUX
  206.     MOVLW .10 ; COPIA "10" PARA O DENOMINADOR
  207.     MOVWF DENOMINADOR
  208.    
  209.     ; GUARDA O VALOR TEMPORARIO DO RESTO ORIGINAL EM RESTO_TEMP
  210.     MOVFW RESTO
  211.     MOVWF RESTO_TEMP
  212.    
  213.     CALL DIVISAO ; DIVIDE O DENOMINADOR ORIGINAL POR 10
  214.     MOVWF DENOMINADOR
  215.     ; **** FIM DA DIVISAO DO DENOMINADOR POR DEZ ****
  216.    
  217.     MOVFW RESTO_TEMP ; DEVOLVE O NUMERADOR ORIGINAL
  218.     MOVWF AUX
  219.     CALL DIVISAO ; DIVIDE O RESTO PELO (DENOMINADOR / 10) E RETORNA
  220.     RETURN
  221.    
  222. ;MAKE_DIVISIVEL
  223.     ;MOVFW ENTRADA_B
  224.     ;SUBWF RESTO, W; RESTO - DENOMINADOR
  225.     ;BTFSS STATUS, C ; Verifica se já pode dividir (RESTO > DENOMINADOR)
  226.     ;CALL MULTIPLICA_10
  227.     ;RETURN
  228.  
  229. ; MULTIPLICA O VALOR EM AUX POR DEZ E SALVA EM RESTO
  230. MULTIPLICA_10
  231.     MOVLW .9
  232.     MOVWF LOOP_VAL
  233.  
  234.     LOOP10 ;LOOP (RODA 9 VEZES)
  235.     MOVFW RESTO
  236.     ADDWF AUX, 1 ; AUX = AUX + RESTO
  237.     DECFSZ LOOP_VAL,1
  238.     GOTO LOOP10
  239.  
  240.     ; COPIA O RESULTADO PARA RESTO
  241.     MOVFW AUX
  242.     MOVWF RESTO
  243.     RETURN
  244.  
  245.    
  246. ; ************************** ARREDONDAMENTO ****************************
  247. ; Arredonda o numero fornecido.
  248. ; Regra adotada:
  249. ;    1) Segunda casa decimal maior que 5, arredonda a primeira casa.
  250. ;    2) Se a primeira casa decimal for 10 após o arredondamento, seta como ZERO e aumenta o valor de X.
  251. ;
  252. ; ENTRADAS: Y (Primeira casa decimal), D2 (Segunda casa decimal)
  253. ; VALORES MODIFICADOS: X (se Y == 10 em algum momento), Y
  254.  
  255. ARREDONDAR
  256.         ; VERIFICA SE O SEGUNDO DIGITO É MAIOR QUE 5
  257.     MOVLW .5
  258.     SUBWF D2,W ; W=D2-5
  259.     BTFSC STATUS, C
  260.     INCF Y,F ; SE D2>5, ARREDONDA Y.
  261.    
  262.     ; VERIFICA SE APÓS O ARREDONDAMENTO, Y == 10
  263.     MOVFW Y
  264.     XORLW .10
  265.     BTFSS STATUS, Z ; Y == 10?
  266.     RETURN ; SE Y != 10, RETORNA.
  267.    
  268.     INCF X,F ; SE Y == 10, X++
  269.     CLRF Y ; SE Y == 10, Y=0
  270. RETURN
  271.    
  272. ; ************************** DISPLAY ****************************
  273. ; Escreve no Display o numero fornecido.
  274. ;
  275. ; ENTRADAS: NUM_DISPLAY
  276. ; VALORES MODIFICADOS: GP0, GP1, GP4, GP5
  277.  
  278. DISPLAY_RESULTADO
  279.     ; O PROGRAMA SÓ ENTRA NESSA ROTINA APENAS SE FOR MENOR QUE 9.
  280.     ; LOGO, NÃO HÁ PROBLEMA EM TRATAR DIRETAMENTE OS BITS ABAIXO.
  281.     ; LIGA LED 1
  282.     BTFSC NUM_DISPLAY, 0
  283.     BSF GPIO, 0
  284.    
  285.     ; LIGA LED 2
  286.     BTFSC NUM_DISPLAY, 1
  287.     BSF GPIO, 1
  288.    
  289.     ; LIGA LED 3
  290.     BTFSC NUM_DISPLAY, 2
  291.     BSF GPIO, 4
  292.    
  293.     ; LIGA LED 4
  294.     BTFSC NUM_DISPLAY, 3
  295.     BSF GPIO, 5
  296.     RETURN
  297.  
  298. ; TRATA O DISPLAY QUANDO X > 10
  299. ESTOURO
  300.     BSF GPIO, 2 ; LIGA O LED DE ESTOURO
  301.     MOVLW .255 ; COLOCA O LED COMO 1111
  302.     MOVWF NUM_DISPLAY ; O NUM_DISPLAY VIRA 255
  303. RETURN
  304.  
  305. ; ************************** CONVERSÃO EM BCD ****************************
  306. ; Separa o valor em dígitos para conversão em BCD.
  307. ; MÉTODO: Divide por 10 e pega o resto. Depois, inverte os dígitos e faz um IORWF
  308. ;
  309. ; ENTRADAS: X
  310. ; VALORES MODIFICADOS: FIRST_DIGIT, SECOND_DIGIT
  311. ; TEMPORARIOS: AUX
  312.    
  313. FIND_DIGITS ; ENCONTRAR DÍGITOS
  314.     CLRF RESULTADO ; LIMPA O RESULTADO
  315.    
  316.     ; COPIA X PARA O NUMERADOR
  317.     MOVFW X
  318.     MOVWF AUX
  319.    
  320.     ; COPIA 10 PARA O DENOMINADOR
  321.     MOVLW .10
  322.     MOVWF DENOMINADOR
  323.    
  324.     ; EFETUA A DIVISÃO
  325.     CALL DIVISAO
  326.    
  327.     ; GUARDA O PRIMEIRO DIGITO
  328.     MOVWF FIRST_DIGIT
  329.    
  330.     ; GUARDA O SEGUNDO DIGITO
  331.     MOVFW RESTO
  332.     MOVWF SECOND_DIGIT
  333.    
  334.     ; JUNTA OS DÍGITOS EM UM ÚNICO NÚMERO BCD
  335.     SWAPF FIRST_DIGIT, 0 ; INVERTE OS NIBBLES
  336.     IORWF SECOND_DIGIT, 0 ; FAZ UM OR DO PRIMEIRO DIGITO INVERTIDO COM O SEGUNDO
  337.     ; Ex.: 0101 0000 OR 00001010 -> 0101 1010
  338.     RETURN
  339.  
  340.  
  341. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  342. ;*                     INICIO DO PROGRAMA                          *
  343. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  344.    
  345. INICIO
  346.     BANK1               ;ALTERA PARA O BANCO 1
  347.     MOVLW   B'00001000' ;CONFIGURA TODAS AS PORTAS DO GPIO (PINOS)
  348.     MOVWF   TRISIO      ;COMO SAÍDAS
  349.     CLRF    ANSEL       ;DEFINE PORTAS COMO Digital I/O
  350.     MOVLW   B'00000100'
  351.     MOVWF   OPTION_REG  ;DEFINE OPÇÕES DE OPERAÇÃO
  352.     MOVLW   B'00000000'
  353.     MOVWF   INTCON      ;DEFINE OPÇÕES DE INTERRUPÇÕES
  354.     BANK0               ;RETORNA PARA O BANCO
  355.     MOVLW   B'00000111'
  356.     MOVWF   CMCON       ;DEFINE O MODO DE OPERAÇÃO DO COMPARADOR ANALÓGICO
  357.  
  358. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  359. ;*                     INICIALIZAÇÃO DAS VARIÁVEIS                 *
  360. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  361.  
  362.  
  363.    
  364. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  365. ;*                     ROTINA PRINCIPAL                            *
  366. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  367. MAIN
  368.     ; DEFINE OS VALORES DE ENTRADA
  369.     MOVLW .250
  370.     MOVWF ENTRADA_A
  371.     MOVLW .10
  372.     MOVWF ENTRADA_B
  373.    
  374.     ; LIMPA TODAS AS PORTAS, EXCETO GP3 (CHAVE)
  375.     BCF GPIO,0
  376.     BCF GPIO,1
  377.     BCF GPIO,2
  378.     BCF GPIO,4
  379.     BCF GPIO,5
  380.    
  381.     ; LIMPA AS SAÍDAS
  382.     CLRF RESULTADO
  383.     CLRF X
  384.     CLRF Y
  385.    
  386.     ; ********************** INICIO DA DIVISÃO ***********************
  387.     ; COPIA A ENTRADA_A PARA O NUMERADOR
  388.     MOVFW ENTRADA_A
  389.     MOVWF AUX
  390.    
  391.     ; COPIA A ENTRADA_B PARA O DENOMINADOR
  392.     MOVFW ENTRADA_B
  393.     MOVWF DENOMINADOR
  394.  
  395.     ; CHAMA A FUNÇÃO DE DIVISÃO
  396.     CALL DIVISAO ; DIVISAO(AUX = NUMERADOR, DENOMINADOR); SAÍDA: Quociente em WORK. Resto em RESTO.
  397.     MOVWF X ; GUARDA A SAÍDA NO WORK
  398.    
  399.     ; PRIMEIRA CASA DECIMAL (DIVIDIR O RESTO)
  400.     CALL DIVISAO_RESTO; DIVIDE O RESTO PELO DENOMINADOR
  401.     MOVWF D1 ; D1 = PRIMEIRA CASA DECIMAL
  402.     MOVWF Y ; COPIA DIRETO PARA Y. LOGO MAIS SERÁ FEITO O ARREDONDAMENTO.
  403.    
  404.     ; SEGUNDA CASA DECIMAL (DIVIDIR O RESTO DO RESTO)
  405.     CALL DIVISAO_RESTO
  406.     MOVWF D2 ; D2 = SEGUNDA CASA DECIMAL
  407.    
  408.     ; FUNCAO DE ARREDONDAMENTO ( D2 > 5, ARREDONDA. D2 === 10, INCREMENTA D1 E ZERA D2)
  409.     CALL ARREDONDAR
  410.    
  411.     ; ********************** FIM DA DIVISÃO ***********************
  412.    
  413.     ; *************** INICIO DA CONVERSÃO EM BCD ******************
  414.    
  415.     ; GUARDA O VALOR DE X EM DECIMAL NA VARIAVEL X_DECIMAL
  416.     MOVFW X
  417.     MOVWF X_DECIMAL
  418.  
  419.     ; SEPARACAO EM DIGITOS (EX.: 15 -> FIRST_DIGIT = 1, SECOND_DIGIT = 5)
  420.     CALL FIND_DIGITS
  421.     MOVWF X ; SALVA O QUOCIENTE EM BCD EM X
  422.    
  423.     ; *************** FIM DA CONVERSÃO EM BCD **********************
  424.    
  425.     ; **************** INÍCIO DA ESCRITA NO VISOR ******************
  426.    
  427.     ; TODO: VERIFICAR SE GP3 É LOW. SE SIM, COPIAR Y PRA RESULTADO
  428.     ; TODO: VERIFICAR SE GP3 É HIGH. SE SIM, COPIAR X PRA RESULTADO
  429.    
  430.     MOVFW X ; COPIA A PARTE INTEIRA PRO WORK. CASO GP3=HIGH, A PRÓXIMA INSTRUÇÃO SERÁ PULADA, MANTENDO ESTE VALOR NO WORK.
  431.     BTFSS GPIO,3 ; TESTA O VALOR DE GP3
  432.     MOVFW Y ; SE GP3=LOW, COPIA A PARTE DECIMAL.
  433.     MOVWF NUM_DISPLAY ; COPIA O QUE ESTIVER NO WORK (X OU Y, DEPENDENDO DE GP3) PARA A VARIAVEL RESULTADO
  434.    
  435.     ; VERIFICA SE NUM_DISPLAY > 10
  436.     ; SE NUM_DISPLAY = X
  437.     ;   NOTE QUE X ESTÁ EM BCD. LOGO, SE X (DECIMAL) FOR 10, EM BCD SERÁ 0x10 = 16
  438.     ;   PORTANTO A VALIDAÇÃO ABAIXO AINDA É VÁLIDA.
  439.     ; SE NUM_DISPLAY = Y
  440.     ;   COMO Y SEMPRE ESTÁ ENTRE 0 E 9, A VERIFICAÇÃO TAMBÉM FUNCIONA NORMALMENTE.
  441.     MOVLW .10
  442.     SUBWF X,
  443.     BTFSC STATUS, C
  444.     CALL ESTOURO ; SE NUM_DISPLAY >= 10
  445.  
  446.     ; DAQUI PRA BAIXO = SE NUM_DISPLAY < 10
  447.     CALL DISPLAY_RESULTADO
  448.     ; **************** FIM DA ESCRITA NO VISOR ******************
  449.  
  450.     GOTO MAIN
  451.  
  452. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  453. ;*                       FIM DO PROGRAMA                           *
  454. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  455.  
  456.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement