servus ich hätte gerne eine Funnktion die mir den PIND statur zurückgibt uint8_t taste() { uint8_t keys = 0; .... keys=PIND return keys; } int main () { uint8_t taste =0 taste=taste() } so geht es nicht funktion nicht callabel HILFE DANKE
Zunächst müssen Taster irgendwie entprellt werden. Das geht z.B. per Hardware (R/C-Glied) oder besser noch per Software. Dazu wurde hier im Forum schon sooo viel geschrieben, guck dir mal die Suchfunktion an, die hilft ;) http://www.mikrocontroller.net/articles/Entprellung Es gibt dazu auch schon prima Code-Beispiele z.B. von Peter Dannegger: Beitrag "Tasten entprellen - Bulletproof"
Das ist ja absoluter Käse. Wofür brauch man ne Funktion die das PIN-Register zurückgibt ? Schreib doch gleich taste = PIND und gut.
ich versuch eine 4x3 Tastenmatrix einzulesen bei meinen hochgelobten und viel gescholtenen BASCOM heist das getKBD() und in dem Hochgeprisenen aber meistGehastem C++ gibt es dafür keie .h .c oder irgendwas verflucht sei C bringt aber nix! das muss klappen 3 col an PD0-2 4 Row an PD4-7 DDRD = 0x0F; ich lese schon seit 2 tagen posts das kann doch nicht sein das ich da ein risen programm für brauche um einen port zustand zu ermitteln ! in euern Beispiel werden 5 Dateien voll mit C benötigt umm eine taste abzufragen(idiotensicher)! ich habe 12Tasten (BASCOM config KBD PordD --- taste=getKBD() fertig !!!!!) brauch ich dann 12x 5 dateien für eine 4x3 matrix woher soll ich all diesen speicher nehmen
Nö, brauchst du auch nicht. Du hast halt 3 Pins die du als Ausgang ansteuerst und 4 Eingänge. Oder andersherum, da musst du dich schon entscheiden. Nehmen wir mal an PB0..PB2 wären die Ausgänge: DDRB = 0x07; // PB0..PB2 als Ausgang, der Rest Eingang Nun setzt man jeweils einen Ausgang auf 1 und liest die Eingänge: char x; PORTB = 0x01; // 1. Zeile lesen x = (PINB>>3); // Bitmaske in x lesen, x.0 = 1. Taste,... so kann man der Reihe nach alle 3 Zeilen lesen. Entprellen sollte man das trotzdem noch, siehe die Links oben. BASCOM macht da sicher auch nix anderes. Nur hast du relativ wenig Kontrolle darüber, wie entprellt wird. Sobald dein System ressourcenmässig mal etwas voller wird, wirst du die zusätzliche Kontrolle zu schätzen lernen ;) Wie du bereits erkannt hast ist der Nachteil davon allerdings, das du wissen musst, was passiert. Aber Grundlagenwissen dürfte auch in BASCOM nicht schaden...
tja...typischer BASCOM-Effekt würd ich das nennen. Mach dir klar, wie ne Matrixtastatur funktioniert, dann ergibt sich dein Programm von selbst.
Oh man, das hier ist ein gutes Beispiel für Wie-sollte-man-niemals-eine-Frage-stellen. Als erstes der Topic: -Du arbeitest anscheinend auf einem Mikrocontroller, also wird das da oben C sein. Die Quelltext-Ausschnitte sagen das gleiche. -"C++ oh JE Funktion und rückgabe" bei dem Titel wolltest du nichts erreichen, oder? Wer soll bei einem solchen Titel, den ich vermutlich irgendwie doch verstehe, nur Lust bekommen zu antworten? -Deine Code-Ausschnitte sind zu alledem (ebenfalls lustlos) aus dem Gedächtnis hier getippt worden. Bei so vielen Syntax vergeht mir alles und du baust dir nur selbst eine Fehlerquelle mehr ein. Sowas kopiert man mit <STRG+C> und <STRG+V>, da sonst beim von Hand eintippen nur noch mehr Fehler eingebaut werden. Dein Problem ist im übrigen auch, dass die Variable 'taste' gleichzeitig der Funktionszeiger (-> ich verweise auf ein gutes C-Buch) auf die Funktion 'taste' ist.
ok klar soweit kann ich wenn ich die spalte 0 PORTB=0x01 setze char x; gleich alle 4 reihen einlesen x= (PIND>>4) 5 6 7 wie sieht das aus dann cheken ob was war das ganze noch 2 mal und dann hat er es
Was passiert, wenn zwei Menschen den gleichen Namen haben und diese Menschen nebeneinander stehen und Du sie mit ihrem Namen ansprichst? Antworten beide? Oder anwortet einer? Wenn ja welcher? Gibt es ein Durcheinander? Wenn ja, warum? Wie könnte man das Problem lösen?
DANKE DANKE na bitte wenn der ansatz stimmpt es geht GANZ EINFACH uint8_t taste_lesen() { uint8_t keys = 0; char wert ='-'; PORTD=0x03; _delay_us( 10 ); keys = PIND; if (keys == 115) wert ='3'; if (keys == 179) wert ='6'; if (keys == 211) wert ='9'; if (keys == 227) wert ='#'; PORTD=0x05; _delay_us( 10 ); keys = PIND; if (keys == 117) wert ='2'; if (keys == 181) wert ='5'; if (keys == 213) wert ='8'; if (keys == 229) wert ='0'; PORTD=0x06; _delay_us( 10 ); keys = PIND; if (keys == 118) wert ='1'; if (keys == 182) wert ='4'; if (keys == 214) wert ='7'; if (keys == 230) wert ='*'; keys =wert; _delay_us( 10 ); return keys; } je zwei reihen ausschalten-- Blockieren (port ein) dann den PINSTATUS abfragen und auswerten bei meiner schaltung tastaturmatrix 4x3 einfach an den port col = PD0-PD2 row = PD4-PD7 ergibt die obige Funktion den tastendruck zurück
Lothar Sammel wrote:
> ich versuch eine 4x3 Tastenmatrix einzulesen
Und warum dann dieser saublöde Titel?
Willst Du etwa absichtlich nur genervte und unpassende Antworten
erhalten?
Bei ner Matrix muß man zweimal einlesen, einmal die Spalten und dann die
Zeilen.
Hier ein Beispiel für ne 4*4 Matrix.
1 | #include <io.h> |
2 | |
3 | |
4 | typedef unsigned char u8; |
5 | typedef unsigned short u16; |
6 | #define NOP(); asm volatile("nop"::);
|
7 | |
8 | |
9 | #define KEY_PIN PINB
|
10 | #define KEY_PORT PORTB
|
11 | #define KEY_DDR DDRB
|
12 | |
13 | |
14 | u8 keyscan( void ) |
15 | {
|
16 | u8 col = 0, row = 0; |
17 | |
18 | KEY_PORT = 0xFF; |
19 | KEY_DDR = 0xF0; |
20 | KEY_PORT = 0x0F; |
21 | NOP(); // wait until input changed |
22 | if( ~KEY_PIN & 1<<0 ) |
23 | col = 4; |
24 | if( ~KEY_PIN & 1<<1 ) |
25 | col = 3; |
26 | if( ~KEY_PIN & 1<<2 ) |
27 | col = 2; |
28 | if( ~KEY_PIN & 1<<3 ) |
29 | col = 1; |
30 | if( col ){ |
31 | KEY_PORT = 0xFF; |
32 | KEY_DDR = 0x0F; |
33 | KEY_PORT = 0xF0; |
34 | NOP(); |
35 | if( ~KEY_PIN & 1<<4 ) |
36 | row = 5; |
37 | if( ~KEY_PIN & 1<<5 ) |
38 | row = 9; |
39 | if( ~KEY_PIN & 1<<6 ) |
40 | row = 13; |
41 | if( ~KEY_PIN & 1<<7 ) |
42 | row = 17; |
43 | if( row == 0 ) |
44 | row = col; // 0 = no key |
45 | }
|
46 | return row - col; // 1..16 = key |
47 | }
|
Peter
Danke ist nicht einfach zu verstehen mit dem ganzen geschiebe << 1<<0 - 7 heist schiebe eine 1 an bit ~ was ist das (Nicht) oder invert kann ich bei 4x3 enfach die col=0 rausnehmen bei mir ist der pin3 nicht beschaltet oder wird dann das ganze innstabil müsste sicher dann die col neu nummerieren im programm
Lothar Sammel wrote: > Danke ist nicht einfach zu verstehen mit dem ganzen geschiebe << > 1<<0 - 7 heist schiebe eine 1 an bit Ja, das ist zur besseren Lesbarkeit. > ~ was ist das (Nicht) oder invert Ja, da die Pullups verwendet werden, ist ne gedrückte Taste low aktiv. > kann ich bei 4x3 enfach die col=0 rausnehmen bei mir ist der pin3 nicht > beschaltet Ja. > oder wird dann das ganze innstabil Warum sollte es? Pins, die man nicht testet haben keinen Einfluß mehr und können anderweitig verwendet werden. > müsste sicher dann die col neu nummerieren im programm Ja, sonst hast Du Lücken. Versuch mal, das Programm zu verstehen. Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.