Hallo zusammen,
ich möchte mit einem 4fach Dipswitch eine „Art“ Adressierung vornehmen.
Diese verändert im Nachgang dann den Ausgabewert der nachfolgenden 5
Taster.
Code Beispiel der Arrays:
1
//Dipswitch 1-4 gibt die Adresse vor
2
intpinNumbers1[4]={2,3,4,5};//Pin
3
intbuttonNumbers1[4]={1,2,3,4};//Dipswitch
4
5
//Switch 5-9 gibt einen Key (a-z, Shift + a-x, oder 0-9) aus
Dann sieht man auch, dass das so keinen Sinn ergibt. Zum einen hat der
Code in dem Block keinerlei Effekt. Zum anderen hat pinNumbers1[0] den
Wert 2, pinNumbers1[1] den Wert 3 u.s.w., und es scheint wenig sinnvoll,
die mit LOW (was immer das sein mag) zu vergleichen.
Deshalb ist mir nicht so ganz klar, was das soll. Und warum kommen da
nur pinNumbers1 und buttonNumbers2 vor?
Und wieso ist key[] 60 Elemente lang?
Müsste das nicht 80 sein (2^4 Adressen = 16, mal die Bedeutung von 5
Tasten)?
Wenn meine vage Idee von deiner Absicht halbwegs hinkommt, wäre für key
vielleicht ein zweidimensionales Feld besser.
Wie nachfolgend skizziert:
> Hier mal ein tabellarisches Beispiel:>>
1
>wennpinNumbers1
2
>2=low2=high2=low...
3
>3=low3=low3=high...
4
>4=low4=low4=low...
5
>5=low5=low5=low...
6
>istbuttonNumbers1
7
>0,0,0,01,0,0,00,1,0,0...
8
>istbuttonNumbers2
9
>5=a5=f5=k...
10
>6=b6=g6=l...
11
>7=c7=h7=m...
12
>8=d8=i8=n...
13
>9=e9=j9=o...
14
>
>
soll der Taster1 (sowie auch die rewstlichen) wie ein Keyboard agieren
und beispielsweise entweder Key- "a" oder "f" oder "k" usw. je nach
Stellung des 4fach Dipswitch (binär) ausgeben.
Sprich, wenn Dipswitch Switch 1, 2, 3 und 4 jeweils „LOW“ sind, also
keine Spannung anliegen haben, soll Taster1 „a“, Taster2 „b“, Taster3
„c“, Taster4 „d“ und Taster5 „e“ ausgeben.
Wechselt allerdings Dipswitch Switch 1 von „LOW“ auf „High“ (Spannung
liegen an) und 2, 3 und 4 bleiben jeweils auf „LOW“ (keine Spannung
liegen an), soll Taster1 „f“, Taster2 „g“, Taster3 „h“, Taster4 „i“ und
Taster5 „j“ ausgeben.
usw.
Dafür suche ich den passenden Code.
Nach meinen C-Kenntnissen macht folgendes Statement einfach gar nichts.
{
buttonNumbers2[0] == key[0] &&
buttonNumbers2[1] == key[1] &&
buttonNumbers2[2] == key[2] &&
buttonNumbers2[3] == key[3] &&
buttonNumbers2[4] == key[4];
}
Es wird verglichen, und das Ergebnis ignoriert. Aber vielleicht verstehe
ich auch das moderne C-2022 nicht mehr.
Ich würde aus den pinNumbers1[] , die ja nur Low oder High sind, eine
Zahl machen.
Zahl = pinNumbers1[0]
| (pinNumbers1[1] <<1)
| (pinNumbers1[2] <<2)
| (pinNumbers1[3] <<3);
Und dann einfach mit der Zahl weiter rechnen.
Klaus W. schrieb:> Und wieso ist key[] 60 Elemente lang?> Müsste das nicht 80 sein (2^4 Adressen = 16, mal die Bedeutung von 5> Tasten)?>> Wenn meine vage Idee von deiner Absicht halbwegs hinkommt, wäre für key> vielleicht ein zweidimensionales Feld besser.
weil es aktuell, wie oben zu sehen ist, von "a" bis "Shift+x" geht, was
dann 60 Elemente ergibt. Der Rest ist erstmal als "Puffer" da und wird
bei Bedarf dann erweitert. Somit dann auch von 60 aufwärts auf 80
vervollständigt.
D. Z. schrieb:> Wechselt allerdings Dipswitch Switch 1 von „LOW“ auf „High“ (Spannung> liegen an) und 2, 3 und 4 bleiben jeweils auf „LOW“ (keine Spannung> liegen an), soll Taster1 „f“, Taster2 „g“, Taster3 „h“, Taster4 „i“ und> Taster5 „j“ ausgeben.
Ändere einfach den Startwert des Index deines Arrays in der
Ausgaberoutine.
Index = Mäuseklavier * 5;
D. Z. schrieb:> ich möchte mit einem 4fach Dipswitch eine „Art“ Adressierung vornehmen.> Diese verändert im Nachgang dann den Ausgabewert der nachfolgenden 5> Taster.
Alles viel zu chaotisch und aufgeblasen.
Zuerst liest man den DIP-Switch ein, damit hat man eine 4 Bit Zahl. Man
hantiert nicht mit den einzelnen Bits. mit der 4 Bit Zahl wählt man
einen Bereich aus, mit dein 5 Einzeltasten das Element. Das schreit nach
einem zweidimensionalen Array. Sinnvollerweise organisiere man das so,
daß es logisch ist, ggf auch mit Lücken.
D. Z. schrieb:> ich möchte mit einem 4fach Dipswitch eine „Art“ Adressierung vornehmen.
Es schadet nichts, sich als blutiger Anfänger erstmal mit dem
Binärsystem zu beschäftigen. Das ist die Grundlage jeglicher Nutzung von
IO-Pins.
Dann verschwinden die riesigen if/else Konstrukte ganz automatisch und
der Code wird erheblich besser lesbar.
D. Z. schrieb:> int pinNumbers1[4] = { 2, 3, 4, 5 }; //Pin> ....
Ich bastle mir ein Byte....
int pinNumbers; -> int dipswitch_summe; // weils ja keine Pinnummer
sind....
dipswitch_summe = (dipswitch_pin1 + (dipswitch_pin2 << 1) +
(dipswitch_pin3 << 2) + (dipswitch_pin4 << 3));
https://www.mikrocontroller.net/articles/Bitmanipulation
Vorausgesetzt:
Peter D. schrieb:> Es schadet nichts, sich als blutiger Anfänger erstmal mit dem> Binärsystem zu beschäftigen.
Starthilfe Ente
bb
Rolf M. schrieb:> Das geht allerdings nur in C, nicht in C++.
Doch schon....
Zumindest der GCC lässt es durchgehen.
warning: initializer-string for 'char [5]' is too long [-fpermissive]
Die Meldung ist berechtigt, da die abschließende Null nicht mit
gespeichert wird.
1
#include<Streaming.h> // die Lib findest du selber ;-)
Falk B. schrieb:> Rolf M. schrieb:>> Das geht allerdings nur in C, nicht in C++.>> Häää? Warum soll das in C++ nicht gehen? Das sind triviale Arrays mit> Strings.
Weil die Stringliterale jeweils 6 Bytes groß sind, da sie das
abschließende \0 enthalten. In C gibt es eine Sonderregel, dass das auch
weggelassen werden kann, wenn das Ziel genau so groß ist, dass das \0
gerade nicht mehr rein passt. Die gibt's in C++ aber nicht.
EAF schrieb:> Rolf M. schrieb:>> Das geht allerdings nur in C, nicht in C++.>> Doch schon....> Zumindest der GCC lässt es durchgehen.
Meiner nicht.
> warning: initializer-string for 'char [5]' is too long [-fpermissive]> Die Meldung ist berechtigt, da die abschließende Null nicht mit> gespeichert wird.
Bei mir ist das keine Warnung, sondern ein Fehler. Offenbar hast du dem
Compiler noch ein -fpermissive oder irgendetwas, das das beinhaltet,
mitgegeben.
1
g++ charkey.cpp
2
charkey.cpp:3:5: error: initializer-string for ‘char [5]’ is too long [-fpermissive]
Rolf M. schrieb:> Weil die Stringliterale jeweils 6 Bytes groß sind, da sie das> abschließende \0 enthalten. In C gibt es eine Sonderregel, dass das auch> weggelassen werden kann, wenn das Ziel genau so groß ist, dass das \0> gerade nicht mehr rein passt. Die gibt's in C++ aber nicht.
Ja mein Gott, dann mach da 6 chars pro Zeile und gut. Die 16 Bytes
"Verschwendung" können wir uns wohl gerade noch leisten.
char key[16][6]