diff options
| -rw-r--r-- | lcd_reg.asm | 165 | 
1 files changed, 165 insertions, 0 deletions
| diff --git a/lcd_reg.asm b/lcd_reg.asm new file mode 100644 index 0000000..de5c911 --- /dev/null +++ b/lcd_reg.asm @@ -0,0 +1,165 @@ +processor PIC16F873A +#include <p16f873a.inc> +;__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 | 
