summaryrefslogtreecommitdiff
path: root/lcd.asm
blob: 8fd0f018cb18be265906beafd85f5b45a0340c36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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