Você está na página 1de 8

Universidade Federal de Mato Grosso

Faculdade de Arquitetura, Engenharia e Tecnologia


Departamento de Engenharia Elétrica
Laboratório de Microprocessadores

Laboratório 8
Bibliotecas de Operações Aritméticas

Engenharia Elétrica

Docente: Prof. Nicolás Eusebio Cortez Ledesma

Discentes:
Bárbara Morais Gianesini
Kaio Vinícius Vilerá

Turma: N1
Data da realização do laboratório:
18 de Março de 2016
1. Objetivos

 Estudo, desenvolvimento e utilização de bibliotecas de sub-rotinas matemáticas e


controle do LCD para processamento de dados e apresentação de resultados.

2. Atividades
Realize as mudanças ou inclua as instruções necessárias, para o programa realizar operações
de precisão dupla, ou seja, com operandos de 16 bits. Ensamblar, simular e gravar no PIC o
conteúdo ‘.HEX’, e testar na placa física de desenvolvimento ou na protoboard.

Os códigos em Assembly para implementação das operações matemáticas foram


incluídos na próxima página. A partir do código entregue pelo professor, cada membro do grupo
realizou as modificações necessárias para implementação das operações de soma, subtração,
divisão e multiplicação utilizando operandos de 16 bits.
Os operandos são definidos pelo programador no início do código, mas o usuário tem a
liberdade de escolher a operação matemática que deseja realizar.
Foram utilizados 4 botões, o primeiro (conectado ao pino 4 da porta B) para escolher a
operação de soma, o segundo (conectado ao pino 5 da porta B) para escolher a operação de
subtração, o terceiro (conectado ao pino 6 da porta B) para multiplicação e o quarto (conectado
ao pino 7 da porta B) para a divisão.
A cada vez que um desses botões é pressionado, o resultado da respectiva operação é
enviado para o display LCD.
Foi necessário “conectar” os códigos das bibliotecas disponibilizadas com o código
principal, por isso foi importante entender como funcionavam as sub-rotinas dessas bibliotecas,
de forma a recuperar os resultados de maneira correta.
Uma observação importante sobre a operação de subtração, é que pode-se considerar
resultados negativos, e quando isso ocorre, um sinal negativo aparece em frente ao resultado.
As partes do código modificadas pelos participantes foram destacadas em negrito.
Código Barbara:
list p =16f877a clrf Binario3 call prt2
#include <p16f877a.inc> clrf Binario4 call bin40_bcd
__CONFIG H'3F32' clrf Binario5 movlw .1
btfss PORTB, 4 xorwf negativo, W
ERRORLEVEL -305 goto soma btfsc STATUS, Z
ERRORLEVEL -302 btfss PORTB, 5 sinalnegativo
goto subtrai swapf BCD5, W
cblock 0x20 btfss PORTB, 6 andlw 0x0F
conta goto multiplica addlw 0x30
Loper btfss PORTB, 7 call EnviaCarLCD
binario_L goto divide movfw BCD5
binario_H goto $-8 andlw 0x0F
endc soma addlw 0x30
movlw '+' call EnviaCarLCD
org 0x00 call EnviaCarLCD swapf BCD4, W
goto inicio call soma16 andlw 0x0F
seq_1 addwf PCL,F btfsc STATUS,C addlw 0x30
dt "OPERACAO: " incf Binario3 call EnviaCarLCD
seq_2 addwf PCL,F movfw Op2_L movfw BCD4
dt "RES.:" ; movwf binario_L andlw 0x0F
movfw Op2_H addlw 0x30
sinalnegativo macro movwf binario_H call EnviaCarLCD
movlw '-' goto prt_rpta swapf BCD3, W
call EnviaCarLCD subtrai andlw 0x0F
endm movlw '-' addlw 0x30
call EnviaCarLCD call EnviaCarLCD
;programa principal call subtracao16 movfw BCD3
inicio: movfw Op2_L andlw 0x0F
movlw 0xF0 movwf binario_L addlw 0x30
movwf PORTB movfw Op2_H call EnviaCarLCD
clrf PORTE movwf binario_H swapf BCD2, W
bsf STATUS, RP0 goto prt_rpta andlw 0x0F
bcf OPTION_REG, 7 multiplica addlw 0x30
bsf TRISA, 0 movlw '*' call EnviaCarLCD
movlw B'11110000' call EnviaCarLCD movfw BCD2
movwf TRISB call multi16 andlw 0x0F
movlw 0x0E movfw Rpta1 addlw 0x30
movwf ADCON1 movwf binario_L call EnviaCarLCD
bcf STATUS, RP0 movfw Rpta2 swapf BCD1, W
bsf INTCON, PEIE movwf binario_H andlw 0x0F
bsf INTCON, GIE movfw Rpta3 addlw 0x30
call inicio_LCD movwf Binario3 call EnviaCarLCD
menu movfw Rpta4 movfw BCD1
clrf negativo movwf Binario4 andlw 0x0F
movlw 0xFF goto prt_rpta addlw 0x30
movwf Op1_L divide call EnviaCarLCD
movlw 0xFF movlw '/' call ret1s
movwf Op2_L call EnviaCarLCD call ret1s
movlw 0x00 call divide16 btfss PORTB, 4
movwf Op1_H movfw Quociente_L goto $-1
movlw 0x00 movwf binario_L btfss PORTB, 5
movwf Op2_H movfw Quociente_H goto $-1
call LCD_limpar movwf binario_H btfss PORTB, 6
call prt1 goto prt_rpta goto $-1
clrf binario_H prt_rpta btfss PORTB, 7
clrf binario_L call LCD_cursor_linha_2 goto $-1
call ret1s Modificações na biblioteca ;*****************************
call ret1s “matemat”: ; SUBTRACAO DE PRECISÃO DUPLA
goto menu ;*****************************
prt1 cblock ; Op1_H:Op1_L - Op2_H:Op2_L ->
clrf conta auxiliar Op2_H:Op2_L
movfw conta carr ;*****************************
call seq_1 negativo
call EnviaCarLCD endc subtracao16:
incf conta,F
movf conta, W ;MACROS clrf negativo
xorlw .10 jae Op1_H, Op2_H, testa_l
btfss STATUS, Z addwfca macro reg1 incf negativo, F
goto $-7 ; salva no Wreg goto final
return clrf carr testa_l
prt2 jae Op1_L, Op2_L, final
btfsc STATUS, C
clrf conta incf negativo, F
addlw .1
movfw conta final
btfsc STATUS, C
call seq_2 comp16 Op2_H, Op2_L
incf carr, F
call EnviaCarLCD call soma16
addwf reg1, W
incf conta,F
movf conta, W
btfsc STATUS, C movfw negativo
xorlw .5 incf carr, F xorlw .1
btfss STATUS, Z movwfauxiliar btfsc STATUS, Z
goto $-7 bcf STATUS, C goto negacao
return movlw .1 goto afirmacao
xorwf carr, W negacao
#include "up_atrasos.asm" btfsc STATUS, Z comp16 Op2_H, Op2_L
#include "up_bin40-bcd.asm" bsf STATUS, C afirmacao
#include "up_driver_lcd.asm" movf auxiliar, W
#include "up_matemat.asm" endm return
;*****************************
end comp16 macro ope2_H, ope2_L ; SOMA DE PRECISÃO DUPLA
;*****************************
comf ope2_H, F ; Op1_H:Op1_L + Op2_H:Op2_L ->
comf ope2_L, F C:Op2_H:Op2_L
movlw .1 ;*****************************
addwf ope2_L, F
movlw 0x00 soma16:
addwfca ope2_H movfw Op1_L
movwf ope2_H bcf STATUS, C
endm addwfca Op2_L
movwf Op2_L
jae macro op1, op2, address movfw Op1_H
;pula se op1>=op2 addwfca Op2_H
movfw op2 movwf Op2_H
subwf op1, w
; w = op1-op2 return
btfsc STATUS, C
goto address
endm

