Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #INCLUDE <P12F629.INC>
- ;Declaracao de variaveis:
- X_MSB EQU 0x20
- X_LSB EQU 0x21
- Y_MSB EQU 0x22
- Y_LSB EQU 0x23
- Z_MSB EQU 0x24
- Z_LSB EQU 0x25
- W_MSB EQU 0x26
- W_LSB EQU 0x27
- R_MSB EQU 0x28
- R_LSB EQU 0x29
- T_MSB EQU 0x2A
- T_LSB EQU 0x2B
- K_MSB EQU 0x2C
- K_LSB EQU 0x2D
- S_MSB EQU 0x2E
- S_LSB EQU 0x2F
- temp_msb EQU 0x30
- temp_lsb EQU 0x31
- ;INICIO DO PROGRAMA:
- ;Atribuição de valores as variaveis:
- inic_prog ORG 0x00
- CLRW ;Limpa o registrador W
- MOVLW 0x08 ;W <- 0x08
- MOVWF X_LSB ;Carrega o valor de W em x
- MOVLW 0x02 ;WREG <- 0x02
- MOVWF Y_LSB ;Carrega o valor de W em y
- MOVLW 0x06 ;WREG <- 0x06
- MOVWF Z_LSB ;Carrega o valor de W em z
- CLRW ;Limpa o registrador W
- MOVWF W_LSB ;Carrega o valor de W em w
- MOVWF R_LSB ;Carrega o valor de W em var_r(0x24)
- MOVWF T_LSB ;Carrega o valor de W em var_t(0x25)
- MOVWF K_LSB ;Carrega o valor de W em var_k(0x26)
- MOVWF S_LSB ;Carrega o valor de W em var_s(0x27)
- ; r = 3*x+2*y-z
- ; Primeirament sera feita a multiplicacao 3*x e será armazenada
- ; em 0x32_0x33:
- MOVF X_MSB,0 ;Copia o valor de X_MSB e coloca em W
- MOVWF temp_msb ;Coloca o valor de W em 0x30
- MOVF X_LSB,0 ;Copia o valor de X_LSB e coloca em W
- MOVWF temp_lsb ;Coloca o valor de W em 0x31
- MOVLW 0x03 ;Copia o literal 03h para W
- MOVWF 0x35 ;Copia o valor de W para 0x35
- CALL func_mult ;Chama a funcao de multiplicacao
- ;Os valores que foram retornados da funcao são colocados em 0X36 e 0x37
- CLRW
- MOVF 0x32,0
- MOVWF 0x36
- MOVF 0x33,0
- MOVWF 0x37
- ; Agora, sera feita a multiplicação 2*y e sera armazenada em 0x32 E 0x33
- MOVF Y_MSB,0
- MOVWF 0x30
- MOVF Y_LSB,0
- MOVWF 0x31
- MOVLW 0x02
- MOVWF 0x35
- CALL func_mult
- ; O proximo passo será somar 0x36_0x37 + 0x32_0x33, e armazenar em 0x36_0x37:
- MOVF 0x33,0
- ADDWF 0x37,1
- BTFSC STATUS,0
- INCF 0x36
- MOVF 0x32,0
- ADDWF 0x36,1
- ;Depois faz-se: R = 0x36_0x37 - Z:
- MOVF Z_LSB,0
- SUBWF 0x37,0 ;Faz-se W = 0x31 - Z
- MOVWF R_LSB ;Copia o resultado da subtracao para R
- ;T = Z + 5*R:
- ;Primeiramente faz-se a multiplicacao 5*R e o resultado fica em 0x32 e 0x33
- MOVF R_MSB,0
- MOVWF 0x30
- MOVF R_LSB,0
- MOVWF 0x31
- MOVLW 0x05
- MOVWF 0x35
- CALL func_mult
- ;Depois faz-se: T = Z + 0x32_0x33
- MOVF Z_LSB,0 ;Copia o valor de Z_LSB para W
- ADDWF 0x33,0
- BTFSC STATUS,0
- INCF 0x32,1
- MOVWF T_LSB
- MOVF 0x32,0
- ADDWF Z_MSB,0
- MOVWF T_MSB
- ;K = 6*X + 2*Z
- ;Primeiramente, faz-se 0x36_0x37 = 6*X:
- MOVF X_MSB,0
- MOVWF 0x30
- MOVF X_LSB,0
- MOVWF 0x31
- MOVLW 0x06
- MOVWF 0x35
- CALL func_mult
- MOVF 0x32,0
- MOVWF 0x36
- MOVF 0x33,0
- MOVWF 0x37
- ;Agora, faz-se 0x32_0x33 = 2*Z
- MOVF Z_MSB,0
- MOVWF 0x30
- MOVF Z_LSB,0
- MOVWF 0x31
- MOVLW 0x02
- MOVWF 0x35
- CALL func_mult
- ;K = 0x32_0x33 + 0x36_0x37
- MOVF 0x37,0
- ADDWF 0x33,1
- BTFSC STATUS,0
- INCF 0x32,1
- MOVF 0x36,0
- ADDWF 0x32,1
- MOVF 0x32,0
- MOVWF K_MSB
- MOVF 0x33,0
- MOVWF K_LSB
- ;Implementação de if(K<T):
- CLRF 0x30
- MOVF T_LSB,0
- SUBWF K_LSB,0
- MOVWF 0x31
- BTFSC 0x31,7
- GOTO IF1
- GOTO ELSE1
- IF1 NOP
- ;Implementação de S = 3*T + Y****************
- MOVF T_LSB,0
- MOVWF 0x31
- MOVF T_MSB,0
- MOVWF 0x30
- MOVLW 0x03
- MOVWF 0x35
- CALL func_mult ;Chama a funcao que vai fazer 3*T
- MOVF Y_LSB,0
- ADDWF 0x33,1
- BTFSC STATUS,0
- INCF 0x32,1
- MOVF Y_MSB,0
- ADDWF 0x32,1
- ;Agora, vamos mover o resultado obtido para S:
- MOVF 0x32,0
- MOVWF S_MSB
- MOVF 0x33,0
- MOVWF S_LSB
- CALL funcA ;Chama a funcA
- MOVF 0x32,0
- MOVWF W_MSB
- MOVF 0x33,0
- MOVWF W_LSB
- GOTO final_prog
- ELSE1 NOP
- ;Realizar S = 2*T + 4
- MOVF T_MSB,0
- MOVWF 0x30
- MOVF T_LSB,0
- MOVWF 0x31
- MOVLW 0x02
- MOVWF 0x35
- CALL func_mult
- MOVLW 0x04
- ADDWF 0x33,1
- BTFSC STATUS,0
- INCF 0x32,1
- MOVF 0x32,0
- MOVWF S_MSB
- MOVF 0x33,0
- MOVWF S_LSB
- CALL funcB ;CHAMA A FUNCAO B
- MOVF 0x30,0 ;MOVE O MSB DO RETORNO DA FUNCAO PARA W
- MOVWF W_MSB ;MOVE W PARA O MSB DA VARIAVEL W
- MOVF 0x31,0 ;MOVE O MSB RETORNO DA FUNCAO PARA W
- MOVWF W_LSB ;MOVE W PARA O LSB DA VARIAVEL W
- GOTO final_prog ;VA PARA O FINAL DO PROGRAMA
- ;***********SUB-ROTINAS**********************
- funcA NOP
- ;Variaveis locais à funcão
- parA1_MSB EQU 0x40
- parA1_LSB EQU 0X41
- parA2_MSB EQU 0x42
- parA2_LSB EQU 0x43
- ;Passar os parametros para as variaveis locais:
- MOVF S_MSB,0
- MOVWF parA1_MSB
- MOVF S_LSB,0
- MOVWF parA1_LSB
- MOVF R_MSB,0
- MOVWF parA2_MSB
- MOVF R_LSB,0
- MOVWF parA2_LSB
- ;Realizar: parA1+8*parA2
- MOVF parA2_MSB,0
- MOVWF 0x30
- MOVF parA2_LSB,0
- MOVWF 0x31
- MOVLW 0x08
- MOVWF 0x35
- CALL func_mult ;Chama a funcao de multiplicação
- MOVF parA1_LSB,0
- ADDWF 0x33,1
- BTFSC STATUS,0
- INCF 0x32,1
- MOVF parA1_MSB,0
- ADDWF 0x32,1
- RETURN
- funcB NOP
- ;Variaveis locais à funcao:
- parB1_MSB EQU 0x44
- parB1_LSB EQU 0x45
- parB2_MSB EQU 0x46
- parB2_LSB EQU 0x47
- ;Passagem de parâmetros:
- MOVF S_LSB,0
- MOVWF parB1_LSB
- MOVF S_MSB,0
- MOVWF parB1_MSB
- MOVF T_LSB,0
- MOVWF parB2_LSB
- MOVF T_MSB,0
- MOVWF parB2_MSB
- ;Realizar: parB1 - parB2
- MOVF parB2_LSB,0
- SUBWF parB1_LSB,0
- BTFSC STATUS,0
- INCF 0x30,1
- DECF 0x30
- MOVWF 0x31
- MOVF parB2_MSB,0
- SUBWF parB1_MSB,0
- ADDWF 0x30,1
- RETURN
- func_mult NOP
- CLRF 0x32
- CLRF 0x33
- CLRW ;LIMPA O ACUMULADOR W
- loop DECF 0x35 ;DECREMENTA POSICAO DE MEMORIA 0x35
- BTFSC 0x35,7 ;VERIFICA SE 0x35 É NEGATIVO
- GOTO retornar ;SE SIM, RETORNA
- MOVF 0x33,0 ;COPIA O VALOR DE 0x33 PARA W
- ADDWF 0x31,0 ;FAZ: W = 0x31 + W
- BTFSC STATUS,0 ;VERIFICA SE HOUVE CARRY
- INCF 0x32,1 ;SE SIM, INCREMENTA 0x32
- MOVWF 0x33 ;COPIA O QUE ESTA EM W PARA 0x33
- MOVF 0x30,0 ;MOVE 0x30 PARA W
- ADDWF 0x32,1 ;FAZ: 0x32 = W + 0x32
- GOTO loop ;VA PARA LOOP
- retornar RETURN
- final_prog NOP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement