Erledigt Wie mache ich das das ein bestimmter LCD TEXT angezeigt wird

Thorsten_Sch

Mitglied
31. Okt. 2010
152
0
16
47
HH
Sprachen
  1. BascomAVR
Hallo Forum Gemeinde und Bastler

Hab da so ein kleines proplem mit
Code:
Led_20 = Not Led_20
da wird ja was umgeschaltet
da ich im programm auch ein lcd habe möchte ich auch gern wenn ich den taster drücke:
LED ( an ) drück ich den wieder ( aus ) dann soll auch im LCD stehen:
LED an und LED aus wie kann ich das machen brauch bitte hilfe.........

Hier mein beispiel code ( ohne LCD code )
Code:
$regfile "ATtiny2313.dat"
$crystal = 8000000                                          '
$hwstack = 32
$swstack = 10
$framesize = 40

Config Portb = Output
Led_10 Alias Portb.1
Led_20 Alias Portb.2
Config Pind.3 = Input
Portd.3 = 0
Taster1 Alias Pind.3
Config Pind.4 = Input
Portd.4 = 0
Taster2 Alias Pind.4

Declare Sub An_led
Declare Sub Led1

Do
 If Taster1 = 1 Then Gosub Led1
 Debounce Taster2 , 1 , An_led , Sub
Loop

Sub Led1
Led_10 = 1
Waitms 500
Led_10 = 0
Waitms 100
Led_10 = 1
Waitms 500
Led_10 = 0
End Sub

Sub An_led
Led_20 = Not Led_20
Waitms 1
End Sub


Return
End

Oder kann man da noch was besser machen?

Mit Freundlichen Grüßen Thorsten Sch.
 
Hallo,
ich würde beim drücken des Tasters also in der Sprungmarke eine Variable hin und herschalten und dann mit IF then den status abfragen.

toggle ANAUS
if ANAUS = 0 then LCD "LED ist aus"
if ANAUS = 255 then LCD "LED ist an"

Oder habe ich deine Frage falsch verstanden?

Gruß
Tenor
 
Dafür muß nicht mal ein Byte verbraten werden, ein Bit reicht aus. Und streng genommen ist dieses Bit bereits da: Portb.2 (Alias Led_20)
Zum kippen des Bits kann übrigens "Toggle Led_20" verwendet werden - wenn Bascom das effizient umsetzt, sollte das einfach in "SBI PINB, PB2" übersetzt werden.
 
hm,
hab mal gelesen das man in Bascom nach Möglichkeit immer bytes verwenden soll, da es dann "performanter" ist... Hab das immer einfach so hin genommen.
Keine Ahnung ob da was dran ist.

Mit den "extra" variablen geb ich dir natürlich recht!
Ich bin da bisher immer sehr spendabel, da sollte ich mal meinen Code etwas optimieren..
 
lcd text

hallo forum und bastler

ja es soll ja so gemacht werden das im LCD follgender TEXT steht Beispiel:
drücke ich taste1 geht dann led1 an
im lcd wird dann volgender text aufgerufen=
led1 angeschaltet....
drücke ich taste1 nochmal soll im LCD stehen=
led1 ausgeschaltet


verleicht hilft das weiter

Freundtliche grüße
Thorsten Sch.
 
ja, das kannst du genauso machen wie ich das oben gepostet habe. anaus ist eine Variable die durch toggle bei jedem ausführen invertiert wird.
also aus 0 wird 1, led geht an und im Display erscheint dann der Text.
Beim nächsten Durchgang (erneutes drücken) wird die Variable wieder zu 0 und dann kannst du via IF anweisung einen anderen Text schreiben.
 
lcd text

Hallo Tenor und forum bastler

hab mal mein test code hier mal eingefügt
Code:
$regfile "ATtiny2313.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40

