Buscar

Prova de microcontroladores em assembly

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.
;---------------------------------------------------------------------------------------------

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais

Outros materiais