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 |