Config Portb.0 = Output
Config Portb.1 = Output
Led_10 Alias Portb.0
Led_20 Alias Portb.1
Config Pinb.3 = Input
Portb.3 = 0
Taster1 Alias Pinb.3
Config Pinb.4 = Input
Portb.4 = 0
Taster2 Alias Pinb.4
Lcd_db4 Alias Portd.2
Lcd_db5 Alias Portd.3
Lcd_db6 Alias Portd.4
Lcd_db7 Alias Portd.5
Lcd_rs Alias Porta.5
Lcd_e Alias Porta.4
'LCD 4-Bit Modus
Config Lcdpin = Pin , Db4 = Lcd_db4 , Db5 = Lcd_db5 , Db6 = Lcd_db6 , Db7 = Lcd_db7 , E = Lcd_e , Rs = Lcd_rs
Config Lcdbus = 4
Initlcd
Cursor Off
Locate 1 , 1
Lcd "Taster als Schalt."
Locate 2 , 2
Lcd "Bereit"

Declare Sub An_led
Declare Sub Led1

Do
 If Anaus = 0 Then Lcd "LED ist aus"
 If Anaus = 255 Then Lcd "LED ist an"
 If Taster1 = 1 Then Gosub Led1
 Debounce Taster2 , 1 , An_led , Sub
Loop

Sub Led1
Led_10 = 1
Waitms 500
Led_10 = 0
Waitms 100
Led_10 = 1
Waitms 500
Led_10 = 0
End Sub

Sub An_led
Locate 1 , 1
Lcd : Toggle Anaus
Led_20 = Not Led_20                                         'Hier PORTB.5 an & aus
Waitms 1
End Sub


Return
End

habe es so versucht er sagt das in der sub routine fehler drin ist?

und woher weist den das ( Anaus ) in welche zeile stehen soll
Code:
locate 1,2
Lcd "anaus"

verleicht kann einer mir dafür noch mal helfen, ich werde berichten wenn es klappt

mit freundtlichen grüßen
Thorsten Sch.
 
