Die 8051-Mikrocontrollerfamilie. 3. Die 8051-Mikrocontrollerfamilie

Ähnliche Dokumente
MOP: Befehlsliste für den Mikrocontroller 8051

Befehlssatz der Mikrocontroller der 51er -Familie

Befehlssatz der Mikrocontroller der 51er -Familie

Zusammenfassung der Assemblerbefehle des 8051

4 Assembler für die 8051-Controller-Familie

Architektur der Intel 8051 Familie und Grundlegende Programmierung Reto Gurtner 2005

Praktikum Mikrorechner 4 (Bitmanipulation und Spezialregister)

EDT-REFERAT Adressierungsarten

Komponenten eines Mikrocontrollers

Mikrocomputertechnik. Thema: Der Aufbau des XC888-Mikrocontrollers -Teil 1 -

Hardwareaufbau der Mikrocontroller der 51er -Familie

8051-Mikrocontroller-Familie

Übungen für die Einführung in die Assemblerprogrammierung mit dem Prozessor c515c

Praktikum Mikrorechner 3 (Adressierungsarten)

MikroController der 8051-Familie

05. Assembler-Programmierung. Datenstrukturen des ATMega32. Literatur

9. Assembler: Der Prozessor Motorola 68000

Speicheraufbau des AT89C5131

10. Die Adressierungsarten des MSP 430

LCD-Display am MVUS (nur einfachste Betriebsweise im Text Display Modus - ausführliche Beschreibung )

Assembler und Hochsprachen

Kap.2 Befehlsschnittstelle. Prozessoren, externe Sicht

Mikrocomputertechnik

Grundlagen Mikroprozessortechnik

Kurzbeschreibung der Hardware, das Schreiben von Software, Testen und Simulation mittels ASM51 und C51 sowie dscope (tscope)-51 und µprofi 51


Zähler- und Zeitgeber-Baugruppen

Von-Neumann-Architektur

Praktikum Mikrorechner 1 (Einführung)

Interruptverarbeitung. 7. Interruptverarbeitung. 7.1 Ablauf einer Programmunterbrechung

Aufbau eines Taschenrechners

Maschinenorientierte Programmierung

Mikrocontrollerprogrammierung in Assembler und C

Mikrocomputertechnik 2.Mikroprozessor

Microcomputertechnik

2

10. Der Befehlssatz des MSP 430

Praktikum Mikrorechner 8 (Pulsweitenmodulation und Automaten)

Einführung in das Mikrocontroller-System 80(C)515/80(C)535

Teil 1: Prozessorstrukturen

Daniel Betz Wintersemester 2011/12

1. Inhaltsverzeichnis

Die Mikroprogrammebene eines Rechners

Praktikum Mikrorechner 9 (serielle Schnittstelle)

PIC16 Programmierung in HITECH-C

Allgemeine Struktur eines Digitalrechners

Steffen Weißer Juni 2003 TG 12/3

Mikrocomputertechnik. Adressierungsarten

Mikrocontrollertechnik

Vorwort 8. Kap. 1: Grundlagen 10

Lösungsvorschlag 9. Übung Technische Grundlagen der Informatik II Sommersemester 2009

Einführung in AVR Assembler

Der Anschluss eines seriellen 16kb EEProms an die I²C Schnittstelle ist denkbar einfach: Hier als Beispiel mit einem ST24C16:

FAKULTÄT FÜR INFORMATIK

Rechnerarchitektur Atmega Vortrag Atmega 32. Von Urs Müller und Marion Knoth. Urs Müller Seite 1 von 7

Das Projekt Pathfinder

$NOMOD51 $INCLUDE (reg515.inc) ; Ein Zeichen auf Tastendruck S1 senden...

Prinzipieller Aufbau und Funktionsweise eines Prozessors

Assembler Integer-Arithmetik

Die Entwicklungsumgebung

Teil 1: Prozessorstrukturen

Einführung in die Informatik

einfache PIC-Übungsprogramme

Mikrocomputertechnik

Der Toy Rechner Ein einfacher Mikrorechner

Maschinensprache und Assembler

Teil III: Wat macht ene Mikrokontroller?

Technische Informatik 2 Adressierungsarten

verzeichnis Bernd-Dieter Schaaf, Peter Wissemann, Stephan Böcker Mikrocomputertechnik

Skriptum Mikrocontroller-Systeme. Kapitel 6: Kapitel 7:

Inhaltsverzeichnis VII. Teil I: PC- und Mikrocomputer-Technik

MC Mikrocomputertechnik (MC) Bitte nehmen Sie sich ein Exemplar der bereitliegenden Kopien

PC/XT/AT ASSEMBLER-BUCH

Rechnergrundlagen SS Vorlesung

Prozessor HC680 fiktiv

Mikrocomputertechnik

Inhaltsverzeichnis VII

Inhaltsverzeichnis 1 Ein-Bit-Rechner Mikrorechentechnik-Grundlagen Das Mikrocontrollersystem ein Überblick am Beispiel MSP430F1232

Kap 4. 4 Die Mikroprogrammebene eines Rechners

7.0 PWM - Pulsbreitenmodulation

Geräteentwurf mit Mikroprozessoren 1

