Advertisement
apollw

quest1

Jul 1st, 2014
305
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.20 KB | None | 0 0
  1. #INCLUDE <P12F629.INC>
  2. ;Declaracao de variaveis:
  3. X_MSB EQU 0x20
  4. X_LSB EQU 0x21
  5. Y_MSB EQU 0x22
  6. Y_LSB EQU 0x23
  7. Z_MSB EQU 0x24
  8. Z_LSB EQU 0x25
  9. W_MSB EQU 0x26
  10. W_LSB EQU 0x27
  11. R_MSB EQU 0x28
  12. R_LSB EQU 0x29
  13. T_MSB EQU 0x2A
  14. T_LSB EQU 0x2B
  15. K_MSB EQU 0x2C
  16. K_LSB EQU 0x2D
  17. S_MSB EQU 0x2E
  18. S_LSB EQU 0x2F
  19. temp_msb EQU 0x30
  20. temp_lsb EQU 0x31
  21.  
  22. ;INICIO DO PROGRAMA:
  23. ;Atribuição de valores as variaveis:
  24. inic_prog ORG 0x00
  25. CLRW ;Limpa o registrador W
  26. MOVLW 0x08 ;W <- 0x08
  27. MOVWF X_LSB ;Carrega o valor de W em x
  28. MOVLW 0x02 ;WREG <- 0x02
  29. MOVWF Y_LSB ;Carrega o valor de W em y
  30. MOVLW 0x06 ;WREG <- 0x06
  31. MOVWF Z_LSB ;Carrega o valor de W em z
  32. CLRW ;Limpa o registrador W
  33. MOVWF W_LSB ;Carrega o valor de W em w
  34. MOVWF R_LSB ;Carrega o valor de W em var_r(0x24)
  35. MOVWF T_LSB ;Carrega o valor de W em var_t(0x25)
  36. MOVWF K_LSB ;Carrega o valor de W em var_k(0x26)
  37. MOVWF S_LSB ;Carrega o valor de W em var_s(0x27)
  38.  
  39. ; r = 3*x+2*y-z
  40.  
  41. ; Primeirament sera feita a multiplicacao 3*x e será armazenada
  42. ; em 0x32_0x33:
  43. MOVF X_MSB,0 ;Copia o valor de X_MSB e coloca em W
  44. MOVWF temp_msb ;Coloca o valor de W em 0x30
  45. MOVF X_LSB,0 ;Copia o valor de X_LSB e coloca em W
  46. MOVWF temp_lsb ;Coloca o valor de W em 0x31
  47. MOVLW 0x03 ;Copia o literal 03h para W
  48. MOVWF 0x35 ;Copia o valor de W para 0x35
  49. CALL func_mult ;Chama a funcao de multiplicacao
  50. ;Os valores que foram retornados da funcao são colocados em 0X36 e 0x37
  51. CLRW
  52. MOVF 0x32,0
  53. MOVWF 0x36
  54. MOVF 0x33,0
  55. MOVWF 0x37
  56.  
  57. ; Agora, sera feita a multiplicação 2*y e sera armazenada em 0x32 E 0x33
  58.  
  59. MOVF Y_MSB,0
  60. MOVWF 0x30
  61. MOVF Y_LSB,0
  62. MOVWF 0x31
  63. MOVLW 0x02
  64. MOVWF 0x35
  65. CALL func_mult
  66.  
  67. ; O proximo passo será somar 0x36_0x37 + 0x32_0x33, e armazenar em 0x36_0x37:
  68.  
  69. MOVF 0x33,0
  70. ADDWF 0x37,1
  71. BTFSC STATUS,0
  72. INCF 0x36
  73. MOVF 0x32,0
  74. ADDWF 0x36,1
  75. ;Depois faz-se: R = 0x36_0x37 - Z:
  76.  
  77. MOVF Z_LSB,0
  78. SUBWF 0x37,0 ;Faz-se W = 0x31 - Z
  79. MOVWF R_LSB ;Copia o resultado da subtracao para R
  80.  
  81. ;T = Z + 5*R:
  82. ;Primeiramente faz-se a multiplicacao 5*R e o resultado fica em 0x32 e 0x33
  83. MOVF R_MSB,0
  84. MOVWF 0x30
  85. MOVF R_LSB,0
  86. MOVWF 0x31
  87. MOVLW 0x05
  88. MOVWF 0x35
  89. CALL func_mult
  90.  
  91. ;Depois faz-se: T = Z + 0x32_0x33
  92. MOVF Z_LSB,0 ;Copia o valor de Z_LSB para W
  93. ADDWF 0x33,0
  94. BTFSC STATUS,0
  95. INCF 0x32,1
  96. MOVWF T_LSB
  97. MOVF 0x32,0
  98. ADDWF Z_MSB,0
  99. MOVWF T_MSB
  100.  
  101. ;K = 6*X + 2*Z
  102.  
  103. ;Primeiramente, faz-se 0x36_0x37 = 6*X:
  104. MOVF X_MSB,0
  105. MOVWF 0x30
  106. MOVF X_LSB,0
  107. MOVWF 0x31
  108. MOVLW 0x06
  109. MOVWF 0x35
  110. CALL func_mult
  111. MOVF 0x32,0
  112. MOVWF 0x36
  113. MOVF 0x33,0
  114. MOVWF 0x37
  115. ;Agora, faz-se 0x32_0x33 = 2*Z
  116. MOVF Z_MSB,0
  117. MOVWF 0x30
  118. MOVF Z_LSB,0
  119. MOVWF 0x31
  120. MOVLW 0x02
  121. MOVWF 0x35
  122. CALL func_mult
  123.  
  124. ;K = 0x32_0x33 + 0x36_0x37
  125. MOVF 0x37,0
  126. ADDWF 0x33,1
  127. BTFSC STATUS,0
  128. INCF 0x32,1
  129. MOVF 0x36,0
  130. ADDWF 0x32,1
  131. MOVF 0x32,0
  132. MOVWF K_MSB
  133. MOVF 0x33,0
  134. MOVWF K_LSB
  135.  
  136. ;Implementação de if(K<T):
  137. CLRF 0x30
  138. MOVF T_LSB,0
  139. SUBWF K_LSB,0
  140. MOVWF 0x31
  141. BTFSC 0x31,7
  142. GOTO IF1
  143. GOTO ELSE1
  144.  
  145. IF1 NOP
  146. ;Implementação de S = 3*T + Y****************
  147.  
  148. MOVF T_LSB,0
  149. MOVWF 0x31
  150. MOVF T_MSB,0
  151. MOVWF 0x30
  152. MOVLW 0x03
  153. MOVWF 0x35
  154. CALL func_mult ;Chama a funcao que vai fazer 3*T
  155.  
  156. MOVF Y_LSB,0
  157. ADDWF 0x33,1
  158. BTFSC STATUS,0
  159. INCF 0x32,1
  160. MOVF Y_MSB,0
  161. ADDWF 0x32,1
  162.  
  163. ;Agora, vamos mover o resultado obtido para S:
  164. MOVF 0x32,0
  165. MOVWF S_MSB
  166. MOVF 0x33,0
  167. MOVWF S_LSB
  168.  
  169. CALL funcA ;Chama a funcA
  170. MOVF 0x32,0
  171. MOVWF W_MSB
  172. MOVF 0x33,0
  173. MOVWF W_LSB
  174. GOTO final_prog
  175.  
  176.  
  177. ELSE1 NOP
  178. ;Realizar S = 2*T + 4
  179. MOVF T_MSB,0
  180. MOVWF 0x30
  181. MOVF T_LSB,0
  182. MOVWF 0x31
  183. MOVLW 0x02
  184. MOVWF 0x35
  185. CALL func_mult
  186. MOVLW 0x04
  187. ADDWF 0x33,1
  188. BTFSC STATUS,0
  189. INCF 0x32,1
  190. MOVF 0x32,0
  191. MOVWF S_MSB
  192. MOVF 0x33,0
  193. MOVWF S_LSB
  194.  
  195. CALL funcB ;CHAMA A FUNCAO B
  196. MOVF 0x30,0 ;MOVE O MSB DO RETORNO DA FUNCAO PARA W
  197. MOVWF W_MSB ;MOVE W PARA O MSB DA VARIAVEL W
  198. MOVF 0x31,0 ;MOVE O MSB RETORNO DA FUNCAO PARA W
  199. MOVWF W_LSB ;MOVE W PARA O LSB DA VARIAVEL W
  200. GOTO final_prog ;VA PARA O FINAL DO PROGRAMA
  201.  
  202. ;***********SUB-ROTINAS**********************
  203. funcA NOP
  204.  
  205. ;Variaveis locais à funcão
  206. parA1_MSB EQU 0x40
  207. parA1_LSB EQU 0X41
  208. parA2_MSB EQU 0x42
  209. parA2_LSB EQU 0x43
  210. ;Passar os parametros para as variaveis locais:
  211. MOVF S_MSB,0
  212. MOVWF parA1_MSB
  213. MOVF S_LSB,0
  214. MOVWF parA1_LSB
  215. MOVF R_MSB,0
  216. MOVWF parA2_MSB
  217. MOVF R_LSB,0
  218. MOVWF parA2_LSB
  219.  
  220. ;Realizar: parA1+8*parA2
  221.  
  222. MOVF parA2_MSB,0
  223. MOVWF 0x30
  224. MOVF parA2_LSB,0
  225. MOVWF 0x31
  226. MOVLW 0x08
  227. MOVWF 0x35
  228. CALL func_mult ;Chama a funcao de multiplicação
  229.  
  230. MOVF parA1_LSB,0
  231. ADDWF 0x33,1
  232. BTFSC STATUS,0
  233. INCF 0x32,1
  234. MOVF parA1_MSB,0
  235. ADDWF 0x32,1
  236. RETURN
  237.  
  238. funcB NOP
  239. ;Variaveis locais à funcao:
  240. parB1_MSB EQU 0x44
  241. parB1_LSB EQU 0x45
  242. parB2_MSB EQU 0x46
  243. parB2_LSB EQU 0x47
  244. ;Passagem de parâmetros:
  245. MOVF S_LSB,0
  246. MOVWF parB1_LSB
  247. MOVF S_MSB,0
  248. MOVWF parB1_MSB
  249. MOVF T_LSB,0
  250. MOVWF parB2_LSB
  251. MOVF T_MSB,0
  252. MOVWF parB2_MSB
  253. ;Realizar: parB1 - parB2
  254. MOVF parB2_LSB,0
  255. SUBWF parB1_LSB,0
  256. BTFSC STATUS,0
  257. INCF 0x30,1
  258. DECF 0x30
  259. MOVWF 0x31
  260. MOVF parB2_MSB,0
  261. SUBWF parB1_MSB,0
  262. ADDWF 0x30,1
  263. RETURN
  264.  
  265. func_mult NOP
  266. CLRF 0x32
  267. CLRF 0x33
  268. CLRW ;LIMPA O ACUMULADOR W
  269. loop DECF 0x35 ;DECREMENTA POSICAO DE MEMORIA 0x35
  270. BTFSC 0x35,7 ;VERIFICA SE 0x35 É NEGATIVO
  271. GOTO retornar ;SE SIM, RETORNA
  272. MOVF 0x33,0 ;COPIA O VALOR DE 0x33 PARA W
  273. ADDWF 0x31,0 ;FAZ: W = 0x31 + W
  274. BTFSC STATUS,0 ;VERIFICA SE HOUVE CARRY
  275. INCF 0x32,1 ;SE SIM, INCREMENTA 0x32
  276. MOVWF 0x33 ;COPIA O QUE ESTA EM W PARA 0x33
  277. MOVF 0x30,0 ;MOVE 0x30 PARA W
  278. ADDWF 0x32,1 ;FAZ: 0x32 = W + 0x32
  279. GOTO loop ;VA PARA LOOP
  280. retornar RETURN
  281.  
  282. final_prog NOP
  283. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement