You are on page 1of 13

;Projeto 1 - Controle de Acesso por Meio de Senha

;By Douglas Polycarpo, Felipe Cascales e Lucas Tonin


;Bloco de endereos
ORG 0000H ;Endereo do reset - externo
LJMP INICIO ;Pula para INICIO, de fato, do programa
ORG 000BH ;Endereo da interrupo do timer 0 - interno
LJMP TIMER ;Pula para TIMER
ORG 0023H ;Endereo da interrupo serial. Pula para este endereo
quando acionada
LJMP RECEP ;Pula para RECEP
ORG 0033H ;Primeiro endereo do programa
;Bloco de incio do programa
INICIO: MOV IE,#10010010b ;Interrupt Enable - Todas as interrupes podem ser
habilitadas individualmente, e habilita as interupes serial e timer 0
MOV IP,#00001000b ;Interrupt Priority - Prioriza a interrupo serial
MOV TCON,#00h ;Timer Control - Comandos TR e TF em zero
MOV SCON,#01010000b ;Serial Control - Habilita a recepo serial
MOV TMOD,#00100010b ;Timer Mode - Habilita o modo temporizador, send
o seu disparo interno. Habilita o modo 3, temporizador de 8 bits duplo independe
nte
MOV TL1,#0FDh ;TH1 e TL1 - Carrega o valor de 253 para a taxa
de comunicao serial (Baud Rate)
MOV TH1,#0FDh
MOV TL0,#18h ;TH0 e TL0 - Com freq. de 11,0592 MHZ, carrega o
timer 0 para gerar 1.085 microsegundos x 24 ~ 25 microsegundos
MOV TH0,#18h
MOV P1,#0F0h ;Inicializa porta P1 (apaga os LED's)
LCALL PARAM ;Chama sub-rotina PARAM de parmetros inciais
CLR TR1 ;Desliga o timer 1
SETB TR1 ;Liga o timer 1
;Bloco da rotina de atualizao do display
DISPLAY:push Acc ;Guarda os dados correntes do acumulador
MOV A,#01h ;Seleciona o display 1
LCALL DISP ;Chama sub-rotina DISP de seleo do display
push Acc ;Guarda os dados correntes do acumulador
MOV A,R0 ;Move registrador R0 (registrador destinado ao d
isplay 1) para o acumulador
LCALL ESCREVE ;Chama sub-rotina ESCREVE de envio dos dados do
acumulador ao display
pop Acc ;Retorna dados guardados do acumulador
pop Acc ;Retorna dados guardados do acumulador
push Acc ;Guarda os dados correntes do acumulador
MOV A,#02h ;Seleciona o display 2
LCALL DISP ;Chama sub-rotina DISP de seleo do display
push Acc ;Guarda os dados correntes do acumulador
MOV A,R1 ;Move registrador R1 (registrador destinado ao d
isplay 2) para o acumulador
LCALL ESCREVE ;Chama sub-rotina ESCREVE de envio dos dados do
acumulador ao display
pop Acc ;Retorna dados guardados do acumulador
pop Acc ;Retorna dados guardados do acumulador
push Acc ;Guarda os dados correntes do acumulador
MOV A,#04h ;Seleciona o display 4
LCALL DISP ;Chama sub-rotina DISP de seleo do display
push Acc ;Guarda os dados correntes do acumulador
MOV A,R2 ;Move registrador R2 (registrador destinado ao d
isplay 3) para o acumulador
LCALL ESCREVE ;Chama sub-rotina ESCREVE de envio dos dados do
acumulador ao display
pop Acc ;Retorna dados guardados do acumulador
pop Acc ;Retorna dados guardados do acumulador
push Acc ;Guarda os dados correntes do acumulador
MOV A,#08h ;Seleciona o display 8
LCALL DISP ;Chama sub-rotina DISP de seleo do display
push Acc ;Guarda os dados correntes do acumulador
MOV A,R3 ;Move registrador R3 (registrador destinado ao d
isplay 4) para o acumulador
LCALL ESCREVE ;Chama sub-rotina ESCREVE de envio dos dados do
acumulador ao display
pop Acc ;Retorna dados guardados do acumulador
pop Acc ;Retorna dados guardados do acumulador
LJMP DISPLAY ;Retorna ao incio do segmento DISPLAY
DISP: MOV DPTR,#0FFC1H ;Move a seleo do display
MOVX @DPTR,A ;Move dado para o display
RET
ESCREVE:MOV DPTR,#hextab ;Move a tabela de cdigos em HEX e outros cdigos
MOVC A,@A+DPTR ;Ponteiro seleciona posio na tabela
MOV DPTR,#0FFC0H ;Move a seleo para o display
MOVX @DPTR,A ;Move dado para o display
MOV 20h,#255 ;Gera um pequeno delay para apagar o display
DJNZ 20h,$
MOV DPTR,#0FFC0h ;Apaga o display logo aps a escrita
MOV A,#00h
MOVX @DPTR,A
RET
;Bloco de recepo e avaliao dos dados seriais
RECEP: JNB RI,$ ;Verifica se a flag de recepo est ativa
MOV A,SBUF ;Move o dado recebido via serial em SBUF para o
acumulador
ENTER: CJNE A,#13,ALT0 ;Verifica se ENTER foi pressionado e passa para
prxima linha. Seno, pula para ALT0
MOV R1,#09h ;Move para R1 (display 2) o nmero 9
MOV R0,#00h ;Move para R0 (display 1) o nmero 0
CLR TR0 ;Desliga timer 0
SETB TR0 ;Liga timer 0
LJMP FIM ;Pula para FIM
ALT0: CJNE A,#'0',ALT1 ;Verifica se 0 foi pressionado e passa para prxim
a linha. Seno, pula para ALT1
LCALL NUMERO ;Chama sub-rotina NUMERO que rotaciona esquerda
o numero anterior
MOV R3,#00h ;Zera o nmero mais direita
LJMP FIM ;Pula para FIM
ALT1: CJNE A,#'1',ALT2 ;Verifica se 1 foi pressionado e passa para prxim
a linha. Seno, pula para ALT2
LCALL NUMERO ;Chama sub-rotina NUMERO que rotaciona esquerda
o numero anterior
MOV R3,#01h ;Move 1 ao nmero mais direita
LJMP FIM ;Pula para FIM
ALT2: CJNE A,#'2',ALT3 ;Verifica se 2 foi pressionado e passa para prxim
a linha. Seno, pula para ALT3
LCALL NUMERO ;Chama sub-rotina NUMERO que rotaciona esquerda
o numero anterior
MOV R3,#02h ;Move 2 ao nmero mais direita
LJMP FIM ;Pula para FIM
ALT3: CJNE A,#'3',ALT4 ;Verifica se 3 foi pressionado e passa para prxim
a linha. Seno, pula para ALT4
LCALL NUMERO ;Chama sub-rotina NUMERO que rotaciona esquerda
o numero anterior
MOV R3,#03h ;Move 3 ao nmero mais direita
LJMP FIM ;Pula para FIM
ALT4: CJNE A,#'4',ALT5 ;Verifica se 4 foi pressionado e passa para prxim
a linha. Seno, pula para ALT5
LCALL NUMERO ;Chama sub-rotina NUMERO que rotaciona esquerda
o numero anterior
MOV R3,#04h ;Move 4 ao nmero mais direita
LJMP FIM ;Pula para FIM
ALT5: CJNE A,#'5',ALT6 ;Verifica se 5 foi pressionado e passa para prxim
a linha. Seno, pula para ALT6
LCALL NUMERO ;Chama sub-rotina NUMERO que rotaciona esquerda
o numero anterior
MOV R3,#05h ;Move 5 ao nmero mais direita
LJMP FIM ;Pula para FIM
ALT6: CJNE A,#'6',ALT7 ;Verifica se 6 foi pressionado e passa para prxim
a linha. Seno, pula para ALT7
LCALL NUMERO ;Chama sub-rotina NUMERO que rotaciona esquerda
o numero anterior
MOV R3,#06h ;Move 6 ao nmero mais direita
LJMP FIM ;Pula para FIM
ALT7: CJNE A,#'7',ALT8 ;Verifica se 7 foi pressionado e passa para prxim
a linha. Seno, pula para ALT8
LCALL NUMERO ;Chama sub-rotina NUMERO que rotaciona esquerda
o numero anterior
MOV R3,#07h ;Move 7 ao nmero mais direita
LJMP FIM ;Pula para FIM
ALT8: CJNE A,#'8',ALT9 ;Verifica se 8 foi pressionado e passa para prxim
a linha. Seno, pula para ALT9
LCALL NUMERO ;Chama sub-rotina NUMERO que rotaciona esquerda
o numero anterior
MOV R3,#08h ;Move 8 ao nmero mais direita
LJMP FIM ;Pula para FIM
ALT9: CJNE A,#'9',LETA ;Verifica se 9 foi pressionado e passa para prxim
a linha. Seno, pula para LETA
LCALL NUMERO ;Chama sub-rotina NUMERO que rotaciona esquerda
o numero anterior
MOV R3,#09h ;Move 9 ao nmero mais direita
LJMP FIM ;Pula para FIM
LETA: CJNE A,#'a',LETB ;Verifica se A foi pressionado e passa para prxim
a linha. Seno, pula para LETB
MOV R4,#00h ;Zera o registrador de auxlio na contagem de temp
o de 10s e indica como resposta j inserida
MOV R7,#0Ah ;Move a letra A ao registrador
LJMP FIM ;Pula para FIM
LETB: CJNE A,#'b',LETC ;Verifica se B foi pressionado e passa para prxim
a linha. Seno, pula para LETC
MOV R4,#00h ;Zera o registrador de auxlio na contagem de temp
o de 10s e indica como resposta j inserida
MOV R7,#0Bh ;Move a letra B ao registrador
LJMP FIM ;Pula para FIM
LETC: CJNE A,#'c',LETD ;Verifica se C foi pressionado e passa para prxim
a linha. Seno, pula para LETD
MOV R4,#00h ;Zera o registrador de auxlio na contagem de temp
o de 10s e indica como resposta j inserida
MOV R7,#0Ch ;Move a letra C ao registrador
LJMP FIM ;Pula para FIM
LETD: CJNE A,#'d',LETE ;Verifica se D foi pressionado e passa para prxim
a linha. Seno, pula para LETE
MOV R4,#00h ;Zera o registrador de auxlio na contagem de temp
o de 10s e indica como resposta j inserida
MOV R7,#0Dh ;Move a letra D ao registrador
LJMP FIM ;Pula para FIM
LETE: CJNE A,#'e',LETS ;Verifica se E foi pressionado e passa para prxim
a linha. Seno, pula para LETS
MOV R4,#00h ;Zera o registrador de auxlio na contagem de temp
o de 10s e indica como resposta j inserida
MOV R7,#0Eh ;Move a letra E ao registrador
LJMP FIM ;Pula para FIM
LETS: CJNE A,#'s',SPACE ;Verifica se S foi pressionado e passa para prxim
a linha. Seno, pula para SPACE
LJMP TOTAL ;Pula para TOTAL para ver os resultados
LJMP FIM ;Pula para FIM
SPACE: CJNE A,#32,FIM ;Verifica se ESPAO foi pressionado e passa para p
rxima linha. Seno, pula para FIM
LCALL PULA ;Chama sub-rotina PULA para pulo da questo
MOV R4,#09h ;Reinicializa a numerao 09 nos dois primeiros disp
lays e reinicializa o registrador de auxlio na contagem de tempo de 10s
MOV R1,#09h
MOV R0,#00h
CLR TR0 ;Desliga o timer 0
SETB TR0 ;Liga o timer 0
FIM: CLR RI ;Limpa a flag de interrupo RI
RETI ;Retorna da interrupo
NUMERO: push Acc ;Guarda os dados correntes do acumulador
MOV A,R3 ;Transfere R3 para o acumulador
MOV R2,A ;Transfere o acumulador para R2, ou seja, transf
ere dgito de display 4 para display 3
pop Acc ;Retorna dados guardados do acumulador
RET ;Retorna da sub-rotina
;Bloco de gerao do delay de 1s
TIMER: INC R5 ;Gera loop de 4000 vezes (250 x 16) do timer 0 d
e 25 microsegundos ~ 1s
CJNE R5,#250,FIMT
MOV R5,#00h
INC R6
CJNE R6,#16,FIMT
MOV R5,#00h
MOV R6,#00h
CLR A ;Limpa acumulador
MOV A,R4 ;Move R4 para acumulador para comparador abaixo
CJNE A,#00h,R4NZ ;A cada repetio, verifica se resposta j no foi dada.
Seno, pula para R4NZ
LJMP R4SZ ;Pula para R4SZ se sim
;Bloco de contagem caso acabe o tempo
R4NZ: DEC R4 ;Decrementa 1s dos 10s disponveis
push Acc ;Guarda os dados correntes do acumulador
MOV A,R4 ;Move R4 para acumulador e depois para R1, atual
izando no display 2 a contagem decrementada
MOV R1,A
pop Acc ;Retorna dados guardados do acumulador
CJNE R4,#-1,FIMT ;Verifica se atingiu -1 (10s). Se sim, continua.
Seno, pula para FIMT
LJMP ERRADA ;Pula para ERRADA
FIMT: CLR TR0 ;Desliga 0 timer 0
CLR TF0 ;Limpa flag do timer 0
SETB TR0 ;Liga o timer 0
RETI ;Retorna da interrupo
;Bloco de identificao e comparao da resposta
R4SZ: CLR A ;Limpa acumulador
MOV A,R2 ;Move R2 (dgito decimal) para o acumulador
CJNE A,#00h,QUEST1 ;Compara se o dgito decimal igual a 0. Seno, pula
para QUEST1
MOV DPTR,#questoes0 ;Se sim, move a tabela de questes de decimal 0 pa
ra a memria
LJMP IDQUEST ;Chama sub-rotina IDQUEST para identificar questo
QUEST1: CJNE A,#01h,QUEST2 ;Compara se o dgito decimal igual a 0. Seno, pula
para QUEST2
MOV DPTR,#questoes1 ;Se sim, move a tabela de questes de decimal 1 pa
ra a memria
LJMP IDQUEST ;Chama sub-rotina IDQUEST para identificar questo
QUEST2: CJNE A,#02h,QUEST3 ;Compara se o dgito decimal igual a 0. Seno, pula
para QUEST3
MOV DPTR,#questoes2 ;Se sim, move a tabela de questes de decimal 2 pa
ra a memria
LJMP IDQUEST ;Chama sub-rotina IDQUEST para identificar questo
QUEST3: CJNE A,#03h,QUEST4 ;Compara se o dgito decimal igual a 0. Seno, pula
para QUEST4
MOV DPTR,#questoes3 ;Se sim, move a tabela de questes de decimal 3 pa
ra a memria
LJMP IDQUEST ;Chama sub-rotina IDQUEST para identificar questo
QUEST4: CJNE A,#04h,QUEST5 ;Compara se o dgito decimal igual a 0. Seno, pula
para QUEST5
MOV DPTR,#questoes4 ;Se sim, move a tabela de questes de decimal 4 pa
ra a memria
LJMP IDQUEST ;Chama sub-rotina IDQUEST para identificar questo
QUEST5: CJNE A,#05h,QUEST6 ;Compara se o dgito decimal igual a 0. Seno, pula
para QUEST6
MOV DPTR,#questoes5 ;Se sim, move a tabela de questes de decimal 5 pa
ra a memria
LJMP IDQUEST ;Chama sub-rotina IDQUEST para identificar questo
QUEST6: CJNE A,#06h,QUEST7 ;Compara se o dgito decimal igual a 0. Seno, pula
para QUEST7
MOV DPTR,#questoes6 ;Se sim, move a tabela de questes de decimal 6 pa
ra a memria
LJMP IDQUEST ;Chama sub-rotina IDQUEST para identificar questo
QUEST7: CJNE A,#07h,QUEST8 ;Compara se o dgito decimal igual a 0. Seno, pula
para QUEST8
MOV DPTR,#questoes7 ;Se sim, move a tabela de questes de decimal 7 pa
ra a memria
LJMP IDQUEST ;Chama sub-rotina IDQUEST para identificar questo
QUEST8: CJNE A,#08h,QUEST9 ;Compara se o dgito decimal igual a 0. Seno, pula
para QUEST9
MOV DPTR,#questoes8 ;Se sim, move a tabela de questes de decimal 8 pa
ra a memria
LJMP IDQUEST ;Chama sub-rotina IDQUEST para identificar questo
QUEST9: CJNE A,#09h,ERRADA1 ;Compara se o dgito decimal igual a 0. Seno, pula
para ERRADA1
MOV DPTR,#questoes9 ;Se sim, move a tabela de questes de decimal 9 pa
ra a memria
LJMP IDQUEST ;Chama sub-rotina IDQUEST para identificar questo
IDQUEST:CLR A ;Limpa o acumulador
MOV A,R3 ;Move R3 (dgito da unidade) para acumulador
MOVC A,@A+DPTR ;Seleciona na tabela de questes a questo correspon
dente ao dgito da unidade digitada
MOV 10h,A ;10h - Registrador para comparao do digitado com a
rmazenado
CLR A ;Limpa acumulador
MOV A,R7 ;Move R7 (registrador da resposta dada via seria
l) para acumulador
CJNE A,10h,ERRADA1 ;Compara a resposta dada com o gabarito. Se erra
do, pula para ERRADA1
LJMP CERTA ;Se certo, pula para CERTA
ERRADA1:LJMP ERRADA ;Pula para ERRADA (usado devido distncia em linha
s)
;Bloco da contagem total, de quest. certas e de quest. erradas
TOTAL: MOV 24h,#200
MOV 25h,#3 ;Aumenta tempo de atualizao dos displays para o nme
ro de questes totais ficar mais tempo na tela
CLR A ;Limpa o acumulador
MOV A,23h ;Move nmero de questes total (23h) para acumulador
MOV B,#10 ;Move o valor 10 para B
DIV AB ;Divide o nmero de questes total por 10 para ser t
er os dgitos decimal e da unidade, sendo A -> decimal e B -> unidade
MOV 40h,A ;Move o dgito decimal para o registrador 40h do d
isplay 3
MOV 41h,B ;Move o dgito da unidade para o registrador 41h d
o display 4
MOV 60h,#13h ;Move a localizao do T na tabela HEXTAB para 60h -
registrador especfico do display 1
MOV 61h,#15h ;Move a localizao do o na tabela HEXTAB para 61h -
registrador especfico do display 2
MOV 62h,#13h ;Move a localizao do T na tabela HEXTAB para 62h -
registrador especfico do display 3
MOV 63h,#0Ah ;Move a localizao do A na tabela HEXTAB para 63h -
registrador especfico do display 4
MOV 64h,#00h ;Inicializa a contagem de 64h em zero
TOT: CLR A ;Limpa o acumulador
MOV A,#01h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,60h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
CLR A ;Limpa o acumulador
MOV A,#02h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,61h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
CLR A ;Limpa o acumulador
MOV A,#04h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,62h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
CLR A ;Limpa o acumulador
MOV A,#08h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,63h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
DJNZ 24h,TOT ;Loop de atualizao dos displays para manter os val
ores mostrados por um tempo
DJNZ 25h,TOT
MOV 24h,#200
MOV 25h,#3
MOV 60h,61h ;Transfere o dgito do display 2 para o 1
MOV 61h,62h ;Transfere o dgito do display 3 para o 2
MOV 62h,63h ;Transfere o dgito do display 4 para o 3
CLR A ;Limpa o acumulador
MOV A,64h ;Move os dados de 64h para o acumulador
CJNE A,#00h,CJ2 ;Se o acumulador (64h) for 0, pula para prxima li
nha. Seno, pula para CJ2.
MOV 63h,#11h ;Move a localizao do L na tabela HEXTAB para 63h -
registrador especfico do display 4
INC 64h ;Incrementa o registrador 64h
LJMP TOT ;Pula para TOT
CJ2: CJNE A,#01h,SE3 ;Se o acumulador (64h) for 1, pula para prxima li
nha. Seno, pula para SE3 (passa para o prximo passo de mostrar as questes erradas).
MOV 25h,#4 ;Aumenta tempo de atualizao dos displays para o nme
ro de questes totais ficar mais tempo na tela
MOV 60h,#00h ;Mostra no display o nmero total de questes no mol
de "00 decimal unidade"
MOV 61h,#00h
MOV 62h,40h
MOV 63h,41h
INC 64h ;Incrementa o registrador 64h
LJMP TOT ;Pula para TOT
SE3: CLR A ;Limpa o acumulador
MOV B,#10 ;Move #10 para B
MOV A,21h ;Move o valor do registrador 21h para o acumulad
or
DIV AB ;Divide A por B
MOV 40h,A ;Move o valor do acumulador para o registrador 4
0h
MOV 41h,B ;Move o valor de B para o registador 41h
MOV 60h,#0Eh ;Move a localizao do E na tabela HEXTAB para 60h -
registrador especfico do display 1
MOV 61h,#12h ;Move a localizao do R na tabela HEXTAB para 61h -
registrador especfico do display 2
MOV 62h,#12h ;Move a localizao do R na tabela HEXTAB para 62h -
registrador especfico do display 3
MOV 63h,#0Ah ;Move a localizao do A na tabela HEXTAB para 63h -
registrador especfico do display 4
MOV 64h,#00h ;Inicializa a contagem de 64h em zero
TOT1: CLR A ;Limpa o acumulador
MOV A,#01h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,60h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
CLR A ;Limpa o acumulador
MOV A,#02h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,61h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
CLR A ;Limpa o acumulador
MOV A,#04h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,62h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
CLR A ;Limpa o acumulador
MOV A,#08h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,63h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
DJNZ 24h,TOT1 ;Loop de atualizao dos displays para manter os val
ores mostrados por um tempo
DJNZ 25h,TOT1
MOV 24h,#200
MOV 25h,#3
MOV 60h,61h ;Move o valor do registrador 61h para o registra
dor 60h
MOV 61h,62h ;Move o valor do registrador 62h para o registra
dor 61h
MOV 62h,63h ;Move o valor do registrador 63h para o registra
dor 62h
CLR A ;Limpa o acumulador
MOV A,64h ;Move o valor do registrador 64h para o acumulad
or.
CJNE A,#00h,CJ3 ;Se o acumulador for #00h, pula para prxima linha
. Seno, pula para CJ3.
MOV 63h,#0Dh ;Move a localizao do D na tabela HEXTAB para 63h -
registrador especfico do display 4
INC 64h ;Incrementa o registrador 64h
LJMP TOT1 ;Pula para a rotina TOT1
CJ3: CJNE A,#01h,CJ4 ;Se o acumulador for #01h, pula para prxima linha
. Seno, pula para CJ4.
MOV 63h,#0Ah ;Move a localizao do A na tabela HEXTAB para 63h -
registrador especfico do display 4
INC 64h ;Incrementa o registrador 64h
LJMP TOT1 ;Pula para a rotina TOT1
CJ4: CJNE A,#02h,CJ5 ;Se o acumulador for #02h, pula para prxima linha
. Seno, pula para CJ5.
MOV 63h,#05h ;Move a localizao do 5 (S) na tabela HEXTAB para 6
3h - registrador especfico do display 4
INC 64h ;Incrementa o registrador 64h
LJMP TOT1 ;Pula para a rotina TOT1
CJ5: CJNE A,#03h,SE4 ;Se o acumulador for #03h, pula para prxima linha
. Seno, pula para SE4.
MOV 25h,#4
MOV 60h,#00h ;Mostra no display o nmero total de questes no mol
de "00 decimal unidade"
MOV 61h,#00h ;Zera o registrador 61h.
MOV 62h,40h ;Move o valor do registrador 40h para o registra
dor 62h.
MOV 63h,41h ;Move o valor do registrador 41h para o registra
dor 63h.
INC 64h ;Incrementa o registrador 64h
LJMP TOT1 ;Pula para a rotina TOT1
SE4: CLR A ;Limpa o acumulador
MOV B,#10 ;Move o valor #10 para B
MOV A,22h ;Move o valor 22h para A
DIV AB ;Divide o valor do acumulador A por B
MOV 40h,A ;Move o valor de A para o registrador 40h.
MOV 41h,B ;move o valor de B para o registrador 41h.
MOV 60h,#0Ch ;Move a localizao do C na tabela HEXTAB para 63h -
registrador especfico do display 1
MOV 61h,#0Eh ;Move a localizao do E na tabela HEXTAB para 63h -
registrador especfico do display 2
MOV 62h,#12h ;Move a localizao do R na tabela HEXTAB para 63h -
registrador especfico do display 3
MOV 63h,#13h ;Move a localizao do T na tabela HEXTAB para 63h -
registrador especfico do display 4
MOV 64h,#00h ;Inicializa a contagem de 64h em zero
TOT2: CLR A ;Limpa o acumulador
MOV A,#01h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,60h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
CLR A ;Limpa o acumulador
MOV A,#02h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,61h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
CLR A ;Limpa o acumulador
MOV A,#04h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,62h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
CLR A ;Limpa o acumulador
MOV A,#08h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,63h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
DJNZ 24h,TOT2 ;Loop de atualizao dos displays para manter os val
ores mostrados por um tempo
DJNZ 25h,TOT2
MOV 24h,#20
MOV 25h,#3
MOV 60h,61h ;Move o valor do registrador 61h para o registra
dor 60h
MOV 61h,62h ;Move o valor do registrador 62h para o registra
dor 61h
MOV 62h,63h ;Move o valor do registrador 63h para o registra
dor 62h
CLR A ;Limpa o acumulador
MOV A,64h ;Move o valor do registrador 64h para o acumulad
or
CJNE A,#00h,CJ6 ;Se o acumulador for #00h, pula para prxima linha
. Seno, pula para CJ6.
MOV 63h,#0Ah ;Move o valor #0Ah para o registrador 63h.
INC 64h ;Incrementa o registrador 64h
LJMP TOT2 ;Pula para a rotina TOT2
CJ6: CJNE A,#01h,CJ7 ;Se o acumulador for #01h, pula para prxima linha
. Seno, pula para CJ7.
MOV 63h,#05h ;Move o valor #05h para o registrador 63h.
INC 64h ;Incrementa o registrador 64h
LJMP TOT2 ;Pula para a rotina TOT2
CJ7: CJNE A,#02h,SE5 ;Se o acumulador for #02h, pula para prxima linha
. Seno, pula para SE5.
MOV 25h,#4
MOV 60h,#00h ;Mostra no display o nmero total de questes no mol
de "00 decimal unidade"
MOV 61h,#00h ;Zera o registrador 61h.
MOV 62h,40h ;Move o valor do registrador 40h para o registra
dor 62h.
MOV 63h,41h ;Move o valor do registrador 41h para o registra
dor 63h.
INC 64h ;Incrementa o registrador 64h
LJMP TOT2 ;Pula para a rotina TOT2
SE5: LCALL PARAM ;Chama sub-rotina PARAM de parmetros inciais para
reiniciar o sistema
LJMP FIM ;Pula para a rotina FIM
;Bloco para mostrar ERRADO no display
ERRADA: INC 21h ;Incrementa o registrador 21h
MOV 24h,#240 ;Tempo de exibio
MOV 25h,#2 ;Tempo de exibio
MOV 60h,#0Eh ;Move a localizao do E na tabela HEXTAB para 60h -
registrador especfico do display 1
MOV 61h,#12h ;Move a localizao do R na tabela HEXTAB para 61h -
registrador especfico do display 2
MOV 62h,#12h ;Move a localizao do R na tabela HEXTAB para 62h -
registrador especfico do display 3
MOV 63h,#0Ah ;Move a localizao do A na tabela HEXTAB para 63h -
registrador especfico do display 4
MOV 64h,#00h ;Inicializa a contagem de 64h em zero
MOV 65h,#00h ;Registrador que identifica se mostra no display
ERRADO (0) ou CERTO (1)
DISPL: CLR A ;Limpa o acumulador
MOV A,#01h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,60h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
CLR A ;Limpa o acumulador
MOV A,#02h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,61h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
CLR A ;Limpa o acumulador
MOV A,#04h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,62h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
CLR A ;Limpa o acumulador
MOV A,#08h ;Move o endereo do display selecionado para o acu
mulador
LCALL DISP ;Chama a rotina de seleo do display
CLR A ;Limpa o acumulador
MOV A,63h ;Move para o acumulador o valor a ser exibido no
display
LCALL ESCREVE ;Chama a rotina de exibio no display
DJNZ 24h,DISPL ;Loop de atualizao dos displays para manter os val
ores mostrados por um tempo
DJNZ 25h,DISPL
MOV 24h,#240
MOV 25h,#2
CLR A ;Limpa o acumulador
MOV A,65h ;Move o valor do registrador 65h para o acumulad
or.
CJNE A,#00h,CER1 ;Se o acumulador for #00h, pula para prxima linha
. Seno, pula para CER1.
MOV 60h,61h ;Move o valor do registrador 61h para o registra
dor 60h
MOV 61h,62h ;Move o valor do registrador 62h para o registra
dor 61h
MOV 62h,63h ;Move o valor do registrador 63h para o registra
dor 62h
CLR A ;Limpa o acumulador
MOV A,64h ;Move o valor do registrador 64h para o acumulad
or.
CJNE A,#00h,CJ1 ;Se o acumulador for #00h, pula para prxima linha
. Seno, pula para CJ1.
MOV 63h,#0Dh ;Move a localizao do D na tabela HEXTAB para 63h -
registrador especfico do display 4
INC 64h ;Incrementa o registrador 64h.
LJMP DISPL ;Pula para a rotina DISPL.
CJ1: CJNE A,#01h,SE1 ;Se o acumulador for #00h, pula para prxima linha
. Seno, pula para SE1.
MOV 63h,#15h ;Move a localizao do O na tabela HEXTAB para 63h -
registrador especfico do display 4
INC 64h ;Incrementa o registrador 64h.
LJMP DISPL ;Pula para a rotina DISPL.
SE1: LCALL PULA ;Chama a rotina PULA
MOV R4,#09h ;Move o valor #09h para o registrador R4
MOV R1,#09h ;Move o valor #09h para o registrador R1
MOV R0,#00h ;Move o valor #00h para o registrador R0
LJMP FIMT ;Pula para a rotina FIMT
;Bloco para mostrar CERTO no display
CERTA: INC 22h ;Incrementa o registrador 22h (contador de certa
s)
MOV 60h,#0Ch ;Move a localizao do C na tabela HEXTAB para 60h -
registrador especfico do display 1
MOV 61h,#0Eh ;Move a localizao do E na tabela HEXTAB para 61h -
registrador especfico do display 2
MOV 62h,#12h ;Move a localizao do R na tabela HEXTAB para 62h -
registrador especfico do display 3
MOV 63h,#13h ;Move a localizao do T na tabela HEXTAB para 63h -
registrador especfico do display 4
MOV 64h,#00h ;Inicializa a contagem de 64h em zero
MOV 65h,#01h ;Move o valor #01h para o registrador 65h.
LJMP DISPL ;Pula para a rotina DISPL
CER1: MOV 60h,61h ;Move o valor do registrador 61h para o registra
dor 60h
MOV 61h,62h ;Move o valor do registrador 62h para o registra
dor 61h
MOV 62h,63h ;Move o valor do registrador 63h para o registra
dor 62h
MOV 63h,#15h ;Move a localizao do O na tabela HEXTAB para 63h -
registrador especfico do display 4
CLR A ;Limpa o acumulador A.
MOV A,64h ;Move o valor do registrador 64h para o acumulad
or.
CJNE A,#00h,SE2 ;Se o acumulador for #00h, pula para prxima linha
. Seno, pula para SE2.
INC 64h ;Incrementa o registrador 64h.
LJMP DISPL ;Pula para a rotina DISPL
SE2: LCALL PULA ;Chama a rotina PULA
MOV R4,#09h ;Move o valor #09h para o registrador R4
MOV R1,#09h ;Move o valor #09h para o registrador R1
MOV R0,#00h ;Move o valor #00h para o registrador R0
LJMP FIMT ;Pula para a rotina FIMT
;Bloco de contagem de pulos e mudana de A para 0 no dgito decimal
PULA: INC 23h ;Incrementa o registrador 23h.
INC R3 ;Incrementa o registrador R3.
CJNE R3,#0Ah,CONT ;Se o registrador for #0Ah, pula para prxima linh
a. Seno, pula para CONT.
MOV R3,#00h ;Move #00h para o registrador R3.
INC R2 ;Incrementa o registrador R2.
CJNE R2,#0Ah,CONT ;Se o registrador for #0Ah, pula para prxima linh
a. Seno, pula para CONT.
MOV R2,#00h ;Move #00h para o registrador R2.
CONT: RET
PARAM: MOV B,#10
MOV R0,#05h
MOV R1,#10h
MOV R2,#00h
MOV R3,#00h
MOV R4,#09h
MOV 21h,#00h ;Acumulador das quest. erradas
MOV 22h,#00h ;Acumulador das quest. certas
MOV 23h,#00h ;Acumulador total
MOV 40h,#00h
MOV 41h,#00h
CLR TR0
CLR TF0
RET
;Tabela de converso para uso do display
hextab: db 3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07h,7Fh,67h,77h,7Ch,39h,5Eh,79h,7
1h,73h,38h,50h,78h,40h,5Ch
; 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , A , B , C , D , E ,
F , P , L , r , t , - , o
questoes0: db 0Ch,0Dh,0Bh,0Ah,0Ch,0Eh,0Ah,0Eh,0Dh,0Ch ;Gabaritos das q
uestes do roteiro
questoes1: db 0Bh,0Ah,0Ch,0Eh,0Ah,0Dh,0Bh,0Bh,0Dh,0Eh
questoes2: db 0Dh,0Ch,0Eh,0Ah,0Ch,0Bh,0Ah,0Ah,0Bh,0Ah
questoes3: db 0Ch,0Dh,0Ah,0Ah,0Ch,0Ch,0Ah,0Bh,0Dh,0Ah
questoes4: db 0Bh,0Eh,0Eh,0Dh,0Bh,0Ah,0Ah,0Ch,0Eh,0Ch
questoes5: db 0Ah,0Ah,0Bh,0Dh,0Bh,0Ch,0Dh,0Ah,0Ch,0Bh
questoes6: db 0Eh,0Dh,0Ah,0Bh,0Eh,0Ah,0Ch,0Dh,0Bh,0Eh
questoes7: db 0Eh,0Bh,0Dh,0Ch,0Dh,0Ch,0Ch,0Eh,0Dh,0Bh
questoes8: db 0Ah,0Eh,0Ah,0Ah,0Dh,0Bh,0Eh,0Ch,0Bh,0Dh
questoes9: db 0Ch,0Ch,0Eh,0Dh,0Bh,0Dh,0Ah,0Bh,0Eh,0Ah
END

You might also like