Buscar

Códigos em Assembly 8051

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 12 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 12 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 12 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Códigos em Assembly 8051 
Nome: Rodrigo Damasceno Nascimento 
Exercício1) Dado um conjunto de 100 dados tipo byte armazenados de forma 
consecutiva na memória de programas a partir do endereço 1000H, mover ditos 
dados à memória de dados, armazenando eles a partir do endereço 10H de forma 
ascendente e respeitando o seu ordenamento. 
ORG 00h ;INICIA NO ENDEREÇO 00H 
MOV DPTR,#1000H ;COLOCA O ENDEREÇO DE INICIO DOS DADOS NA MEMÓRIA DE PROGRAMA NO 
;REGISTRADOR DPTR 
MOV R0,#10H ;COLOCA O ENDEREÇO DE INICIO NA MEMÓRIA DE DADOS 
MOV R3,#0 ;INICIALIZA UM CONTADOR PARA CONTAR OS 100 DADOS 
 
LAÇO: MOV A,R3 ;MOVE O VALOR DE R3 PARA O ACUMULADOR 
MOVC A,@A+DPTR ;COLOCA EM A O DADO CORRENSPONDETE DA TABELA EM MEMÓRIA 
DE PROGRAMA 
MOV @R0,A ;COLOCA O DADO ANTERIOR NA LOCALIZAÇÃO DA MEMÓRIA DE DADOS 
INC R0 ;APONTA A SEGUINTE LOCALIZAÇÃO DA MEMÓRIA DE DADOS 
INC R3 ;CONTA O NÚMERO DE DADOS JÁ COLOCADOS NA MEMÓRIA DE DADOS 
CJNE R3,#100D,LAÇO ;SE O VALOR DO R3 FOR 100 ELE TERMINA, SENÃO CONTINUA O LAÇO 
END 
Exercício 2) Fazer um segmento de programa que a partir de um número em 
hexadecimal entre 0 e 99, armazenado na localização de memória de dados cujo 
endereço é 10H, obtenha o número equivalente em BCD (Código Binário Decimal) 
empacotado, armazenando ele na localização de memória de dados correspondente 
ao endereço 11H 
ORG 00H ;INICIA O ENDEREÇO EM 00H 
MOV A,10H ;ARMAZENAR O VALOR CONTIDO EM 10H EM A 
MOV B,#10D ;ARMAZENAR O VALOR 10D EM B 
DIV AB ;DIVIDI O VALOR DE A POR B, EM A FICA O BCD DAS DEZENAS E EM B FICA O 
BCD DAS UNIDADES 
MOV 11H,B ;ARMAZENA O CÓDIGO BCD DAS UNIDADES NO ENDEREÇO 11H 
MOV B,#16D ;ARMAZENA O VALOR 16D NO REGISTRADOR B 
MUL AB ;MULTIPLICA E O CONTEUDO DO ACUMULADOR É DESLOCADO EM 4 
POSIÇÕES A ESQUERDA 
ADD A,11H ;SOMA OS CONTEÚDOS 
MOV 11H,A ;VOLTA O VALOR PARA O ACUMULADOR 
END ;FIM DO PROGRAMA 
Exercício 3) Fornecidos dois números de 8 bits, armazenados nas localizações de 
memória de dados 10H e 11H, fazer um fragmento de programa que armazene na 
localização 12H de dita memória o valor 00H se ambos números são iguais, o 01H se 
o número armazenado em 10H é maior que o armazenado na 11H e o 02H no casso 
contrário. 
MOV A,10H ;CARREGA O CONTEUDO EM 10H NO ACUMULADOR 
CJNE A,11H,CASO1 ;SE O VALOR DO ACUMULADOR FOR 11H ELE VAI PARA A 
PROXIMA INSTRUÇÃO, SENÃO FOR ELE IRA PRO CASO 1 
MOV 12H,#00h ;ADICIONA NO ENDEREÇO 12H O VALOR 00H(IGUAL) 
SJMP SAIR ;SAIR DO PROGRAMA 
CASO1: JC MENOR ;SE 10H FOR MENOR ELE DESVIA PARA A FUNÇÃO MENOR 
MOV 12H,#01H ;ADICIONA O VALOR 01H NO ENDEREÇO 12H (MAIOR) 
SJMP SAIR ;SAIR DO PROGRAMA 
MENOR: MOV 12H,#02H ;ADICIONA O VALOR 02H NO ENDEREÇO 12H (MENOR) 
SAIR: NOP 
Exercício 4) Desenhar um fragmento de programa que provoca uma demora de 120 
microssegundos. É conhecido que a instrução ´djnz´ tem um tempo de execução de 
2 microssegundos. 
DEMORA120: MOV R0,#60 ;QUANTIDADE DE VEZES A EXECUTAR A INSTRUÇÃO 
LAÇO: DJNZ R0,LAÇO ;DECREMENTA GASTANDO UM TOTAL DE 2 MICROSSEGUNDOS POR CICLO DE MÁQUINA 
RET 
Exercício 5) Dada uma tabela conformada por 16 números inteiros sem sinal de 8 bits 
armazenados na memória de dados a partir da localização 00H, conformar duas 
tabelas, uma contendo os números pares de dita tabela e a outra os números impares. 
A primeira armazenada a partir da localização 20H da memória de dados de forma 
que os endereços se incrementem e a segunda a partir da localização 40H de forma 
que os endereços se decrementem. 
ORG 00H 
MOV R2,#20h ;INCIO DO ARMAZENAMENTO DOS PARES 
MOV R3,#40h ;INICIO DO ARMAZENAMENTO DOS IMPARES 
MOV R1,#00h ;LOCALIZAÇÃO DO ARMAZENAMENTONA MEMÓRIA DE DADOS 
MOV R4,#16D ;CONTADOR 
 LAÇO: MOV A,@R1 ;MOVIMENTA O VALOR DO ENDEREÇO DE R1 EM A 