Mikroprozessor bzw. CPU (Central Processing. - Steuerwerk (Control Unit) - Rechenwerk bzw. ALU (Arithmetic Logic Unit)

Mikrocomputertechnik

Teil 1: Prozessorstrukturen

E Mikrocontroller-Programmierung

Teil 2: Rechnerorganisation

Prof. Dr. Sven-Hendrik Voß Sommersemester 2017 Technische Informatik (Bachelor), Semester 2 Termin 2, Maschinenorientierte Programmierung

FAKULTÄT FÜR INFORMATIK

Befehle zur Verarbeitung von Daten ( data processing ):

Informatikgrundlagen I Grundlagen der Informatik I

Inhaltsverzeichnis VII.

Mikroprozessor als universeller digitaler Baustein

Mikroprozessoren Grundlagen AVR-Controller Input / Output (I/O) Interrupt Mathematische Operationen

Stack, Stackpointer, Unterprogramm HP: 0 * 1 * 2 * 3 CAL UP1 4 * 5 * 6 CAL UP2 7 *... UP1: 30 * 33 RET UP2: 40 * 41 CAL UP1 42 * 43 RET

Prozessorarchitektur. Kapitel 1 - Wiederholung. M. Schölzel

4 Der Von-Neumann-Rechner als Grundkonzept für Rechnerstrukturen

Übungsblatt 10 (Block C 2) (16 Punkte)

B1 Stapelspeicher (stack)

Name: ES2 Klausur Thema: ARM Name: Punkte: Note:

Transkript:

3. Anfang der 80-er Jahre brachte Intel den 8051-Mikrocontroller als Nachfolger der ersten Mikrocontrollergeneration 8048 auf den Markt. Der Befehlssatz ist stark auf die Lösung von Steuerungsaufgaben zugeschnitten, doch neben speziellen Befehlen zur Einzelbitverarbeitung stehen auch Befehle zur Multiplikation und Division zur Verfügung, sodaß auch Aufgaben der Meßwertverarbeitung und der Regelungstechnik effizient gelöst werden können. Die 8051-Familie bestand zu Beginn aus folgenden Prozessorvarianten: 8051 Prozessor mit integriertem Programmspeicher (ROM) für Anwendungen mit hohen Stückzahlen. Der Programmspeicher wird schon bei der Herstellung des Chips programmiert. 8031 Prozessor ohne internen Programmspeicher. Der Programmspeicher muß extern angeschaltet werden. Nachteil: für die Anschaltung des Programmspeichers werden Portanschlüsse benötigt, die dann u.u. für Ein/Ausgaben fehlen. 8751 Prozessor mit integriertem 4 kbyte EPROM. Das EPROM ist mit UV-Licht löschbar und der Prozessor anschließend wieder programmierbar. Alle Portanschlüsse sind frei verfügbar. Durch das im Gehäuse befindliche Quarzglasfenster ist dieser Prozessor in der Herstellung erheblich teurer als die ROM-lose Version. Der 8751 ist etwa um den Faktor 5 bis 10 teurer als der 8031. Durch die Einführung von Special-Function-Registern im internen RAM hat man eine Rechnerstruktur entwickelt, die sehr flexibel erweiterbar ist. Unter Beibehaltung der Grundstruktur des 8051 und seines Befehlssatzes läßt sich ein erweitertes System einfach dadurch entwickeln, indem man zusätzliche Funktionen wie z.b. einen Analog- Digitalwandler auf dem Chip integriert und die Register des Analog-Digitalwandlers an freie Stellen im Special- Function-Registerbereich legt. Maximal sind 128 verschiedene Special-Function-Register (SFR) adressierbar, der 8051 benutzt hiervon 21. Die meisten dieser 21 SFR sind für die 8051-Familie und ihre Derivate verbindlich, sodaß bereits vorhandene Software in großem Umfang wiederverwendbar ist. Eine größere Anzahl von Herstellern hat von Intel Lizenzen für die Benutzung des 8051-Kernes genommen und den Kern um eigene Funktionen erweitert. Siemens hat z.b. die Zahl der Parallelports erweitert, einen weiteren, leistungsfähigen Zähler/Zeitgeber und einen Analog-Digitalwandler mit 8-Kanal-Multiplexer integriert. Dieser Baustein hat die Bezeichnung 80515, seine ROM-lose Version heißt 80535. Eine nochmals stark erweiterte Prozessorversion ist 1990 als 80517 auf den Markt gekommen. Eine noch größere Zahl von 8051-Derivaten bietet Philips an, vor allem auf dem Gebiet der Konsumelektronik und der verteilten Controllersysteme (CAN - Controller Area Network). Obwohl die erwähnten 8051-Derivate wesentlich leistungsfähiger und moderner sind als der schon etwas "betagte" 8051, werden in den nächsten Kapiteln nur die Funktionen des 8051 benutzt. Im Rahmen dieser Einführung ist es aus Gründen der Übersichtlichkeit sinnvoll, sich auf die grundsätzlichen Zusammenhänge zu beschränken. Hinweise auf den im Labor benutzten 80535-Prozessor findet man in einem der letzten Kapitel. In diesem Skript soll eine Einführung in die maschinennahe Programmierung vermittelt werden. Es wird daher im folgenden auf die Registerstruktur, die Speicheraufteilung und den Befehlssatz eingegangen. Dies ist eine Beschreibung aus der Sicht des Programmierers. Die Beschreibung der Hardware wird auf das zum allgemeinen Verständnis Notwendige beschränkt. 3-1

3.1. Hardwarestruktur des 8051 Der 8051 ist ein Ein-Chip-Mikrocontroller, der alle für einen Mikrorechner notwendigen Funktionseinheiten bis auf die Taktversorgung enthält. In Abb. 3.1. ist das Blockschaltbild des 8051 angegeben. 4-KByte- Programmspeicher 128-byte- Datenspeicher 2 x 16-bit- Zähler/Zeitgeber 8-bit-CPU 1-bit-Boolescher- Prozessor Interrupt-Logik Parallele Eingabe-Ausgabe 4 x 8 bit Serielle Eingabe-Ausgabe 8 8 8 8 Abb. 3.1. Blockschaltbild des 8051 In dem Baustein befinden sich 8-Bit-CPU 1-Bit-Boolscher Prozessor 4K Byte Programmspeicher 128 Byte interner Datenspeicher 4 Ein/Ausgabeports à 8 Bit 2 16-Bit Zeitgeber/Zähler serielle Schnittstelle für Vollduplexbetrieb Interruptsystem für 5 unterschiedliche Interruptquellen in zwei Prioritätsebenen Der Verständlichkeit halber ist in Abb. 3.2. ein verfeinertes Blockschaltbild des 8051 angegeben. Man erkennt hier sehr gut den internen Daten- und Adressbus und die Anschaltung einzelner Funktionsblöcke an das Bussystem. Über Port 0 und Port 2 kann ein externes Bussystem an das interne Bussystem angekoppelt werden. Als einzige externe Bauelemente sind ein Quarz und zwei Kondensatoren an den Controller anzuschließen. Die 8-Bit-CPU hat drei Arbeitsregister: den ACC für alle arithmetischen und logischen Operationen das B-Register für 8-Bit-Multiplikation und Division sowie als allgemein nutzbares Register das Programmstatuswort PSW, das die vier von der ALU beeinflußten Flags CY, AC, OV und P enthält sowie ein durch Software setz- bzw. rücksetzbares Flag F0 und zwei Auswahlbits RS0 und RS1 zur Festlegung der aktiven Registerbank, siehe auch Abb. 3.3. 3-2

Abb. 3.2 Verfeinertes Blockschaltbild des 8051 (nach Valvo-Unterlagen) 3-3

Abb. 3.3. Programmstatuswort des 8051 CY AC F0 RS1 RS0 OV -- P CY - Übertragsbit, wird von Additions- und Subtraktion- sowie logischen und Schiebeoperationen beeinflußt AC - Hilfsübertragsbit (Auxiliary Carry) wird von Additions- und Subtraktionsbefehlen beeinflußt. Muß bei BCD-Arithmetik verwendet werden. OV - Überlaufbit bei Rechnung mit vorzeichenbehafteten Zahlen im 2-Komplement P - Parität. Wird gesetzt, wenn die Anzahl der "Einsen" im Accu ungerade ist, sonst wird es rückgesetzt F0 - ist ein vom Benutzer frei verfügbares Bit (Flag) RS1,RS0 wählen die gerade aktive Registerbank aus. Nach Einschalten des Prozessors wird automatisch Registerbank 0 eingeschaltet. Die von der ALU beeinflußten Flags werden nach jeder arithmetischen und logischen Operation je nach Ergebnis gesetzt bzw. rückgesetzt. Das CY-Flag wird z.b. nach jeder Addition oder Subtraktion gesetzt, wenn das Ergebnis nicht im 8-Bit- darstellbar ist (Übertrag), es wird rückgesetzt, wenn das Ergebnis in 8 Bit darstellbar ist. Mit Hilfe von bedingten Sprungbefehlen kann dann auf ein Übertragsereignis reagiert werden. Mit dem Befehl JC FEHLER würde z.b. zum Programmteil Fehler gesprungen werden, wenn ein Übertrag aufgetreten ist (JC - Jump on Carry). Der 8051 enthält in seinem Programmstatuswort kein Z-Flag (Zero Flag)! Die bedingten Sprungbefehle JZ (Jump on Zero) bzw. JNZ (Jump on no Zero) werten bei ihrer Ausführung den Inhalt des Accus direkt aus. Das Carry-Bit des PSW dient zusätzlich als 1-Bit-Boolscher Accumulator, d.h. Ergebnisse logischer Bitoperationen stehen grundsätzlich im Carry-Bit. Der Befehl ORL C,P1.1 z.b. verknüpft das Carry-Bit mit dem Bit P1.1 (Port 1, Bit 1) ODER und schreibt das Ergebnis der Operation in das Carry-Bit zurück. Der Boolsche macht das sonst bei vielen Prozessoren notwendige Ausmaskieren von Bits vor deren Weiterverarbeitung überflüssig und beschleunigt damit den Programmablauf. Der 8051 hat getrennte Programm- und Datenspeicheradreßräume (Havard-Architektur). Grundsätzlich muß man unterscheiden zwischen Programmspeicher (interner Programmspeicher je nach Prozessortyp 4K Byte oder 0K Byte, externer Programmspeicher bis 60K Byte bzw. 64K Byte) interner Datenspeicher 128 Byte RAM (Bei Nachfolgetypen meistens 256 Byte ) Bereich der Special-Function-Register max. 128 Byte externer Datenspeicher bis zu 64K Byte anschließbar Für den Programmierer ist vor allem der Datenspeicher interessant. Abb. 3.4. gibt eine erste Übersicht über den internen und externen Datenspeicher 3-4

direkt adressierbar FF 80 7F 0 obere 128 Byte internes RAM untere 128 Byte internes RAM Special Function Register direkt und indirekt adressierbar FFFF 0 Externer Datenspeicher (optional) Abb. 3.4. Datenspeicher und zulässige Adressierung Immer vorhanden ist der interne Datenspeicher im Bereich von 0 bis 7FH (127 10 ). Alle Speicherplätze in diesem Bereich sind byteweise les- und schreibbar und sowohl direkt als auch registerindirekt adressierbar. Es gibt hier aber auch Bereiche, die zusätzliche Funktionen haben. So sind in den unteren 32 Byte des internen RAM's vier Registerbänke mit jeweils acht Registern (R0 bis R7) untergebracht. Die Register sind vom Befehlssatz her sehr flexibel einsetzbar. Sie dienen vor allem als temporäre Speicherplätze für Größen, auf die häufig zugegriffen wird. Es ist zur Zeit jeweils immer nur eine Registerbank aktiv. Welche dies ist, wird über die Bits RS0 und RS1 im Programmstatuswort festgelegt (s. Abb. 3.3.). Damit bei der Bearbeitung mehrerer Aufgaben nicht immer die Register gerettet werden müssen, kann bei Aufgabenwechsel in eine andere Bank umgeschaltet werden. Ist die neue Aufgabe beendet und soll die zuvor unterbrochene Aufgabe fortgesetzt werden, muß nur auf die alte Registerbank umgeschaltet werden. Die in dieser Registerbank befindlichen Register sind nicht verändert worden, obwohl im unterbrochenen Programm ebenfalls mit den Registern R0 bis R7 gearbeitet wurde. Diese sind aber, da sie zu einer anderen Registerbank gehörten, in anderen Speicherplätzen angesiedelt. Der Bereich 20H bis 2FH ist zusätzlich bitadressierbar. Jedes Bit in diesem Bereich kann über entsprechende Befehle direkt angesprochen und ausgewertet werden. In Abb. 3.5. sind die einzelnen Bitadressen angegeben. Das niederwertigste Bit des Speicherplatzes 21H hat demnach die Bitadresse 8. Dieses Bit kann z.b. durch den Befehl SETB 8 gesetzt oder durch CLR 8 rückgesetzt werden. Ein bedingter Sprung in Abhängigkeit von diesem Bit ist ebenfalls möglich, z.b. JB 8,FEHLER bedeutet, daß zu einer Fehlerbehandlung gesprungen wird, wenn das Bit 8 gesetzt ist. Im Assemblerprogramm können diese Bits auch mit symbolischen Namen versehen werden, sodaß der bedingte Sprung dann auch die Form JB ÜBERLAST,FEHLER haben könnte. Das Bit mit der physikalischen Adresse 8 hat aus Gründen der leichteren Lesbarkeit eines Programms den symbolischen Namen ÜBERLAST bekommen. Der Bereich von 30H bis 7FH ist ein allgemein nutzbarer Speicherbereich, in dem beim 8751 auch noch der Kellerspeicher (Stack) untergebracht werden muß. Der Stack wird vom 8-Bit-Stackpointer verwaltet und kann im gesamten internen Daten-RAM plaziert werden. Der Stackpointer zeigt jeweils auf den letzten vom Prozessor bei Stackoperationen beschriebenen Speicherplatz. Eine Plazierung des Stacks im externen Daten-RAM ist nicht möglich. Abb. 3.5. zeigt die Aufteilung der unteren 128 Byte des internen RAM-Speichers. Er ist sowohl direkt als auch über die Register R0 und R1 indirekt adressierbar. 3-5

7FH 30H 7F 7E 7D 7C 7B 7A 79 78 2FH 77 76 75 74 73 72 71 70 2EH 6F 67 5F 57 4F 47 3F 37 2F 27 1F 17 0F 07 6E 6D 6C 6B 6A 69 68 2DH 66 65 64 63 62 61 60 2CH 5E 5D 5C 5B 5A 59 58 2BH 56 55 54 53 52 51 50 2AH 4E 4D 4C 4B 4A 49 48 29H 46 45 44 43 42 41 40 28H 3E 3D 3C 3B 3A 39 38 27H 36 35 34 33 32 31 30 26H 2E 2D 2C 2B 2A 29 28 25H 26 25 24 23 22 21 20 1E 1D 1C 1B 1A 19 18 16 15 14 13 12 11 10 24H 23H 22H 0E 0D 0C 0B 0A 09 08 21H 06 05 04 03 02 01 00 20H RB 3 1FH 18H 17H RB 2 10H 0FH RB 1 08H R7 R6 R5 R4 R3 R2 R1 R0 RB 0 07H 06H 05H 04H 03H 02H 01H 00H Abb. 3.5. Aufteilung der unteren 128 Byte des internen RAM Im Adressbereich 80H bis FFH des internen RAM liegen nach Abb. 3.4. zwei Speicher parallel, die oberen 128 Byte des internen Daten-RAM und der Bereich der Special-Function-Register (SFR). Die Eindeutigkeit ihrer Adressierung wird durch unterschiedliche Adressierungsarten, mit denen diese Bereiche angesprochen werden, erreicht. Die oberen 128 Byte Datenspeicher, die nicht im 8051, aber in fast allen Nachfolgetypen vorhanden sind, sind nur über registerindirekte Adressierung über die Register R0 und R1 ansprechbar. In Assemblerschreibweise wird registerindirekte Adressierung mit dem Zeichen '@' kenntlich gemacht. Um einen Speicherplatz in den oberen 128 Byte ansprechen zu können, muß also zuerst seine Adresse entweder in das Register R0 oder R1 geladen werden (nur diese beiden Register sind für registerindirekte Adressierung zugelassen) und dann ein registerindirekter Zugriff erfolgen. Beispiel: Lesen des Inhaltes des Speicherplatzes des internen Daten-RAM mit der Adresse 80H: MOV R0,#80H ; Adresse in Zeigerregister laden MOV A,@R0 ; Inhalt in Accu bringen Diese Art der Adressierung ist etwas umständlicher und langsamer als die direkte Adressierung in den unteren 128 Byte des internen RAM. Man wird deshalb bestrebt sein, häufig benutzte Variable im direkt adressierbaren RAM und weniger häufig benutzte Variable im indirekt adressierbaren RAM, sofern vorhanden, abzuspeichern. Ist der RAM-Bereich ab 80H vorhanden, sollte in ihm auch der Stack angelegt werden, denn der 8-Bit Stackpointer kann das gesamte interne RAM verwalten. 3-6

Der parallel zum Daten-RAM liegende Special-Function-Register-Bereich ist nur durch direkte Adressierung erreichbar. Will man z.b. den Speicherplatz 80H des SFR-Bereiches lesen, so erfolgt dies durch direkte Angabe der Adresse im Befehl: MOV A,80H ;Inhalt des Speicherplatzes 80H --> ACCU Abb. 3.6. zeigt den SFR-Bereich des 8051 mit den dort vorhandenen 21 Special-Function-Registern. B *) F0H ACC *) E0H PSW *) D0H IP *) B8H P3 *) B0H IE *) A8H P2 *) A0H SBUF SCON *) 99H 98H P1 *) 90H TH1 TH0 TL1 TL0 TMOD TCON *) PCON 8DH 8CH 8BH 8AH 89H 88H 87H DPH DPL SP P0 *) 83H 82H 81H 80H *) bitadressierbar Abb. 3.6. Special-Function-Register des 8051 Relativ einfache SFR sind die 8-Bit-Ports P0 bis P3. Durch eine geschickt gewählte Hardwarestruktur sind sie ohne zusätzliche Programmierung sowohl als Eingabe- als auch als Ausgabeports nutzbar. Die Ein/Ausgabe über Parallelports beschränkt sich damit auf das direkte Lesen und Schreiben der entsprechenden Special-Function- Register. Die serielle Schnittstelle und die Timer benötigen zusätzlich zu den Datenregistern weitere Register zur Steuerung, zur Einstellung der Betriebsart und zur Anzeige des Status. Auch diese Register sind im SFR-Bereich angesiedelt. Beispielhaft sei hier der Zähler/Zeitgeber 0 beschrieben. Die Funktionsweise und die Programmierung anderer Funktionsblöcke muß dem Datenbuch entnommen werden. Der Zähler/Zeitgeber 0 besteht aus den beiden kaskadierbaren 8-Bit-Zählern TH0 (obere 8 Bit) und TL0 (untere 8 Bit). Die Zähler können in verschiedenen Betriebsarten betrieben werden. Festgelegt wird die Betriebsart durch 4 Bits des SFR TMOD. Die Steuerung des Zählers und die Anzeige des Status erfolgt über Bits im Steuer/Status- Register TCON. 3-7

