$include (SilF32x.def) ; Include register definition file. $INCLUDE (Work.def) ; --------------------------------------------------------- ; - NewF32x - ; --------------------------------------------------------- ;NewF32x.01: Startprogramm mit serieller Schnittstelle ;---------------------------------------------------------------------------- ; --------------------------------------------------------- ; - Reset - ; --------------------------------------------------------- ORG 00000h ;Start bei 00000h _Reset: ljmp Start ;Sprung über die Fixadressen der Interrupts ;und die Interruptroutinen an den Beginn ;des Hauptprogramms ;---------------------------------------------------------------------------- ; --------------------------------------------------------- ; - Interruptvektoren - ; --------------------------------------------------------- $ INCLUDE (Work.int) ;Interruptvektoren ausgelagert ;---------------------------------------------------------------------------- ; --------------------------------------------------------- ; - Initialisierung - ; --------------------------------------------------------- Start: mov sp,#Stack-1 ;Initialize Stackpointer anl pca0md,#10111111b ;Disable Watchdog lcall InitPort ;Initialisierung Ports, Crossbar lcall InitOsz ;Initialisierung interner Oszillator lcall InitSerialPort ;Initialisierung Serial Port mov vorname,#'v' mov nachname,#'n' ;mov dptr,#StartMessage ljmp Main StartMessage: ;db 0dh,0ah,'Programm gestartet, geben Sie Text ein.',0dh,0ah+80h ; --------------------------------------------------------- ; - Hauptprogramm - ; --------------------------------------------------------- Main: lcall ini lcall Eingabe ;Aufruf der jeweiligen Unterprogramme lcall Vergleich lcall dekrementieren ; ........ ljmp main ;---------------------------------------------------------------------------- ; --------------------------------------------------------- ; - Unterprogramme - ; --------------------------------------------------------- ini: clr c mov R2,#02h Eingabe: lcall SP_InWait ;endlos auf Eingabe warten und in A laden Vergleich: clr c cjne A,vorname,VergleichNN mov DPTR,#TXT_Ausgabe_Vorname lcall SP_OutString jmp dekrementieren VergleichNN: clr c cjne A,nachname,Eingabe mov DPTR,#TXT_Ausgabe_Nachname lcall SP_OutString dekrementieren: djnz R2,Eingabe lcall SP_OutNewLine ljmp main TXT_Ausgabe_Vorname: DB 'Han','s'+80h TXT_Ausgabe_Nachname: DB 'Wimme','r'+80h ; --------------------------------------------------------- ; - Initialisiere Hardware - ; --------------------------------------------------------- ;In: ;Out: ;Destr: ;Cycl: ;Stack: ;Descr: InitPort: mov p0mdin,#0ffh ;Alle Pins Digital In mov p0mdout,#000h ;Alle Pins Open Drain orl p0mdout,#00010000b ;Txd auf PushPull userdef mov p0skip,#000h ;Kein Pin Skipped durch die Crossbar mov p1mdin,#0ffh ;Alle Pins Digital In mov p1mdout,#000h ;Alle Pins Open Drain mov p1skip,#000h ;Kein Pin Skipped durch die Crossbar mov p2mdin,#0ffh ;Alle Pins Digital In mov p2mdout,#000h ;Alle Pins Open Drain orl p2mdout,#00001100b ;Leds Kit auf PushPull userdef mov p2skip,#000h ;Kein Pin Skipped durch die Crossbar mov p3mdin,#0ffh ;Alle Pins Digital In mov p3mdout,#000h ;Alle Pins Open Drain mov xbr0,#000h ;Crossbar0 nichts zugeordnet orl xbr0,#00000001b ;Txd = P0.4, Rxd = P0.5 userdef mov xbr1,#000h ;Crossbar1 nichts zugeordnet orl xbr1,#01000000b ;Crossbar enabled ret ;---------------------------------------------------------------------------- ; --------------------------------------------------------- ; - Initialisiere Oszillator - ; --------------------------------------------------------- ;In: ;Out: ;Destr: ;Cycl: ;Stack: ;Descr: InitOsz: orl oscicn,#003h ;sysclk = intosz/1 ; orl oscicn,#083h ;sysclk = intosz/1 und Start Oszillator mov clkmul,#000h ;Initialyze UsbClock Multiplier orl clkmul,#080h ;nach Manual mov r2,#64h DelIO: nop ;Delay eventuell zu lang nop djnz r2,DelIO orl clkmul,#0c0h mov r2,#64h DelI1: nop ;Delay eventuell zu lang nop djnz r2,DelI1 WaitMulRdy: mov a,clkmul ;Warten auf Multiplier Ready jnb acc.5,WaitMulRdy mov clksel,#02h ret ;---------------------------------------------------------------------------- ; --------------------------------------------------------- ; - Programmsammlung für die serielle Schnittstelle - ; - Serial Port = Uart0 = SP_xxx - ; --------------------------------------------------------- ;SP_Init: Setzt den Timer1 passend für die Baudrate und startet den Timer ;SP_InWaitA: Wartet auf ein Zeichen (endlos), ; übergibt es im Accu ;SP_InAskA: Sieht nach, ob ein neues Zeichen eingetroffen ist, ; übergibt es im Accu ;SP_OutA: Sendet das Byte im Accu (ergibt Char) ;SP_OutByteR0: Sendet das Byte, auf das r0 zeigt (ergibt Char) ;SP_OutHexA: Sendet das Byte im Accu als Hex-String (z.B. FF) ;SP_OutByteHexR0: Sendet das Byte, auf das r0 zeigt, als Hex-String (z.B. FF) ;SP_OutWordHexR0: Sendet das Byte, auf das r0 zeigt, und das nächste Byte als ; Hex-String (z.B. FFFF) ;SP_OutHexDptr: Sendet die beiden Bytes im dptr als Hex-String (z.B. FFFF) ;SP_OutString: Sendet die Bytes einer Tabelle, deren Anfang im dptr steht, ; nacheinander bis das oberste Bit gesetzt ist. ; Das oberste Bit wird dabei gelöscht und das Zeichen noch ausgegeben ;SP_OutReturn: Setzt den Cursor an den Anfang der Zeile ;SP_OutNewLine: Setzt den Cursor an den Anfang der nächsten Zeile ; --------------------------------------------------------- ; - Initialisiere Serial Port - ; --------------------------------------------------------- ;In: --- ;Out: --- ;Destr: ;Cycl: ;Stack: ;Descr: SP_Init: ;Set Baud Rate InitSerialPort: mov scon,#05ah mov tmod,#00100001b ;Timer1 auf 8-bit-autoreload, Timer0 auf 16-bit anl ckcon,#11110100b ;t1m = 0 (ckcon.3) 9600 Bd orl ckcon,#00000000b ;sca = 00 (ckcon.1,ckcon.0) 9600 Bd mov th1,#098h ;Baudrate 9600 mov tl1,#00h setb tr1 ;Start Timer1 ret ;---------------------------------------------------------------------------- ; --------------------------------------------------------- ; - Serial Port Out Byte Hex R0 bzw. A - ; --------------------------------------------------------- ;In: --- ;Out: --- ;Destr: ;Cycl: ;Stack: ;Descr: SP_OutByteHexR0: mov a,@r0 SP_OutHexA: push acc swap a ;H Nibble anl a,#0fh ;nur Nibble lcall HexNibToAscii jnb ti,$ ;Warten auf fertig clr ti mov sbuf,a pop acc anl a,#0fh ;nur Nibble lcall HexNibToAscii jnb ti,$ ;Warten auf fertig clr ti mov sbuf,a ret HexNibToAscii: add a,#30h ;Ascii erzeugen cjne a,#3ah,HNAAskGr ;Ziffer oder Buchstabe HNAAskGr: jc NoAbisF add a,#07h ;Ascii A-F NoAbisF: ret ;---------------------------------------------------------------------------- ; --------------------------------------------------------- ; - Serial Port Out Word Hex R0 - ; --------------------------------------------------------- ;In: --- ;Out: --- ;Destr: ;Cycl: ;Stack: ;Descr: SP_OutWordHexR0: inc r0 ;Pointer auf H lcall SP_OutByteHexR0 dec r0 ;Pointer auf L lcall SP_OutByteHexR0 ret ;---------------------------------------------------------------------------- ; --------------------------------------------------------- ; - Serial Port Out Hex DPTR - ; --------------------------------------------------------- ;In: dptr = zu sendendes Wort ;Out: --- ;Destr: ;Cycl: ;Stack: ;Descr: Sendet das Wort im Dptr Hexadezimal an die serielle Schnittstelle SP_OutHexDptr: mov a,dph lcall SP_OutHexA mov a,dpl lcall SP_OutHexA ret ;---------------------------------------------------------------------------- ; --------------------------------------------------------- ; - Seriel Port Out String - ; --------------------------------------------------------- ;In: --- ;Out: --- ;Destr: ;Cycl: ;Stack: ;Descr: SP_OutString: clr a movc a,@a+dptr jbc acc.7,EndSO lcall SP_OutA inc dptr sjmp SP_OutString EndSO: lcall SP_OutA ret ;---------------------------------------------------------------------------- ; --------------------------------------------------------- ; - Serial Port Out R0 bzw. Accu - ; --------------------------------------------------------- ;In: R0 = Pointer auf - bzw. a = zu sendendes Byte ;Out: --- ;Destr: ;Cycl: ;Stack: 0 ;Descr: Sendet das über R0 referenzierte Byte bzw. ; das Byte im Accu auf die serielle Schnittstelle SP_OutByteR0: mov a,r0 SP_OutA: jnb ti,$ ;Warten auf fertig clr ti mov sbuf,a ret ;---------------------------------------------------------------------------- ; --------------------------------------------------------- ; - Serial Port New Line bzw. Return - ; --------------------------------------------------------- ;In: --- ;Out: --- ;Destr: ;Cycl: ;Stack: 0 ;Descr: Sendet Return bzw. Return + NewLine an die serielle Schnittstelle SP_OutNewLine: mov a,#00ah lcall SP_OutA SP_OutReturn: mov a,#00dh lcall SP_OutA ret ;---------------------------------------------------------------------------- ; ---------------------------------------------------------- ; - Serial Port In Wait - ; ---------------------------------------------------------- ;In: --- ;Out: acc = empfangenes Zeichen ;Destr: --- ;Cycl: ;Stack: 0 ;Descr: Wartet auf ein Zeichen aus der seriellen Schnittstelle (endlos) ; Zeichen wird im Accu übergeben SP_InWait: jnb ri,$ mov a,sbuf clr ri ret ;---------------------------------------------------------------------------- ; ---------------------------------------------------------- ; - Serial Port In Ask - ; ---------------------------------------------------------- ;In: --- ;Out: c=0: kein neues Zeichen, c=1: neues Zeichen ; acc = empfangenes Zeichen wenn neu ;Destr: --- ;Cycl: ;Stack: 0 ;Descr: Fragt ab, ob ein neues Zeichen hereingekommen ist ; Wenn ja wird C = 1 gesetzt und das Zeichen im Accu übergeben ; ri wird gelöscht SP_InAsk: clr c jnb ri,VAEnd ;fragen ob neues Zeichen im Puffer NewInVA: setb c mov a,sbuf ;neues Zeichen in den Accu clr ri VAEnd: ret ;---------------------------------------------------------------------------- end