Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
;---------------------------------------------------------------------------- ; ENGENHARIA ELETRONICA | ; Disciplina: Microcontroladores | ; PROVA ; JADE LESSA CUTINHOLA RA: 1307924 | ;---------------------------------------------------------------------------- ; DESCRICAO GERAL ;---------------------------------------------------------------------------- ; CONFIGURACAO DOS JUMPERS DE PLACA ;---------------------------------------------------------------------------- ; CONFIGURACOES PARA GRAVACAO __CONFIG _WDT_OFF & _XT_OSC & _LVP_OFF & _DEBUG_ON & _BODEN_OFF ;_CP_OFF ==> MEMORIA DE PROGRAMA DESPROTEGIDA CONTRA LEITURA. ;_WRT_OFF ==> SEM PERMISSÃO PARA ESCREVER NA MEMORIA DE PROGRAMA ; DURANTE EXECUCAO DO PROGRAMA. ;_DEBUG_ON ==> DEBUG ATIVADO. ;_CPD_OFF ==> MEMÓRIA EEPROM PROTEGIDA CONTRA LEITURA. ;_LVP_OFF ==> PROGRAMACAO EM BAIXA TENSÃO DESABILITADA. ;_WDT_OFF ==> WDT DESATIVADO. ;_BODEN_OFF ==> BROWN-OUT DESATIVADO. ;_PWRTE_ON ==> POWER-ON RESET ATIVADO. ;_XT_OSC ==> OSCILADOR CRISTAL (4MHz). ;---------------------------------------------------------------------------- ; ARQUIVOS DE DEFINICOES #INCLUDE <P16F877.INC> ;Arquivo padrão microchip para 16F877 ;---------------------------------------------------------------------------- ; DEFINICOES DAS CONSTANTES TEMPO_MS EQU .255 ;Cria variável para contar tempo ;---------------------------------------------------------------------------- ; MACROS ;---------------------------------------------------------------------------- ; DEFINICAO DAS VARIAVEIS CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE ;USUÁRIO. W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA USO STATUS_TEMP ;JUNTO ÀS INTERRUPÇÕES. bot_0 bot_1 bot_2 bot_3 DELAY NumCiclos ;Variável para contagem de tempo TEMPO_1ms ;Variavel para contar 1ms TEMPO_xms ;Variavel para multiplicar 1ms, a ser definido ;pelo programador conforme necessário. ENDC ;---------------------------------------------------------------------------- ; DEFINICAO DOS BANCOS DA RAM BANK0 MACRO ;Seleciona Bank0 de memória. bcf STATUS,RP1 bcf STATUS,RP0 ENDM ;Fim da MACRO Bank0 BANK1 MACRO ;Seleciona Bank1 de memória. bcf STATUS,RP1 bsf STATUS,RP0 ENDM ;Fim da MACRO Bank1. ;---------------------------------------------------------------------------- ; FLAGS ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;* ENTRADAS ;---------------------------------------------------------------------------- #define botao0 PORTB,0 ;botão 1 ligado a porta RB0 #define botao1 PORTB,1 ;botão 2 ligado a porta RB1 #define botao2 PORTB,2 ;botão 3 ligado a porta RB2 #define botao3 PORTB,3 ;botão 4 ligado a porta RB3 #DEFINE E PORTE, 1 #DEFINE RS PORTE, 0 ;---------------------------------------------------------------------------- ;* SAÍDAS * ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ;* VETOR DE RESET * ;---------------------------------------------------------------------------- ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO. goto INICIO ;---------------------------------------------------------------------------- ;* CONFIGURAÇÃO DO MICROCONTROLADOR * ;---------------------------------------------------------------------------- INICIO BANK1 ;ALTERA PARA O BANCO 1. movlw B'11111111' movwf TRISB ;TODA A PORTB É ENTRADA. movlw B'00000000' movwf TRISC ;TODA A PORTC É SAÍDA. movlw B'00000000' movwf TRISD ;TODA A PORTD É SAÍDA. movlw B'00000000' movwf TRISE ;TODA A PORTE É SAÍDA. movlw 0xC8 ;valor d200 movwf PR2 ;move w para PR2. BANK0 ;RETORNA PARA O BANCO 0. movlw B'00000101' ;Liga Tmr2, preescaler 1:4 movwf T2CON ;RB0 É ENTRADA. bsf CCP1CON,2 ;Habilita modo PWM bsf CCP1CON,3 ;---------------------------------------------------------------------------- ;* INICIALIZAÇÃO DA RAM * ;---------------------------------------------------------------------------- ; LIMPEZA DE TODA A RAM DO BANC0 0, INDO DE 0X20 A 0X7F. movlw 0x20 movwf FSR ;APONTA O ENDEREÇAMENTO INDIRETO PARA ;A PRIMEIRA POSIÇÃO DA RAM. LIMPA_RAM clrf INDF ;LIMPA A POSIÇÃO ATUAL. incf FSR,F ;INCREMENTA PONTEIRO P/ A PRÓX. POS. movf FSR,W xorlw 0x80 ;COMPARA PONTEIRO COM A ÚLT. POS. +1. btfss STATUS,Z ;JÁ LIMPOU TODAS AS POSIÇÕES? goto LIMPA_RAM ;NÃO, LIMPA A PRÓXIMA POSIÇÃO. ;SIM, CONTINUA O PROGRAMA. ;---------------------------------------------------------------------------- ;* INICIALIZAÇÃO DAS VARIÁVEIS E SFRs * ;---------------------------------------------------------------------------- ; ATRIBUIÇÃO DE VALORES INICIAIS ÀS VARIÁVEIS CRIADAS NA RAM E ; RESGISTRADORES ESPECIAIS. movlw B'11111110' ;NIVEL BAIXO EM RC0 movwf PORTC ;---------------------------------------------------------------------------- ;* ROTINA PRINCIPAL * ;---------------------------------------------------------------------------- MAIN: BTFSS botao0 ;TESTE SE O BIT 0 DA PORTB ESTÁ EM 1 SE NÃO SKIP CALL desligado ;CHAMA A FUNÇÃO DESLIGADO BTFSC botao0 ;TESTA SE O BIT 0 DA PORTB ESTA EM 0 SE NÃO SKIP clrf bot_0 ;CLEAR EM BOT_0 BTFSS botao1 ;TESTE SE O BIT 1 DA PORTB ESTÁ EM 1 SE NÃO SKIP CALL LIGA20 ;CHAMA A FUNÇÃO LIGA33 BTFSC botao1 clrf bot_1 BTFSS botao2 ;TESTE SE O BIT 2 DA PORTB ESTÁ EM 1 SE NÃO SKIP CALL LIGA40 ;CHAMA A FUNÇÃO LIGA66 BTFSC botao2 clrf bot_2 BTFSS botao3 ;TESTE SE O BIT 2 DA PORTB ESTÁ EM 1 SE NÃO SKIP CALL LIGA60 ;CHAMA A FUNÇÃO LIGA100 BTFSC botao3 clrf bot_3 ; movlw B'11111101' ;NIVEL BAIXO EM RC1 ->TESTA OUTRA LINHA ; movwf PORTC ; BTFSS botao0 ;TESTE SE O BIT 0 DA PORTB ESTÁ EM 1 SE NÃO SKIP ; CALL LIGA80 ;CHAMA A FUNÇÃO DESLIGADO ; BTFSC botao0 ;TESTA SE O BIT 0 DA PORTB ESTA EM 0 SE NÃO SKIP ; clrf bot_0 ; BTFSS botao1 ;TESTE SE O BIT 1 DA PORTB ESTÁ EM 1 SE NÃO SKIP ; CALL LIGA100 ;CHAMA A FUNÇÃO LIGA33 ; BTFSC botao1 ; clrf bot_1 goto MAIN ;---------------------------------------------------------------------------- ;* ROTINA DOS BOTOES * ;---------------------------------------------------------------------------- desligado: btfsc bot_0,0 return bsf bot_0,0 bcf CCP1CON,4 ;Habilita modo PWM bcf CCP1CON,5 movlw B'00000000' movwf CCPR1L return LIGA20: btfsc bot_1,0 return bsf bot_1,0 bcf CCP1CON,4 bsf CCP1CON,5 movlw B'01010000' movwf CCPR1L return LIGA40: btfsc bot_2,0 return bsf bot_2,0 bcf CCP1CON,4 bcf CCP1CON,5 movlw B'10100101' movwf CCPR1L return LIGA60: btfsc bot_3,0 return bsf bot_3,0 bcf CCP1CON,4 bcf CCP1CON,5 movlw B'11111010' movwf CCPR1L return LIGA80: btfsc PORTB,0 return bsf PORTB,0 bcf CCP1CON,4 bcf CCP1CON,5 movlw B'11111110' movwf CCPR1L return LIGA100: btfsc bot_1,0 return bsf bot_1,0 bcf CCP1CON,4 bsf CCP1CON,5 movlw B'11111111' movwf CCPR1L return ;---------------------------------------------------------------------------- ; * INICIALIZAÇÃO DO LCD * ;---------------------------------------------------------------------------- INICIALIZA_LCD: BCF RS MOVLW H'38' CALL ESCREVE MOVLW D'12' CALL DELAY_MS MOVLW H'38' ; ESCREVE COMANDO 0X30 PARA INICIALIZAÇÃO CALL ESCREVE MOVLW D'12' CALL DELAY_MS MOVLW H'6' ; ESCREVE COMANDO 0X30 PARA INICIALIZAÇÃO CALL ESCREVE MOVLW D'12' CALL DELAY_MS MOVLW H'0C' ; ESCREVE COMANDO PARA CALL ESCREVE ; INTERFACE DE 8 VIAS DE DADOS MOVLW D'12' CALL DELAY_MS MOVLW H'01' ; ESCREVE COMANDO PARA CALL ESCREVE ; LIMPAR TODO O DISPLAY MOVLW D'12' CALL DELAY_MS ; DELAY DE 1MS BSF RS RETURN ;--------------------------------------------------------------------------------------------- ESCREVE: BSF E ;ENVIA UM PULSO DE ENABLE AO DISPLAY MOVWF PORTD BCF E BTFSS DELAY,1 ;PASSOU 250uS GOTO $-1 ;NÃO (TESTA NOVAMENTE) BCF DELAY,1 ;LIMPA FLAG DE 250uS RETURN ; RETORNA ;--------------------------------------------------------------------------------------------- ESCREVE_LCD BCF RS ; SELECIONA O DISPLAY P/ COMANDOS MOVLW H'82' ; COMANDO PARA POSICIONAR O CURSOR CALL ESCREVE ; LINHA 0 / COLUNA 1 BSF RS ; SELECIONA O DISPLAY P/ DADOS MOVLW '%' CALL ESCREVE MOVLW 'V' CALL ESCREVE MOVLW 'O' CALL ESCREVE MOVLW 'L' CALL ESCREVE MOVLW 'T' CALL ESCREVE MOVLW 'S' CALL ESCREVE MOVLW '=' CALL ESCREVE BCF RS ; SELECIONA O DISPLAY P/ COMANDOS MOVLW H'C6' ; COMANDO PARA POSICIONAR O CURSOR CALL ESCREVE ; LINHA 0 / COLUNA 1 BSF RS ; SELECIONA O DISPLAY P/ DADOS ;AQUI MANDAR O VALOR PARA PORTD PARA MANDAR PRO DISPLAY ;--------------------------------------------------------------------------------------------- DELAY_MS: movlw 2 MOVWF TEMPO_xms ; CARREGA TEMPO1 (UNIDADES DE ms) MOVLW .4 ; CARREGA VALOR PARA CONTAR 1ms MOVWF NumCiclos MOVLW .250 MOVWF TEMPO_1ms ; CARREGA TEMPO0 (P/ CONTAR 1ms) ESPERA_1ms NOP ; PERDE TEMPO = nao faz nada DECFSZ TEMPO_1ms,F ; PASSOU 1ms? (decrementa) GOTO ESPERA_1ms ; NÃO - CONTINUA CONTAGEM ; SIM - PASSOU-SE 0.25 ms MOVLW .250 MOVWF TEMPO_1ms ; CARREGA TEMPO0 (P/ CONTAR 1ms) DECFSZ NumCiclos,F ; PASSOU TEMPO SELECIONADO (TEMPO_xms)? GOTO ESPERA_1ms ; NÃO - CONTINUA CONTAGEM ; SIM - PASSOU APROX. 1 ms MOVLW .4 ;CARREGA VALOR PARA CONTAR 1ms MOVWF NumCiclos DECFSZ TEMPO_xms,F ; PASSOU TEMPO SELECIONADO (TEMPO_xms)? GOTO ESPERA_1ms ; NÃO - CONTINUA CONTAGEM ; SIM RETURN ; RETORNA ;--------------------------------------------------------------------------------------------- ; FIM DO PROGRAMA END ; Fim do programa. ;---------------------------------------------------------------------------------------------
Compartilhar