Osz. 12 GateC/T M1 M0 Betriebsartenregiste r TMOD TH0, TL0 ext. Anschluß T0 1 > 1 ext. Gate-Anschl. & Steuer/Statusregiste TR1TF1TR0TF0 r TCON Abb. 3.7. Struktur des Zählers/Zeitgebers 0 Über die Bits M1 und M0 von TMOD wird die Betriebsart des Zählerblocks T0 festgelegt. M1=0 M0=0: 8-Bit-Zähler/Zeitgeber mit Vorteiler M1=0 M0=1: 16-Bit Zähler/Zeitgeber M1=1 M0=0: 8-Bit Zähler/Zeitgeber mit automatischer Rückladung. TH0 enthält den Wert, der nach Überlauf von TL0 geladen wird. M1=1 M0=1: TL0 ist 8-Bit Zähler/Zeitgeber, TH0 ist 8-Bit-Zeitgeber. Das Bit C/T im SFR TMOD legt fest, ob T0 als Zeitgeber (C/T=0) oder als Zähler (C/T=1) betrieben werden soll, während über Gate die am externen Anschluß für T0 anliegenden Zählimpulse freigegeben bzw. gesperrt werden können. Das Bit Gate ermöglicht die Steuerung des Zählers/Zeitgebers durch eine Torschaltung. Wenn Gate=1 ist, wird der Zähler/Zeitgeber nur dann aktiviert, wenn am externen Gateanschluß ein High-Pegel anliegt und das Bit TR0 gesetzt ist. Durch Setzen bzw. Rücksetzen dieser vier Bits läßt sich die Funktionsweise des Zählers/ Zeitgebers in weiten Grenzen softwaremäßig einstellen. Über das Steuer/Statusregister TCON kann T0 softwaremäßig über das Bit TR0 insgesamt gesperrt bzw. freigegeben werden. In TF0 wird ein Überlauf des Zählers T0 angezeigt. Diese kurze Darstellung des Zählers/Zeitgebers T0 soll nur zu einem ersten Überblick über die Arbeitsweise des Special Function Register dienen. Für eine Programmierung sollte auf jeden Fall das Datenbuch herangezogen werden. Abb. 3.8. zeigt noch einmal alle durch Programmierung erreichbaren RAM-Speicherplätze des 8051. 3-8

