'########################################################################## '### ### '### Display für Mini-USB-MP3 Player ### '### ### '########################################################################## '---------------------------------------------------------------------------- ' ------17-11-04 verbesserte Version----- ' ' ---Flashverbrauch 30%--- '---------------------------------------------------------------------------- $regfile = "m8def.dat" 'für ATMEL ATMEGA8 $crystal = 4000000 'Quarz: 4 MHz $baud = 19200 'Baudrate $lib "DIP_Ansteuerung01.lib" Ddrd = &B11000000 'Pin PD6-PD7 auf Out Ddrc = &B00001111 'Pin PC0-PC3 auf Out Ddrb = &B00000001 'Pin PB0 auf Out (Beleuchtung) Dim A As String * 2 , B As String * 4 , C As String * 2 , D As Byte Dim E As String * 1 , F As String * 20 , G As Byte , Z As Byte Dim M1 As Bit , M2 As Bit , M3 As Bit , M4 As Byte 'M1 = wenn ein "A" ankommt für Befehlsauswertung 'M2 = wenn Player senden will (gesetzt mit AT^SSTK) 'M3 = wenn Header vorbei für Anzeige auf dem LCD 'M4 = für Headererkennung 'A = ASCII-Wert vom seriellen Puffer 'B = für Steuerzeichen-Erkennung des Players 'C = Byte-String, der dann den ASCII-Wert enthält der Anzeige 'D = Hex-Wert vom ASCII 'E = Klartext-Wert vom ASCII-Wert (aus Hex-Wert) 'F = LCD-Ausgabe-String 'G = Zähler für Länge des LCD-Ausgabe-Strings 'Z = Zeile für LCD Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 Config Lcdpin = Pin , Db7 = Portc.0 , E = Portd.6 , Rs = Portd.7 Config Lcd = 20 * 4a Z = 1 G = 1 Initlcd Cls Locate 2 , 4 Lcd "ATMEL ready" Declare Sub Handy Declare Sub Displ Declare Sub Conv Config Serialin = Buffered , Size = 50 'serielle Schnittstelle puffern Enable Urxc 'UART initialisieren Enable Interrupts 'Interupt ON '---------------------------------------------------------------------------- 'Hauptprogramm '---------------------------------------------------------------------------- Do Do Loop Until Ischarwaiting() <> 0 ' Warte auf Zeichen von RxD A = Inkey() 'Zeichen aus dem Puffer holen Gosub Handy 'Sprung zur Handyemulation Gosub Displ 'Sprung zur LCD-Routine Loop '---------------------------------------------------------------------------- 'Handyemulation '---------------------------------------------------------------------------- Handy: If A = "A" Then 'wenn Zeichen "A" erscheint M1 = 1 'Marker1 setzen End If If M1 = 1 Then B = B + A 'zusammensetzen zu einem String If Len(b) > 3 Then 'falls mal Datenmüll drin steht B = "" 'String löschen M1 = 0 'Marker1 löschen End If Select Case B Case "ATE" 'wenn String "ATE" Waitms 100 'warten 100ms Print "" 'Steuerzeichen senden Print "OK" '"OK" senden B = "" 'String löschen M1 = 0 'Marker1 löschen M2 = 0 'Marker2 löschen M3 = 0 M4 = 1 F = "" Z = 1 G = 1 C = "" Portb.0 = 0 Case "AT^" 'wenn String "AT^S" Waitms 100 'warten 100ms Print "" 'Steuerzeichen senden Print "> "; '"> " senden OHNE Steuerzeichen (;) B = "" 'String löschen M1 = 0 'Marker1 löschen M2 = 1 'Marker2 setzen Locate 1 , 1 'LCD löschen Lcd " " Locate 2 , 1 Lcd " " Locate 3 , 1 Lcd " " Locate 4 , 1 Lcd " " Portb.0 = 1 End Select End If Return '---------------------------------------------------------------------------- 'Displayanzeige '---------------------------------------------------------------------------- Displ: If M2 = 1 Then 'wenn "AT^SSTK" eingetroffen D = Hexval(a) 'Konvertierung in Hex If D = 234 Then 'entspricht "1A" M2 = 0 M3 = 0 End If End If If M2 = 1 Then 'wenn "AT^SSTK" eingetroffen C = C + A 'Anzeige-Bit zu Byte zusammensetzen If Len(c) = 2 Then Incr M4 'Headerzähler hochzählen End If End If If M3 = 1 Then 'wenn Header vorbei If Len(c) = 2 Then 'wenn zu einem Byte zusammengesetzt If C = "0D" Then 'Zeilenende-Erkennung F = "" 'LCD-String löschen Incr Z 'eine Zeile weiter G = 1 'Zähler wieder auf 1 Else Gosub Conv 'zum Unterprogramm der ASCII-Konvert. F = F + E 'zu einem String zusammensetzen Select Case Z 'Zeilensteuerung des LCD Case 1 'bei 1. Zeile If Len(f) = 5 Then 'nach 5. Zeichen F = F + " " 'Leerzeilen einfügen End If If Instr(f , "ENS") > 0 Then 'wenn "ens" erscheint F = "" 'String löschen Locate 1 , 1 Lcd " " 'Anzeige löschen F = " SIEMENS" 'durch "SIEMENS" ersetzen End If If Instr(f , "O FF") > 0 Then 'wenn "OFF" erscheint F = "" 'String löschen Locate 1 , 1 Lcd " " 'Anzeige löschen F = " MP3 OFF" 'durch "MP3 OFF" ersetzen End If Locate 1 , 1 Lcd F 'LCD-Ausgabe Case 2 'bei 2. Zeile If G = 2 Then 'erstes Zeichen löschen, F = "" 'da Anzeige sonst 21 Zeichen lang wäre End If If Instr(f , "OFF") > 0 Then 'wenn "OFF" erscheint F = "" 'String löschen Locate 2 , 1 Lcd " " 'Anzeige löschen F = "MP3 OFF" 'durch "MP3 OFF" ersetzen End If Locate 2 , 1 Lcd F 'LCD-Ausgabe Case 3 'bei 3. Zeile Locate 3 , 1 Lcd F 'LCD-Ausgabe If Len(f) = 20 Then 'Zeilenlängenbegrenzung auf 20 Incr Z F = "" End If Case 4 'bei 4. Zeile Locate 4 , 1 Lcd F 'LCD-Ausgabe End Select End If End If End If If M4 = 21 Then '21 Bytes zählen um Header zu umgehen M3 = 1 End If If Len(c) = 2 Then 'wenn Byte vollständig, löschen C = "" End If Return '---------------------------------------------------------------------------- 'ASCII-Konvertierung '---------------------------------------------------------------------------- Conv: Select Case C Case "2D" 'Sonderzeichen E = "-" Case "2E" 'Sonderzeichen E = "." Case "2F" 'Sonderzeichen E = "/" Case "3A" 'Sonderzeichen E = ":" Case "3C" 'Sonderzeichen E = "<" Case "3E" 'Sonderzeichen E = ">" Case "4A" 'Sonderzeichen E = "J" Case "4B" 'Sonderzeichen E = "K" Case "4C" 'Sonderzeichen E = "L" Case "4D" 'Sonderzeichen E = "M" Case "4E" 'Sonderzeichen E = "N" Case "4F" 'Sonderzeichen E = "O" Case "5A" 'Sonderzeichen E = "Z" Case "6A" 'Sonderzeichen E = "j" Case "6B" 'Sonderzeichen E = "k" Case "6C" 'Sonderzeichen E = "l" Case "6D" 'Sonderzeichen E = "m" Case "6E" 'Sonderzeichen E = "n" Case "6F" 'Sonderzeichen E = "o" Case "7A" 'Sonderzeichen E = "z" Case Else D = Hexval(c) 'Umwandlung String in Hex-Byte E = Chr(d) 'Konvertierung in ASCII und in String End Select Incr G 'Zeichenzähler (für Zeilenlänge wichtig) Return