Display 1,14 Zoll 135x240 Pixel Treiber ST7789V

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Ja der Thomas hat offensichtlich Verständis-Schwierigkeiten bezüglich Basic-Befehlen, die nicht alleine für sich stehen dürfen.
      Zu einem For gehört immer ein Next.
      Zu einem If gehört immer ein End if, wenn sich dazwischen mehrere Zeilen Code befinden.

      Zu Einem $ASM gehört immer ein $END ASM.
      Zu einem Label: gehört ein Return, zu einer Sub ein End Sub etc.

      @Thomas1964
      Wenn ich dir mal einen gut gemeinten Tipp geben darf:

      Verwende anstelle von Unterprogrammen mit Label: .. Return besser SUB oder FUNCTION.
      Vorteil ist:
      1. Code wird übersichtlicher
      2. Verwendung von lokalen Variablen in der SUB/FUNCTION. Das spart globale Variablen!
      3. Die dürfen auch vor der Hauptschleife stehen, wenn "Config Submode = New" angegeben ist. Nach der Hauptschleife mit Deklaration der Routine.

      Nachteil:
      1. keiner. Eine Sub ohne Parameter ist genauso schnell wie ein Label mit Return. Auch die Codelänge ist die selbe behaupte ich jetzt mal.
      Labels mit Return haben natürlich auch ihre Berechtigung, z.B. bei Interrupt-Routinen. Wobei man das auch mit einer Sub machen kann. So kann man sogar in ISR-Routinen lokale Variablen verwenden.

      Labels stammen aus den Urzeiten/Anfängen von Basic, als es noch keine Functionsn/Sub's gab, und sollten i.d.R. nur in Ausnahmen verwendet werden.
    • Wenn du dir in der Hilfe z.B. mal If .. End If anschaust, dann wirst du feststellen, dass du deinen Code vereinfachen kannst.
      So der Syntax:

      BASCOM Source Code

      1. If <Bedingung> then
      2. <Befehl>
      3. <Befehl>
      4. End If


      So dein Code am Beispiel B1:

      BASCOM Source Code: So ist dein Code aktuell

      1. if B1 = 0 then y1 = 105 'immer wenn die Bahn auf der Anzeige
      2. if B1 = 0 then y2 = 30 'die Abfahrtszeit 0min erreicht wird diese in
      3. if B1 = 0 then y3 = 45 'die untereste Zeile geschoben
      4. if B1 = 0 then y4 = 60 'und alle anderen rücken um 12 Pixel nach oben.
      5. if B1 = 0 then y5 = 75
      6. if B1 = 0 then y6 = 90
      7. if B1 = 0 then B1 = 60
      Und so könnte er sein:


      BASCOM Source Code: Bessere Variante (Vorschlag)

      1. If B1 = 0 then
      2. y1 = 105 'immer wenn die Bahn auf der Anzeige
      3. y2 = 30 'die Abfahrtszeit 0min erreicht wird diese in
      4. y3 = 45 'die untereste Zeile geschoben
      5. y4 = 60 'und alle anderen rücken um 12 Pixel nach oben.
      6. y5 = 75
      7. y6 = 90
      8. B1 = 60
      9. End If
    • Hallo Mitch,

      habe ich mal so abgeändert, anbei der Code, aber wenn ich den PINB.0 auf 3,3Volt setze zählt er die Stunden
      hoch, hört aber nicht bei 24 auf und setzte ich es dann wieder auf GND springt er nicht mehr ins Hauptprogramm.
      Das selbe bei den Minuten.

      Kann auch nicht kompilieren, bekomme folgende Fehlermeldung.

      Error : 7 Line : 406 IF THEN expected [ 107] , in File : C:\Users\Zoe\Desktop\µC-Programme\Anzeige 1,14 Zoll 135x240\1.14 Test\Anzeigetafel_Iserlohn_114_4.bas
      Error : 350 Line : 406 Interrupt needs return [[ 11]] , in File : C:\Users\Zoe\Desktop\µC-Programme\Anzeige 1,14 Zoll 135x240\1.14 Test\Anzeigetafel_Iserlohn_114_4.bas
      Error : 123 Line : 406 END IF expected , in File : C:\Users\Zoe\Desktop\µC-Programme\Anzeige 1,14 Zoll 135x240\1.14 Test\Anzeigetafel_Iserlohn_114_4.bas
      Files
    • Das liegt daran, weil du nicht sauber programmierst.

      Die Fehlermeldungen kommen, weil der Compiler auf kein End If stößt.

      Du erinnerst dich? Block-Befehle? Post #22

      In Zeile 208 startest du einen Block mit If, wo wird der Block angeschlossen?
      Genau das gleiche in Zeilen 217, 226, 235, 244, 253 ...

      Schau nochmal genau in Post #30, wie mein Vorschlag war. Wo kommt das End If???
    • Hallo Mitch, das ist mir auch schon aufgefallen, habe ich auch schon geändert,
      er springt auch von der Zeiteinstellung wieder ins Hauptprogramm.
      Aber ich habe noch irgendwo in der Zeiteinstellung einen Fehler drin.
      Ich bin die ganze Zeit am suchen, muss noch mal genau nachschauen.

      Anbei der Code
      Files
    • Und sowas geht auch nicht!

      BASCOM Source Code: Unterprogramm von Hauptschleife ber Gosub aufgerufen

      1. ZeiteinstellungStunden:
      2. cls
      3. Setfont Color16x16
      4. Boxfill(0 , 0) -(240 , 135) , blue
      5. For S =1 to 24
      6. tmpString = "00"+Str(Stunden) 'Einblendung der Uhrzeit unterste Displayzeile
      7. Zeit = Right(tmpString , 2) + ":"
      8. tmpString ="00" +Str(Minuten)
      9. Zeit = Zeit + Right(tmpString,2)
      10. Lcdat 70,70,Zeit,White, Blue
      11. Lcdat 100 , 60 ,"Uhrzeit", White, Blue
      12. incr Stunden
      13. If Stunden >= 23 then:gosub Hauptprogramm
      14. waitms 800
      15. next S
      16. end if
      17. return
      Display All
      Du kannst nicht von einer Hauptschleife mit Gosub in ein Unterprogramm springen, und von dort wieder mit Gosub (siehe Zeile 15) ins Hauptprogramm.
      Das würd dein Stack zum Überlaufen bringen.

      Du Kannst deine Sub vorzeitig mit Return verlassen (schlechter Programmierstyle).
      Ein Gosub legt die Rücksprungadresse auf den HWStack und springt zum Unterprogramm.
      Daher muss dieses mit Return verlassen werden, damit der Stack wieder stimmt.
      Das Programm setzt dann die Abarbeitung nach dem Gosub <Label> im Hauptprogramm wieder fort.

      Verwende für deine Unterprogramme
      Sub ZeiteinstellungStunden()
      ' Code hier
      ' ..
      End Sub ' schließt das Unterprogramm ab

      Jetzt ist mir auch klar, warum du nach der Haupschleife ein Return hast.
      Aber da kommt der Code ja nie hin.

      Weil
      Do
      ' ..
      Loop

      Eine Endlosschleife ist. (Blockbefehl)
    • Hallo Mitch, meinst du so ?
      config Submode=new
      declare sub ZeiteinstellungStunden
      declare sub ZeiteinstellungMinuten

      if Stunde = 1 and Minute = 0 then:call ZeiteinstellungStunden
      elseif Stunde = 0 and Minute = 1 then:call ZeiteinstellungMinuten:
      elseif Stunde = 0 and Minute = 0 then:gosub Hauptprogramm

      sub ZeiteinstellungStunden()


      cls
      Setfont Color16x16
      Boxfill(0 , 0) -(240 , 135) , blue
      For S =1 to 24
      tmpString = "00"+Str(Stunden) 'Einblendung der Uhrzeit unterste Displayzeile
      Zeit = Right(tmpString , 2) + ":"
      tmpString ="00" +Str(Minuten)
      Zeit = Zeit + Right(tmpString,2)
      Lcdat 70,70,Zeit,White, Blue
      Lcdat 100 , 60 ,"Uhrzeit", White, Blue
      incr Stunden
      waitms 800
      If Stunde = 0 then:gosub Hauptprogramm
      next S
      end if
      end sub


      sub ZeiteinstellungMinuten()


      cls
      Setfont Color16x16
      Boxfill(0 , 0) -(240 , 135) , blue
      For M =1 to 60
      tmpString = "00"+Str(Stunden) 'Einblendung der Uhrzeit unterste Displayzeile
      Zeit = Right(tmpString , 2) + ":"
      tmpString ="00" +Str(Minuten)
      Zeit = Zeit + Right(tmpString,2)
      Lcdat 70,70,Zeit,White, Blue
      Lcdat 100 , 60 ,"Uhrzeit", White, Blue
      incr Minuten
      waitms 800
      If Minute = 0 then:gosub Hauptprogramm
      next M
      end if
      end sub
    • Eine Sub wird automatisch beendet, wenn sie abgearbeitet ist.
      In der Praxis ist das der Fall, wenn die Code-Ausführung auf "END SUB" trifft.
      Das entspricht quasi dem Return von einem Unterprogramm.

      Will man die Sub vorzeitig verlassen gibt es die Anweisung "Exit Sub".

      Das hat nichts mit Bedingung zu tun.
      Außer man will explizit die Sub verlassen, wenn man eine Bedingung erreicht ist, dann schreibt man
      If <Bedingung> then Exit Sub.

      (Bascom Hilfe ansehen, da steht das alles drin!)
    • Wenn du Sub oder Function deklarierst (Zeile 18 u. 18), müssen die Klammern angegeben werden.
      Falsch:
      Declare Sub Name ' hier fehlt die Klammer!

      Richtig:
      Declare Sub Name()

      Auch wenn keine Parameter verwendet werden, muss eine Klammer angegeben werden.
      Wenn du das nicht tust, könnte das in einer späteren Version zu Fehlern oder Fehlverhalten der Routinen führen.

      Wenn du eine Sub aufrufst, musst du auch die Klammer angeben (Zeile 131, 132).
      Falsch: Call Name
      Richtig: Call Name() ' Klammer angeben!

      Fehler in Zeile 133:
      Hier springst du mit Gosub ins Hauptprogramm.
      Wenn Springen, dann hier mit Goto. Weil Hauptschleife ein Unterprogramm ist, sondern Endlos-Schleife, verbleibt die Rücksprungadresse ewig auf dem Stack.

      Dann ist da noch ein Fehler, den du mehrfach im Programm hast
      Du schreibst in Zeile 132 folgendes:
      elseif Stunde = 0 and Minute = 1 then:call ZeiteinstellungMinuten:

      Das ist syntaktisch falsch.
      Zwischen then und Call gehört kein Doppelpunkt. Der wird nur verwendet, um mehrere Anweisen voneinander zu trennen.
      Weiterhin steht nach dem Call ZeiteinstellungMinuten wieder ein Doppelpunkt. Da kommt aber keine Anweisung mehr.
      Außerdem müssen Klammern angegeben werden bei Sub.

      Überhaupt verstehe ich den Sinn nicht der Zeilen 131 bis 135 in der Programm-Position nicht.