Abb. 3.8. Programmiermodell des 8051 3-9

3.2 Befehlssatz und Adressierungsarten des 8051 Die unter 2.2. allgemein betrachteten Befehlstypen sollen an dieser Stelle für den 8051 genauer besprochen werden. Eine ausführliche Beschreibung jedes einzelnen Befehls findet man in den entsprechenden Datenbüchern und im Anhang. Für die Schreibweise von Befehlen mit zwei Operanden gilt in der 8051-Assemblersyntax, daß der erste Operand das Ziel und der zweite Operand die Quelle für die auszuführende Operation darstellt. So bedeutet der Befehl MOV A,B zum Beispiel, daß der Inhalt des B-Registers in den Accumulator gebracht werden soll. 1. Transportbefehle Betrachtet man das Programmiermodell für den 8051 in Abb. 3.8., so ergeben sich für den Datenfluß die folgenden, sinnvollen Datentransportbefehlstypen: a. Register <--> Register Der Befehlssatz kennt für die Registeradressierung die Register R0, R1,... R7 der ausgewählten Registerbank, den Accumulator A, das Register B und den 16-Bit-Datapointer DPTR, der aus den beiden 8-Bit-Registern DPH (obere 8 Bit) und DPL (untere 8 Bit) besteht. Beispiele: MOV R0,A ;Inhalt von A nach R0 bringen MOV A,R7 ;Inhalt von R7 nach A bringen XCH A,R1 ;Inhalte von A und R1 vertauschen b. Register <--> Speicher Entsprechend dem Speichermodell des 8051 muß zwischen internem direkt adressierbaren Speicher (0.. 7FH), internem registerindirekt adressierbarem Speicher (0.. FFH), externem RAM-Speicher (0.. FFFFH) und Programmspeicher (0.. FFFFH) unterschieden werden. Am flexibelsten ist der Datentransport zwischen internem RAM-Speicher und Registern durchführbar. Dagegen kann ein Datenaustausch mit externen Speichern grundsätzlich nur über den Accumulator erfolgen. Befehle für Datentransfer zwischen Registern und internem RAM-Speicher haben die Form MOV und XCH, beim Transfer vom und zum externen RAM-Speicher werden Befehle der Form MOVX (X für externes RAM) und beim Transfer vom Programmspeicher wird ein Befehl der Form MOVC (C für Codespeicher) benutzt. Beispiele: MOV A,40H ;Inhalt des internen Speicherplatzes 40H ;in den Accu bringen MOV @R0,A XCH A,40H ;Inhalt des Accus in den durch R0 ;adressierten Speicherplatz im ;internen RAM bringen ;Inhalt des Speicherplatzes 40H mit Accu ;vertauschen MOVX A,@R0 MOVC A,@A+DPTR ;Inhalt des über R0 adressierten externen ;RAM in den Accu bringen ;Inhalt des Speicherplatzes, dessen ;Adresse die Summe des Accus und des ;Datapointers ist, in den Accu bringen 3-10

