hallo
ich möchte aus neugier mal eine tastenabfrage auf ein display bringen
und soweit funktioniert es halbwegs? allerdigs "flasht" das display und
die tastenabfrage funktioniert auch nur bei einem reset des uC
also wenn ich die taste drücke geschieht erst mal gar nix und es belibt
bei "Taster OFF" wenn ich aber die taste gedrückt halte und die reset
taste drücke dann hab ich "Taster ON"
bin anfänger.... was mach ich falsch?
LG und danke viel mal
peroja
display ist ein 16x2 standard
1
#include<avr/io.h>
2
#include"lcd-routines.h"
3
#include<util/delay.h>
4
5
intmain(void)
6
{
7
8
inttemp;
9
10
// Set Port B 4 as output (binary 1), 3 as input (binary 0)
Nimm die while-Schleife in der Funktion set_PORTB_bit raus. Damit
erzeugst Du eine Endlosschleife, aus der Du nicht mehr rauskommst.
Ausserdem würde ich
lcd_init();
lcd_string("Test");
in die main-Funktion vor das for() schreiben, damit das nicht jedes Mal
wieder gemacht wird.
Bedenke auch, dass Du set_PORTB_bit() viele hunderttausendmal pro
Sekunde aufrufst. Überlege Dir, wie Du diese Funktion nur bei Änderungen
aufrufst.
Mit dieser Funktion
> int set_PORTB_bit(int position, int value)
trickst du dich massiv selber aus. Du erzeugst da eine Komplexität, die
für dich noch zu hoch ist und die du nicht mehr überblickst.
Was spricht gegen die ganz einfache Variante
1
intmain(void)
2
{
3
inttemp;
4
5
lcd_init();
6
lcd_string("Test");
7
lcd_setcursor(0,2);
8
9
for(;1==1;)
10
{
11
temp=(PINB&0x08);
12
13
if(temp==0)
14
{
15
lcd_string("Taster ON");
16
}
17
else
18
{
19
lcd_string("Taster OFF");
20
}
21
}
22
}
Ist dir das zu einfach, zu simpel, zu geschmacklos?
Und nochwas: Was du gelernt haben solltest - die Idee, dass man aus 2
getrennten Programmen ein einziges macht, indem man sie zusammenkopiert
und irgendwie da Aufrufe von einem 'Programm' in das 'andere Programm'
macht - die Idee funktioniert nicht.
Betrachte jedes Programm, welches du schreibst als ein neues Programm.
Du kannst Einzelteile und Ideen und Codeabschnitte oft aus
Vorgängerprogrammen übernehmen und weiterverwenden (so wie hier), aber
grundsätzlich schreibst du IMMER ein neues Programm.
Karl Heinz
Je einfacher desto besser. Und nein es ist mir nicht zu einfach, zu
simpel und zu geschmacklos. Du hast mich natürlich dabei ertappt aus 2
mach 1 und ja sollte man natürlich nicht machen. Ich lerne gerne neues
dazu. Vielen dank erstmal für deine gedankenstütze, aber direkt
umgesetzt erzeugt mir dein code einen text der rollt. die funktion des
tasters ist zwar gelöst aber nun kann ich nix erkennen weil der text so
schnell vorbeirennt.....
LG
Pero
Randy Tomlinson schrieb:> simpel und zu geschmacklos. Du hast mich natürlich dabei ertappt aus 2> mach 1 und ja sollte man natürlich nicht machen.
Im Laufe der Zeit lernt man eben gewisse Muster zu sehen
> Ich lerne gerne neues> dazu. Vielen dank erstmal für deine gedankenstütze, aber direkt> umgesetzt erzeugt mir dein code einen text der rollt.> die funktion des> tasters ist zwar gelöst aber nun kann ich nix erkennen weil der text so> schnell vorbeirennt.....
Tja. Dann musst du dir was dazu einfallen lassen.
'Eine' Lösung, allerdings nicht die beste, ist es wenn der Text immer an
derselben Stelle am LCD auftauchen würde.
Hmm. Da gibt es doch eine Funktion, mit der man bestimmen kann, wo die
nächste Textausgabe beginnen soll. Hmmm .......
Karl Heinz Buchegger schrieb:> Hmm. Da gibt es doch eine Funktion, mit der man bestimmen kann, wo die> nächste Textausgabe beginnen soll. Hmmm .......
du meinst "lcd_setcursor( 0, 2 );" ??
die ist doch da..... ich steh auf m schlauch beschämtguck
Randy Tomlinson schrieb:> Karl Heinz Buchegger schrieb:>>> Hmm. Da gibt es doch eine Funktion, mit der man bestimmen kann, wo die>> nächste Textausgabe beginnen soll. Hmmm .......>>> du meinst "lcd_setcursor( 0, 2 );" ??> die ist doch da.....
Wo 'genau'(!) steht das?
Wenn diese Positionierung nur EINMAL, ganz am Anfang, gemacht wird, dann
wird sie auch nur EINMAL gemacht. Du gibst aber IN DER SCHLEIFE laufend
Texte aus! Nur weil du EINMALIG den Cursor positioniert hast, gilt das
nicht automatisch für alle weiteren Folgetexte. Nur der NÄCHSTE Text
beginnt an dieser POsition. Danach wandert die Ausgabeposition (der
Cursor) mit den Buchstaben dieses Textes mit und alle weiteren Texte
werden ab der dann jeweils gültigen Cursorposition ausgegeben.
Das ist wie wenn du im Editor tippst. Der _ sagt dir, wo der nächste
Buchstabe erscheinen wird. Tippst du einen Buchstaben, dann wandert der
_ um 1 Stelle weiter. Und der nächste Buchstabe erscheint dann dort usw.
Wenn du den Cursor wo anders haben willst, dann musst du eine Aktion
setzen. In dem Fall dieser LCD Routinen ist das eben der Aufruf von
lcd_setcursor.
ok bin drauf gekommen
ein kleiner schönheitsfehler hat es noch
wenn ich die worte ON und OFF nutze dann bleibt ein F hängen wenn ich
den taster loslasse (ONF) mit einem "EIN / AUS" hab ich natürlich eine
billige lösung gefunden....
1
#include<avr/io.h>
2
#include"lcd-routines.h"
3
#include<util/delay.h>
4
5
intmain(void)
6
{
7
inttemp;
8
9
{
10
lcd_init();
11
lcd_string("Test");
12
13
14
for(;1==1;)
15
{
16
temp=(PINB&0x08);
17
18
if(temp==0)
19
{
20
21
lcd_setcursor(0,2);
22
lcd_string("Taster AUS");
23
}
24
else
25
{
26
27
lcd_setcursor(0,2);
28
lcd_string("Taster EIN");
29
}
30
}
31
}
32
}
so und nun versuche ich ein ein / aus bei welchem der status jeweils
beim drücken des buttons bleibt, also 1x drücken ein und nochmal drücken
aus....
Randy Tomlinson schrieb:> ok bin drauf gekommen> ein kleiner schönheitsfehler hat es noch> wenn ich die worte ON und OFF nutze dann bleibt ein F hängen wenn ich> den taster loslasse (ONF) mit einem "EIN / AUS" hab ich natürlich eine> billige lösung gefunden....
Die andere billige Lösung besteht darin, nicht
"Taster ON" sondern "TASTER ON " auszugeben. Das Leerzeichen nach dem N
überschreibt dann das ansonsten übrig bleibende F von OFF.
Auch ein Leerzeichen ist ein Zeichen!
> so und nun versuche ich ein ein / aus bei welchem der status jeweils> beim drücken des buttons bleibt, also 1x drücken ein und nochmal drücken> aus....
Das ist erstaunlich schwierig. Stell es noch zurück. Da gibt es noch
viele andere Dinge, die du vorziehen kannst und auch vorziehen sollst.
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.