Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
SEL–0629
Aplicação de
Microprocessadores I
Aula 4
Operações Lógicas e
A it éti
Aritméticas
AAAA
Operações Lógicas
AA
Operações Lógicas
Existem 5 tipos de operações lógicas nos
microcontroladores PIC:
AA
AND
Byte1 1 0 1 0 0 0 1 0
Byte2 1 1 0 0 1 0 1 0
AND 1 0 0 0 0 0 1 0
“E”
E Lógico entre todos os bits do registrador,
registrador bit a bit
bit.
AA
AND
A B AND
0 0 0 Criar uma “máscara”:
máscara :
0 1 0
1: “Copia”
Copia o valor do bit
1 0 0
0: “Reseta”
Reseta o valor do bit
1 1 1
AA
AND
Byte1 1 0 1 1 0 0 1 0
Byte2 1 1 1 1 0 0 0 0
AND 1 0 1 1 0 0 0 0
“Máscara”
Máscara
AA
AND
AA
ANDWF e ANDLW
Garantir que um número seja menor que 15
MOVLW B ‘00001111’
ANDWF NUM_1,F
Ou
MOVF NUM_1,W
ANDLW B ‘00001111’
MOVWF NUM_1
AA
OR
Byte1 1 0 1 0 0 0 1 0
Byte2 1 1 0 0 1 0 1 0
OR 1 1 1 0 1 0 1 0
“OU”
OU Lógico entre todos os bits do registrador,
registrador bit a bit
bit.
AA
OR
A B OR
0 0 0 Criar uma “máscara”:
máscara :
0 1 1
0: “Copia”
Copia o valor do bit
1 0 1
1: “Seta”
Seta o valor do bit
1 1 1
AA
OR
Byte1 1 0 1 0 0 0 1 0
Byte2 0 0 0 0 1 1 1 1
AND 1 0 1 0 1 1 1 1
“Máscara”
Máscara
AA
OR
AA
IORWF e IORLW
Garantir que um número seja maior que 15
MOVLW B ‘00010000’
IORWF NUM_1,F
Ou
MOVF NUM_1,W
IORLW B ‘00010000’
MOVWF NUM_1
AA
XOR
Byte1 1 0 1 0 0 0 1 1
Byte2 1 1 0 0 1 0 1 0
XOR 0 1 1 0 1 0 0 1
“OU”
OU Exclusivo entre todos os bits do registrador
registrador, bit a bit
bit.
Bits Iguais – 0
Bits Diferentes - 1
AA
XOR
AA
XOR
Byte1 1 0 1 1 0 0 1 0
Byte2 1 1 1 1 0 0 0 0
XOR 0 1 0 0 0 0 1 0
“Máscara”
Máscara
AA
XOR
Byte1 1 0 1 1 0 0 1 0
Byte2 1 1 1 1 0 0 0 0
XOR 0 1 0 0 0 0 1 0
“Comparação”
Comparação
AA
XOR
AA
XORWF
Chamar uma rotina 10 vezes – Contador
Se a operação “OU” Exclusivo resultar em Zero, é porque os valores são iguais.
CLRF CONTADOR
LOOP
CALL ROTINA
INCF CONTADOR,F
CONTADOR F
MOVLW .10
XORWF CONTADOR,W
CONTADOR W
BTFSS STATUS,Z
GOTO LOOP
FIM
AA
COMF
Byte 0 0 0 1 0 0 1 0 18
COMF 1 1 1 0 1 1 0 1 237
AA
COMF
AA
SWAP
Byte 0 1 1 0 1 1 0 0
SWAP 1 1 0 0 0 1 1 0
AA
SWAP
AA
Operações Aritméticas
AA
ADIÇÃO
• Existem 4 comandos para adição no PIC:
3 ADDWF f,d
3. f d : Soma o valor de W com o registrador f,f
guardando o resultado no destino (w ou f) (d ← f + w);
AA
INCF
Chamar uma rotina 4 vezes
CLRF CONTADOR
LOOP
CALL ROTINA
INCF CONTADOR,F
BTFSS CONTADOR,2
GOTO LOOP
FIM
AA
INCFSZ
MOVLW D‘252’
D 252
MOVWF CONTADOR
CALL ROTINA
INCFSZ CONTADOR,F
CONTADOR F
GOTO $-2
FIM
AA
INCFSZ
AA
AA
ADDWF e ADDLW
Somar dois números
MOVLW .10
MOVWF NUM_1
MOVLW .20
MOVWF NUM_2
CLRF RESULT
MOVF NUM_1,W ; W ← 10
ADDWF NUM2,W ;W ← 10 + 20
ADDLW .5 ;W ← 30 + 5
MOVWF RESULT ; RESULT ← 35
FIM
AA
E se a soma for maior que 255?
Carry
NUM1 100 1 1 0 0 1 0 0 0
NUM2 200 0 1 1 0 0 1 0 0
RESULT 300 1 0 0 1 0 1 1 0 0 44
MOVLW .100
MOVWF NUM_1
MOVLW .200
200
MOVWF NUM_2
CLRF RESULT_LSB
CLRF RESULT
RESULT_MSB
MSB
MOVF NUM_1,W ; W ← 100
ADDWF NUM2,W
, ;W ← 100 + 200
BTFSC STATUS,C ; testa o carry
INCF RESULT_MSB,F
MOVWF RESULT_LSB
RESULT LSB
FIM
AA
SUBTRAÇÃO
• Existem 4 comandos para subtração no PIC:
3 SUBWF f,d
3. f d : Subtrai o valor de W do registrador f,f guardando
o resultado no destino (w ou f) (d ← f - w);
AA
DECFSZ
Chamar uma rotina 10 vezes
MOVLW .10
MOVWF CONTADOR
LOOP
CALL ROTINA
DECFSZ CONTADOR,F
GOTO LOOP
FIM
AA
SUBWF e SUBLW
Subtrair dois números quaisquer
MOVLW .12
12
MOVWF NUM1
MOVLW .20
20
MOVWF NUM2
CLRF RESULT
MOVF NUM1,W ; W ← 12
SUBWF NUM2
NUM2,W W ;W ← 20 – 12 = 8 (NUM2 – W)
SUBLW .10 ; W ← 10 – 8 (k – W)
MOVWF RESULT; RESULT ← 2
FIM
AA
DECFSZ
A subtração afeta o carry (STATUS) de modo inverso à
operação de adição!
ADIÇÃO:
à n° positivo: C = 0
zero: C = 1 e Z = 1 (“estouro”)
( estouro )
SUBTRAÇÃO:
à n° positivo: C = 1
zero: C = 1 e Z = 1
n° negativo: C = 0 (“estouro”)
AA
E se o resultado for negativo?
Carry
NUM1 160 1 0 1 0 0 0 0 0
NUM2 200 1 1 0 0 1 0 0 0
RESULT -40 0 1 1 0 1 1 0 0 0 216
AA
SUBWF e SUBLW
Subtrair dois números quaisquer
CLRF RESULT
MOVF NUM_1,W ;W ← NUM_1
SUBWF NUM2,W
NUM2 W ;W ← NUM_2
NUM 2 – NUM_1
NUM 1
BTFSS STATUS,C ;TESTA O CARRY (NÚMERO NEGATIVO → C = 0)
GOTO NEGATIVO
MOVWF RESULT ; SALVA O RESULTADO POSITIVO
BCF NEG ; LIMPA O FLAG DE SINAL NEGATIVO
GOTO FIM
NEGATIVO
SUBLW .00 ; W ←256 – W
MOVWF RESULT ; SALVA O RESULTADO NEGATIVO
BSF NEG ; SETA O FLAG DE SINAL NEGATIVO
AA
FIM
Rotacionando o Byte
AA
MULTIPLICAR e DIVIDIR
• Só é válido para potências de 2 (2-4-8-16-32):
– RLF f,d
, : Rotaciona o bit à esquerda
q ((left)) – multiplica
p ppor
2 cada vez que o bit é rotacionado;
AA
Rotacionando o Byte
AA
Multiplicar um número por 4
MOVLW .200
200
MOVWF NUM_1
CLRF RESULT
RESULT_LSB
LSB
CLRF RESULT_MSB
BCF STATUS, C ; LIMPA O CARRY
RLF NUM_1,F ; MULTIPLICA POR 2 (400 = 200 (11001000) X 2)
RLF RESULT_MSB,F ;ROTACIONA O BYTE MAIS SIGNIFICATIVO PARA “PEGAR”
O BIT DO CARRY (400 = 110010000)
RLF NUM_1,F ; MULTIPLICA POR 2 NOVAMENTE (800 = 200 X 4)
RLF RESULT_MSB,F
, ; “PEGA” O CARRY ((800 = 1100100000))
MOVF NUM_1, W
MOVWF RESULT_LSB
FIM
AA
RETLW
AA
Tabela de Conversão
Rotina de conversão: (NUM ← NUM * 3 + 2)
CONVERSAO
MOVF NUM,W
ADDWF PCL,F
PCL F
RETLW .2 ; NUM = 0 → Retorna 2
RETLW .5 ; NUM = 1 → Retorna 5
RETLW .88 ; NUM = 2 → Retorna
R t 8
RETLW .11 ; NUM = 3 → Retorna 11
AA
Endereçamento Indireto
AA
Endereçamento
AA
AA
Acesso Indireto à Memória
AA
AA
Acesso Indireto à Memória
Rotina para limpar um bloco de endereços da memória RAM de 0x20 a 0x2F
LIMPA
MOVLW 0x20
MOVWF FSR ; Inicia o ponteiro com o endereço 0x20h
LOOP
CLRF INDF; na verdade está “limpando” o endereço dado que está no
endereço indicado no ponteiro FSR
MOVLW 0X2F
XORWF FSR,W
BTFSC STATUS,Z
RETURN
INCF FSR,F
GOTO LOOP
FIM
AA
FIM
AA