c. Register <--> Ein/Ausgabe Die Ein/Ausgabe erfolgt beim 8051 grundsätzlich über Special-Function-Register, die die Verbindung zur Außenwelt darstellen. Für die Parallel-Ein/Ausgabe sind dies die 8-Bit-Ports P0 bis P3 und für die serielle Ein/Ausgabe das SFR SBUF. Beispiele: MOV P3,A ;Den im Accu stehenden Wert über Port 3 ;ausgeben MOV SBUF,R3 ;Inhalt von R3 seriell über SBUF ausgeben d. Speicher <--> Ein/Ausgabe Es ist möglich, den Inhalt von Speicherplätzen direkt auszugeben bzw. extern anliegende Informationen direkt nach internen Speicherplätzen zu bringen. Beispiele: MOV P3,40H ;Inhalt des internen Speicherplatzes 40H ;über Port 3 ausgeben MOV @R0,P0 ;Port 0 einlesen und unter dem internen ;Speicherplatz abspeichern, dessen Adresse ;in R0 steht e. Bit <--> Bit Der Befehlssatz des 8051 läßt die Einzelbitverarbeitung zu. Als Boolscher Accumulator dient dabei das Carry-Bit. Im 8051 sind max. 256 Bit direkt adressierbar, davon befinden sich die Bits mit den Adressen 0 bis 7FH im Bereich 20H bis 2FH des internen RAM's. Des weiteren sind Bits von verschiedenen Special-Function-Registern direkt adressierbar. Beispiele: MOV C,3 ;Bringe das direkt adressierte Bit 3 in das ;Carry-Bit MOV 20.2,C ;wie vorhergehender Befehl, Bitadresse aber über ;Position des Bits innerhalb des Bytes angegeben ;(Bit 2 des internen Speicherplatzes 20H) MOV C,P3.4 ;Die an Port 3 Bit 4 anliegende Information ;ins Carry lesen 2. Arithmetische und logische Befehle a. Addition, Subtraktion, Inkrement und Dekrement Alle im 8051 implementierten arithmetischen Befehle beziehen sich auf 8-Bit-Operanden. Das Ergebnis von Addition und Subtraktion steht grundsätzlich im Accumulator. Die Addition kann mit oder ohne Berücksichtigung des Carry-Bits durchgeführt werden, während bei der Subtraktion grundsätzlich das "Borrow"-Bit ("Borrow" entspricht dem "Borge"-Bit; es ist identisch mit dem Carry-Bit des Flag-Registers PSW) berücksichtigt wird. Soll eine Subtraktion ohne Berücksichtigung des "Borrow's" durchgeführt werden, muß das Carry-Bit zuvor gelöscht werden (CLR C). Beispiele: ADD A,B ;Inhalt des B-Registers zum Inhalt des ;Accus addieren, Ergebnis in A ADDC A,40H ;Inhalt des Speicherplatzes 40H zum ;Accu addieren SUBB A,#30H ;Die Konstante 30H vom Accu unter ;Berücksichtigung des Borrow's abziehen Inkrement und Decrement sind Sonderfälle der Additions- und Subtraktionsbefehle. Beim Inkrementbefehl wird der Operand um Eins erhöht, beim Dekrementbefehl um Eins erniedrigt. Im Gegensatz zu den Additions- und Subtraktionsbefehlen werden von den Inkrement- und Dekrementbefehlen keine Flags im PSW beeinflußt. 3-11

b. Multiplikation, Division Im 8051-Befehlssatz ist eine 8-Bit-Multiplikation und Division implementiert. Bei der Multiplikation und Division werden vorzeichenlose 8-Bit-Inhalte von Accumulator und B-Register miteinander multipliziert bzw. dividiert. Im Accumulator stehen nach Ausführung des Befehls die niederwertigen 8 Bit des Ergebnisses, das B-Register enthält die höherwertigen 8 Bit. Die Division ist ebenfalls eine vorzeichenlose, ganzzahlige 8-Bit-Division, bei der der Dividend im Accumulator und der Divisor im B-Register übergeben werden muß. Der ganzzahlige Teil des Ergebnisses steht im Accumulator, der Teilungsrest im B-Register. Beispiele: MOV A,#5 ;Konstanten Wert 5 in Accu MOV B,#3 ;Konstanten Wert 3 in B-Register MUL AB ;Multiplikation, Ergebnis in Accu und ;B-Register c. Logische Funktionen Operanden von logischen Funktionen können entweder 1 Bit oder 8 Bit lang sein. Logische Operationen auf 8-Bit-Operanden werden für jede Stelle einzeln durchgeführt. Als byteweise logische Operationen sind zugelassen: UND-, ODER-, Exclusiv-ODER-, Komplement- und Schiebebefehle. Das Ergebnis der logische Verknüpfung steht jeweils im Accumulator. Beispiele: ANL A,#0FH ;Inhalt des Accu's mit der Konstanten 0FH ;logisch UND verknüpfen ORL A,B ;Inhalte von A und B logisch ;ODER verknüpfen Folgende Bitoperationen mit Booleschen Variablen sind möglich: Löschen eines Bits (CLR ), Setzen eines Bits (SETB), Komplementieren (CPL), UND- und ODER-Verknüpfung eines Bits mit dem Carry-Bit. 3. Sprungbefehle Beispiele: SETB 3 ;Das direkt adressierbare Bit 3 setzen und ANL C,3 ;mit dem Carry-Bit UND verknüpfen ORL C,P3.1 ;Das Carry-Bit mit dem am zweiten Bit ;von Parallelport 3 anliegenden Signal ; ODER verknüpfen a. Unbedingte Sprünge Es gibt drei verschiedene Befehle für unbedingte Sprünge, die sich jeweils in der Darstellung des Sprungziels unterscheiden. Liegt das Sprungziel innerhalb der ersten 2 K-Byte des Programmspeichers, ist es mit dem AJMP-Befehl (Befehlslänge 2 Byte, Adresse absolut in 11 Bit dargestellt) erreichbar. Ist das Sprungziel nicht weiter als -128... +127 vom augenblicklichen Stand des Programmzählers entfernt, kann der SJMP-Befehl (Befehlslänge 2 Byte, Sprungadresse berechnet sich aus dem augenblicklichen Stand des Befehlszählers und einem im 2-Komplement angegebenen 8-Bit-Offset) im gesamten Programmspeicherbereich benutzt werden. Ist das Sprungziel außerhalb der untersten 2 K-Byte des Programmspeichers und die Sprungweite nicht in einer 8-Bit 2-Komplementzahl darstellbar, ist der LJMP-Befehl (3 Byte Länge, Sprungziel wird in 2 Byte absolut angegeben) zu benutzen. Leistungsfähige Assembler legen automatisch den jeweils benötigten Sprungbefehl fest, wenn vom Programmierer ein JMP-Befehl eingegeben wird. 3-12

