summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lcd_reg.asm165
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