[fta1] INF 7segment

  • From: walde256@xxxxxxx
  • To: fta1@xxxxxxxxxxxxx
  • Date: Sun, 02 May 2010 08:35:46 -0400

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 



Other related posts:

  • » [fta1] INF 7segment - walde256