;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