MOV B,#02d ;MOVE O VALO 02 DECIMAL 
DIV AB ;DIVIDE O ACUMULADOR PELO REGISTRADOR B 
MOV A,B ;ARMAZENA O VALOR DE B EM A 
JNZ IMPAR ;DESVIA PARA O ENDEREÇO SE O VALOR DO ACC FOR DIFERENTE DE ZERO 
PAR: MOV A,R2 ;MOVIMENTA O VALOR DE R2 EM A 
MOV R0,A ;MOVIMENTA O VALOR DE A EM R0 
MOV A,@R1 ;MOVIMENTA O VALOR DO ENDEREÇO DE R1 PARA A 
MOV @R0,A ;MOVIMENTA O VALOR DO ACUMULADOR PARA O ENDEREÇO R0 
INC R2 ;INCREMENTA O VALOR DE R2 
SJMP SAIR ;DESVIA PARA A FUNÇÃO SAIR 
IMPAR: MOV A,R3 ;MOVIMENTO O VALOR DE R3 EM A 
MOV R0,A ;MOVIMENTA O VALOR DO A PARA R0 
MOV A,@R1 ;MOVIMENTA O VALOR DO ENDEREÇO DE R1 PARA A 
MOV @R0,A ;MOVIMENTA O VALOR DO A PARA O ENDEREÇO R0 
DEC R3 ;DECREMENTA O VALOR DE R3 
SJMP SAIR ;DESVIA PARA A FUNÇÃO SAIR 
 SAIR: DJNZ R4,LAÇO ;DECREMENTA R4 E SE FOR DIFERENTE DE ZERO ELE RETORNA PRO LAÇO 