b. Bedingte Sprünge Bei bedingten Sprüngen wird das Sprungziel immer relativ zum augenblicklichen Stand des Befehlszählers in einer 8-Bit 2-Komplementzahl angegeben. Bedingungen, auf die verzweigt werden kann, sind: - JZ, JNZ Sprung, wenn der Inhalt des Accus Null bzw. ungleich Null ist (Jump on Zero bzw. Jump on No Zero). Es wird kein Flag ausgewertet, sondern vielmehr direkt der Inhalt des Accus geprüft. - JC, JNC Sprung in Abhängigkeit des Carry-Flags (Jump on Carry bzw. Jump on No Carry) - JB, JNB Sprung in Abhängigkeit eines direkt adressierbaren Bits (Jump on Bit bzw. Jump on No Bit) - CJNE Vergleich zweier Operanden und Sprung, wenn diese ungleich sind (Compare and Jump if Not Equal). Es sind nur wenige Operandentypen zugelassen. - DJNZ Dekrementieren eines Schleifenzählers und Sprung, solange dieser noch nicht Null ist (Decrement and Jump if Not Zero) Ist die Sprungbedingung nicht erfüllt, wird jeweils die auf den bedingten Sprung folgende Instruktion ausgeführt. c. Unbedingte Unterprogrammaufrufe Es gibt zwei verschiedene Befehle für unbedingte Unterprogrammaufrufe, die sich jeweils in der Darstellung der Startadresse des Unterprogramms unterscheiden. Liegt die Startadresse innerhalb der ersten 2 K-Byte des Programmspeichers, ist es mit dem ACALL-Befehl (Befehlslänge 2 K-Byte, 11 Bit Adresse) aufrufbar. Mit dem LCALL-Befehl (3 Byte Länge, 16 Bit Adresse ) kann jedes Unterprogramm an beliebiger Stelle im Programmspeicher aufgerufen werden. d. Beendigung von Unterprogrammen Unterprogramme müssen mit dem Befehl RET abgeschlossen werden. Es wird, sofern der Stack im Unterprogramm fehlerfrei verwaltet wurde, an die Adresse zurückgesprungen, an der der nächste Befehl steht, der auf den gerade ausgeführten Unterprogrammaufruf folgt. 3-13

Adressierungsarten des 8051 Der 8051 kennt fünf verschiedene Adressierungsarten. 1. Registeradressierung Über Registeradressierung kann auf die 8 Register (R0... R7) der eingeschalteten Registerbank zugegriffen werden. Weiterhin sind der Accumulator ACC, das B-Register und der Datenpointer DPTR als Register ansprechbar z.b. MOV A,R3 2. Direkte Adressierung Hier wird die Adresse eines Speicherplatzes des internen RAMs angegeben. Die Special-Function- Register (obere 128 Byte des internen RAMs) sind nur über diese Adressierungsart erreichbar. Auch die unteren 128 Byte des internen RAMs sind direkt adressierbar z.b. MOV 40H,#77H (in den internen Speicherplatz 40H wird der konstante Wert 77H geladen) 3. Registerindirekte Adressierung Registerindirekte Adressierung ist nur über R0 und R1 (erreichbar: die unteren 256 Byte des internen und des externen RAMs) sowie über den Datapointer DPTR (erreichbar: gesamter adressierbarer Bereich des externen Datenspeichers) möglich. Special-Functin-Register können nicht über registerindirekte Adressierung angesprochen werden. Kennzeichen für registerindirekte Adressierung: @ z.b. MOV A,@R0 (der Inhalt des Speicherplatzes, auf den R0 zeigt, wird in den Accu gebracht). 4. Unmittelbare (immediate) Adressierung Hiermit können Konstanten als Teile von Befehlen direkt angegeben werden. Kennzeichen für direkte Adressierung: # z.b. MOV A,#77H. 5. Adressierung über Basis- plus Indexregister Nur über diese Adressierungsart kann auf den Programmspeicher zugegriffen weden. Indexregister ist grundsätzlich der Accumulator, Basisregister können der Datapointer DPTR oder der Programmzähler PC sein. Beispiel MOVC A,A+@DPTR 3-14

Arithmetische Operationen ADD A,Rr ADD A,direct ADD A,@Ri ADD A,#data ADDC A,Rr ADDC A,direct ADDC A,@Ri ADDC A,#data SUBB A,Ri SUBB A,direct SUBB A,@Ri SUBB A,#data INC A INC Rr INC direct INC @Ri INC DPTR DEC A DEC Rr DEC direct DEC @Ri MUL AB DIV AB DA A Addiere Register r zum Addiere direktes Byte zum Addiere indirekt aus RAM zum Addiere unmittelbare Daten zum Addiere Register r und Übertrag zum Addiere direktes Byte und Übertrag zum Addiere indirekt aus RAM sowie Übertrag zum Addiere unmittelbare Daten und Übertrag zum Subtrahiere Register r und Übertrag vom Subtrahiere direktes Byte und Übertrag vom Subtrahiere indirekt aus RAM sowie Übertrag vom Subtrahiere unmittelbare Daten und Übertrag vom Inkrementiere Inkrementiere Register r Inkrementiere direktes Byte Inkrementiere indirekt RAM-Byte Inkrementiere Datenzeiger Dekrementiere Dekrementiere Register r Dekrementiere direktes Byte Dekrementiere indirekt RAM-Byte Multipliziere mit Register B Dividiere durch Register B Dezimalkorrektur des s bei Addition 3-15

Logische Operationen ANL A,Rr Verknüpfe Register r durch logisches UND zum ANL A,direct Verknüpfe direktes Byte durch logisches UND zum ANL A,@Ri Verknüpfe indirekt aus RAM durch logisches UND zum ANL A,#data Verknüpfe unmittelbare Daten durch logisches UND zum ANL direct,a Verknüpfe durch logisches UND zu direktem Byte ANL direct,#data Verknüpfe unmittelbare Daten durch durch logisches UND zu direktem Byte ORL A,Rr ORL A,direct ORL A,@Ri ORL A,#data ORL direct,a ORL direct,#data XRL A,Ri XRL A,direct XRL A,@Ri XRL A,#data XRL direct,a XRL direct,#data CLR A CPL A RL A RLC A RR A RRC A SWAP A Verknüpfe Register r durch logisches ODER zum Verknüpfe direktes Byte durch logisches ODER zum Verknüpfe indirekt aus RAM durch logisches ODER zum Verknüpfe unmittelbare Daten durch logisches ODER zum Verknüpfe durch logisches ODER zu direktem Byte Verknüpfe unmittelbare Daten durch logisches ODER zu direktem Byte Verknüpfe Register r durch logisches Exklusiv-ODER Verknüpfe direktes Byte durch logisches Exklusiv-ODER zum Verknüpfe indirekt aus RAM durch logisches Exclusiv-ODER zum Verknüpfe unmittelbare Daten durch logisches Exklusiv-ODER zum Verknüpfe durch logisches Exclusiv-ODER zu direktem Byte Verknüpfe unmittelbare Daten durch logisches Exclusiv-ODER zu direktem Byte Lösche Komplementiere Schiebe Akkunmulator nach links rund Schiebe nach links durch Übertragsbit rund Schiebe nach rechts rund Schiebe nach rechts durch Übertragsbit rund Vertausche Halbbytes im 3-16

