1 | ;----------------------------------------------------------------------
|
2 | ; Filename: anw_07_LCD8it.asm
|
3 | ; Date: 22.04.2011 mit PIC16F887
|
4 | ; File Version: 1.0
|
5 | ; Author:
|
6 | ; Company: David-Roentgen-Schule Neuwied
|
7 | ;----------------------------------------------------------------------
|
8 | ; Features: LCD 8 bit mode
|
9 | ;----------------------------------------------------------------------
|
10 | ; Ports: Port A: Switch-Modul
|
11 | ; RA0: Bit0, ... RA7: Bit 7
|
12 | ; Port B: LEDs über Treiberbaustein ULN 2803 A
|
13 | ; RB0: Bit0, ... RB7: Bit7
|
14 | ;----------------------------------------------------------------------
|
15 | ; Files Required: p16F887.inc
|
16 | ;----------------------------------------------------------------------
|
17 | list p=16f887 ; list definiert den Controller
|
18 | #include <p16f887.inc> ; Headerdatei mit Registernamen
|
19 | errorlevel -302 ; suppress message 302 from list file
|
20 |
|
21 | __CONFIG _CONFIG1, _LVP_OFF&_FCMEN_OFF&_IESO_OFF&_BOR_OFF&_CPD_OFF&_CP_OFF&_MCLRE_ON&_PWRTE_ON&_WDT_OFF&_INTRC_OSC_NOCLKOUT
|
22 | __CONFIG _CONFIG2, _WRT_OFF&_BOR21V
|
23 | ;----------------------------------------------------------------------
|
24 | ; Configuration Word Register1:
|
25 | ; Low Voltage Programming -> LVP_OFF(disabled)
|
26 | ; Monitor Clock Fail-safe -> FCMEN_OFF(disabled)
|
27 | ; Internal External Switch Over Mode -> IESO_OFF(disabled)
|
28 | ; Brown Out Detect -> BOR_OFF(disabled)
|
29 | ; Data EE Read Protect -> CPD_OFF (disabled)
|
30 | ; Code Protect -> CP_OFF
|
31 | ; Master Clear Enable -> MCLRE_ON (enabled)
|
32 | ; Power Up Timer -> PWRTE_ON (enabled)
|
33 | ; Watchdog Timer -> WDT_OFF (disabled)
|
34 | ; Oscillator -> INTRC_OSC_NOCLKOUT (Internal RC No Clock)
|
35 | ; Configuration Word Register2:
|
36 | ; Flash Memory Write Protection off -> WRT_OFF (disabled)
|
37 | ; Brown-out Reset Voltage -> BORV21 (2,1 V)
|
38 | ;----------------------------------------------------------------------
|
39 | ; VARIABLE DEFINITIONS
|
40 | ;----------------------------------------------------------------------
|
41 | cblock 0x20 ; Block beginnt bei 0x20 (RAM-Bank 0)
|
42 | temp_01 ; temporäres Zählregister 01
|
43 | temp_02 ; temporäres Zählregister 02
|
44 | byte
|
45 | z1
|
46 | z2
|
47 | z3
|
48 | endc ; Ende des Registerblocks
|
49 | ;----------------------------------------------------------------------
|
50 | ; CONSTANT DEFINITIONS
|
51 | ;----------------------------------------------------------------------
|
52 | LCD_RS equ 0x02 ; LCD register select
|
53 | ; 0 -> Steuermodus
|
54 | ; 1 -> Daten
|
55 | LCD_E equ 0x03 ; LCD Enable
|
56 | ;----------------------------------------------------------------------
|
57 | ORG 0x000 ; Anfangsadresse 0x000
|
58 | ResetVector movlw high(main)
|
59 | movwf PCLATH
|
60 | goto main
|
61 | ;----------------------------------------------------------------------
|
62 | ; Unterprogramm: _delay_2.5m
|
63 | ; benötigte Zählregister: temp_01, temp_02
|
64 | ; Grundverzögerung: 2.5 ms
|
65 | ; Multiplikator: Übergabe durch w-Register
|
66 | ;----------------------------------------------------------------------
|
67 | _delay_2.5m
|
68 | movwf temp_02 ; w -> temp_02
|
69 | wait_2 movlw d'250' ; 250 -> w
|
70 | movwf temp_01 ; w -> temp_01
|
71 | wait_1 nop ; 1µs
|
72 | nop ; 1µs
|
73 | nop ; 1µs
|
74 | nop ; 1µs
|
75 | nop ; 1µs
|
76 | nop ; 1µs
|
77 | nop ; 1µs
|
78 | decfsz temp_01, f ; 1 µs
|
79 | goto wait_1 ; 2 µs
|
80 | decfsz temp_02, f ; 1 µs
|
81 | goto wait_2 ; 2 µs
|
82 | return
|
83 | ;----------------------------------------------------------------------
|
84 | _delay_40u
|
85 | movlw d'10'
|
86 | movwf temp_01
|
87 | nop
|
88 | decfsz temp_01, f
|
89 | goto $-2
|
90 | return
|
91 | ;----------------------------------------------------------------------
|
92 | ; Unterprogramm _portinit
|
93 | ; zur Definition der Ein- und Ausgangspins
|
94 | ;----------------------------------------------------------------------
|
95 | _portinit
|
96 | BANKSEL ANSEL ; -> Bank 3
|
97 | clrf ANSEL ; Port A, Port E: Analog-Fkt. aus, digital I/O
|
98 | clrf ANSELH ; Port B: Analog-Fkt. aus, digital I/O
|
99 |
|
100 | BANKSEL TRISA ; -> Bank 1
|
101 | movlw 0xF0
|
102 | movwf TRISA ; RA0-RA7 Eingänge
|
103 | movlw 0x00
|
104 | movwf TRISB ; RB0-RB7 Ausgänge
|
105 |
|
106 | BANKSEL PORTB ; Bank 0
|
107 | clrf PORTB ; Port B löschen
|
108 | clrf PORTA
|
109 |
|
110 | bcf STATUS,RP1
|
111 | bsf STATUS,RP0
|
112 | MOVLW B'11111111'
|
113 | movwf TRISD
|
114 | movlw B'00000000'
|
115 | movwf TRISC
|
116 | bcf STATUS,RP0
|
117 | clrf PORTD
|
118 | clrf PORTC
|
119 | ;----------------------------------------------------------------------
|
120 | _LCD_init ; LCD init
|
121 | bcf PORTA, LCD_RS ; control_in
|
122 | movlw b'00111000' ; Set->8 bit
|
123 | call _write_LCD ; 2 Z. 5x8 Dot
|
124 | movlw b'00001100' ; On/Off
|
125 | call _write_LCD ; Control
|
126 | movlw b'00000110' ; Entry Mode Set
|
127 | call _write_LCD
|
128 | bsf PORTA,LCD_RS ; data_in
|
129 | return
|
130 | ;----------------------------------------------------------------------
|
131 | _LCD_clear
|
132 | bcf PORTA,LCD_RS ; control_in
|
133 | movlw 0x01
|
134 | call _write_LCD
|
135 | bsf PORTA,LCD_RS ; data_in
|
136 | movlw d'2'
|
137 | call _delay_2.5m
|
138 | return
|
139 | ;----------------------------------------------------------------------
|
140 | _line_1
|
141 | bcf PORTA,LCD_RS ; control_in
|
142 | movlw b'10000000' ; 1. Zeile
|
143 | call _write_LCD ; 1. Stelle
|
144 | bsf PORTA,LCD_RS ; data_in
|
145 | return
|
146 |
|
147 | ;----------------------------------------------------------------------
|
148 | _write_LCD
|
149 | movwf PORTB
|
150 | bsf PORTA, LCD_E ; ->1
|
151 | nop
|
152 | bcf PORTA, LCD_E ; ->0
|
153 | call _delay_40u
|
154 | return
|
155 | ;----------------------------------------------------------------------
|
156 | _line_2:
|
157 | bcf PORTA,LCD_RS
|
158 | movlw b'11000000' ; 2. Zeile
|
159 | call _write_LCD ; 1. Stelle
|
160 | bsf PORTA,LCD_RS
|
161 | return
|
162 | ;----------------------------------------------------------------------
|
163 | main call _portinit ; Ports init.
|
164 | movlw d'8' ; 20 ms Wartezeit
|
165 | call _delay_2.5m ; beim Einschalten
|
166 | call _LCD_init ; 8-Bit-Modus
|
167 | call _LCD_clear ; Anzeige löschen
|
168 | mainloop
|
169 | call _line_1
|
170 |
|
171 | movlw a'D' ; ASCII-Zeichen 'H'
|
172 | call _write_LCD ; Schreiben
|
173 | movlw a'r' ; ASCII-Zeichen 'H'
|
174 | call _write_LCD ; Schreiben
|
175 | movlw a'u' ; ASCII-Zeichen 'H'
|
176 | call _write_LCD ; Schreiben
|
177 | movlw a'e' ; ASCII-Zeichen 'H'
|
178 | call _write_LCD ; Schreiben
|
179 | movlw a'c' ; ASCII-Zeichen 'H'
|
180 | call _write_LCD ; Schreiben
|
181 | movlw a'k' ; ASCII-Zeichen 'H'
|
182 | call _write_LCD ; Schreiben
|
183 | movlw a'e' ; ASCII-Zeichen 'H'
|
184 | call _write_LCD ; Schreiben
|
185 | movlw a'n' ; ASCII-Zeichen 'H'
|
186 | call _write_LCD ; Schreiben
|
187 | movlw a' ' ; ASCII-Zeichen 'H'
|
188 | call _write_LCD ; Schreiben
|
189 | movlw a'S' ; ASCII-Zeichen 'H'
|
190 | call _write_LCD ; Schreiben
|
191 | movlw a'i' ; ASCII-Zeichen 'H'
|
192 | call _write_LCD ; Schreiben
|
193 | movlw a'e' ; ASCII-Zeichen 'H'
|
194 | call _write_LCD ; Schreiben
|
195 | movlw a' ' ; ASCII-Zeichen 'H'
|
196 | call _write_LCD ; Schreiben
|
197 | movlw a'd' ; ASCII-Zeichen 'H'
|
198 | call _write_LCD ; Schreiben
|
199 | movlw a'i' ; ASCII-Zeichen 'H'
|
200 | call _write_LCD ; Schreiben
|
201 | movlw a'e' ; ASCII-Zeichen 'H'
|
202 | call _write_LCD ; Schreiben
|
203 | movlw a' ' ; ASCII-Zeichen 'H'
|
204 | call _write_LCD ; Schreiben
|
205 | movlw a' ' ; ASCII-Zeichen 'H'
|
206 | call _write_LCD ; Schreiben
|
207 | movlw a' ' ; ASCII-Zeichen 'H'
|
208 | call _write_LCD ; Schreiben
|
209 | movlw a' ' ; ASCII-Zeichen 'H'
|
210 | call _write_LCD ; Schreiben
|
211 | movlw a'z' ; ASCII-Zeichen 'H'
|
212 | call _write_LCD ; Schreiben
|
213 | movlw a'u' ; ASCII-Zeichen 'H'
|
214 | call _write_LCD ; Schreiben
|
215 | movlw a'm' ; ASCII-Zeichen 'H'
|
216 | call _write_LCD ; Schreiben
|
217 | movlw a' ' ; ASCII-Zeichen 'H'
|
218 | call _write_LCD ; Schreiben
|
219 | movlw a'S' ; ASCII-Zeichen 'H'
|
220 | call _write_LCD ; Schreiben
|
221 | movlw a't' ; ASCII-Zeichen 'H'
|
222 | call _write_LCD ; Schreiben
|
223 | movlw a'a' ; ASCII-Zeichen 'H'
|
224 | call _write_LCD ; Schreiben
|
225 | movlw a'r' ; ASCII-Zeichen 'H'
|
226 | call _write_LCD ; Schreiben
|
227 | movlw a't' ; ASCII-Zeichen 'H'
|
228 | call _write_LCD ; Schreiben
|
229 | movlw a'e' ; ASCII-Zeichen 'H'
|
230 | call _write_LCD ; Schreiben
|
231 | movlw a'n' ; ASCII-Zeichen 'H'
|
232 | call _write_LCD ; Schreiben
|
233 | movlw a' ' ; ASCII-Zeichen 'H'
|
234 | call _write_LCD ; Schreiben
|
235 | movlw a'd' ; ASCII-Zeichen 'H'
|
236 | call _write_LCD ; Schreiben
|
237 | movlw a'e' ; ASCII-Zeichen 'H'
|
238 | call _write_LCD ; Schreiben
|
239 | movlw a's' ; ASCII-Zeichen 'H'
|
240 | call _write_LCD ; Schreiben
|
241 |
|
242 | call _line_2
|
243 |
|
244 | movlw a'T' ; ASCII-Zeichen 'H'
|
245 | call _write_LCD ; Schreiben
|
246 | movlw a'a' ; ASCII-Zeichen 'H'
|
247 | call _write_LCD ; Schreiben
|
248 | movlw a's' ; ASCII-Zeichen 'H'
|
249 | call _write_LCD ; Schreiben
|
250 | movlw a't' ; ASCII-Zeichen 'H'
|
251 | call _write_LCD ; Schreiben
|
252 |
|
253 | movlw a'e' ; ASCII-Zeichen 'H'
|
254 | call _write_LCD ; Schreiben
|
255 | movlw a' ' ; ASCII-Zeichen 'H'
|
256 | call _write_LCD ; Schreiben
|
257 | movlw a'e' ; ASCII-Zeichen 'H'
|
258 | call _write_LCD ; Schreiben
|
259 | movlw a'i' ; ASCII-Zeichen 'H'
|
260 | call _write_LCD ; Schreiben
|
261 |
|
262 | movlw a'n' ; ASCII-Zeichen 'H'
|
263 | call _write_LCD ; Schreiben
|
264 | movlw a's' ; ASCII-Zeichen 'H'
|
265 | call _write_LCD ; Schreiben
|
266 | movlw a' ' ; ASCII-Zeichen 'H'
|
267 | call _write_LCD ; Schreiben
|
268 | movlw a'o' ; ASCII-Zeichen 'H'
|
269 | call _write_LCD ; Schreiben
|
270 | movlw a'd' ; ASCII-Zeichen 'H'
|
271 | call _write_LCD ; Schreiben
|
272 | movlw a'e' ; ASCII-Zeichen 'H'
|
273 | call _write_LCD ; Schreiben
|
274 | movlw a'r' ; ASCII-Zeichen 'H'
|
275 | call _write_LCD ; Schreiben
|
276 |
|
277 | movlw a' ' ; ASCII-Zeichen 'H'
|
278 | call _write_LCD ; Schreiben
|
279 | movlw a'z' ; ASCII-Zeichen 'H'
|
280 | call _write_LCD ; Schreiben
|
281 | movlw a'w' ; ASCII-Zeichen 'H'
|
282 | call _write_LCD ; Schreiben
|
283 | movlw a'e' ; ASCII-Zeichen 'H'
|
284 | call _write_LCD ; Schreiben
|
285 |
|
286 | movlw a'i' ; ASCII-Zeichen 'H'
|
287 | call _write_LCD ; Schreiben
|
288 |
|
289 |
|
290 | movlw a'L' ; ASCII-Zeichen 'H'
|
291 | call _write_LCD ; Schreiben
|
292 | movlw a'a' ; ASCII-Zeichen 'H'
|
293 | call _write_LCD ; Schreiben
|
294 | movlw a'u' ; ASCII-Zeichen 'H'
|
295 | call _write_LCD ; Schreiben
|
296 | movlw a'f' ; ASCII-Zeichen 'H'
|
297 | call _write_LCD ; Schreiben
|
298 |
|
299 | movlw a'l' ; ASCII-Zeichen 'H'
|
300 | call _write_LCD ; Schreiben
|
301 | movlw a'i' ; ASCII-Zeichen 'H'
|
302 | call _write_LCD ; Schreiben
|
303 | movlw a'c' ; ASCII-Zeichen 'H'
|
304 | call _write_LCD ; Schreiben
|
305 | movlw a'h' ; ASCII-Zeichen 'H'
|
306 | call _write_LCD ; Schreiben
|
307 | movlw a't' ; ASCII-Zeichen 'H'
|
308 | call _write_LCD ; Schreiben
|
309 |
|
310 | movlw a's' ; ASCII-Zeichen 'H'
|
311 | call _write_LCD ; Schreiben
|
312 |
|
313 |
|
314 |
|
315 |
|
316 | ;----------------------------------------------------------------------
|
317 |
|
318 |
|
319 |
|
320 |
|
321 | test
|
322 |
|
323 | btfsc PORTD,0
|
324 | goto start3
|
325 | btfsc PORTD,1
|
326 | goto start
|
327 | goto test
|
328 |
|
329 |
|
330 |
|
331 | start
|
332 | movlw d'50' ;1ms*x
|
333 | movwf z3
|
334 | call _LCD_clear
|
335 | call _line_1
|
336 |
|
337 | movlw a'L' ; ASCII-Zeichen 'H'
|
338 | call _write_LCD ; Schreiben
|
339 | movlw a'a' ; ASCII-Zeichen 'H'
|
340 | call _write_LCD ; Schreiben
|
341 | movlw a'u' ; ASCII-Zeichen 'H'
|
342 | call _write_LCD ; Schreiben
|
343 | movlw a'f' ; ASCII-Zeichen 'H'
|
344 | call _write_LCD ; Schreiben
|
345 | movlw a'l' ; ASCII-Zeichen 'H'
|
346 | call _write_LCD ; Schreiben
|
347 | movlw a'i' ; ASCII-Zeichen 'H'
|
348 | call _write_LCD ; Schreiben
|
349 | movlw a'c' ; ASCII-Zeichen 'H'
|
350 | call _write_LCD ; Schreiben
|
351 | movlw a'h' ; ASCII-Zeichen 'H'
|
352 | call _write_LCD ; Schreiben
|
353 | movlw a't' ; ASCII-Zeichen 'H'
|
354 | call _write_LCD ; Schreiben
|
355 | movlw a'2' ; ASCII-Zeichen 'H'
|
356 | call _write_LCD ; Schreiben
|
357 |
|
358 | movlw a' ' ; ASCII-Zeichen 'H'
|
359 | call _write_LCD ; Schreiben
|
360 | movlw a'i' ; ASCII-Zeichen 'H'
|
361 | call _write_LCD ; Schreiben
|
362 | movlw a's' ; ASCII-Zeichen 'H'
|
363 | call _write_LCD ; Schreiben
|
364 | movlw a't' ; ASCII-Zeichen 'H'
|
365 | call _write_LCD ; Schreiben
|
366 | movlw a' ' ; ASCII-Zeichen 'H'
|
367 | call _write_LCD ; Schreiben
|
368 | movlw a' ' ; ASCII-Zeichen 'H'
|
369 | call _write_LCD ; Schreiben
|
370 | movlw a' ' ; ASCII-Zeichen 'H'
|
371 | call _write_LCD ; Schreiben
|
372 | movlw a' ' ; ASCII-Zeichen 'H'
|
373 | call _write_LCD ; Schreiben
|
374 | movlw a' ' ; ASCII-Zeichen 'H'
|
375 | call _write_LCD ; Schreiben
|
376 | call _line_2
|
377 |
|
378 | movlw a'A' ; ASCII-Zeichen 'H'
|
379 | call _write_LCD ; Schreiben
|
380 | movlw a'k' ; ASCII-Zeichen 'H'
|
381 | call _write_LCD ; Schreiben
|
382 | movlw a't' ; ASCII-Zeichen 'H'
|
383 | call _write_LCD ; Schreiben
|
384 | movlw a'i' ; ASCII-Zeichen 'H'
|
385 | call _write_LCD ; Schreiben
|
386 | movlw a'v' ; ASCII-Zeichen 'H'
|
387 | call _write_LCD ; Schreiben
|
388 | movlw a' ' ; ASCII-Zeichen 'H'
|
389 | call _write_LCD ; Schreiben
|
390 | movlw b'10000000'
|
391 | movwf PORTC
|
392 |
|
393 | start2
|
394 | movlw d'60' ;1ms*x
|
395 | movwf z2
|
396 | call delay
|
397 | rlf PORTC, ;links
|
398 | btfss PORTC,7 ;bit7=0?
|
399 | decfsz z3
|
400 |
|
401 | goto start2
|
402 |
|
403 | goto main
|
404 |
|
405 |
|
406 |
|
407 | start3
|
408 | movlw d'50' ;1ms*x
|
409 | movwf z3
|
410 | call _LCD_clear
|
411 | call _line_1
|
412 |
|
413 | movlw a'L' ; ASCII-Zeichen 'H'
|
414 | call _write_LCD ; Schreiben
|
415 | movlw a'a' ; ASCII-Zeichen 'H'
|
416 | call _write_LCD ; Schreiben
|
417 | movlw a'u' ; ASCII-Zeichen 'H'
|
418 | call _write_LCD ; Schreiben
|
419 | movlw a'f' ; ASCII-Zeichen 'H'
|
420 | call _write_LCD ; Schreiben
|
421 | movlw a'l' ; ASCII-Zeichen 'H'
|
422 | call _write_LCD ; Schreiben
|
423 | movlw a'i' ; ASCII-Zeichen 'H'
|
424 | call _write_LCD ; Schreiben
|
425 | movlw a'c' ; ASCII-Zeichen 'H'
|
426 | call _write_LCD ; Schreiben
|
427 | movlw a'h' ; ASCII-Zeichen 'H'
|
428 | call _write_LCD ; Schreiben
|
429 | movlw a't' ; ASCII-Zeichen 'H'
|
430 | call _write_LCD ; Schreiben
|
431 | movlw a'1' ; ASCII-Zeichen 'H'
|
432 | call _write_LCD ; Schreiben
|
433 |
|
434 | movlw a' ' ; ASCII-Zeichen 'H'
|
435 | call _write_LCD ; Schreiben
|
436 | movlw a'i' ; ASCII-Zeichen 'H'
|
437 | call _write_LCD ; Schreiben
|
438 | movlw a's' ; ASCII-Zeichen 'H'
|
439 | call _write_LCD ; Schreiben
|
440 | movlw a't' ; ASCII-Zeichen 'H'
|
441 | call _write_LCD ; Schreiben
|
442 | movlw a' ' ; ASCII-Zeichen 'H'
|
443 | call _write_LCD ; Schreiben
|
444 | movlw a' ' ; ASCII-Zeichen 'H'
|
445 | call _write_LCD ; Schreiben
|
446 | movlw a' ' ; ASCII-Zeichen 'H'
|
447 | call _write_LCD ; Schreiben
|
448 | movlw a' ' ; ASCII-Zeichen 'H'
|
449 | call _write_LCD ; Schreiben
|
450 | movlw a' ' ; ASCII-Zeichen 'H'
|
451 | call _write_LCD ; Schreiben
|
452 | call _line_2
|
453 |
|
454 | movlw a'A' ; ASCII-Zeichen 'H'
|
455 | call _write_LCD ; Schreiben
|
456 | movlw a'k' ; ASCII-Zeichen 'H'
|
457 | call _write_LCD ; Schreiben
|
458 | movlw a't' ; ASCII-Zeichen 'H'
|
459 | call _write_LCD ; Schreiben
|
460 | movlw a'i' ; ASCII-Zeichen 'H'
|
461 | call _write_LCD ; Schreiben
|
462 | movlw a'v' ; ASCII-Zeichen 'H'
|
463 | call _write_LCD ; Schreiben
|
464 | movlw a' ' ; ASCII-Zeichen 'H'
|
465 | call _write_LCD ; Schreiben
|
466 | movlw b'00001001'
|
467 | movwf PORTC
|
468 |
|
469 | start4
|
470 | movlw d'60' ;1ms*x
|
471 | movwf z2
|
472 | call delay
|
473 | rrf PORTC, f ;links
|
474 | btfss PORTC, 0 ;bit7=0?
|
475 | decfsz z3
|
476 |
|
477 | goto start4
|
478 |
|
479 | goto main
|
480 |
|
481 |
|
482 |
|
483 |
|
484 |
|
485 |
|
486 |
|
487 | ;****************************************************
|
488 | delay
|
489 | wait2
|
490 | movlw d'100'
|
491 | movwf z1
|
492 |
|
493 | wait1
|
494 | nop
|
495 | nop
|
496 | nop
|
497 | nop
|
498 | nop
|
499 | nop
|
500 | nop
|
501 | decfsz z1
|
502 | goto wait1
|
503 | decfsz z2
|
504 | goto wait2
|
505 | return
|
506 |
|
507 |
|
508 |
|
509 |
|
510 |
|
511 | ;----------------------------------------------------------------------
|
512 | END
|
513 | ;----------------------------------------------------------------------
|