summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorleo <leo@azuminha.com>2023-11-15 20:47:27 -0300
committerleo <leo@azuminha.com>2023-11-15 20:47:27 -0300
commite58f8b04eb53da9438209de6b991a10a1fb0091c (patch)
treeaa784355a1757837e3decfcc9ad6a1155f040634
parentc5aec66b3eae14068bfaacaa5364e002c02bf042 (diff)
lcd inicializar
-rw-r--r--lcd.asm91
1 files changed, 91 insertions, 0 deletions
diff --git a/lcd.asm b/lcd.asm
new file mode 100644
index 0000000..8fd0f01
--- /dev/null
+++ b/lcd.asm
@@ -0,0 +1,91 @@
+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
+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
+
+LOOP:
+ goto LOOP
+
+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
+
+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