summaryrefslogtreecommitdiff
path: root/lcd_reg.asm
blob: de5c91111bbdedc0e393ee82f072d347d4021b1f (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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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