$NOMOD51 ;der Modus fuer 8051 wird abgeschaltet $debug $nolist ;es wird kein Listing fuer reg51 erstellt $include(REG51.inc) ;die 8051-spezifischen Daten $list ;es wird ein Listing erstellt $title (SPEICHER.A51) ;------------------------------------------------------------------------ ;Programmbeschreibung ;------------------------------------------------------------------------ ;Programm: ; Die unterschiedlichen Speicherbereiche werden mit ; verschiedenen Adressierungen angesprochen ;INTERNER SPEICHERBEREICH ; A - ACCU - Register ; direkte Adressierung Interner Datenspeicher DSEG, D:0x00h - 0x7Fh ; direkte Adressierung SFR Interner Datenspeicher DSEG, D:0x80h - 0xFFh ; Special Function Register ; indirekte Adressierung Interner Datenspeicher ISEG I:0x00 - 0xFFh ; ;EXTERNER SPEICHERBEREICH ; indirekte Adressierung externer Datenspeicher XSEG X:0x####h ; indirekte Adressierung Codespeicher mit Basis- und Indexregister; ; ;Erstellt am: Samstag, 10. Januar 2009 10:10:02 ;Programmiert: Juergen Walter ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ;R2 ; ;Kommentar: ; ;Aenderungen: ;Geaendert am: Samstag, 10. Januar 2009 10:10:02 ; ; ;------------------------------------------------------------------------ ;Initialisierungsteil fuer allgemeine Konstanten ;------------------------------------------------------------------------ org 2000H ;Stelle Programmspeicheradresse auf 2000H db "Hallo" ;Schreibt ASCII-Zeichen db '0,1,2,255,4,5,6,7,8,9,10,11,12,13,14,15,16' ;Schreibt die Zahlen CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h jmp INIT ; ;------------------------------------------------------------------------ ;Interrupt-Vektoren ;------------------------------------------------------------------------ ;ORG ;------------------------------------------------------------------------ ;Initialisierungsteil fuer On-Chip Peripherie ;------------------------------------------------------------------------ ORG 100H ;Programmstart bei 100H INIT: ;------------------------------------------------------------------------ ;Programmschleife ;------------------------------------------------------------------------ ABFRAGE: jnb P1.1,INT_DATENSP ;T1 --> Interner Datenspeicher jnb P1.2,BIT_ADRESSEN ;T2 --> Bitadressierbarer Speicherbereich jnb P1.3,EXT_DATENSP ;T3 --> Externer Datenspeicher jmp ABFRAGE INT_DATENSP: ;DIREKT ADRESSIERBAR mov A,#040h ;Lade den ACCU mit der Zahl # ;Der ACCU liegt im direkt adressierbaren ;internen Speicher auf der Adresse 0E0H mov R1,#03Bh ;Lade Register R1 - Adresse 01h - mit der ;Zahl #h mov R0,A ;Lade Register R0 mit dem Inhalt des ACCUS ;R0 liegt auf Adresse 00h im direkt und indirekt ;adressierbaren Speicherbereich mov 3CH,#0C3H ;Lade die Speicherzelle mit der Adresse 3CH ;mit der Zahl 0C3H mov 3BH,3CH ;Lade / kopiere Adresse 3BH mit dem Inhalt ;der Adresse 3CH ; ;INDIREKT ADRESSIERBAR mov @R1,A ;Kopiere den Inhalt von A in die Adresse ;welche in R1 steht ;Es gibt zwei Speicherzellen mit der Adresse 0B0h ;Eine direkt adressierbar Port 3 ;Eine indirekt adressierbar 0B0h inc R1 ;Adresse +1 inc R1 ;Adresse +2 = Adresse 3DH mov @R1,A ;Inhalt von ACCU in die Speicherzelle mit der Adresse ;welche in R1 steht 0B0h+1 = =B1H mov P3,#11111011b ;L1 an - Schreibe die Zahl 251 in P3 Adresse 0B0 SFR-Bereich jmp ABFRAGE BIT_ADRESSEN: mov C,P3.2 ;Inhalt der Bit-Adresse von Port 3 in das Carry-Bit ;von Program Status Word PSW mov 20H.0,C ;Schiebe den Inhalt von Carry in die Bitadresse 20.0 mov F0,C ;Schiebe Inhalt des Carrybits in F0 - PSW mov P3,#11110111b ;L2 an jmp ABFRAGE EXT_DATENSP: ;EXTERNER DATENSPEICHER 4K bei C8051F340 mov A,#0FH ;Schreibe die Zahl Fh in den Akku mov DPTR,#0FF0H ;Lade den Adresszeiger mit der Zahl 0FF0H movx @DPTR,A ;Lade die Adresse im DPTR mit dem Inhalt des Accus inc DPTR movx @DPTR,A ;Lade die Adresse im DPTR+1 mit dem Inhalt des Accus ; ;EXTERNER CODESPEICHER NUR LESBAR mov DPTR,#00100H ;Lade den Datenpointer clr A ;loesche den Inhalt des Akkus movc A,@A+DPTR ;Lade den Akku mit dem Inhalt der ;Programmspeicheradresse, die durch die Summe ;von Accu und Datenpointer gebildet wird inc dptr ;naechste Codespeicheradresse mov A,#01h ;Lade Accu mit der Zahl 01h movc A,@A+PC ;Schreibe den Inhalt des Accus in die Adresse ;KONSTANTEN IM PROGRAMMSPEICHER mov P3,#11101111b ;T3 wurde betaetigt jmp ABFRAGE end