;LED 1 an Bit 1 des PortB, an Bit0 des Port B ein Taster ;LED 2 an Bit 3 des PortB, an Bit2 des Port B ein Taster ;drücken des Tasters 1 schaltet LED 1 ein ;drücken des Tasters 2 läßt LED 2 blinken ; .nolist ;verhindert auflisten .INCLUDE "C:\Programme\AVR\AStudio4\AvrAssembler\appnotes\2313def.inc" ;Include-Datei einbinden .LIST ;Listen wieder einschalten .def stack = r16 ;Name festlegen für r16 ;das war das Vorspiel, ist bei jedem Programm nötig .def exor = r20 .cseg ;legt fest, das hier das Codesegment beginnt .org 0x0000 ;Programmbeginn festlegen bei 0x0000 ldi stack, RAMEND ;Stack initialisieren out SPL, stack ;superwichtig!! sonst funktioniert RCALL und RET nicht ldi r17, 0b00001010 ;lädt den Wert in Register 17 out DDRB, r17 ;Wert aus Register 17 in DataDirectionRegister Port B laden, macht Bit1+3 zu Ausgang ldi r17, 0b00000101 ;Wert laden out PORTB, r17 ;aktiviert Pull-Up-Widerstand an Bit 0 PortB ldi ZH,HIGH(65535) ;High-Byte des "16bit-Zählers" mit 65535 laden (Z-Register) ldi ZH,LOW(65535) ;dito low-byte ldi exor, 0b00001000 ;Maske für Exclusiv-Oder rjmp main ; ;************** Hauptprogramm ***************** ; main: sbic PINB, 0 ;überspringe nächsten Befehl, falls Taster1 gedrückt rcall LED_1_aus ;springe Unterprogramm an sbis PINB, 0 ;überspringe nächsten Befehl, falls Taster1 nicht gedrückt rcall LED_1_an ;springe Unterprogramm an sbic PINB, 2 ;überspringe nächsten Befehl, falls Taster 2 gedrückt rcall LED_2_aus ;springe Unterprogramm an sbis PINB, 2 ;Überspringe nächsten Befehl, falls Taster 2 nicht gedrückt rcall LED_2_blink ;springe Unterprogramm an rjmp main ;endlosschleife ; ; ;************* Unterprogramm LED_1_aus ************* ; LED_1_aus: cbi PORTB, 1 ;Lösche Bit 1 im PORT B ret ; ; ;************* Unterprogramm LED_1_an ************** ; LED_1_an: sbi PORTB, 1 ;Setze Bit 1 im PORT B ret ; ; ;************ Unterprogramm LED_2_aus ************** ; LED_2_aus: cbi PORTB, 3 ;Lösche Bit 3 des PORT B ret ; ; ;************ Unterprogramm LED_2_blink ************ ; LED_2_blink: sbiw ZL, 1 ;Subtrahiere 1 von 16bit Registerpaar (Zähler) brne main ;springe zurück zu main, solange Zero-Flag nicht gesetzt in r18, PINB ;aktueller Wert des Port B wird in Register r18 gelesen eor r18, exor ;maskieren, damit nur Bit 3 geändert wird out PORTB, r18 ;ausgeben an PORT B ldi ZH,HIGH(65535) ;High-Byte des "16bit-Zählers" mit 65535 laden (Z-Register) ldi ZH,LOW(65535) ;dito low-byte ret