;//////////////////////////////////////////////////
Código Kaio:
list p =16f877a Soma call bin_bcd
#include <p16f877a.inc> movlw '+' movfw dmil
__CONFIG H'3F32' movwf operacao addlw 0x30
ERRORLEVEL -305 call ptrResultadoLinha1 call EnviaCarLCD
ERRORLEVEL -302 call Soma16 movfw umil
cblock 0x20 movfw Op1_L addlw 0x30
conta,Loper movwf binario_L call EnviaCarLCD
endc movfw Op1_H movfw cent
org 0x00 movwf binario_H addlw 0x30
goto inicio btfsc Carry,1 call EnviaCarLCD
seq1 addwf PCL,F incf Binario3,F movfw deze
dt "OPERACAO: " ;10c goto prt_rpta addlw 0x30
call EnviaCarLCD
inicio: Subtrai movfw unit
movlw 0xF0 movlw '-' addlw 0x30
movwf PORTB movwf operacao call EnviaCarLCD
clrf PORTE call ptrResultadoLinha1 movlw ' '
clrf INTCON clrf seNeg call EnviaCarLCD
bsf STATUS,RP0 call Subtrai16 movlw 'R'
bcf OPTION_REG,7 movfw Op1_L call EnviaCarLCD
movlw B'11110000' movwf binario_L movlw ':'
movwf TRISB movfw Op1_H call EnviaCarLCD
bsf TRISA,0 movwf binario_H movfw Resto_L
movlw 0x0E goto prt_rpta movwf binario_L
movwf ADCON1 movfw Resto_H
bcf STATUS,RP0 Multiplica movwf binario_H
bsf INTCON,RBIE movlw '*' call bin_bcd
bsf INTCON,GIE movwf operacao movfw dmil
call inicio_LCD call ptrResultadoLinha1 addlw 0x30
call multi16 call EnviaCarLCD
menu movfw Rpta1 movfw umil
movlw .25 movwf binario_L addlw 0x30
movwf Op1_L movfw Rpta2 call EnviaCarLCD
movlw .0 movwf binario_H movfw cent
movwf Op1_H movfw Rpta3 addlw 0x30
movlw .65 movwf Binario3 call EnviaCarLCD
movwf Op2_L movfw Rpta4 movfw deze
movlw .0 movwf Binario4 addlw 0x30
movwf Op2_H goto prt_rpta call EnviaCarLCD
call LCD_limpar movfw unit
call prt1 Divide addlw 0x30
clrf binario_H movlw '/' call EnviaCarLCD
clrf binario_L movwf operacao call ret1s
clrf Binario3 call ptrResultadoLinha1 call ret1s
clrf Binario4 call divide16 btfss PORTB,4
clrf Binario5 goto prt_rptaDivide goto $-1
clrf operacao btfss PORTB,5
clrf seNeg prt_rptaDivide goto $-1
btfss PORTB,4 call LCD_cursor_linha_2 btfss PORTB,6
goto Soma movlw 'Q' goto $-1
btfss PORTB,5 call EnviaCarLCD btfss PORTB,7
goto Subtrai movlw ':' goto $-1
btfss PORTB,6 call EnviaCarLCD call ret1s
goto Multiplica movfw Quociente_L call ret1s
btfss PORTB,7 movwf binario_L goto menu
goto Divide movfw Quociente_H
goto $-8 movwf binario_H
prt_rpta call ret1s prtop2:
call LCD_cursor_linha_2 goto menu movfw Op2_L
btfsc seNeg,0 prt1: movwf binario_L
movlw '-' clrf conta movfw Op2_H
btfsc seNeg,0 movfw conta movwf binario_H
call EnviaCarLCD call seq1 call bin_bcd
call bin40_bcd call EnviaCarLCD movfw dmil
swapf BCD5,W incf conta,F addlw 0x30
andlw 0X0F movf conta,W call EnviaCarLCD
addlw 0x30 xorlw .10 movfw umil
call EnviaCarLCD btfss STATUS,Z addlw 0x30
movfw BCD5 goto $-7 call EnviaCarLCD
andlw 0X0F return movfw cent
addlw 0x30 addlw 0x30
call EnviaCarLCD cblock call EnviaCarLCD
swapf BCD4,W Op1_H, Op1_L movfw deze
andlw 0X0F Op2_H, Op2_L, Carry addlw 0x30
addlw 0x30 endc call EnviaCarLCD
call EnviaCarLCD prtop1: movfw unit
movfw BCD4 movfw Op1_L addlw 0x30
andlw 0X0F movwf binario_L call EnviaCarLCD
addlw 0x30 movfw Op1_H return
call EnviaCarLCD movwf binario_H
swapf BCD3,W call bin_bcd Subtrai16:
andlw 0X0F movfw dmil call neg_Oper2
addlw 0x30 addlw 0x30 call Soma16
call EnviaCarLCD call EnviaCarLCD btfsc Carry,1
movfw BCD3 movfw umil return
andlw 0X0F addlw 0x30 bsf seNeg,0 ;Mostra que o
addlw 0x30 call EnviaCarLCD numero e negativo
call EnviaCarLCD movfw cent call neg_Oper1
swapf BCD2,W addlw 0x30 return
andlw 0X0F call EnviaCarLCD
addlw 0x30 movfw deze Soma16:
call EnviaCarLCD addlw 0x30 clrf Carry
movfw BCD2 call EnviaCarLCD movfw Op2_L
andlw 0X0F movfw unit addwf Op1_L, F
addlw 0x30 addlw 0x30 btfsc STATUS, C
call EnviaCarLCD call EnviaCarLCD bsf Carry,0
swapf BCD1,W return movfw Op2_H
andlw 0X0F addwf Op1_H,F
addlw 0x30 ptrResultadoLinha1: btfsc STATUS,C
call EnviaCarLCD call LCD_cursor_linha_1 bsf Carry,1
movfw BCD1 call prtop1 btfss Carry,0
andlw 0X0F movlw ' ' return
addlw 0x30 call EnviaCarLCD incf Op1_H,F
call EnviaCarLCD movfw operacao btfsc STATUS,Z
call ret1s call EnviaCarLCD bsf Carry,1
call ret1s movlw ' ' return
btfss PORTB,4 call EnviaCarLCD
goto $-1 call prtop2 neg_Oper2:
btfss PORTB,5 movlw ' ' comf Op2_L,F
goto $-1 call EnviaCarLCD incf Op2_L,F
btfss PORTB,6 movlw '=' btfsc STATUS,Z
goto $-1 call EnviaCarLCD decf Op2_H,F
btfss PORTB,7 return comf Op2_H,F
goto $-1 return
call ret1s
neg_Oper1:
comf Op1_L,F
incf Op1_L,F
btfsc STATUS,Z
decf Op1_H,F
comf Op1_H,F
return

cblock
Mulcnd, Mulpdr,
conta8
Rpta2, Rpta1,
operacao
seNeg
endc

Multi8:
clrf Rpta1
clrf Rpta2
movlw .8
movwf conta8
movfw Mulcnd
bcf STATUS,C

lazo_m8:
rrf Mulpdr,F
btfsc STATUS,C
addwf Rpta2,F
rrf Rpta2,F
rrf Rpta1,F
decfsz conta8,F
goto lazo_m8
return

cblock
Divdnd, Divisor
endc
Quociente equ Divisor
Resto equ Divdnd

Divide8:
movfw Divisor
clrf Quociente

loopd subwf Resto,F


btfss STATUS,C
goto fimd
incf Quociente,F
goto loopd
fimd addwf Resto,F
return

#include "up_atrasos.asm"
#include "up_bin16-bcd.asm"
#include "up_driver_lcd.asm"
#include "up_matemat.asm"
#include "up_bin40-bcd.asm"
End

Você também pode gostar