1 | ;===================================
|
2 | ; Portdefinitionen
|
3 | ;===================================
|
4 |
|
5 | #define Taster_1 PORTA, 0 ;
|
6 | #define Taster_2 PORTA, 1 ;
|
7 | #define LED_1 PORTA, 7 ;
|
8 | #define LCD_E PORTA, 4 ;
|
9 | #define LCD_RW PORTA, 3 ;
|
10 | #define LCD_RS PORTB, 5 ;
|
11 | #define LCD_D4 PORTB, 0 ;
|
12 | #define LCD_D5 PORTB, 1 ;
|
13 | #define LCD_D6 PORTB, 2 ;
|
14 | #define LCD_D7 PORTB, 3 ;
|
15 |
|
16 | ....
|
17 | ....
|
18 | ....
|
19 |
|
20 | ;===================================
|
21 | ; Display initialisieren
|
22 | ;===================================
|
23 |
|
24 | _wait d'300000' ; warte 0,3 s
|
25 | bcf LCD_RW ; 8 Bit Initialisierung
|
26 | bcf LCD_RS ;
|
27 | bsf LCD_D4 ;
|
28 | bsf LCD_D5 ;
|
29 | nop ;
|
30 | bsf LCD_E ;
|
31 | nop ;
|
32 | nop ;
|
33 | bcf LCD_E ;
|
34 | nop
|
35 | bcf LCD_D4 ;
|
36 | bcf LCD_D5 ;
|
37 | _wait d'1000' ; warte 1 ms
|
38 |
|
39 | bsf LCD_D4 ; 8 Bit Initialisierung
|
40 | bsf LCD_D5 ;
|
41 | nop ;
|
42 | bsf LCD_E ;
|
43 | nop ;
|
44 | nop ;
|
45 | bcf LCD_E ;
|
46 | nop
|
47 | bcf LCD_D4 ;
|
48 | bcf LCD_D5 ;
|
49 |
|
50 | _wait d'1000' ; warte 1 ms
|
51 | bsf LCD_D4 ; 8 Bit Initialisierung
|
52 | bsf LCD_D5 ;
|
53 | nop ;
|
54 | bsf LCD_E ;
|
55 | nop ;
|
56 | nop ;
|
57 | bcf LCD_E ;
|
58 | nop
|
59 | bcf LCD_D4 ;
|
60 | bcf LCD_D5 ;
|
61 | nop
|
62 | _wait d'1800' ; warte 1,8 ms
|
63 |
|
64 | ; 4 Bit Initialisierung
|
65 |
|
66 |
|
67 | bsf LCD_D5 ;
|
68 | nop ;
|
69 | bsf LCD_E ;
|
70 | nop ;
|
71 | nop ;
|
72 | bcf LCD_E ;
|
73 | nop
|
74 | bcf LCD_D5 ;
|
75 | nop
|
76 | _wait d'1800' ; warte 1,8 ms
|
77 |
|
78 | ; ab hier muss mit Zerlegung der 8 Bit gearbeitet werden
|
79 | ;
|
80 | movlw b'00101000' ; Function set, 2 zeilig und 5x7
|
81 | call write_ins ;
|
82 | nop ;
|
83 |
|
84 |
|
85 | _wait d'1800' ; warte 1,8 ms
|
86 |
|
87 | movlw b'00001000' ; Display aus
|
88 | call write_ins ;
|
89 | nop ;
|
90 | _wait d'1800' ; warte 1,8 ms
|
91 |
|
92 | movlw b'00000001' ; Display löschen
|
93 | call write_ins ;
|
94 | nop ;
|
95 | _wait d'1800' ; warte 1,8 ms
|
96 |
|
97 |
|
98 | movlw b'00000110' ; Entry Mode Set, cursor nach rechts, shift aus
|
99 | call write_ins ;
|
100 | nop ;
|
101 | _wait d'1800' ; warte 1,8 ms
|
102 | movlw b'00001111' ; Display einschalten, Cursor ein und Zeichen blinkt an Cursorstelle
|
103 | call write_ins ;
|
104 | nop ;
|
105 |
|
106 | ....
|
107 | ....
|
108 | ....
|
109 |
|
110 | ;================================================================================================
|
111 | ; Unterprogramme
|
112 | ;================================================================================================
|
113 |
|
114 | busy_check
|
115 |
|
116 | _BANK_1 ;
|
117 | movlw b'00001000' ;PortB 3 als Eingang definieren
|
118 | movwf TRISB ;
|
119 | _BANK_0
|
120 | bcf LCD_RS ; setze LCD_RW und LCD_RS auf low
|
121 | bsf LCD_RW ; um busy flag auszulesen
|
122 |
|
123 | loopb
|
124 | bcf LCD_E
|
125 | nop
|
126 | nop
|
127 | bsf LCD_E ; Enable setzen
|
128 | btfsc LCD_D7 ; ist busy Flag nicht gesetzt?
|
129 | goto loopb ; doch, zurück zu loopb
|
130 | bcf LCD_E ; nein, nicht mehr, Enable löschen
|
131 | _BANK_1 ;
|
132 | clrf TRISB ; alle B Ports sind wieder Ausgänge
|
133 | _BANK_0 ;
|
134 | _wait d'21' ; warte 21 us
|
135 | return ; zurück ins Programm
|
136 |
|
137 | write_ins
|
138 | movwf 0x25 ; Wert in Reg 25 speichern
|
139 | movwf 0x26 ; Wert in Reg 26 speichern
|
140 | swapf 0x25, 0 ; 4 obere Bits mit 4 unteren vertauschen
|
141 | andlw b'00001111' ; 4 "neue" obere Bits maskieren
|
142 | movwf PORTB ; 4 "alte" obere Bits an PortB ausgeben
|
143 | bcf LCD_RS ; lösche LCD_RS und LCD_RW
|
144 | bcf LCD_RW ; um in die Befehlsübertragung zu gelangen
|
145 | nop ; warte
|
146 | bsf LCD_E ; Übertragung starten
|
147 | nop ; warte
|
148 | nop ; warte
|
149 | bcf LCD_E ; Übertragung beenden
|
150 | nop ; warte
|
151 | _wait d'1800'
|
152 | movf 0x26, 0 ; ursprüngliches Byte in W laden
|
153 | andlw b'00001111' ; 4 "alte" obere Bits maskieren
|
154 | movwf PORTB ; 4 "alte" untere Bits an PORTB ausgeben
|
155 | nop ; warte
|
156 | bsf LCD_E ; Übertragung starten
|
157 | nop ;
|
158 | nop ;
|
159 | bcf LCD_E ;
|
160 | nop ;
|
161 | clrf PORTB ; Bits in PORTB löschen
|
162 | return ; zurück ins Hauptprogramm
|
163 |
|
164 | write_data
|
165 | movwf 0x27 ; Wert in Reg 27 speichern
|
166 | movwf 0x28 ; Wert in Reg 28 speichern
|
167 | bsf LCD_RS ; setze LCD_RS und lösche LCD_RW um in
|
168 | bcf LCD_RW ; Datenübertragung zu gelangen
|
169 | swapf 0x27, 0 ; 4 obere Bits mit 4 unteren vertauschen
|
170 | andlw b'00001111' ; 4 "neue" obere Bits maskieren
|
171 | iorwf PORTB, 1 ; 4 "alte" obere Bits an PortB ausgeben
|
172 | nop ; warte
|
173 | bsf LCD_E ; Übertragung starten
|
174 | nop ; warte
|
175 | bcf LCD_E ; warte
|
176 | nop ; warte
|
177 |
|
178 | movf 0x28, 0 ; ursprüngliches Byte wiederherstellen, Byte in W-Register lassen
|
179 | andlw b'00001111' ; 4 "alte" obere Bits maskieren
|
180 | iorwf PORTB, 1 ; 4 "alte" untere Bits an PORTB ausgeben
|
181 | nop ; warte
|
182 | bsf LCD_E ; Übertragung starten
|
183 | nop ; warte
|
184 | nop ; warte
|
185 | bcf LCD_E ; Übertragung beenden
|
186 | nop ; warte
|
187 | clrf PORTB ; Bits in PORTB löschen
|
188 | bcf LCD_RS ; lösche LCD_RS
|
189 | bcf LCD_RW ; und LCD_RW wieder
|
190 | return ; zurück ins Hauptprogramm
|