1 | ;===============================================
|
2 | ;= Beschreibung - funktionert - fertig! =
|
3 | ;===============================================
|
4 | ; Textmodus: singlemode (kein automatisches increment)
|
5 | ; absolut minimierte Version
|
6 | ; Steuerleitungen an Port B --> siehe Pinbelegung
|
7 | ; Datenleitungen an Port D
|
8 |
|
9 | ;testprogramm zum ansprechen ein lcd-displays mit t6963c controller
|
10 | ; Unterprogramme:
|
11 | ; Init_GLCD
|
12 | ; WriteCMD
|
13 | ; WriteByte
|
14 | ; StatusCheck
|
15 | ; delay
|
16 |
|
17 |
|
18 | .INCLUDE <m16def.inc> ; Controllertyp
|
19 |
|
20 |
|
21 | .equ TXT_BASE = 0x0000
|
22 | .equ FONT_SIZE = 8 ; änderbar über FS-Pin am Display
|
23 |
|
24 | .equ SPALTEN = 240/FONT_SIZE
|
25 | .equ TXT_ZEILEN = 128/8
|
26 |
|
27 | ;===============================================
|
28 | ;= Pinbelegung Display (L = low-active) =
|
29 | ;===============================================
|
30 | .equ wr = PB0 ; Data Write (L)
|
31 | .equ rd = PB1 ; Read Data (L)
|
32 | .equ ce = PB2 ; chip enable (L)
|
33 | .equ cd = PB3 ; Command/Data (H/L)
|
34 | .equ reset = PB4 ; Reset (L)
|
35 |
|
36 | ;===============================================
|
37 | ;= Registerverwendung =
|
38 | ;===============================================
|
39 | .def temp1 = r16
|
40 |
|
41 | .def daten = r21
|
42 | .def command= r22
|
43 |
|
44 |
|
45 | ;===============================================
|
46 | ;= Display-Kommandos =
|
47 | ;===============================================
|
48 | .equ TXTHOME = $40 ; Set Text Home Adresse
|
49 | .equ TXTAREA = $41 ; Set Text Area
|
50 | .equ ADPSET = $24 ; Set Adress-Zeiger
|
51 | .equ WRITEINC = $C0 ; Schreibt Daten und erhöht Adresszeiger um 1
|
52 |
|
53 | .equ MODE_ATTR = 0b10000100 ; Display an - Mode TEXT-ATTRIBUT
|
54 | .equ D_MODE_TXT = 0b10010111 ; Text an
|
55 | .equ crusormode = 0b10100111
|
56 |
|
57 | ; einzelne Bits des Statusbytes vom Display
|
58 | .equ STA0 = 1
|
59 | .equ STA1 = 0
|
60 |
|
61 |
|
62 |
|
63 |
|
64 | .CSEG ; was nun folgt, gehört in den FLASH-Speicher
|
65 |
|
66 | ;===============================================
|
67 | ;= Start Adresse 0000 /Interruptvektoren =
|
68 | ;===============================================
|
69 | .org 0x000
|
70 | rjmp Init ; Interruptvektoren überspringen
|
71 |
|
72 | ;===============================================
|
73 | ;= INITIALIZE =
|
74 | ;===============================================
|
75 |
|
76 | INIT:
|
77 |
|
78 |
|
79 |
|
80 |
|
81 |
|
82 | ldi r16, LOW(RAMEND)
|
83 | out SPL, r16
|
84 | ldi r16, HIGH(RAMEND)
|
85 | out SPH, r16
|
86 |
|
87 |
|
88 |
|
89 |
|
90 | ser temp1
|
91 | out DDRB, temp1 ; gesamter (Steuer)Port als Ausgang
|
92 | ldi temp1, 0b00011111 ; Steuerleitungen low-active, deshalb im Ruhezustand auf high
|
93 | out PortB, temp1
|
94 |
|
95 | ser temp1
|
96 | out DDRA, temp1 ; Datenport im Ruhezustand als Ausgang
|
97 | out DDRD,temp1
|
98 |
|
99 |
|
100 |
|
101 |
|
102 | rcall Init_GLCD
|
103 |
|
104 |
|
105 | ;************ adress pointer set **************
|
106 | ldi daten, 0
|
107 | rcall WriteByte
|
108 | ldi daten, 0
|
109 | rcall WriteByte
|
110 | ldi command, ADPSET
|
111 | rcall WriteCMD
|
112 |
|
113 |
|
114 | ;************ write Text 'FELIX' **************
|
115 | ldi daten, 0x26 ;F
|
116 | rcall WriteByte
|
117 | ldi command, WRITEINC ;Adresszeiger erhöhen
|
118 | rcall WriteCMD
|
119 |
|
120 | ldi daten, 0x25 ;E
|
121 | rcall WriteByte
|
122 | ldi command, WRITEINC ;Adresszeiger erhöhen
|
123 | rcall WriteCMD
|
124 |
|
125 | ldi daten, 0x2C ;L
|
126 | rcall WriteByte
|
127 | ldi command, WRITEINC ;Adresszeiger erhöhen
|
128 | rcall WriteCMD
|
129 |
|
130 | ldi daten, 0x29 ;I
|
131 | rcall WriteByte
|
132 | ldi command, WRITEINC ;Adresszeiger erhöhen
|
133 | rcall WriteCMD
|
134 |
|
135 | ldi daten, 0x38 ;X
|
136 | rcall WriteByte
|
137 | ldi command, WRITEINC ;Adresszeiger erhöhen
|
138 | rcall WriteCMD
|
139 |
|
140 |
|
141 | ;===============================================
|
142 | ;= Hauptschleife =
|
143 | ;===============================================
|
144 | Hauptschleife:
|
145 |
|
146 |
|
147 |
|
148 |
|
149 |
|
150 | rjmp Hauptschleife
|
151 |
|
152 |
|
153 | ;------------------------------------------------------
|
154 | ; Subroutinen / ISRs
|
155 | ;------------------------------------------------------
|
156 | Init_GLCD:
|
157 | ; Reset
|
158 | cbi PortB,reset ; Reset auf L
|
159 | rcall delay ; am anfang kurz warten
|
160 | sbi PortB,reset ; Reset auf H
|
161 | rcall delay
|
162 |
|
163 |
|
164 |
|
165 | ; text start adress set
|
166 | ldi daten,low (TXT_BASE)
|
167 | rcall WriteByte
|
168 | ldi daten,high(TXT_BASE)
|
169 | rcall WriteByte
|
170 | ldi command, (TXTHOME)
|
171 | rcall WriteCMD
|
172 |
|
173 | ; text area adress set
|
174 | ldi daten, (SPALTEN)
|
175 | rcall WriteByte
|
176 | ldi daten, 0x00
|
177 | rcall WriteByte
|
178 | ldi command, (TXTAREA)
|
179 | rcall WriteCMD
|
180 |
|
181 | ; Text/Grafik mode set
|
182 | ldi command, MODE_ATTR ; Textmodus, internal character gen. mode
|
183 | rcall WriteCMD
|
184 |
|
185 | ; Text/Grafik mode set
|
186 | ldi command, crusormode ; Textmodus, internal character gen. mode
|
187 | rcall WriteCMD
|
188 |
|
189 | ; mode set
|
190 | ldi command,D_MODE_TXT ; Text ON, Cursor OFF, Blink OFF
|
191 | rcall WriteCMD
|
192 |
|
193 | ; rcall LCD_ClrTxt
|
194 | ret
|
195 |
|
196 | ;********************************************
|
197 | ; Übergibt Befehl an Display (1 Byte)
|
198 | ;********************************************
|
199 | WriteCMD:
|
200 | rcall StatusCheck
|
201 | out PORTA, command ; command ausgeben
|
202 |
|
203 | cbi PortB, CE ; übernahmeimpuls an steuerleitungen
|
204 | cbi PortB, WR
|
205 | nop
|
206 | nop
|
207 | nop
|
208 | nop
|
209 | sbi PortB, WR ; übernahmeimpuls an steuerleitungen
|
210 | sbi PortB, CE
|
211 | ret
|
212 |
|
213 |
|
214 | ;*********************************************
|
215 | ; Übergibt Daten an Display (1 Byte)
|
216 | ;*********************************************
|
217 | WriteByte:
|
218 | rcall StatusCheck
|
219 | out PortA, daten ; lowbyte ausgeben
|
220 |
|
221 | cbi PortB, CD
|
222 | nop
|
223 | nop
|
224 | nop
|
225 |
|
226 | cbi PortB, CE ; übernahmeimpuls an steuerleitungen
|
227 | cbi PortB, WR
|
228 | nop
|
229 | nop
|
230 | nop
|
231 | nop
|
232 | sbi PortB, WR ; übernahmeimpuls an steuerleitungen
|
233 | sbi PortB, CE
|
234 | nop
|
235 | nop
|
236 | nop
|
237 | sbi PortB, CD
|
238 | ret
|
239 |
|
240 |
|
241 | ;*********************************************
|
242 | ; Liest Status vom Display
|
243 | ;*********************************************
|
244 | StatusCheck:
|
245 | clr temp1
|
246 | out DDRA, temp1 ; Datenport als Eingang für Statusantwort des Displays
|
247 | cbi PortB, CE ; Display enable
|
248 |
|
249 | _status_check_1:
|
250 | cbi PortB, RD ; übernahmeimpuls an steuerleitungen
|
251 | in temp1, PinA ; Daten vom Display kommend einlesen
|
252 | sbi PortB, RD ; übernahmeimpuls an steuerleitungen
|
253 |
|
254 | sbi portd,2
|
255 |
|
256 |
|
257 | ; Leseanforderung beenden
|
258 | andi temp1,(1<<STA0)+(1<<STA1)
|
259 | cpi temp1,(1<<STA0)+(1<<STA1) ; Püfen ob Bits Bits STA0 und STA1 gesetzt sind
|
260 | brne _status_check_1 ; warte auf sta0 und sta1 =1
|
261 |
|
262 | cbi portd,2
|
263 |
|
264 | sbi PortB, CE ; Display disable
|
265 | ser temp1 ; Datenport als Ausgang
|
266 | out DDRA, temp1
|
267 | ret
|
268 |
|
269 |
|
270 | ;***************************************************************************
|
271 | ; Löscht Textbereich vom Display
|
272 | ; Scratch-Reg: -
|
273 | ;***************************************************************************
|
274 | LCD_ClrTxt:
|
275 | ldi ZL,low (TXT_ZEILEN*SPALTEN) ; Berechnung der zu löschenden Speichergröße
|
276 | ldi ZH,high(TXT_ZEILEN*SPALTEN) ; i = TXT_ZEILEN*SPALTEN
|
277 |
|
278 | ldi daten,low (TXT_BASE) ; Adresszeiger setzen
|
279 | rcall WriteByte
|
280 | ldi daten,high (TXT_BASE)
|
281 | rcall WriteByte
|
282 | ldi command, (ADPSET)
|
283 | rcall WriteCMD
|
284 |
|
285 | _lcd_clr_txt_loop: ; löscht Textspeicher
|
286 | clr daten
|
287 | rcall WriteByte ; Null in Speicherzelle schreiben
|
288 | ldi command, WRITEINC ; Adresszeiger erhöhen
|
289 | rcall WriteCMD
|
290 | subi ZL,1 ; i = i-1
|
291 | sbci ZH,0
|
292 | brcc _lcd_clr_txt_loop ; wenn i = 0 --> Speicher gelöscht
|
293 |
|
294 | ret
|
295 | ;*********************************************
|
296 | ; Wartezeit für Reset
|
297 | ;*********************************************
|
298 | delay: ; Einschaltverzögerung 5ms
|
299 | push r16
|
300 | push r17
|
301 |
|
302 | ldi r16,255
|
303 | ws1:
|
304 | ldi r17,255
|
305 | ws2:
|
306 | dec r17
|
307 | brne ws2
|
308 | dec r16
|
309 | brne ws1
|
310 |
|
311 | pop r17
|
312 | pop r16
|
313 | ret
|
314 |
|
315 | ;------------------------------------------------------
|
316 | ; ENDE
|
317 | ;------------------------------------------------------
|
318 | Ende:
|
319 | rjmp Ende
|