1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2 | ;; LCD-Routinen ;;
|
3 | ;; ============ ;;
|
4 | ;; (c)andreas-s@web.de ;;
|
5 | ;; ;;
|
6 | ;; 4bit-Interface ;;
|
7 | ;; DB4-DB7: PD0-PD3 ;;
|
8 | ;; RS: PD4 ;;
|
9 | ;; E: PD5 ;;
|
10 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
11 |
|
12 |
|
13 |
|
14 | ;sendet ein Datenbyte an das LCD
|
15 | lcd_data:
|
16 | mov temp2, temp1 ;"Sicherungskopie" für
|
17 | ;die Übertragung des 2.Nibbles
|
18 | swap temp1 ;Vertauschen
|
19 | andi temp1, 0b00001111 ;oberes Nibble auf Null setzen
|
20 | sbr temp1, 1<<4 ;entspricht 0b00010000
|
21 | out PORTC, temp1 ;ausgeben
|
22 | rcall lcd_enable ;Enable-Routine aufrufen
|
23 | ;2. Nibble, kein swap da es
|
24 | schon
|
25 | ;an der richtigen stelle ist
|
26 | andi temp2, 0b00001111 ;obere Hälfte auf Null setzen
|
27 | sbr temp2, 1<<4 ;entspricht 0b00010000
|
28 | out PORTC, temp2 ;ausgeben
|
29 | rcall lcd_enable ;Enable-Routine aufrufen
|
30 | rcall delay50us ;Delay-Routine aufrufen
|
31 | ret ;zurück zum Hauptprogramm
|
32 |
|
33 | ;sendet einen Befehl an das LCD
|
34 | lcd_command: ;wie lcd_data, nur ohne RS zu
|
35 | setzen
|
36 | mov temp2, temp1
|
37 | swap temp1
|
38 | andi temp1, 0b00001111
|
39 | out PORTC, temp1
|
40 | rcall lcd_enable
|
41 | andi temp2, 0b00001111
|
42 | out PORTC, temp2
|
43 | rcall lcd_enable
|
44 | rcall delay50us
|
45 | ret
|
46 |
|
47 | ;erzeugt den Enable-Puls
|
48 | lcd_enable:
|
49 | sbi PORTC, 5 ;Enable high
|
50 | nop ;3 Taktzyklen warten
|
51 | nop
|
52 | nop
|
53 | cbi PORTC, 5 ;Enable wieder low
|
54 | ret ;Und wieder zurück
|
55 |
|
56 |
|
57 | ;Pause nach jeder Übertragung
|
58 | delay50us: ;50us Pause
|
59 | ldi temp1, $42
|
60 | delay50us_:dec temp1
|
61 | brne delay50us_
|
62 | ret ;wieder zurück
|
63 |
|
64 | ;Längere Pause für manche Befehle
|
65 | delay5ms: ;5ms Pause
|
66 | ldi temp1, $21
|
67 | WGLOOP0: ldi temp2, $C9
|
68 | WGLOOP1: dec temp2
|
69 | brne WGLOOP1
|
70 | dec temp1
|
71 | brne WGLOOP0
|
72 | ret ;wieder zurück
|
73 |
|
74 | ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
|
75 | lcd_init:
|
76 | ldi temp3,50
|
77 | powerupwait:
|
78 | rcall delay5ms
|
79 | dec temp3
|
80 | brne powerupwait
|
81 | ldi temp1, 0b00000011 ;muss 3mal hintereinander
|
82 | gesendet
|
83 | out PORTC, temp1 ;werden zur Initialisierung
|
84 | rcall lcd_enable ;1
|
85 | rcall delay5ms
|
86 | rcall lcd_enable ;2
|
87 | rcall delay5ms
|
88 | rcall lcd_enable ;und 3!
|
89 | rcall delay5ms
|
90 | ldi temp1, 0b00000010 ;4bit-Modus einstellen
|
91 | out PORTC, temp1
|
92 | rcall lcd_enable
|
93 | rcall delay5ms
|
94 | ldi temp1, 0b00101000 ;noch was einstellen...
|
95 | rcall lcd_command
|
96 | ldi temp1, 0b00001100 ;...nochwas...
|
97 | rcall lcd_command
|
98 | ldi temp1, 0b00000100 ;endlich fertig
|
99 | rcall lcd_command
|
100 | ret
|
101 |
|
102 | ;Sendet den Befehl zur Löschung des Displays
|
103 | lcd_clear:
|
104 | ldi temp1, 0b00000001 ;Display löschen
|
105 | rcall lcd_command
|
106 | rcall delay5ms
|
107 | ret
|