CONT1 EQU 21 ;Contador 1. CONT2 EQU 22 ;Contador 2. TEMP1 EQU 23 ;Temporizador 1. org 0x00 ;Vetor de Reset. goto Main ;Ir para Incio do Programa. org 0x04 ;Vetor de Interrupo. goto INTERRUPT ;Ir para Interrupt. Main ;Incio do Programa Principal. bsf STATUS, 5 ;Seleciona o Banco de Memria 1. bcf OPTION_REG,5 ;Seleciona o clock interno como base de tempo para TMR0. movlw b'00000000' ;Move o literal para o registrador W. movwf TRISB ;Move W para TRISB, configurando PORTB como sadas. bcf STATUS ,5 ;Seleciona o Banco de Memria 0. movlw B'10100000' ;Move a palavra binria para W. movwf INTCON ;Configura as interrupes, ativando a interrupo por transbordo de TMR0. movlw B'00001111' ;Move o literal 15 para W. movwf CONT2 ;Move o valor 15 para o registrador CONT2. Loop: goto Loop ;vai para Loop. Tabela: ;Sub-Rotina Tabela. addwf PCL ;Faz PCL=W+PCL. retlw B'00111111' ;Retorna a palavra que representa graficamente 0 para W. retlw B'00000110' ;Retorna a palavra que representa graficamente 1 para W. retlw B'01011011' ;Retorna a palavra que representa graficamente 2 para W. retlw B'01001111' ;Retorna a palavra que representa graficamente 3 para W. retlw B'01100110' ;Retorna a palavra que representa graficamente 4 para W. retlw B'01101101' ;Retorna a palavra que representa graficamente 5 para W. retlw B'01111101' ;Retorna a palavra que representa graficamente 6 para W. retlw B'00000111' ;Retorna a palavra que representa graficamente7 para W. retlw B'01111111' ;Retorna a palavra que representa graficamente 8 para W. retlw B'01101111' ;Retorna a palavra que representa graficamente 9 para W. retlw B'11110111' ;Retorna a palavra que representa graficamente A para W. retlw B'11111111' ;Retorna a palavra que representa graficamente B para W. retlw B'10111001' ;Retorna a palavra que representa graficamente C para W. retlw B'10111111' ;Retorna a palavra que representa graficamente D para W. retlw B'11111001' ;Retorna a palavra que representa graficamente E para W. retlw B'11110001' ;Retorna a palavra que representa graficamente F para W. INTERRUPT: ;Sub-Rotina de Interrupo. incfsz CONT1,1 ;Incrementa CONT1, pula se resultado igual a zero. goto Fim_interrupt ;Caso CONT1 no for igual a 0, vai para o fim da interrupo. decfsz CONT2,1 ;Decrementa CONT2, pula se resultado igual a zero. goto Fim_interrupt ;Caso CONT2 no for igual a 0, vai para o fim da interrupo. incf TEMP1,1 ;Incrementa TEMP1, resultado salvo em TEMP1. movlw b'00010000 ;Move o literal 16 para W. subwf TEMP1 ;Faz 16-TEMP1. btfsc STATUS,0 ;Testa o bit zero de STATUS, pula se igual a zero. goto L1 ;Vai para L1. goto L2 ;Vai para L2. L1: clrf TEMP1 ;Limpa o registrador TEMP1. call Tabela ;Chama a funo Tabela. movwf PORTB ;Move o valor de W para PORTB. movlw B'00001111' ;Move o literal 15 para W. movwf CONT2 ;Move W para CONT2. L2: movf TEMP1, 0 ; Move o valor de TEMP1 para W. call Tabela ;Chama a funo Tabela. movwf PORTB ;Move o valor de W obtido em Tabela para PORTB. movlw B'00001111' ;Move o literal 15 para W. movwf CONT2 ;Move W para CONT2. Fim_interrupt: bcf INTCON, TMR0IF ;Limpa o bit TMR0IF de INTCON. retfie ;Retorna da sub-rotina de interrupo. end ;Fim do programa.