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
|