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
|