...hab mal gelesen das man in Bascom nach Möglichkeit immer bytes verwenden soll, da es dann "performanter" ist...
Naja, so verallgemeinern kann man das nicht...
Wenn mehrere Bits in einem (SRAM)Byte abgespeichert sind, und ein Bit davon gesetzt/gelöscht werden soll, muß man i.a. erst das Byte in ein Rechenregister laden, die Bitmanipulation durchführen, und zurückspeichern. Mit 'nem ganzen Byte würde halt nur der Wert geladen werden, und in das Byte(SRAM) gespeichert.
Bei 'ner Abfrage hingegen kann bereits der Vergleich als Bitmanipulation verwendet werden (laden, AND/OR/...), da dabei bereits das entsprechende Flag im SREG fallen sollte.
Wenn jetzt gleichzeitig gelesen, und danach ggf geschrieben werden soll, sollte sich beides ähnlich performant umsetzen lassen - was Bascom da dann konkret draus macht, hab ich aber noch nicht geschaut.
Noch interessanter wirds, wenn man für sowas Bits nimmt, die direct-bit accessible sind (also I/O-Register bis 0x1F). Neuere Controller bieten da meist ein Register, daß dafür frei ist (GPIOR0) - Bascom nutzt das aber meiner Meinung nach nicht. Die meisten Register, die die Prozessorbeinchen ansteuern liegen auch in diesem Bereich (Ich habe zB auch mal das PORT-Bit des Reset-Pins verwendet, um ein direkt toggelbares Bit zu haben (PIN-Bit beschreiben).

Aber das wird jetzt schon zu speziell, um noch was zum Thema zu sagen:

Eigentlich sollte (da ja die Led geschaltet (Bit/Byte schreiben) und ein entsprechender Text geschrieben werden soll (Bit/Byte lesen und auswerten)) folgendes am sinnigsten sein:
Code:
If Led_20=1 Then
  Reset Led_20
  Lcd "Led aus"
else
  Set Led_20
  LCD "Led an"
end if
(kommt jetzt auch darauf an, wie die Led angeschlossen ist)

Nachtrag: Also der Code sollte in die Sub, die vom debounce aus angesprungen wird. Überleg mal, was Dein Programm derzeit machen würde (wenns ginge)...
Bei jedem Durchlauf der Hauptschleife schreibst Du den Text (Led an/aus) ins LCD, danach testest Du auf den Taster der anderen Led, und läßt diese ggf blinken ('ne gute Sekunde warten).
Danach prüft debounce den anderen Taster (30 ms lang?), und springt dann ggf die Subroutine an.

Set/Reset/Toggle lassen sich natürlich nur auf Bits anwenden. Irgendwo prüfst Du, ob "anaus" 255 ist, wozu es ein Byte sein müßte. Konkret ist es aber nirgendwo definiert, oder?

Mal Dir mal ein Struktogramm oder sowas auf...
 
lcd text

Hallo Forum und Bastler

Ich habe es eingefügt und propiert nur leider ist folgenes passiert.....
wenn ich den taster1 1x drücke und los lasse erscheint auf den LCD der text wie ein flimmern anaus
drück ich ber den Taster1 steht der Text normal da? wie was oder wo ist denn nu falsch an den code

ich möchte ja das hier:
Code:
Sub An_led
Led_20 = Not Led_20
Waitms 1
End Sub
der eingang beim drücken anbleibt, also drücke ich den taster1 blink die led_10 und led_20 bleibt an so soll es sein...
ich möchte aber gern das bei SUB An_led der LCD text angezeigt wird also so=
1x taster2 drücke geht die Led_20 an / drück ich die taste2 nach 2 min wieder an geht die aus.
dabei soll auch der LCD TEXT auch angezeigt werden wie 1 drücken im LCD-> (led_20 ist an)
bei erneuten drücken im LCD - > steht ( Led_20 ist Aus )................

Ich hoffe es versteht mich jemand und kann mir dabei helfen.

also festgespeicherte texte abrufen für das LCD


Mit Freundtlichen Grüßen
Thorsten Sch.
 
Vielleicht gehts nur mir so, aber ... ja, ich habe einige Probleme zu verstehen, was Du jetzt konkret willst. Deswegen ja auch der Vorschlag, ein Struktogramm oder einen Programmablaufplan zu Skizzieren.

Das mit dem Flimmern hatte ich ja bereits angedeutet (Dein letzter veröffentlichter Code aus #7) - In der Hauptprogrammschleife wird bei jedem Durchlauf irgendwas auf das LCD geschrieben (also wenn "anaus" 255 oder 0 ist).
Solange kein Taster betätigt wird, ununterbrochen - immer wieder. Zig-hundertmal pro Sekunde (kA, wie schnell die LCD-Ausgabe ist).
Wenn Taster1 betätigt wird, wird die Hauptschleife (für 'ne gute Sekunde) unterbrochen um die LED etwas blinken zu lassen - in dieser Zeit wird auch das permanente neubeschreiben des LCD unterbrochen, weswegen der Text sichtbar stehen bleibt.
Danach tritt das Programm dann wieder in die Hauptschleife ein (Flimmern).

Wie jetzt Dein konkreter letzter Code aussieht (insbesondere auch die 2te sub), weiß ich nicht.
 
lcd text

Hi

Ja es flimmer wie blöd es soll stehen bleiben wenn ich taster2 drücke wenn ich nach ein paar minuten wieder drücke soll ein andere txt stehen?
bei taster ein da geht das ja bekomm ich auch hin nur bei Taster2 soll der text wescheln....

Mit freundtlichen Grüßen
Thorsten Sch.
 
lcd text

Hi tenor und forum Bastler
hier mal mein code den ich habe......
Code:
$regfile "ATtiny2313.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40

Config Portb.0 = Output
Config Portb.1 = Output
Led_10 Alias Portb.0
Led_20 Alias Portb.1
Config Pinb.2 = Input
Portb.2 = 0
Taster1 Alias Pinb.2
Config Pinb.3 = Input
Portb.3 = 0
Taster2 Alias Pinb.3
Lcd_db4 Alias Portd.2
Lcd_db5 Alias Portd.3
Lcd_db6 Alias Portd.4
Lcd_db7 Alias Portd.5
Lcd_rs Alias Portb.4
Lcd_e Alias Portb.5
'LCD 4-Bit Modus
Config Lcdpin = Pin , Db4 = Lcd_db4 , Db5 = Lcd_db5 , Db6 = Lcd_db6 , Db7 = Lcd_db7 , E = Lcd_e , Rs = Lcd_rs
Config Lcdbus = 4
Initlcd
Cursor Off
Cls
Locate 1 , 1
Lcd "Taster als Schalt."
Locate 2 , 2
Lcd "Bereit"

Declare Sub An_led
Declare Sub Led1

Do
 If Taster1 = 1 Then Gosub Led1
 Debounce Taster2 , 1 , An_led , Sub
Loop

Sub Led1
Cls
Locate 1 , 1
Lcd "led 10 Blinkt"
Led_10 = 1
Waitms 500
Led_10 = 0
Waitms 100
Led_10 = 1
Waitms 500
Led_10 = 0
Cls
Locate 1 , 1
Lcd "Fertig"
End Sub

Sub An_led
Locate 1 , 1
Lcd "LED 20 AN"                                             'Hiernach soll im LCD anderer TEXT stehen
Led_20 = Not Led_20
Waitms 1
End Sub


Return
End

Mit Freundtlichen Grüßen
Thorsten Sch.
 
lcd text

Hi Forum nu schreib ich welchen code ich jetzt habe und nu kommt nichts mehr..... bitte einmal helfen bitte dankeeeee+

mit freundtlichen grüßen
Thorsten Schröder
 
Hi Thorsten,

Hi Forum nu schreib ich welchen code ich jetzt habe und nu kommt nichts mehr..... bitte einmal helfen bitte dankeeeee+

mit freundtlichen grüßen
Thorsten Schröder

dein Beitrag war gestern um 17:04 !
Die Leute machen das hier in ihrer FREIZEIT !
Die meißten werden wohl von morgens bis irgendwann 16:00 oder sogar 20:00 arbeiten um ihre Wohnung heizen zu können und was im Kühlschrank zu haben.
Zahl ihnen Geld für die Zeit die die für dich investieren und du darfst auch fordern das sie dir 24h am Tag zur Verfügung stehen. Deinen Text finde ich doch etwas fordernd. :mad:

Gruß
Dino
 
So ... nun zum Thema ...

Ich hab das mal etwas anders formatiert damit der Code ein wenig übersichtlicher wird ...
Code:
$regfile "ATtiny2313.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40



' ===== Ports initialisieren ======
Config Portb.0 = Output       ' PB0 --- LED1 (Ausgang)
Led_10 Alias Portb.0

Config Portb.1 = Output       ' PB1 --- LED2 (Ausgang)
Led_20 Alias Portb.1

Config Pinb.2 = Input       ' PB2 --- Taster1 (Eingang)
Taster1 Alias Pinb.2
Portb.2 = 0

Config Pinb.3 = Input       ' PB3 --- Taster2 (Eingang)
Taster2 Alias Pinb.3
Portb.3 = 0



' ===== LCD initialisieren =====
Lcd_db4 Alias Portd.2
Lcd_db5 Alias Portd.3
Lcd_db6 Alias Portd.4
Lcd_db7 Alias Portd.5
Lcd_rs Alias Portb.4
Lcd_e Alias Portb.5
'LCD 4-Bit Modus
Config Lcdpin = Pin , Db4 = Lcd_db4 , Db5 = Lcd_db5 , Db6 = Lcd_db6 , Db7 = Lcd_db7 , E = Lcd_e , Rs = Lcd_rs
Config Lcdbus = 4
Initlcd
Cursor Off
Cls
Locate 1 , 1                  ' ersten Text ausgeben
Lcd "Taster als Schalt."
Locate 2 , 2
Lcd "Bereit"



' ===== Subs declarieren =====
Declare Sub An_led
Declare Sub Led1



' ===== Hauptschleife =====
Do
   If Taster1 = 1 Then Gosub Led1         ' Wenn Taster1 gedrueckt ist, dann LED1 blinken lassen (ohne Entprellung)
   Debounce Taster2 , 1 , An_led , Sub      ' Wenn Taster2 gedrueckt wurde dann LED2 anschalten (mit Entprellung)
Loop



' ==== LED 1 blinken lassen =====
Sub Led1
Cls                ' LCD loeschen
Locate 1 , 1              ' Text anzeigen - blinken
Lcd "led 10 Blinkt"
Led_10 = 1            ' LED1 anschalten
Waitms 500            ' 0,5s warten
Led_10 = 0            ' LED1 ausschalten
Waitms 100            ' 0,5s warten
Led_10 = 1            ' LED1 ausschalten
Waitms 500            ' 0,5s warten
Led_10 = 0            ' LED1 ausschalten
Cls                ' LCD loeschen
Locate 1 , 1              ' Text anzeigen - Fertigmeldung
Lcd "Fertig"
End Sub



' ===== LED 2 anschalten =====
Sub An_led
Locate 1 , 1              ' Text anzeigen - LED2 angeschaltet
Lcd "LED 20 AN"                                             'Hiernach soll im LCD anderer TEXT stehen
Led_20 = Not Led_20               ' LED2 umschalten (von AN nach AUS oder umgedreht)
Waitms 1
End Sub



Return
End
Soweit erstmal. Mit Bemerkungen und etwas Struktur wird es übersichtlicher ;)
... und nun mach ich mal ein wenig weiter die Wohnung sauber ...

Gruß
Dino
 
Dein Text ist echt schwer zu verstehen, denke mal das folgende sollte die helfen:
Code:
Cls
anzeige = 1
Do
 If Taster1 = 1 Then Gosub Led1
 Debounce Taster2 , 1 , An_led , Sub
Loop

Sub Led1
Locate 1 , 1
Select Case anzeige
    Case 1 : Lcd "led 10 Blinkt"
    Case 2 : Lcd "LED 20 AN"   
End Select
Led_10 = 1
Waitms 500
Led_10 = 0
Waitms 100
Led_10 = 1
Waitms 500
Led_10 = 0
Cls
Locate 1 , 1
Lcd "Fertig"
End Sub

Sub An_led
Led_20 = Not Led_20
anzeige = 2
Waitms 1
End Sub

Den CLS würde ich nicht bei jedem Schleifendurchgang benutzen, ist auch nicht nötig, du kann stattdessen den längeren Text einfach mit " " Leerzeichen füllen.
Das Cls lässt dann auch die Anzeige flackern.

Im Beispiel ob gibts du über die variable anzeige an welcher text geschrieben werden soll, wenn du nicht zu viele texte hast, sollte das reichen.
habs jetzt nicht kompiliert, hoffe aber es geht dennoch :)
 
lcd text

Hallo Tenor u.Dino03
und alle forum bastler

so habe es mit tenor beispiel versucht ne variable da hinzubekommen aber irgendwie komm ich echt null weiter.....
Hier der code wo ich mich weiter versucht habe leider gescheitert:
Code:
$regfile "ATtiny2313.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40



' ===== Ports initialisieren ======
Config Portb.0 = Output       ' PB0 --- LED1 (Ausgang)
Led_10 Alias Portb.0

Config Portb.1 = Output       ' PB1 --- LED2 (Ausgang)
Led_20 Alias Portb.1

Config Pinb.2 = Input       ' PB2 --- Taster1 (Eingang)
Taster1 Alias Pinb.2
Portb.2 = 0

Config Pinb.3 = Input       ' PB3 --- Taster2 (Eingang)
Taster2 Alias Pinb.3
Portb.3 = 0



' ===== LCD initialisieren =====
Lcd_db4 Alias Portd.2
Lcd_db5 Alias Portd.3
Lcd_db6 Alias Portd.4
Lcd_db7 Alias Portd.5
Lcd_rs Alias Portb.4
Lcd_e Alias Portb.5
'LCD 4-Bit Modus
Config Lcdpin = Pin , Db4 = Lcd_db4 , Db5 = Lcd_db5 , Db6 = Lcd_db6 , Db7 = Lcd_db7 , E = Lcd_e , Rs = Lcd_rs
Config Lcdbus = 4
Initlcd
Cursor Off
Cls

Declare Sub An_led
Declare Sub Led1

Const An_led = 1
Const Led1 = 1

Dim Anzeige As Byte
Dim Anzeige1 As Byte
Dim Anzeige3 As Byte
Dim Anzeige4 As Byte

Cls
Anzeige = 1
Do
 If Taster1 = 1 Then Gosub Led1
 Debounce Taster2 , 1 , An_led , Sub
Loop

Sub Led1
Locate 1 , 1
Select Case anzeige
    Case 1 : Lcd "led 10 Blinkt"
    Case 2 : Lcd "LED 20 AN"
End Select
Led_10 = 1
Waitms 500
Led_10 = 0
Waitms 100
Led_10 = 1
Waitms 500
Led_10 = 0
Cls
Locate 1 , 1
Lcd "Fertig"
End Sub

Sub An_led
Led_20 = Not Led_20
anzeige = 2
Waitms 1
End Sub
so wie es Tenor geschrieben hat finde ich schon mal gut.
Ach ja Dino03 wie du es gemacht hast versteh ich schon....

ich will es ja wo es im ->
Code:
Sub An_led
Led_20 = Not Led_20
anzeige = 2
Waitms 1
End Sub
da wird ja nur beim einschalten der eine text angezeigt, und irgendwie wie es Tenor geschrieben hat finde es schon ok.
hab auch die liebe G........ seite benutz aber da werden über Uhren und Menü angezeigt und komm Null Komma Weiter.

WIE MACHT MAN DAS MIT DER variable

BITTE UM Hilfe ich danke mich jetzt schon mal.

Mit Freundtlichen Grüßen
Thorsten Schröder
:D:eek:
 
Du hast das mit dem Case nicht so ganz verstanden.
Dein LCD "fertig" hätte in dem Fall Case 3 sein müssen und du hättest somit die Variable Anzeige den Wert 3 zuweisen müssen.
Sonst hast du immer wieder das Problem das die Anzeige flackert, da viel zu schnell der Text geändert wird.
 
lcd text

Hi tenor und forum bastler

Und wie muss ich das dann machen????
so
Code:
Sub Led1
Cls
Locate 1 , 1
Select Case Anzeige
    Case 1 : Lcd "led 10 Blinkt"
    Case 2 : Lcd "LED 20 AN"
    Case 3 : Lcd "led aus"
End Select
Led_10 = 1
Waitms 200
Led_10 = 0
Waitms 200
Led_10 = 1
Waitms 200
Led_10 = 0
End Sub

oder anderes bitte um rat verleicht klappt es ja bis zum wochende währe nett......

Mit Freundtlichen Grüßen
Thorsten Sch.
 
Ja, genau so.
Du musst jetzt nur noch die variable Anzeige nur noch an der richtigen Stelle auf 3 setzen,
Schau dir einfach mal die Hilfe zu select Case an, dann sollte das klarer werden
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)