Hier mal die Aufgabe vom Freitag wie ich sie gelöst habe! Einfach alles in AVR Studio kopieren viel spaß
;*********************************************************************** ;* 7 S E G M E N T * ;* * ;* Autor : Tonn * ;* Datei : "7_Segment.asm" * ;* Datum : 30.04.2010 * ;* Version : 1.0 * ;* uC : ATMEGA16 * ;* * ;* Beschreibung: * ;* * ;* (PD0) wird als Taster verwendet der einen Z�hler ansteuert, dieser * ;* gibt seine Zahl an ein 7 Segment ab. Wenn der Z�hler gr��er wie 9 * ;* wird, so wird dieser genullt. * ;*********************************************************************** .include "m16def.inc" init: ldi r16, 0xFF // Lade 8 einser in Register 16 out DDRB, r16 // Lade Register 16 (mit den 8 einser) in DDRB // und deklariere DDRB somit als Ausgang ldi r16, 0x00 // Lade 8 nuller in Register 16 out DDRD, r16 // Lade Register 16 (mit den 8 nuller) in DDRD // und deklariere DDRD somit als Eingang // Der folgende Teil ist daf�r da um den Stack zu // initialisieren das brauch man einfach bei einem // Microkontroller mit mehr als 256Byte Ram ldi r16,low(RAMEND) // Lade low in Register 16 out spl,r16 // Lade Register 16 (low) in Stack ldi r16,high(RAMEND) // Lade High in Register 16 out sph,r16 // Lade Register 16 (high) in Stack ;---------------------------------------------------------------------------- Nullen: ldi r17, 0x00 // r17 ist mein Z�hler, der wird am Anfang erst mal // auf Null gesetzt Main: in r16, PinD // Lade PinD (Eing�nge) in Register 16 andi r16, 0x01 // Da uns nur PD0 interessiert und dieser ganz // rechts steht wird der Rest von dem Byte einfach // mit "&0" ausgeblendet cpi r16, 0 // vergleiche r16 mit 0 breq Main // wenn PD0 0 ist soll er zu Main springen und das so oft // bis PD0 gedr�ckt wird inc r17 // erh�he Register 17 um 1 cpi r17, 10 // vergleiche Register 17 mit 10 brne loop // wenn Register 17 kleiner wie 10 ist springe zu loop rjmp Nullen // springe zur Marke Nullen loop: rcall UP_7Segment // Unterporgramm "UP_7Segment" wird aufgerufen loop1: in r16, PinD // Lade PinD (Eing�nge) in Register 16 andi r16, 0x01 // Da uns nur PD0 interessiert und dieser ganz // rechts steht wird der Rest von dem Byte einfach // mit "&0" ausgeblendet cpi r16, 0 // vergleiche r16 mit 0 brne loop1 // wenn PD0 1 ist soll er zu loop1 springen und das so oft // bis PD0 nicht mehr gedr�ckt wird rjmp main // Sprung zu Marke main UP_7Segment: cpi r17, 1 // Vergleiche Register 17 mit 1 breq eins // Wenn Register 17 1 ist springe zu Marke eins cpi r17, 2 // Vergleiche Register 17 mit 2 breq zwei // Wenn Register 17 2 ist springe zu Marke zwei cpi r17, 3 // Vergleiche Register 17 mit 3 breq drei // Wenn Register 17 3 ist springe zu Marke drei cpi r17, 4 // Vergleiche Register 17 mit 4 breq vier // Wenn Register 17 4 ist springe zu Marke vier cpi r17, 5 // Vergleiche Register 17 mit 5 breq funf // Wenn Register 17 5 ist springe zu Marke funf cpi r17, 6 // Vergleiche Register 17 mit 6 breq sechs // Wenn Register 17 6 ist springe zu Marke sechs cpi r17, 7 // Vergleiche Register 17 mit 7 breq sieben // Wenn Register 17 7 ist springe zu Marke sieben cpi r17, 8 // Vergleiche Register 17 mit 8 breq acht // Wenn Register 17 8 ist springe zu Marke acht cpi r17, 9 // Vergleiche Register 17 mit 9 breq neun // Wenn Register 17 9 ist springe zu Marke neun // Die Segmente der 7-Segmentanzeige sind wie folgt angebracht // Ob 0000 0000 // gfe dcba eins: ldi r16, 0b00000110 // lade Bin�rcode f�r die Anzeige der Zahl 1 in Register 16 out PortB, r16 // transferiere Register 16 in PortB ret // springe zur�ck zum Aufruf des UP's zwei: ldi r16, 0b01011011 // lade Bin�rcode f�r die Anzeige der Zahl 2 in Register 16 out PortB, r16 // transferiere Register 16 in PortB ret // springe zur�ck zum Aufruf des UP's drei: ldi r16, 0b01001111 // lade Bin�rcode f�r die Anzeige der Zahl 3 in Register 16 out PortB, r16 // transferiere Register 16 in PortB ret // springe zur�ck zum Aufruf des UP's vier: ldi r16, 0b01100110 // lade Bin�rcode f�r die Anzeige der Zahl 4 in Register 16 out PortB, r16 // transferiere Register 16 in PortB ret // springe zur�ck zum Aufruf des UP's funf: ldi r16, 0b01101101 // lade Bin�rcode f�r die Anzeige der Zahl 5 in Register 16 out PortB, r16 // transferiere Register 16 in PortB ret // springe zur�ck zum Aufruf des UP's sechs: ldi r16, 0b01111100 // lade Bin�rcode f�r die Anzeige der Zahl 6 in Register 16 out PortB, r16 // transferiere Register 16 in PortB ret // springe zur�ck zum Aufruf des UP's sieben: ldi r16, 0b00000111 // lade Bin�rcode f�r die Anzeige der Zahl 7 in Register 16 out PortB, r16 // transferiere Register 16 in PortB ret // springe zur�ck zum Aufruf des UP's acht: ldi r16, 0b01111111 // lade Bin�rcode f�r die Anzeige der Zahl 8 in Register 16 out PortB, r16 ret // springe zur�ck zum Aufruf des UP's neun: ldi r16, 0b01101111 // lade Bin�rcode f�r die Anzeige der Zahl 9 in Register 16 out PortB, r16 ret // springe zur�ck zum Aufruf des UP's