Datentransport-Befehle MOV A,Rr MOV A,direct MOV A,@Ri MOV A,#data MOV Rr,A MOV Rr,direct MOV Rr,#data MOV direct,a MOV direct,rr MOV direct,direct MOV direkt,@ri MOV direct,#data MOV @Ri,A MOV @Ri,direct MOV @Ri,#data MOV DPTR,#data16 MOVC A,@A+DPTR MOVC A,@A+PC MOVX A,@Ri MOVX A,@DPTR MOVX @Ri,A MOVX @DPTR,A PUSH direct POP direct XCH A,Rr XCH A,direct XCH A,@Ri XCHD A,@Ri Transportiere Register r zum Transportiere direktes Byte zum Transportiere indirekt aus RAM zum Transportiere unmittelbare Daten zum Transportiere zum Register r Transportiere direktes Byte zu Register r Transportiere umittelbare Daten zu register r Transportiere zu direktem Byte Transportiere Register r zu direktem Byte Transportiere direktes Byte zu direktem Byte Transportiere indirekt aus RAM zu direktem Byte Transportiere unmittelbare Daten zu direktem Byte Transportiere indirekt zum RAM Transportiere direktes Byte indirekt zum RAM Transportiere unmittelbare Daten indirekt zum RAM Lade Datenzeiger mit einer 16bit-Konstante Transportiere Programmbyte relativ zu DPTR zum Transportiere Programmbyte relativ zu PC zum Transportiere indirekt vom externen RAM (8bit-Adresse) zum Akumulator Transportiere indirekt vom externen RAM (16bit-Adresse) zum Transportiere indirekt zu externem RAM (8bit- Adresse) Transportiere indirekt zu externem RAM (16bit- Adresse) Bringe direktes Byte in den Stack Bringe direktes Byte aus dem Stack Vertausche Register r mit Vertausche direktes Byte mit Vertausche indirekt aus RAM mit Vertausche unteres Halbbyte indirekt aus RAM mit unterem Halbbyte des s 3-17

Bitoperationen CLR C CLR bit SETB C SETB bit CPL C CPL bit ANL C,bit ANL C,/bit ORL C,bit ORL C,/bit MOV C,bit MOV bit,c JC rel JNC rel JB bit,rel JNB bit,rel JBC bit,rel Lösche Übertragsbit Lösche direktes Bit Setze Übertragsbit Setze direktes Bit Komplementiere Übertragsbit Komplementiere direktes Bit Verknüpfe direktes Bit durch logisches UND zum Übertragsbit Verknüpfe Komplement des direkten Bits durch logisches UND zum Übertragsbit Verknpüpfe direktes Bit durch logisches ODER zum Übertragsbit Verknüpfe Komplement des direkten Bits durch logisches ODER zum Übertragsbit Transportiere direktes Bit zum Übertragsbit Transportiere Übertragsbit zu direktem Bit Springe, wenn Übertragsbit gesetzt ist Springe wenn Übertragsbit nicht gesetzt ist Springe, wenn direktes Bit gesetzt ist Springe, wenn direktes Bit nicht gesetzt ist Springe, wenn direktes Bit gesetzt ist und lösche das Bit 3-18

Programmverzweigungen ACALL addr11 LCALL addr16 Unbedingter Aufruf einer Subroutine innerhalb 2KBytes im Programmspeicher Unbedingter Aufruf einer Subroutine innerhalb des 64KByte- Programmspeichers RET RETI Rücksprung von Subroutine Rücksprung von Interrupt AJMP addr11 LJMP addr16 SJMP rel JMP @A+DPTR JZ rel JNZ rel CJNE A,direct,rel CJNE A,#data,rel CJNE Rr,#data,rel CJNE @Rr,#data,rel Unbedingter Sprung innerhalb 2KBytes im Programmspeicher Unbedingter Sprung innerhalb des 64KByte-Programmspeicher Unbedingter Sprung innerhalb -128...+127 im Programmspeicher Springe indirekt relativ zu DPTR Springe, wenn Null ist Springe, wenn nicht Null ist Vergleiche direktes Byte mit und springe, wenn sie ungleich sind Vergleiche unmittelbare Daten mit und springe, wenn sie ungleich sind Vergleiche unmittelbare Daten mit Register r und springe, wenn sie ungleich sind Vergleiche unmittelbare mit indirekten Daten und springe, wenn sie ungleich sind DJNZ Rr,rel DJNZ direct,rel NOP Dekrementiere Register r und springe, wenn es ungleich Null ist Dekrementiere direktes Byte und springe, wenn es ungleich Null ist Keine Operation 3-19

Alphabetische Auflistung des Befehlsvorrates ACALL addr11 Unbedingter Aufruf einer Subroutine innerhalb 2KBytes im Programmspeicher ADD A,#data Addiere unmittelbare Daten zum ADD A,@Ri Addiere indirekt aus RAM zum ADD A,direct Addiere direktes Byte zum ADD A,Rr Addiere Register r zum ADDC A,#data Addiere unmittelbare Daten und Übertrag zum ADDC A,@Ri Addiere indirekt aus RAM sowie Übertrag zum ADDC A,direct Addiere direktes Byte und Übertrag zum ADDC A,Rr Addiere Register r und Übertrag zum AJMP addr11 Unbedingter Sprung innerhalb 2KBytes im Programmspeicher ANL A,#data Verknüpfe unmittelbare Daten durch logisches UND zum ANL A,@Ri Verknüpfe indirekt aus RAM durch logisches UND zum ANL A,direkt Verknüpfe direktes Byte durch logisches UND zum ANL A,Rr Verknüpfe Register r durch logisches UND zum ANL C,/bit Verknüpfe Komplement des direkten Bits durch logisches UND zum Übertragsbit ANL C,bit Verknüpfe direktes Bit durch logisches UND zum Übertragsbit ANL direct,#data Verknüpfe unmittelbare Daten durch durch logisches UND zu direktem Byte ANL direct,a Verknüpfe durch logisches UND zu direktem Byte CJNE @Rr,#data,rel Vergleiche unmittelbare mit indirekten Daten und springe, wenn sie ungleich sind CJNE A,#data,rel Vergleiche unmittelbare Daten mit und springe, wenn sie ungleich sind CJNE A,direct,rel Vergleiche direktes Byte mit und springe, wenn sie ungleich sind CJNE Rr,#data,rel Vergleiche unmittelbare Daten mit Register r und springe, wenn sie ungleich sind CLR A Lösche CLR bit Lösche direktes Bit CLR C Lösche Übertragsbit CPL A Komplementiere CPL bit Komplementiere direktes Bit CPL C Komplementiere Übertragsbit DA A Dezimalkorrektur des s bei Addition DEC @Ri Dekrementiere indirekt RAM-Byte DEC A Dekrementiere DEC direct Dekrementiere direktes Byte DEC Rr Dekrementiere Register r DIV AB Dividiere durch Register B 3-20

