processor PIC16F873A #include ;__config _XT_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF & _LVP_OFF & _BODEN_OFF __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_OFF & _BOREN_OFF & _LVP_OFF & _CP_OFF & _CPD_OFF #define RS PORTA, 1 ; porta RS do lcd 16x2 - register select signal #define RW PORTA, 2 ; porta RW do lcd 16x2 - read/write #define EN PORTA, 3 ; porta E do LCD 16x2 - enable cblock 0x20 ;definir variaveis comando aux velocidade unidade dezena centena endc org 0x0 ;errorlevel -302 ;desabilitar mensagens de avisos na compilacao goto INICIO ;;;;;;;;INICIO DO TIMER;;;;;;;;;;;;;;;; org 0x004 retfie INICIO: movlw b'00000000' banksel TRISC movwf TRISC movlw b'001100011' ; 1, 2, 3 saidas movwf TRISA banksel PORTC clrf PORTC clrf PORTA ;resetar PORTA e PORTC call INIT_LCD movlw d'123' movwf velocidade ;MOSTRAR REGISTRADOR; movf velocidade, W ; W = velocidade call BASE10 movf centena, W addlw h'30' ; 0 na tabela ascii call ENVIA_CHAR movf dezena, W addlw h'30' call ENVIA_CHAR movf unidade, W addlw h'30' call ENVIA_CHAR LOOP: goto LOOP BASE10: movwf aux ; salva o valor a ser convertido clrf unidade clrf dezena clrf centena ; limpa registradores movf aux, F ; aux = aux btfsc STATUS, Z ; aux = 0 return ; sim ADD_UNI: incf unidade, F ; nao unidade++ movf unidade, W ; W = unidade xorlw d'10' ; unidade = 10? btfss STATUS, Z goto FIM_BASE10 ; nao clrf unidade ; sim, unidade = 0 movf dezena, W ; W = dezena xorlw d'9' ; dezena = 9 ?, pois 9+1 = 10 btfss STATUS, Z goto INC_DEZENA ; nao, vai para incrementa dezena clrf dezena ; sim, dezena = 0 incf centena, F ; centena += 1 goto FIM_BASE10 INC_DEZENA: incf dezena, F ; dezena += 1 FIM_BASE10: decfsz aux, F; aux -= 1 goto ADD_UNI ; se aux nao for 0, entao volta para decrementar uma unidade novamente return ; aux = 0 INIT_LCD: movlw b'00111000' ; instrucao: function set -> ver tabela de comandos do lcd call COMANDO_LCD ; LCD 8 bits; 2 linhas; 5x7 pontos movlw b'00001111' ; instrucao: display on/off call COMANDO_LCD ; LCD on; cursor: sim; blink: sim movlw b'00000110' ; instrucao: Entry Mode Set call COMANDO_LCD ; vai para direita; nao mexe o display movlw b'00000001' ; instrucao: Clear Display call COMANDO_LCD retlw d'0' ; retorna W = 0 ENVIA_CHAR: movwf comando call ESPERA_LCD ; aguarda lcd ficar pronto bcf RW ; modo escrita bsf RS ; modo comando bsf EN ; habilita lcd movf comando, W ; W = comando, pois o ESPERA_LCD retorna w = 0 movwf PORTC ; envia para o lcd bcf EN ; desliga lcd retlw d'0' ; retorna w = 0 COMANDO_LCD: movwf comando call ESPERA_LCD ; espera o lcd ficar pronto bcf RW ; modo leitura bcf RS ; modo comando ; os comando a serem utilizados sempre sao do tipo RS = 0 R/W = 0 e PORTC bsf EN ; habilta LCD movf comando, W movwf PORTC ; envia dado pro LCD bcf EN ; desativa LCD retlw d'0' ; retorn w = 0 ESPERA_LCD: banksel TRISC movlw b'11111111' movwf TRISC ; todas PORTC sao input banksel PORTA bcf RS ; modo comando bsf RW ; modo escrita bsf EN ; habilita LCD movf PORTC, W ; salva a leitura do LCD bcf EN ; desabilita LCD ; testar o busy flag - 8 bit do PORTC andlw b'10000000' ; se o busy flag for 0, entao o lcd esta pronto ; portando, essa operacao tem que resultar em 0 btfss STATUS, Z ; a operacao deu 0 goto ESPERA_LCD ; nao, faz tudo de novo ate estar pronto ;VOLTAR AO NORMAL bcf RW ; modo leitura banksel TRISC movlw d'00000000' movwf TRISC ; volta o PORTC para output banksel PORTC ; deixar no banco 0 retlw d'0' ; retorna W = 0 end