1 | ;Demoprogramm für 8-fach-PWM mit Tastensteuerung Up-Down.
|
2 |
|
3 | ;8 LEDs gegen Vcc an PortB (STK500)
|
4 | ;8 entprellte Tasten gegen GND für die einzelnen PWM-Kanäle an PortD
|
5 | ;1 "Shift-Taste" an PA6 gegen GND zum Wählen der Stellrichtung der Kanaltasten.
|
6 | ;Shift offen -> Kanaltasten zählen hoch,
|
7 | ;Shift betätigt -> Kanaltasten zählen runter.
|
8 | ;Der Zählumfang wird nach oben und unten begrenzt.
|
9 |
|
10 | .include "m8515def.inc"
|
11 | .listmac ;Makros listen
|
12 | .equ clock = 8000000 ;Taktfrequenz 8Mhz
|
13 |
|
14 |
|
15 | .equ pwu = 100 ;PWM-Zählumfang
|
16 | .equ timerwert = -100 ;Timer-Startwert (Reload)
|
17 | .equ step=6 ;Schrittweite für Änderung pro Tastendruck
|
18 | .equ lep=portb ;Port für LEDs
|
19 | .equ tap=pinc ;Tastenport
|
20 | .equ links=0 ;Taste links = Bit 0
|
21 | .equ hoch=1 ;Taste hoch = Bit 1
|
22 | .equ runter=2 ;Taste runter = Bit 2
|
23 | .equ rechts=3 ;Taste rechts = Bit 3
|
24 | .equ enter=4 ;Taste enter = Bit 4
|
25 | .equ tasten=0b00011111 ;Maske Tasten (PC0..PC4)
|
26 |
|
27 | ;.equ ship=pind ;Port für Shift-Taste
|
28 | ;.equ shib=6 ;Bit für Shift-Taste
|
29 |
|
30 |
|
31 | .equ avt0=20 ;Startwert Anzeige-Vorteiler
|
32 |
|
33 |
|
34 |
|
35 |
|
36 | .def soll0 = r0 ;Sollwert Kanal 1
|
37 | .def soll1 = r1 ;Sollwert Kanal 2
|
38 | .def soll2 = r2 ;Sollwert Kanal 3
|
39 | .def soll3 = r3 ;Sollwert Kanal 4
|
40 | .def soll4 = r4 ;Sollwert Kanal 5
|
41 | .def soll5 = r5 ;Sollwert Kanal 6
|
42 | .def soll6 = r6 ;Sollwert Kanal 7
|
43 | .def soll7 = r7 ;Sollwert Kanal 8
|
44 | .def tsw = r8 ;Timer-Startwert
|
45 | .def sregtemp = r9 ;Sicherheitskopie SREG
|
46 | .def scan=r10 ;Scannwert Tastenport
|
47 | .def tz0=r11 ;Tasten-Prellzähler Bit0
|
48 | .def tz1=r12 ;Tasten-Prellzähler Bit1
|
49 | .def tas=r13 ;Tastenstatus (gültig)
|
50 | .def null=r14 ;immer 0
|
51 |
|
52 |
|
53 |
|
54 | .def temp = r16
|
55 | .def tfl=r17 ;Flags für Tasten, die gedrückt wurden
|
56 | .def pwz = r18 ;PWM-Zähler
|
57 | .def task=r19 ;Taskscheibe für diverse Aufgaben
|
58 | .def ri=r20 ;Richtung der Änderung
|
59 | .def max=r21 ;Maximum
|
60 |
|
61 |
|
62 |
|
63 | ;.dseg ;SRAM-Variablen
|
64 | ;astring: .byte 27 ;Startadresse für LCD-Ausgabestring im S-RAM
|
65 |
|
66 | .def avt=r22 ;Anzeige-Vorteiler
|
67 | .def flags=r23 ;Steuerflags
|
68 | .equ aktuLCD=7 ;7 ;LCD aktualisieren
|
69 |
|
70 | .def wl=r24 ;Working L
|
71 | .def wh=r25 ;Working H
|
72 |
|
73 |
|
74 |
|
75 | .equ lcdcontroller1=4 ;Flag für Controller 1
|
76 | .equ lcdcontroller2=6 ;Flag für Controller 2
|
77 |
|
78 | .cseg
|
79 | ;.org 0 ;Reset- und Interrupt-Vektoren Mega 8535
|
80 | .org 0 ;Reset- und Interrupt-Vektoren AT-Mega 8515
|
81 | rjmp RESET ;Reset Handler
|
82 | rjmp nix;EXT_INT0 ;IRQ0 Handler
|
83 | rjmp nix;EXT_INT1 ;IRQ1 Handler
|
84 | rjmp nix;TIM1_CAPT ;Timer1 Capture Handler
|
85 | rjmp nix;TIM1_COMPA ;Timer1 Compare A Handler
|
86 | rjmp nix;TIM1_COMPB ;Timer1 Compare B Handler
|
87 | rjmp nix;TIM1_OVF ;Timer1 Overflow Handler
|
88 | rjmp TIM0_OVF ;Timer0 Overflow Handler
|
89 | rjmp nix;SPI_STC ;SPI Transfer Complete Handler
|
90 | rjmp nix;USART_RXC ;USART RX Complete Handler
|
91 | rjmp nix;USART_UDRE ;UDR0 Empty Handler
|
92 | rjmp nix;USART_TXC ;USART TX Complete Handler
|
93 | rjmp nix;ANA_COMP ;Analog Comparator Handler
|
94 | rjmp nix;EXT_INT2 ;IRQ2 Handler
|
95 | rjmp nix;TIM0_COMP ;Timer0 Compare Handler
|
96 | rjmp nix;EE_RDY ;EEPROM Ready Handler
|
97 | rjmp nix;SPM_RDY ;Store Program memory Ready Handler
|
98 | nix: ;unbenutzte Interrupts
|
99 | reti ;zurück...
|
100 |
|
101 | .include"LCDprint.inc" ;LCD-Ausgabefunktionen
|
102 | .include"LCD_4x27.inc" ;LCD-Routinen für 4-Zeilen-LCDs mit HD44780
|
103 |
|
104 | Reset:
|
105 |
|
106 | ldi wl,low(ramend) ;Stackpointer initialisieren
|
107 | out SPL,wl
|
108 | ldi wl,high(ramend)
|
109 | out SPH,wl
|
110 |
|
111 | clr null ;immer 0
|
112 |
|
113 | ldi wl, 0xFF ;Port A = Ausgang
|
114 | out DDRA, wl
|
115 |
|
116 |
|
117 |
|
118 | ldi temp, 0xff
|
119 | out lep-1,temp ;Ports B = Ausgang (DDRx=PORTx-1)
|
120 |
|
121 | ;out lep,temp ;LED aus
|
122 |
|
123 |
|
124 | ldi wl,tasten ;Pull-Ups
|
125 | out tap+2,wl ;für Tasten einschalten
|
126 |
|
127 |
|
128 | ;out tap+2,temp ;Pull-Ups für Tasten einschalten (PORTx=PINx+2)
|
129 | ; ldi temp, 0x00
|
130 | ; out tap+1,temp ;Ports d = Eingang (DDRx=PINx+1)
|
131 |
|
132 | ; cbi ship+1,shib ;Shift-Tastenanschluss als Eingang;
|
133 | ; sbi ship+2,shib ;Shift-PullUp einschalten
|
134 |
|
135 |
|
136 | clr soll0
|
137 | clr soll1
|
138 | clr soll2
|
139 | clr soll3
|
140 | clr soll4
|
141 | clr soll5
|
142 | clr soll6
|
143 | clr soll7
|
144 | clr tz0 ;Definierte Startbedingung
|
145 | clr tz1 ;für Tastenentprellung
|
146 | clr tas
|
147 | clr tfl
|
148 |
|
149 |
|
150 | ldi temp, 0x01
|
151 | out tccr0, temp ;Timertakt = 1:1
|
152 | ldi temp, 1<<toie0
|
153 | out timsk, temp ;Timer OVF freigeben
|
154 | ldi temp,timerwert+12 ;Timer-Startwert, korregiert mit Int-Aufruf12
|
155 | mov tsw,temp ;definieren
|
156 | out tcnt0,tsw ;und ausgeben
|
157 |
|
158 | ldi temp, 0; 50
|
159 | mov soll0, temp ;Naja, wenn es sein muss...
|
160 | ldi temp,1<<se ;Sleep-Mode (idle)
|
161 | out mcucr,temp ;freischalten
|
162 | ldi max,pwu ;Max-Wert für Begrenzung der Änderung
|
163 |
|
164 |
|
165 |
|
166 |
|
167 | rcall lcd_init ;LCD initialisieren
|
168 |
|
169 |
|
170 |
|
171 |
|
172 | sei
|
173 |
|
174 | MENU:
|
175 | sbrc tfl,rechts ;rechte Taste? nein...
|
176 | rcall menu1 ;ja...
|
177 | sbrc tfl,hoch ;obere Taste? nein...
|
178 | rcall menu2 ;ja...
|
179 | sbrc tfl,runter ;untere Taste? nein...
|
180 | rcall menu3 ;ja...
|
181 | cbr tfl,tasten ;alle Tasten sind erledigt
|
182 | rjmp menu ;zurück zur menu schleife
|
183 |
|
184 | menu1:
|
185 | rcall m1
|
186 | ret
|
187 | menu2:
|
188 | rcall m2
|
189 | ret
|
190 | menu3:
|
191 | rcall m3
|
192 | ret
|
193 |
|
194 |
|
195 | m1:
|
196 | locate 3,19
|
197 | printf M00
|
198 | ret
|
199 | m2:
|
200 | locate 3,19
|
201 | printf M01
|
202 | ret
|
203 | m3:
|
204 | locate 3,19
|
205 | printf M02
|
206 | ret
|
207 |
|
208 |
|
209 |
|
210 |
|
211 |
|
212 |
|
213 |
|
214 |
|
215 |
|
216 |
|
217 |
|
218 |
|
219 |
|
220 |
|
221 |
|
222 | ;Haupt: ;Hauptschleife, Auswertung der Tastenflags
|
223 | ;und Jobflags die in der ISR gesetzt wurden und verändern
|
224 | ;der PWM-Werte der 8 Kanäle.
|
225 | ; sleep ;Schlafmodus, Wecken erfolgt durch Timer-Int.
|
226 |
|
227 |
|
228 |
|
229 | ;sbrc flags,aktuLCD ;muss LCD aktualisiert werden? - nein...
|
230 |
|
231 | ;rcall gibaus ;ja, Job aufrufen...
|
232 |
|
233 |
|
234 | ;tst tfl ;Ein Bit im Tastenflag gesetzt?
|
235 | ;breq haupt ;nein, keine Taste gedrückt gewesen... (schlafen gehen...)
|
236 | ;ldi ri,step ;ja, erstmal aufwärts zählen
|
237 | ; sbis ship,shib ;Shift-Taste gedrückt? (nein...)
|
238 | ; rjmp minus ;ja, zum Abwärtszählen...
|
239 |
|
240 |
|
241 | ;taste0:
|
242 | ; sbrs tfl,0 ;Taste 0?
|
243 | ; rjmp taste1 ;nein...
|
244 | ; add soll0,ri ;ja, ändern
|
245 | ; rcall t1
|
246 | ; cp soll0,max ;Maxwert überschritten?
|
247 | ; brlo taste1 ;nein...
|
248 | ; mov soll0,max ;ja, auf Maxwert begrenzen
|
249 | ;taste1:
|
250 | ; sbrs tfl,1 ;Taste 1?
|
251 | ; rjmp taste2 ;nein...
|
252 | ; add soll1,ri ;ja, ändern
|
253 | ;rcall t2
|
254 | ; cp soll1,max ;Maxwert überschritten?
|
255 | ; brlo taste2 ;nein...
|
256 | ; mov soll1,max ;ja, auf Maxwert begrenzen
|
257 | ;taste2:
|
258 | ; sbrs tfl,2 ;Taste 2?
|
259 | ; rjmp taste3 ;nein...
|
260 | ; add soll2,ri ;ja, ändern
|
261 | ;rcall t3
|
262 | ; cp soll2,max ;Maxwert überschritten?
|
263 | ; brlo taste3 ;nein...
|
264 | ; mov soll2,max ;ja, auf Maxwert begrenzen
|
265 | ;taste3:
|
266 | ; sbrs tfl,3 ;Taste 3?
|
267 | ; rjmp taste4 ;nein...
|
268 | ; add soll3,ri ;ja, ändern
|
269 | ;rcall t4
|
270 | ; cp soll3,max ;Maxwert überschritten?
|
271 | ; brlo taste4 ;nein...
|
272 | ; mov soll3,max ;ja, auf Maxwert begrenzen
|
273 | ;taste4:
|
274 | ; sbrs tfl,4 ;Taste 4?
|
275 | ; rjmp taste5 ;nein...
|
276 | ; add soll4,ri ;ja, ändern
|
277 | ;rcall t5
|
278 | ; cp soll4,max ;Maxwert überschritten?
|
279 | ; brlo taste5 ;nein...
|
280 | ; mov soll4,max ;ja, auf Maxwert begrenzen
|
281 | ;taste5:
|
282 | ; sbrs tfl,5 ;Taste 5?
|
283 | ; rjmp taste6 ;nein...
|
284 | ; add soll5,ri ;ja, ändern,
|
285 | ;rcall t6
|
286 | ; cp soll5,max ;Maxwert überschritten?
|
287 | ; brlo taste6 ;nein...
|
288 | ; mov soll5,max ;ja, auf Maxwert begrenzen
|
289 | ;taste6:
|
290 | ; sbrs tfl,6 ;Taste 6?
|
291 | ; rjmp taste7 ;nein...
|
292 | ; add soll6,ri ;ja, ändern
|
293 | ;rcall t7
|
294 | ; cp soll6,max ;Maxwert überschritten?
|
295 | ; brlo taste7 ;nein...
|
296 | ; mov soll6,max ;ja, auf Maxwert begrenzen
|
297 | ;taste7:
|
298 | ; sbrs tfl,7 ;Taste 7?
|
299 | ; rjmp taste8 ;nein...
|
300 | ; add soll7,ri ;ja, ändern
|
301 | ;rcall t8
|
302 | ; cp soll7,max ;Maxwert überschritten?
|
303 | ; brlo taste8 ;nein...
|
304 | ; mov soll7,max ;ja, auf Maxwert begrenzen
|
305 | ;taste8:
|
306 | ; clr tfl ;alle Tastenflags löschen
|
307 | ; rjmp haupt ;fertig, schlafen gehen...
|
308 |
|
309 |
|
310 | ;minus:
|
311 | ; sbrs tfl,0 ;Taste 0?
|
312 | ; rjmp minus1 ;nein...
|
313 | ; sub soll0,ri ;ja, ändern
|
314 | ;rcall t1m
|
315 | ; brcc minus1 ;Unterlauf ? (nein...)
|
316 | ; clr soll0 ;ja, auf 0 setzen
|
317 | ;minus1:
|
318 | ; sbrs tfl,1 ;Taste 1?
|
319 | ; rjmp minus2 ;nein...
|
320 | ; sub soll1,ri ;ja, ändern
|
321 | ;rcall t2m
|
322 | ; brcc minus2 ;Unterlauf ? (nein...)
|
323 | ; clr soll1 ;ja, auf 0 setzen
|
324 | ;minus2:
|
325 | ; sbrs tfl,2 ;Taste 2?
|
326 | ; rjmp minus3 ;nein...
|
327 | ; sub soll2,ri ;ja, ändern
|
328 | ;rcall t3m
|
329 | ; brcc minus3 ;Unterlauf ? (nein...)
|
330 | ; clr soll2 ;ja, auf 0 setzen
|
331 | ;minus3:
|
332 | ; sbrs tfl,3 ;Taste 3?
|
333 | ; rjmp minus4 ;nein...
|
334 | ; sub soll3,ri ;ja, ändern
|
335 | ;rcall t4m
|
336 | ; brcc minus4 ;Unterlauf ? (nein...)
|
337 | ; clr soll3 ;ja, auf 0 setzen
|
338 | ;minus4:
|
339 | ; sbrs tfl,4 ;Taste 4?
|
340 | ; rjmp minus5 ;nein...
|
341 | ; sub soll4,ri ;ja, ändern
|
342 | ;rcall t5m
|
343 | ; brcc minus5 ;Unterlauf ? (nein...)
|
344 | ; clr soll4 ;ja, auf 0 setzen
|
345 | ;minus5:
|
346 | ; sbrs tfl,5 ;Taste 5?
|
347 | ; rjmp minus6 ;nein...
|
348 | ; sub soll5,ri ;ja, ändern
|
349 | ;rcall t6m
|
350 | ; brcc minus6 ;Unterlauf ? (nein...)
|
351 | ; clr soll5 ;ja, auf 0 setzen
|
352 | ;minus6:
|
353 | ; sbrs tfl,6 ;Taste 6?
|
354 | ; rjmp minus7 ;nein...
|
355 | ; sub soll6,ri ;ja, ändern
|
356 | ; rcall t7m
|
357 | ; brcc minus7 ;Unterlauf ? (nein...)
|
358 | ; clr soll6 ;ja, auf 0 setzen
|
359 | ;minus7:
|
360 | ; sbrs tfl,7 ;Taste 7?
|
361 | ; rjmp minus8 ;nein...
|
362 | ; sub soll7,ri ;ja, ändern
|
363 | ;rcall t8m
|
364 | ; brcc minus8 ;Unterlauf ? (nein...)
|
365 | ; clr soll7 ;ja, auf 0 setzen
|
366 | ;minus8:
|
367 | ; clr tfl ;alle Tastenflags löschen
|
368 | ; rjmp haupt ;Hauptprogramm Endlosschleife
|
369 |
|
370 |
|
371 | ;gibaus: ;Unterprogramm zum Ausgeben der Werte
|
372 | ; cbr flags,1<<aktuLCD ;Jobflag löschen, wird ja jetzt erledigt
|
373 |
|
374 |
|
375 |
|
376 | ; locate 0,0 ;Erste Position der zweiten Zeile
|
377 |
|
378 | ; print 'K' ;K
|
379 | ; print 'A' ;A
|
380 | ; print 'N' ;N
|
381 | ;print '1' ;1
|
382 | ; print ' ' ;Leerzeichen
|
383 | ; print8 r0 ;1. Wert
|
384 | ; print '%' ;Prozent-Zeichen
|
385 | ; print ' ' ;Leerzeichen
|
386 | ; ;print ' ' ;Leerzeichen
|
387 |
|
388 | ;locate 1,0
|
389 |
|
390 | ; print 'K' ;K
|
391 | ; print 'A' ;A
|
392 | ; print 'N' ;N
|
393 | ; print '2' ;2;
|
394 | ; print ' ' ;Leerzeichen
|
395 | ; print8 r1 ;2. Wert
|
396 | ; print '%' ;Prozent-Zeichen
|
397 | ; print ' ' ;Leerzeichen
|
398 | ; ;print ' ' ;Leerzeichen
|
399 |
|
400 | ;locate 2,0
|
401 | ; print 'K' ;K
|
402 | ; print 'A' ;A
|
403 | ; print 'N' ;N
|
404 | ; print '3' ;3
|
405 | ; print ' ' ;Leerzeichen
|
406 | ; print8 r2 ;3. Wert
|
407 | ; print '%' ;Prozent-Zeichen
|
408 | ; print ' ' ;Leerzeichen
|
409 | ; ;print ' ' ;Leerzeichen
|
410 |
|
411 | ;locate 3,0
|
412 | ; print 'K' ;K
|
413 | ;print 'A' ;A
|
414 | ; print 'N' ;N
|
415 | ; print '4' ;4
|
416 | ; print ' ' ;Leerzeichen;
|
417 | ; print8 r3 ;4. Wert
|
418 | ; print '%' ;Prozent-Zeichen
|
419 | ; print ' ' ;Leerzeichen
|
420 | ;print ' ' ;Leerzeichen
|
421 |
|
422 | ; locate 0,10 ;erste Position der dritten Zeile
|
423 |
|
424 | ; print 'K' ;K
|
425 | ; print 'A' ;A
|
426 | ; print 'N' ;N
|
427 | ;print '5' ;5
|
428 | ;print ' ' ;Leerzeichen
|
429 | ; print8 r4 ;5 Wert
|
430 | ; print '%' ;Prozent-Zeichen
|
431 | ; print ' ' ;Leerzeichen
|
432 | ;;;print ' ' ;Leerzeichen;
|
433 |
|
434 | ;locate 1,10
|
435 | ; print 'K' ;K
|
436 | ; print 'A' ;A
|
437 | ; print 'N' ;N
|
438 | ; print '6' ;6
|
439 | ; print ' ' ;Leerzeichen
|
440 | ; print8 r5 ;6 Wert
|
441 | ; print '%' ;Prozent-Zeichen
|
442 | ; print ' ' ;Leerzeichen
|
443 | ;print ' ' ;Leerzeichen
|
444 |
|
445 | ;locate 2,10
|
446 | ; print 'K' ;K
|
447 | ; print 'A' ;A
|
448 | ; print 'N' ;N
|
449 | ; print '7' ;7
|
450 | ; print ' ' ;Leerzeichen
|
451 | ;print8 r6 ;7. Wert
|
452 | ; print '%' ;Prozent-Zeichen
|
453 | ; print ' ' ;Leerzeichen
|
454 | ;print ' ' ;Leerzeichen
|
455 |
|
456 | ;locate 3,10
|
457 | ; print 'K' ;K
|
458 | ; print 'A' ;A
|
459 | ; print 'N' ;N
|
460 | ;print '8' ;8
|
461 | ; print ' ' ;Leerzeichen
|
462 | ; print8 r7 ;8. Wert
|
463 | ; print '%' ;Prozent-Zeichen
|
464 | ; print ' ' ;Leerzeichen
|
465 |
|
466 |
|
467 | ; ret
|
468 |
|
469 |
|
470 |
|
471 |
|
472 |
|
473 |
|
474 | Tim0_OVF: ;ISR Timer0-Überlauf
|
475 | in sregtemp, sreg ;Sreg sichern
|
476 | out tcnt0,tsw ;Timer auf Startwert setzen
|
477 | inc pwz ;PWM-Treppenzähler erhöhen
|
478 | cpi pwz, pwu ;PWM-Zählumfang erreicht?
|
479 | brne Time0_a ;nein... (die 3 Punkte bedeuten bei mir Sprung)
|
480 | clr pwz ;von vorn beginnen mit zählen
|
481 | Time0_a: ;Vergleich der einzelnen PWM-Werte mit dem PWM-Treppenzähler
|
482 | ;(Idee geklaut bei Peter Dannegger)
|
483 | cp pwz, soll7 ;Sollwert erreicht? (Ergebnis im Carry)
|
484 | rol temp ;Carry-Bits "einsammeln", dieses wird bis Bit7 durchgeschoben
|
485 | cp pwz, soll6
|
486 | rol temp ;Bit 6
|
487 | cp pwz, soll5
|
488 | rol temp ;Bit 5
|
489 | cp pwz, soll4
|
490 | rol temp ;Bit 4
|
491 | cp pwz, soll3
|
492 | rol temp ;Bit 3
|
493 | cp pwz, soll2
|
494 | rol temp ;Bit 2
|
495 | cp pwz, soll1
|
496 | rol temp ;Bit 1
|
497 | cp pwz, soll0
|
498 | rol temp ;Bit 0
|
499 | ;com temp ;invertieren da low-aktive LED im STK500
|
500 | out portB, temp ;Ausgabe
|
501 | inc task ;Taskscheibe erhöhen (Tastenabfrage erfolgt nur bei Task Nr. 0)
|
502 | ;andere Aufgaben können bei anderen Zählerständen aufgerufen werden
|
503 | ;dabei ist darauf zu achten, dass kein Durchlauf der ISR mehr als
|
504 | ;70 Takte dauert, da die ISR alle 100 Takte aufgerufen wird und
|
505 | ;der Aufruf (mit Reti) schon 10 Takte braucht.
|
506 | brne timertasks ;nur bei 0 Tasten abfragen...
|
507 | Tastenabfrage: ;Entprellroutine (geklaut bei Peter Dannegger...)
|
508 | in scan,tap ;Tastenport einlesen (gedrückt=L)
|
509 | com scan ;invertieren (gedrückt=H)
|
510 | eor scan,tas ;nur Änderungen werden H
|
511 | and tz0,scan ;Prellzähler unveränderter Tasten löschen (Bit0)
|
512 | and tz1,scan ;Prellzähler unveränderter Tasten löschen (Bit1)
|
513 | com tz0 ;L-Bit zählen 0,2,->1, 1,3,->0
|
514 | eor tz1,tz0 ;H-Bit zählen 0,2,->tz1 toggeln
|
515 | and scan,tz0 ;Änderungen nur dann erhalten, wenn im Prellzähler
|
516 | and scan,tz1 ;beide Bits gesetzt sind (Zählerstand 3)
|
517 | eor tas,scan ;erhaltene Änderungen toggeln alten (gültigen) Tastenstatus
|
518 | and scan,tas ;nur (neu) gedrückte Tastenbits bleiben erhalten
|
519 | or tfl,scan ;und zugehörige Bits setzen (gelöscht wird nach Abarbeitung)
|
520 | ;in "tas" steht jetzt der gültige Tastenzustand,
|
521 | ;in "tfl" die Flags der neu gedrückten, noch nicht abgearbeiteten Tasten...
|
522 | timertasks:
|
523 | cpi task,2 ;Beispiel für Verzweigung nach Taskscheibe
|
524 | brne timerfertig ;bei falscher Tasknummer Überspringen...
|
525 | dec avt ;Anzeige-Vorteiler runter
|
526 | brne timerfertig ;unten? nein, weg hier...
|
527 | ldi avt,avt0 ;ja, Startwert laden
|
528 | sbr flags,1<<aktuLCD ;Flag setzen, um LCD zu aktualisieren
|
529 |
|
530 | timerfertig:
|
531 | out sreg, sregtemp ;Sreg wiederherstellen
|
532 | reti ;ISR fertig
|
533 |
|
534 |
|
535 |
|
536 |
|
537 | M00: .db " MEN",$f5,"<1> ",0
|
538 | M01: .db " MEN",$f5,"<2> ",0
|
539 | M02: .db " MEN",$f5,"<3> ",0
|
540 |
|
541 |
|
542 |
|
543 | t1:
|
544 | locate 3,27
|
545 | print '1'
|
546 | print ' ' ;6 Leerzeichen
|
547 | print ' '
|
548 | print ' '
|
549 | print ' '
|
550 | print ' '
|
551 | print 'U'
|
552 | print 'P'
|
553 | print ' '
|
554 | ret
|
555 |
|
556 |
|
557 |
|
558 | t2:
|
559 | locate 3,27
|
560 | print '2'
|
561 | print ' ' ;6 Leerzeichen
|
562 | print ' '
|
563 | print ' '
|
564 | print ' '
|
565 | print ' '
|
566 | print 'U'
|
567 | print 'P'
|
568 | print ' '
|
569 | ret
|
570 |
|
571 | t3:
|
572 | locate 3,27
|
573 | print '3'
|
574 | print ' ' ;6 Leerzeichen
|
575 | print ' '
|
576 | print ' '
|
577 | print ' '
|
578 | print ' '
|
579 | print 'U'
|
580 | print 'P'
|
581 | print ' '
|
582 | ret
|
583 |
|
584 | t4:
|
585 | locate 3,27
|
586 | print '4'
|
587 | print ' ' ;6 Leerzeichen
|
588 | print ' '
|
589 | print ' '
|
590 | print ' '
|
591 | print ' '
|
592 | print 'U'
|
593 | print 'P'
|
594 | print ' '
|
595 | ret
|
596 |
|
597 | t5:
|
598 | locate 3,27
|
599 | print '5'
|
600 | print ' ' ;6 Leerzeichen
|
601 | print ' '
|
602 | print ' '
|
603 | print ' '
|
604 | print ' '
|
605 | print 'U'
|
606 | print 'P'
|
607 | print ' '
|
608 | ret
|
609 |
|
610 | t6:
|
611 | locate 3,27
|
612 | print '6'
|
613 | print ' ' ;6 Leerzeichen
|
614 | print ' '
|
615 | print ' '
|
616 | print ' '
|
617 | print ' '
|
618 | print 'U'
|
619 | print 'P'
|
620 | print ' '
|
621 | ret
|
622 |
|
623 | t7:
|
624 | locate 3,27
|
625 | print '7'
|
626 | print ' ' ;6 Leerzeichen
|
627 | print ' '
|
628 | print ' '
|
629 | print ' '
|
630 | print ' '
|
631 | print 'U'
|
632 | print 'P'
|
633 | print ' '
|
634 | ret
|
635 |
|
636 | t8:
|
637 | locate 3,27
|
638 | print '8'
|
639 | print ' ' ;6 Leerzeichen
|
640 | print ' '
|
641 | print ' '
|
642 | print ' '
|
643 | print ' '
|
644 | print 'U'
|
645 | print 'P'
|
646 | print ' '
|
647 | ret
|
648 |
|
649 |
|
650 | t1m:
|
651 | locate 3,27
|
652 | print '1'
|
653 | print ' ' ;6 Leerzeichen
|
654 | print ' '
|
655 | print ' '
|
656 | print ' '
|
657 | print 'D'
|
658 | print 'O'
|
659 | print 'W'
|
660 | print 'N'
|
661 | ret
|
662 |
|
663 | t2m:
|
664 | locate 3,27
|
665 | print '2'
|
666 | print ' ' ;6 Leerzeichen
|
667 | print ' '
|
668 | print ' '
|
669 | print ' '
|
670 | print 'D'
|
671 | print 'O'
|
672 | print 'W'
|
673 | print 'N'
|
674 | ret
|
675 |
|
676 | t3m:
|
677 | locate 3,27
|
678 | print '3'
|
679 | print ' ' ;6 Leerzeichen
|
680 | print ' '
|
681 | print ' '
|
682 | print ' '
|
683 | print 'D'
|
684 | print 'O'
|
685 | print 'W'
|
686 | print 'N'
|
687 | ret
|
688 |
|
689 | t4m:
|
690 | locate 3,27
|
691 | print '4'
|
692 | print ' ' ;6 Leerzeichen
|
693 | print ' '
|
694 | print ' '
|
695 | print ' '
|
696 | print 'D'
|
697 | print 'O'
|
698 | print 'W'
|
699 | print 'N'
|
700 | ret
|
701 |
|
702 | t5m:
|
703 | locate 3,27
|
704 | print '5'
|
705 | print ' ' ;6 Leerzeichen
|
706 | print ' '
|
707 | print ' '
|
708 | print ' '
|
709 | print 'D'
|
710 | print 'O'
|
711 | print 'W'
|
712 | print 'N'
|
713 | ret
|
714 |
|
715 | t6m:
|
716 | locate 3,27
|
717 | print '6'
|
718 | print ' ' ;6 Leerzeichen
|
719 | print ' '
|
720 | print ' '
|
721 | print ' '
|
722 | print 'D'
|
723 | print 'O'
|
724 | print 'W'
|
725 | print 'N'
|
726 | ret
|
727 |
|
728 | t7m:
|
729 | locate 3,27
|
730 | print '7'
|
731 | print ' ' ;6 Leerzeichen
|
732 | print ' '
|
733 | print ' '
|
734 | print ' '
|
735 | print 'D'
|
736 | print 'O'
|
737 | print 'W'
|
738 | print 'N'
|
739 | ret
|
740 |
|
741 | t8m:
|
742 | locate 3,27
|
743 | print '8'
|
744 | print ' ' ;6 Leerzeichen
|
745 | print ' '
|
746 | print ' '
|
747 | print ' '
|
748 | print 'D'
|
749 | print 'O'
|
750 | print 'W'
|
751 | print 'N'
|
752 | ret
|