NOP 
Exercício 6) Desenhar um algoritmo e seu diagrama de blocos, assim como o 
fragmento de programa em forma de sub-rotina que cada vez que seja chamada 
provoque uma demora de 51.2 milissegundos, antes de regressar ao programa 
principal. 
DEMORA51_2MS: MOV R4,#102 ;QUANTIDADE DE VEZES PARA EXECUTAR A INSTRUÇAO 
MOV R3,#250 ;QUANTIDADE DE VEZES PARA EXECUTAR A INSTRUÇÃO 
LAÇO: DJNZ R3,LAÇO ;DECREMENTA R3 UTILIZANDO 2 CICLOS DE MAQUINA 
DJNZ R4,LAÇO ;DECREMENTA R4 UTILIZANDO 2 CICLOS DE MAQUINA 
Exercício 7) Desenhar um algoritmo e seu diagrama de blocos, assim como o 
fragmento de programa em forma de sub-rotina para. Preencher a zona de memória 
de dados compreendida entre as localizações 20H e 2fH com o número 00H. 
MOV R0,#20H ;INICIO DO ARMAZENAMENTO DE DADOS EM 20H 
LAÇO: MOV A,#00H ;MOVE O VALOR 00H PARA O ACUMULADOR 
MOV @R0,A ;MOVE O VALOR DO ACUMULADOR PARA O ENDEREÇO 20H 
INC R0 ;INCREMENTA R0 
CJNE R0,#30H,LAÇO ;SE R0 FOR IGUAL A 30H ELE TERMINA, SENÃO FOR CONTINUA 
END 
Exercício 8) Você forma parte da equipe de trabalho que está programando o firmware 
de um sistema de captura de dados por GPS utilizando o microcontrolador 8051. Foi 
assignada a tarefa de escrever um segmento de código que se encarregue de fazer 
uma nova cópia dos últimos 20 dados de posição que se tem registrado. Esses dados 
se encontram localizados a partir do endereço 30h da memória de dados interna 
(IDATA) e cada um ocupa 1 byte de espaço. A nova copia destes dados deve criar-
se a partir do endereço 50h. Desenhar um algoritmo e seu diagrama de blocos, assim 
como o fragmento de programa para resolver a tarefa anterior. 
MOV R0,#30H ;MOVE O VALOR 30H PARA R0 
MOV R1,#50H ;MOVE O VALOR 50H PARA R1 
MOV R2,#20D ;MOVE O VALOR 20D PARA R2 
LAÇO: MOV A,@R0 ;MOVIMENTA O VALOR DO ENDEREÇO PARA O ACUMULADOR 
MOV @R1,A ;MOVIMENTA O VALOR DO ACUMULADOR PARA O ENDEREÇO R1 
INC R0 ;INCREMENTA R0 
INC R1 ;INCREMENTA R1 
DJNZ R2,LAÇO ;DECREMENTA O REGISTRADOR R2 E DESVIA PARA O LAÇO SE FOR DIFERENTE DE 0NOP 
Exercício 9) Projete o hardware e elabore um programa que apague e acenda um 
LED cada 2 segundos a partir de que se feche um interruptor. O funcionamento deve-
se manter até que se abra o interruptor. 
ORG 0H ;Origem do programa no endereço 0h 
JMP INICIO ;Pula para a função INICIO 
ORG 30H ;Começar no endereço 30h para não da problema 
DEMORA: MOV R2,#50 ;Move o valor 50 para o registrador 2 
CICLO2: MOV R3,#100 ;Move o valor 100 para o registrador 3 
CICLO1: MOV R4,#200 ;Move o valor 200 para o registrador 4 
CICLO: DJNZ R4,CICLO ;Decrementa o R4 e volta para a função CICLO 
DJNZ R3,CICLO1 ;Decrementa o R3 e volta para o CICLO1 
DJNZ R2,CICLO2 ;Decrementa o R2 e volta para o CICLO 2 
RET 
ORG 100H 
 INICIO: JB P1.0,$ ;Ele segura a P1.0 enquanto o bit não estiver setado 
CLR P2 ;Escreve no PORT2 o 0 
CALL DEMORA ;Ele chama a sub-rotina DEMORA, depois que for relaizada ele pula a instrução 
SETB P2 ;Escreve no PORT2 o 1 
CALL DEMORA ;Ele chama a sub-rotina DEMORA, depois que for relaizada ele pula a instrução 
JMP INICIO ;Retorna para o inicio 
END ;Fim do programa 
Exercício 10) Projete o hardware e elabore um programa que mostre numa lâmpada 
de 7 segmentos o código hexadecimal correspondente ao número binário que se gera 
com o abre e fecha de 4 interruptores. 
ORG 00H ;ORIGEM DE ENDEREÇAMENTO EM 00H 
AJMP INICIO ;PULAR PARA O INICIO 
; TABELA PARA ARMAZENA A CONVERSAO PARA O 7 SEGMENTOS DE ANODO COMUM 
TABELA: DB 01000000b ; ZERO 
DB 01111001b ; UM 
DB 00100100b ; DOIS 
DB 00110000b ; TRÊS 
DB 00011001b ; QUATRO 
DB 00010010b ; CINCO 
DB 00000010b ; SEIS 
DB 01111000b ; SETE 
DB 00000000b ; OITO 
DB 00011000b ; NOVE 
DB 00001000b ; A 
DB 00000011b ; B 
DB 01000110b ; C 
DB 00100001b ; D 
DB 00000110b ; E 
DB 00001110b ; F 
 
