lcd.asm


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
;----------------------------------------------------------------------