$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 lcall ws0 ;hier beginnt die initialisierung des Display clr RS clr RW mov PInOut,#00110000b lcall ws1 clr RS clr RW mov PInOut,#00110000b lcall ws2 clr RS clr RW mov PInOut,#00110000b clr RS clr RW mov PInOut,#00111000b clr RS clr RW mov PInOut,#00001000b clr RS clr RW mov PInOut,#00000001b clr RS clr RW mov PInOut,#00000110b ;ende der initialisierung mov DPTR,#LCD_msg LCD_prints: ; Ausgabe eines mit 0 terminierten Strings aus DPTR push ACC LCD_prints_anf: clr a movc a,@A+DPTR jz LCD_prints_weiter inc DPTR lcall LCD_printc jmp LCD_prints_anf LCD_prints_weiter: pop ACC ret ljmp Main ; --------------------------------------------------------- ; - Hauptprogramm - ; --------------------------------------------------------- Main: ;lcall Eingabe ;Aufruf der jeweiligen Unterprogramme ; ........ ; ........ ljmp Main ;---------------------------------------------------------------------------- ; --------------------------------------------------------- ; - Unterprogramme - ; --------------------------------------------------------- LCD_msg: db 'LCD Ok.',0 LCD_printc: ; Ausgabe eines Charakters aus ACC inc LCD_RAM push ACC ; bei Überlauf der Spalten in mov a,LCD_RAM ; nächste Zeile weitersetzen cjne a,#41,LCD_no_change mov a,#168 call LCD_send_b LCD_no_change: pop ACC ; Zeichen ausgeben call LCD_send_d ret LCD_send_b: ;sendet Befehle aus ACC an Datenport des LCD (interne Funktion) clr RS clr RW jmp LCD_send ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;sendet Daten aus ACC an Datenport des LCD (interne Funktion) LCD_send_d: clr RW setb RS LCD_send: mov c,ACC.7 ; high-nibble ausgeben mov LCD_D7,c mov c,ACC.6 mov LCD_D6,c mov c,ACC.5 mov LCD_D5,c mov c,ACC.4 mov LCD_D4,c setb LCD_ENABLE call LCD_ws clr LCD_ENABLE mov c,ACC.3 ; low-nibble ausgeben mov LCD_D7,c mov c,ACC.2 mov LCD_D6,c mov c,ACC.1 mov LCD_D5,c mov c,ACC.0 mov LCD_D4,c setb LCD_ENABLE call LCD_ws clr LCD_ENABLE ret ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LCD_ws: push psw push 0 mov 0,#232 LCD_ws_labelA: nop nop nop nop nop djnz 0,LCD_ws_labelA nop nop pop 0 pop psw ret ;--------------------------------------------------------------- ; Warteschleife: 20 ms ; Anzahl Maschinenzyklen: 20000 ws0: push PSW push 0 push 1 mov 1,#194 ws0_labelB1: mov 0,#9 ws0_labelB0: nop nop nop nop nop nop nop nop nop djnz 0,ws0_labelB0 djnz 1,ws0_labelB1 pop 1 pop 0 pop PSW ret ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; Warteschleife: 4.5 ms ; Anzahl Maschinenzyklen: 4500 ws1: push PSW push 0 push 1 mov 1,#249 ws1_labelB1: mov 0,#2 ws1_labelB0: nop nop nop nop nop djnz 0,ws1_labelB0 djnz 1,ws1_labelB1 pop 1 pop 0 pop PSW ret ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; Warteschleife: 0.15 ms ; Anzahl Maschinenzyklen: 149.99999999999997 ws2: push psw push 0 mov 0,#45 ws2_labelA: nop djnz 0,ws2_labelA nop pop 0 pop psw ret ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; --------------------------------------------------------- ; - 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,#0ffh ;Alle Pins PushPull mov p1skip,#000h ;Kein Pin Skipped durch die Crossbar mov p2mdin,#0ffh ;Alle Pins Digital In mov p2mdout,#0ffh ;Alle Pins PushPull ;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