INICIO: MOV DPTR,#TABELA ; MOVIMENTA A TABELA COMO UM VETOR DE 16 BITS PARA A DPTR 
LOOP: MOV P1,#0FFH ; ATUALIZA P1 PARA LEITURA 
MOV A,P1 ; MOVIMENTA P1 PARA A 
CPL A ; INVERTE OS VALORES DE A 
ANL A,#00001111b ; Grava no acumulador o resultado da operação lógica AND entre o acumulador 
e conteúdo do endereço 0FH 
MOVC A,@A+DPTR ; MOVIMENTA O VALOR COMPARADO COM VALOR DE A COM A TABELA 
MOV P2,A ; MOVIMENTA A PARA P2 
JMP LOOP ; VOLTA PARA O LOOP 
END 
Exercício 11) Faça um programa que apague o led em P1.0 quando a chave P1.4 for 
acionada, P1.1 quando a chave P1.5 for acionada, P1.2 quando a chave P1.6 for 
acionada e P1.3 quando a chave P1.7 for acionada. 
;OBS: NESSE EXEMPLO AS LÂMPADAS UTILIZADAS SÃO DE CÁTODO COMUM 
ORG 00H ;INICIA NO ENDEREÇO 00H 
LOOP: JNB P1.4,LED1 ;SE O PINO 1.4 ESTIVER COM O VALOR 1 ELE IRA PARA FUNÇÃO LED1 
SETB P1.0 ;GRAVA 1 NO PINO 1.0 
AJMP LOOP1 ;DESVIO CURTO PARA O LOOP1 
LED1: CLR P1.0 ;GRAVA 0 NO PINO 1.0 
LOOP1: JNB P1.5,LED2 ;SE O PINO 1.5 ESTIVER COM O VALOR 1 ELE IRA PARA A FUNÇÃO LED 2 
SETB P1.1 ;GRAVA 1 NO PINO 1.1 
AJMP LOOP2 ;DESVIO CURTO PARA O LOOP2 
LED2: CLR P1.1 ;GRAVA 0 NO PINO 1.1 
LOOP2: JNB P1.6,LED3 ;SE O PINO 1.6 ESTIVER COM O VALOR 1 ELE IRA PARA A FUNÇÃO LED 3 
SETB P1.2 ;GRAVA 1 NO PINO 1.2 
AJMP LOOP3 ;DESVIO CURTO PARA O LOOP3 
LED3: CLR P1.2 ;GRAVA 0 NO PINO 1.2 
LOOP3: JNB P1.7,LED4 ;SE O PINO 1.7 ESTIVER COM O VALOR 1 ELE IRA PARA A FUNÇÃO LED4 
SETB P1.3 ;GRAVA 1 NO PINO 1.3 
LJMP LOOP ;DESVIO LONGO PARA O LOOP 
LED4: CLR P1.3 ;GRAVA 0 NO PINO 1.3 
END ;FIM DO PROGRAMA 
Exercício 12) Faça o programa que mostre nos leds dos quatro bits mais significativos 
um número binário de 0 até 15, onde inicia-se em zero e seja incrementado em uma 
a cada ativação de chave em P1.7. 
ORG 00H 
LJMP INICIO 
ORG 30H 
INICIO: MOV P1,#0F0H ;ADICIONA O VALOR ALTO EM P1 
MOV R0,#00H ;ADICIONA O VALOR 00H PARA R0 
LOOP: JNB P1.7,$ ;ENQUANTO ESTIVER FM NIVEL LOGICO 0 O MESMO FICA 
TRAVADO NA FUNÇÃO 
JB P1.7,$ ;ENQUANTO ESTIVER EM NIVEL LOGICO 1 O MESMO FICA 
TRAVADO NA FUNÇÃO 
INC R0 ;INCREMENTA R0 
CJNE R0,#00H,CONTINUA_CONT ;COMPARA O CONTEUDO DO R0 COM 00H, E DESVIA PARA 
O ENDEREÇO CONTINUA_CONTAGEM SE FOR DIFERENTE 
MOV R0,#00H ;RETORNA PARA O INICIO 
CONTINUA_CONT: MOV P1,R0 ;MOVE O VALOR DE R0 PARA O PORT1 
LJMP LOOP ;DESVIO PARA O INICIO 
END 
Exercício 13) Vamos comparar o valor do acumulador com o valor 45h. Se o valor do 
acumulador for superior deve ligar o pino P1.0, se for inferior deve ligar o pino P1.1. 
Se forem iguais deve ligar o pino P1.2. 
mov A,#45H ;MOVE O VALOR 5H PARA O ACUMULADOR 
cjne A,#45H,caso1 ;COMPARA O VALOR DO ACUMULADOR COM 45H, SE FOR DIFERENTE ELE PULA 
mov P1,#11111011B ;MOVE O VALOR EM BINARIO PARA PORT1 
sjmp sair ;VAI PARA FUNÇÃO SAIR 
caso1: jc menor ;SE A FOR MENOR QUE #45 ELE DESVIA PARA A FUNÇÃO MENOS 
mov P1,#11111110B ;MOVE O VALOR EM BINARIO PARA O PORT 1 
sjmp sair ;VAI PARA A FUNÇÃO SAIR 
menor: mov P1, #11111101B ;MOVE O VALOR EM BINARIO PARA O PORT1 
sair: END 
Exercício 14) Refaça o exercício 12 utilizando uma lâmpada de 7 segmentos. 
ORG 00H 
LJMP INICIO 
ORG 30H 
; TABELA PARA ARMAZENA A CONVERSAO PARA O 7 SEGMENTOS DE ANODO COMUM 
TABELA: DB 01000000b ; ZERO 
DB 01111001b ; UM 
DB 00100100b ; DOIS 
DB 00110000b ; TRÊS 
DB 00011001b ; QUATRO 
DB 00010010b ; CINCO 
DB 00000010b ; SEIS 
DB 01111000b ; SETE 
DB 00000000b ; OITO 
DB 00011000b ; NOVE 
DB 00001000b ; A 
DB 00000011b ; B 
DB 01000110b ; C 
DB 00100001b ; D 
DB 00000110b ; E 
DB 00001110b ; F 
INICIO: MOV DPTR, #TABELA ;ADICIONA O VALOR ALTO EM P1 
MOV R0,#00H ;ADICIONA O VALOR 00H PARA R0 
LOOP: MOV P1,#0FFH ;HABILITA A PORTA PARA LEITUR 
JNB P1.7,$ ;ENQUANTO ESTIVER FM NIVEL LOGICO 0 O MESMO FICA 
TRAVADO NA FUNÇÃO 
JB P1.7,$ ;ENQUANTO ESTIVER EM NIVEL LOGICO 1 O MESMO FICATRAVADO NA FUNÇÃO 
INC R0 ;INCREMENTA R0 
CJNE R0,#00H,CONTINUA_CONT ;COMPARA O CONTEUDO DO R0 COM 00H, E DESVIA PARA 
O ENDEREÇO CONTINUA_CONTAGEM SE FOR DIFERENTE 
MOV R0,#00H ;RETORNA PARA O INICIO 
CONTINUA_CONT: MOV A,R0 ;MOVE O VALOR DE R0 PARA O ACC 
ANL A,#00001111b ;GRAVA NO ACUMULADOR O RESULTADO DA OPERAÇÃO AND ENTRE 
O ACC E 0FH 
MOVC A,@A+DPTR ;MOVIMENTA O VALOR COMPARADO COM O VALOR DA TABELA 
MOV P2,A ;MOVIMENTA O VALOR DO ACUMULADOR EM P2 
LJMP LOOP ;DESVIO PARA O INICIO 
END 
Exercício 15) Projete o hardware e elabore um programa mude o estado do display 
de 7 segmentos cada 1 segundos, em ordem crescente, de 0 a F. 
ORG 00H ;ORIGEM DE ENDEREÇAMENTO EM 00H 
JMP INICIO ;PULAR PARA O INICIO 
; TABELA PARA ARMAZENA A CONVERSAO PARA O 7 SEGMENTOS DE ANODO COMUM 
TABELA: DB 01000000b ; ZERO 
DB 01111001b ; UM 
DB 00100100b ; DOIS 
DB 00110000b ; TRÊS 
DB 00011001b ; QUATRO 
DB 00010010b ; CINCO 
DB 00000010b ; SEIS 
DB 01111000b ; SETE 
DB 00000000b ; OITO 
DB 00011000b ; NOVE 
DB 00001000b ; A 
DB 00000011b ; B 
DB 01000110b ; C 
DB 00100001b ; D 
DB 00000110b ; E 
DB 00001110b ; F 
ORG 40H ;Começar no endereço 40h para não da problema 
DEMORA: MOV R2,#50 ;Move o valor 50 para o registrador 2 
CICLO2: MOV R3,#50 ;Move o valor 50 para o registrador 3 
CICLO1: MOV R4,#200 ;Move o valor 100 para o registrador 4 
CICLO: DJNZ R4,CICLO ;Decrementa o R4 e volta para a função CICLO 
DJNZ R3,CICLO1 ;Decrementa o R3 e volta para o CICLO1 
DJNZ R2,CICLO2 ;Decrementa o R2 e volta para o CICLO 2 
RET 
ORG 100H ;COMEÇA NO ENDEREÇO 100H PARA NÃO DAR PROBLEMA 
INICIO: MOV DPTR,#TABELA ;MOVIMENTA A TABELA COMO UM VETOR DE 16 BITS PARA A DPTR 
MOV R0,#00H 
LOOP: MOV A,R0 ;MOVIMENTA R0 PARA A 
ANL A,#00001111b ; Grava no acumulador o resultado da operação lógica AND entre o acumulador e 
conteúdo do endereço 0FH 
MOVC A,@A+DPTR ; MOVIMENTA O VALOR COMPARADO COM VALOR DE A COM A TABELA 
MOV P2,A ; MOVIMENTA A PARA P2 
CALL DEMORA ;ELE CHAMA A SUBROTINA 
INC R0 ; INCREMENTA O VALOR DE R0 
JMP LOOP ; VOLTA PARA O LOOP 
END 
Exercício 16) Um programa que leia a porta P1. Se o valor lido for par, incrementa 
R2; em caso contrário, incrementa R1. Os dados pares são colocados na porta P2 e 
os dados ímpares na porta P3; todos os dados são armazenados sequencialmente a 
partir da posição de memória 20H 
ORG 2000H 
MOV R0,#20H ;INICIO DO ARMAZENAMENTO 
MOV R1,#0H ;CONTADOR DOS IMPARES 
MOV R2,#0H ;CONTADOR DOS PARES 
INICIO: MOV A,P1 ;MOVE O VALOR DO PORT1 PARA O ACUMULADOR 
MOV @R0,A ;GRAVA DADO 
ANL A,#01H ;VER SE PAR OU IMPAR 
JNZ IMPAR ;DESVIA PARA O IMPAR SE O ACUMULADOR FOR DIFERENTE DE ZERO 
PAR: INC R2 ;INCREMENTA R2 
MOV A,@R0 ;MOVE O VALOR DO ENDEREÇO PARA O ACUMULADOR 
MOV P2,A ;MOVE O VALOR DO ACUMULADOR PARA P2 
INC R0 ;INCREMENTA R0 
JMP INICIO ;RETORNA PARA O INICIO 
IMPAR: INC R1 ;INCREMENTA R1 
MOV A,@R0 ;MOVE O VALOR DO ENDEREÇO PARA O ACUMULADOR 
INC R0 ;INCREMENTA R0 
MOV P3,A ; MOSTRA DADO 
JMP INICIO ;RETORNA PARA O INICIO 
END

Outros materiais