Erklärung
In dieser Aufgabe werden die Zahlen von 1 bis 6 durch eine 7-Segment-Anzeige dargestellt.
Zur Lösung der Aufgabe benützen wir eine indirekte Adressierung @DPTR im 16 bit- Adressraum und Define Byte (DB).
Die Zahlen 1 bis 6 haben folgende Entsprechungen:
Ausgabewert
Hexzahl
Eins
12h
Zwei
0BCh
Drei
0B6h
Vier
0D2h
Fünf
0E6h
Sechs
0EEh
Am Ende der Datenzeile setze man 0FFh, um das Ende der Zeile zu markieren (end of line).
Assemblercode
Code at 0000h
P2 equ 0A0h
P3 equ 0B0h
clr P3.6 ; Eine 7-Segment-Anzeige loeschen/abschalten
init: mov DPTR, #Daten ; Daten laden
start: clr A ; Akku loeschen
movC A, @A+DPTR ; Indirekte 16-Bit-Adressierung.
; Es wird auf diese Weise wegen der
; Besonderheiten des Prozessors gemacht.
;
CJNE A, #0FFh, weiter ; Pruefe, ob "end of line" (Ende der Zeile).
sjmp init ; Wenn ja, von Anfang an.
weiter: mov P2, A ; Ausgabe des Akkuinhaltes
INC DPTR ; Naechstes Datum nehmen.
sjmp start ; Zurueck zu Start
ORG 0C0h
Daten: DB 12h, 0BCh, 0B6h, 0D2h, 0E6h, 0EEh, 0FFh
; Liste der Zustaende der 7-Segment-Anzeige,
; 1 bis 6
END
Programmablaufplan
Bild 21. Programmablaufplan für die Aufgabe 4
Adressierungsarten
1. Unmittelbare Adressierung.
Einer Variable (einem Speicherplatz, dem Akku oder einem Register) wird unmittelbar ein Wert zugeordnet.
#01h->R1
oder
mov R1, #01h
2. Direkte Adressierung.
Einer Variable (einem Speicherplatz, dem Akku oder einem Register) wird direkt der Inhalt Wert einer anderen Variable (eines Speicherplatzes, des Akkus oder eines Registers) zugeordnet.
<A>->R1
mov R1, A
3. Indirekte Adressierung.
Einer Variable (einem Speicherplatz, dem Akku oder einem Register) wird direkt der Inhalt der Speicherzelle zugeordnet, deren Adresse dem Inhalt einer anderen Variable (eines Speicherplatzes, des Akkus oder eines Registers) entspricht.
<<A>>->R1
mov A, 0ACh
mov R1, @A
Nach dem Ausführen steht der Inhalt der Speicherzelle mit der Adresse 0ACh in R1.
Aufgabe 5. Programmierung der 8051Win-Simulation der 7-Segment-Anzeige
In dieser Aufgabe werden die Zahlen von 1 bis 6 durch eine 7-Segment-Anzeige dargestellt. Zur Lösung der Aufgabe benützen wir CJNE-Befehl, DPTR und Define Byte (DB). Die Aufgabe 5 ist im Prinzip die Aufgabe 4. Jedoch benötigen wir hier eine Zeitpause, damit wir den Ergebnis prüfen können.
Die Programmierung wurde erfolgreich während des Unterrichts durchgeführt. Die Simulation mit dem Programm 8051Win ist wegen der Zeitpause nicht sinnvoll.
lcall uptime ; Zeitpause
; Liste der Zustaende der 7-Segment-Anzeige.
uptime:
mov R3, #10 ; lädt 10 in R3 ein
loop3: mov R2, #100 ; Unterschleife; lädt 100 in R2 ein
loop2: mov R1, #100 ; Unterschleife; lädt 100 in R2 ein
loop1: djnz R1, loop1 ; bedingter Sprung zurück
djnz R2, loop2 ; bedingter Sprung zurück
djnz R3, loop3 ; bedingter Sprung zurück
RET ; Das Programm wird an der Stelle ; fortgesetzt, an der das Unter- ; programm aufgerufen wurde, also ; nach der lcall uptime
Programmablaufplan.
Bild 22. Programmablaufplan für die Aufgabe 5
Aufgabe 6. Langsam auslaufender/nachlaufender Zähler
Erklärung.
Die Aufgabe 6 ist eine Erweiterung der Aufgaben 4 und 5. Jetzt brauchen wir, dass der Zähler mit einer Beschleunigung oder verzögerung zählt.
P1 equ 90h
clr P3.6 ; eine 7-Segment-Anzeige abschalten
mov 0F9h, #1 ; eins in die Speicherzelle 0F9h laden
init: mov DPTR, #Daten ; s. Bemerkungen zu Nr. 4 und 5
start: clr A
movC A, @A+DPTR
CJNE A, #0FFh, weiter
sjmp init
weiter: mov P2, A
stopp: JB P1.0, beschleunigen ; wenn P1.0-Schalter auf 1 steht,
;beschleunigen
langsamer: ;
mov R4, 0F9h ; der Inhalt der Speicherzelle 0F9h ins
;R4 laden
cjne R4, #7, verzoegern ; vergleichen mit #7.
;Bei Ungleichheit zum Verzoegern (also
;einfach weiter) gehen
sjmp stopp ; Bei Gleichheit zum Stopp gehen
verzoegern:
inc R4 ; durch Erhoehung von R4 macht man die
; Pause laenger
mov 0F9h, R4 ; Inhalt von R4 ins R3 ueber
mov R3, 0F9h ; eine Speicherzelle laden
sjmp vor ; Zur Pause springen
beschleunigen:
mov R3, #1
mov R4, 0F9h
cjne R4, #1, go ; wenn noch keine 1, beschleunigen
; durch go
sjmp vor
go:
dec R4 ; durch Verkleinerung von R4 macht man
; ; die Pause kuerzer
vor:
LCALL uptime ; Pause ausführen
INC DPTR ; naechstes Datum nehmen.
sjmp start
Daten: DB 12h, 0BCh, 0B6h, 0D2h, 0E6h, 0EEh, 0FFh;
loop3: mov R2, #200
loop2: mov R1, #250
loopl: djnz R1, loopl
djnz R2, loop2
djnz R3, loop3
RET
Bild 24. Programmablaufplan für die Aufgabe 6
Code at Adresse
Legt fest, ab welcher Adresse der Programmcode gespeichert wird. Bei uns ist es immer ab Anfang.
end
Ein Assembler-Programm wird mit dem Befehl End beendet.
DJNZ (Decrement Jump if Not Zero; dekrementiere, springe, wenn nicht Null)
DJNZ Adresse, rel
DJNZ Rn, rel
Der Befehl vermindert Adresseinhalt (Adresse) bzw. Registerinhalt (Rn) um eins und verzweigt zu rel, wenn das Ergebnis ungleich Null ist.
CJNE – Befehl (Compare Jump if Not Equal)
CJNE Adresse, #data, rel oder CJNE Adresse, Adresse, rel
Vergleicht Adresse mit #data / Adresse und verzweigt nach rel wenn es ungleich ist.
JB (Jump Bit)
JB bit, rel
Springt zu rel beim gesetzten Bit (bit)
Ausgabe EQU und MOV
mov P2, #data
Zuerst wird die Adresse 0A0h dem P2 zugewiesen, danach werden die Daten (#data) ausgegeben. Mit dem Befehl mov können einer bestimmten Adresse verschiedene Sachen zugeordnet werden z.B. Wert, Daten oder eine andere Adresse.
Auf diese Weise lässt sich auch die Ausgabe auf die LPT Schnittstelle und Parallele Schnittstelle realisieren.
SJMP (Short Jump)
SJMP Programmpunkt
Relativer Programmsprung im Bereich -128 bis 127 zur nachfolgenden Befehlsadresse.
LCALL
Mit diesem Befehl wird ein Unterprogramm aufgerufen (LCALL Unterprogrammname)
Der Befehl lässt das Programm an die Stelle zurückspringen, an der er aufgerufen wurde und das Programm läuft dort weiter.
INC und DEC
Mit den Befehlen wird der Wert um 1 erhöht bzw. verkleinert.
ORG
Der Befehl legt fest die Stelle, an der der nachfolgende Quellcode abgelegt wird. Er ist mit dem Befehl „Code at Adresse“ vergleichbar (ORG Adresse). Der Wert liegt zwischen 00h und FFh.
Quellenangabe
1. Im Unterricht angeeignetes Wissen
2. CD von Herrn A. Hein mit Programmen und Erklärungen
3. Wikipedia (www.wikipedia.org)
4. http://www.humerboard.at/
5. Modul-Hardware ( http://www.humerboard.at/doku/sb8/hardware_sb8.pdf )
6. Uthishdran Sreeranganathan stellte mir das Foto der BB-Mikrocontrollerplatine zur Verfügung
Anlage: CD
Ñòðàíèöû: 1, 2, 3, 4