DJNZ direct,rel DJNZ Rr,rel INC @Ri INC A INC direct INC DPTR INC Rr JB bit,rel JBC bit,rel JC rel JMP @A+DPTR JNB bit,rel JNC rel JNZ rel JZ rel LCALL addr16 LJMP addr16 MOV @Ri,#data MOV @Ri,A MOV @Ri,direct MOV A,#data MOV A,@Ri MOV A,direct MOV A,Rr MOV bit,c MOV C,bit MOV direct,#data MOV direct,rr MOV direct,@ri MOV direct,a MOV direct,direct MOV DPTR,#data16 MOV Rr,#data MOV Rr,A MOV Rr,direct MOVC A,@A+DPTR MOVC A,@A+PC MOVX @DPTR,A MOVX @Ri,A MOVX A,@DPTR Dekrementiere direktes Byte und springe, wenn ungleich Null Dekrementiere Register r und springe, wenn es ungleich Null ist Inkrementiere indirekt RAM-Byte Inkrementiere Inkrementiere direktes Byte Inkrementiere Datenzeiger Inkrementiere Register r Springe, wenn direktes Bit gesetzt ist Springe, wenn direktes Bit gesetzt ist und lösche das Bit Springe, wenn Übertragsbit gesetzt ist Springe indirekt relativ zu DPTR Springe, wenn direktes Bit nicht gesetzt ist Springe wenn Übertragsbit nicht gesetzt ist Springe, wenn nicht Null ist Springe, wenn Null ist Unbedingter Aufruf einer Subroutine innerhalb des 64KByte- Programmspeichers Unbedingter Sprung innerhalb des 64KByte-Programmspeicher Transportiere unmittelbare Daten indirekt zum RAM Transportiere indirekt zum RAM Transportiere direktes Byte indirekt zum RAM Transportiere unmittelbare Daten zum Transportiere indirekt aus RAM zum Transportiere direktes Byte zum Transportiere Register r zum Transportiere Übertragsbit zu direktem Bit Transportiere direktes Bit zum Übertragsbit Transportiere unmittelbare Daten zu direktem Byte Transportiere Register r zu direktem Byte Transportiere indirekt aus RAM zu direktem Byte Transportiere zu direktem Byte Transportiere direktes Byte zu direktem Byte Lade Datenzeiger mit einer 16bit-Konstante Transportiere umittelbare Daten zu register r Transportiere zum Register r Transportiere direktes Byte zu Register r Transportiere Programmbyte relativ zu DPTR zum Transportiere Programmbyte relativ zu PC zum Transportiere indirekt zu externem RAM (16bit- Adresse) Transportiere indirekt zu externem RAM (8bit- Adresse) Transportiere indirekt vom externen RAM (16bit-Adresse) zum 3-21

MOVX A,@Ri MUL AB NOP ORL A,#data ORL A,@Ri ORL A,direct ORL A,Rr ORL C,/bit ORL C,bit ORL direct,#data ORL direct,a POP direct PUSH direct RET RETI RL A RLC A RR A RRC A SETB bit SETB C SJMP rel SUBB A,#data SUBB A,@Ri SUBB A,direct SUBB A,Ri SWAP A XCH A,@Ri XCH A,direct XCH A,Rr XCHD A,@Ri XRL A,#data Transportiere indirekt vom externen RAM (8bit-Adresse) zum Akumulator Multipliziere mit Register B Keine Operation Verknüpfe unmittelbare Daten durch logisches ODER zum Verknüpfe indirekt aus RAM durch logisches ODER zum Verknüpfe direktes Byte durch logisches ODER zum Verknüpfe Register r durch logisches ODER zum Verknüpfe Komplement des direkten Bits durch logisches ODER zum Übertragsbit Verknpüpfe direktes Bit durch logisches ODER zum Übertragsbit Verknüpfe unmittelbare Daten durch logisches ODER zu direktem Byte Verknüpfe durch logisches ODER zu direktem Byte Bringe direktes Byte aus dem Stack Bringe direktes Byte in den Stack Rücksprung von Subroutine Rücksprung von Interrupt Rotiere Akkunmulator nach links rund Rotiere nach links durch Übertragsbit rund Rotiere nach rechts rund Rotiere nach rechts durch Übertragsbit rund Setze direktes Bit Setze Übertragsbit Unbedingter Sprung innerhalb -128...+127 im Programmspeicher Subtrahiere unmittelbare Daten und Übertrag vom Subtrahiere indirekt aus RAM sowie Übertrag vom Subtrahiere direktes Byte und Übertrag vom Subtrahiere Register r und Übertrag vom Vertausche Halbbytes im Vertausche indirekt aus RAM mit Vertausche direktes Byte mit Vertausche Register r mit Vertausche unteres Halbbyte indirekt aus RAM mit unterem Halbbyte des s Verknüpfe unmittelbare Daten durch logisches Exklusiv-ODER zum 3-22

XRL A,@Ri XRL A,direct XRL A,Ri XRL direct,#data XRL direct,a Verknüpfe indirekt aus RAM durch logisches Exclusiv-ODER zum Verknüpfe direktes Byte durch logisches Exklusiv-ODER zum Verknüpfe Register r durch logisches Exklusiv-ODER Verknüpfe unmittelbare Daten durch logisches Exclusiv-ODER zu direktem Byte Verknüpfe durch logisches Exclusiv-ODER zu direktem Byte Abkürzungserklärung: A : addr11 : 11-Bit Zieladresse. Wird von ACALL und AJMP verwendet. Es ist hierbei eine Verzweigung innerhalb 2KByte des Programmspeichers, angefangen vom ersten Byte des folgenden Befehls, möglich. addr16 : 16-Bit Zieladresse. Wird von LCALL und LJMP verwendet. Eine Verzweigung kann überall innerhalb des 64KByte Programmspeichers erfolgen. B : Register B (für Multiplikation und Division) bit : Direkt adressiertes Bit im internen RAM oder Special-Function-Register (SFR). #data : #data16: 8-Bit Konstante. Direkte Daten-/Wertangabe. 16- Bit Konstante. Direkte Daten-/Wertangabe. direkt : 8-Bit Adresse des internen RAM (0..127) oder des SFR (128..255). Direkte Adressierung. rel : Relative 8-Bit Sprung-Adresse. Der Bereich geht von -128 bis +127 Bytes bezogen auf das erste Byte des folgenden Befehls. @Ri : Indirekte Adressierung des internen RAM (0..255) oder eines 256 Byte großen Gebiets innerhalb des externen Datenspeichers. Die indirekte Adressierung erfolgt mittels R0 und R1 (in der aktuellen Registerbank) Rr : Register 0 bis 7 der selektierten Registerbank. 3-23

3-24

Zustandsbits (Flags): Folgende Befehle beeinflussen bei ihrer Ausführung die angegebenen Zustandsbits. Die Flags bleiben solange in ihrem Zustand, bis sie durch einen weiteren, diese Flags beeinflussenden Befehl neu gesetzt bzw. rückgesetzt werden. Alle Datentransportbefehle bis auf die Befehle MOV C,bit und MOV bit,c mit 208<bit<216 sowie MOV PSW,Operand verändern grundsätzlich keine Flags. Das Statusregister enthält kein Zero-Flag. die Z-Bedingung wird durch Auswertung des Inhalts des Accus bestimmt. 3-25