-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: 3x4 Matrix-Tastarur

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Ort
    Herford
    Alter
    33
    Beiträge
    52

    3x4 Matrix-Tastarur

    Anzeige

    Hallo Mikrocontroller Freunde,

    ich habe ein kleines Problem bei der abfrage einer 3x4 Matrix Tastatur und hoffe auf eure Hilfe, da ich langsam nicht mehr weiter weiß.

    Die abfrage an sich stellt keine Probleme dar, aber ich möchte erkennen ob 2 Tasten gedrückt sind. Und da komme ich heftig ins stolpern.

    die Tastatur ist wie folgt an den PORTB angeschlossen

    1--2--3-------RB4
    | | |
    4--5--6-------RB5
    | | |
    7--8--9------RB6
    | | |
    *--0--#----- RB7
    | | |
    | | |
    1 2 3
    RB RB RB

    Code:
    /** I N C L U D E S **********************************************************/
    #include <delays.h>
    #include <p18f4550.h>
    #include "typedef.h"
    /**************************************************************************/
    
    
    /** D E F I N I T I O N S ****************************************************/
    #define PORTKEY 	LATB
    #define TRIS_KEY   	TRISB
    #define spalte1		PORTBbits.RB1	//Keypad - 1 4 7 *  
    #define spalte2		PORTBbits.RB2	//Keypad - 2 5 8 0	
    #define spalte3		PORTBbits.RB3	//Keypad - 3 6 9 #
    #define zeile1		PORTBbits.RB4	//Keypad - + I I I 
    #define zeile2		PORTBbits.RB5	//Keypad - --+ I I	
    #define zeile3		PORTBbits.RB6	//Keypad - ----+ I      
    #define zeile4		PORTBbits.RB7	//Keypad - ------+
    
    
    /***********************************************************************************************
    
    bit | 15 | 14 | 13 | 12 |  11 |  10 |  09 |  08 |  07 |  06 |  05 |  04 |  03 |  02 |  01 |  00
    ----|-------------------------------------------|------------------------------------------------
    s/z |    |    |    |    | 4/3 | 4/2 | 4/1 | 3/3 | 3/2 | 3/1 | 2/3 | 2/2 | 2/1 | 1/3 | 1/2 | 1/1
    ----|-------------------------------------------|------------------------------------------------
    key |    |    |    |    |  #  |  0  |  *  |  9  |  8  |  7  |  6  |  5  |  4  |  3  |  2  |  1            
    
    
    **************************************************************************************************/
    
    signed int KEY_Scancode (void)
    {
    	signed int code=0x0000;
    
    	INTCON2bits.RBPU=0;          //pull-up's an
    	TRIS_KEY = 0b11110000;     	// KEY-PORT bit 0,1,2,3 = Ausgänge (bit 0 für LCD_E=0)
    	PORTKEY  = 0b11111110;
    	
    
    
    //*******1.Spalte(1,4,7,*)*************************************************************************
    	spalte2 = 1;
    	spalte3 = 1;
    	spalte1 = 0;
    TRIS_KEY = 0b11111100;
    	Nop();
    	if (zeile1==0) code = code | 1;		//1
    	if (zeile2==0) code = code | 8;		//4
    	if (zeile3==0) code = code | 64;	//7
    	if (zeile4==0) code = code |512;    //*
    
    //*******2.Spalte(2,5,8,0)*************************************************************************
    	spalte1 = 1;
    	spalte2 = 0;
    TRIS_KEY = 0b11111010;
    	Nop();
    	if (zeile1==0) code = code |  2; 	//2
    	if (zeile2==0) code = code | 16; 	//5
    	if (zeile3==0) code = code |128; 	//8
    	if (zeile4==0) code = code |1024; 	//0
    
    
    //*******3.Spalte(3,6,9,#)*************************************************************************	
    	spalte2 = 1;
    	spalte3 = 0;
    TRIS_KEY = 0b11110110;
    	Nop();
    	if (zeile1==0) code = code |  4; 	//3
    	if (zeile2==0) code = code | 32; 	//6
    	if (zeile3==0) code = code |256; 	//9
    	if (zeile4==0) code = code |2048; 	//#
    
    	return code;
    
    
    void main(void)
    {	
    .
    .
    .	
           while (1)
           {
    	    PORTD=KEY_Scancode ();  //an PortD sind zur silulation led's
            }
    
    }
    Diese abfrage funktioniert sofern ich 2 Tasten drücke die sich Zeilen oder Spaltenweise nicht überschneiden.

    alles andere ist 'müll'

    hat jemand von euch Erfahrung mit der abfrage von 2 Tasten und kann mir einen tipp geben?

    das eigentliche Ziel wird es später sein, wie bei einer PC-Tastatur bei tasten druck einen makecode (hier 2 byte), und beim loslassen einen breakcode (makecode | 0xf000) zu senden. aber davon bin ich noch einiges entfernt

    hoffe es kann mir jemand weiterhelfen.

    mfg
    andi

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Ich persönlich würde für alle Tasten eine Bit-Matrix anlegen, die ich beim scannen einzeln vergleiche.
    Matrix-Bit = 1 und TastenPin=1 --> nix zu tun
    Matrix-Bit = 1 und TastenPin=0 --> taste (neu) gedrückt ->sende ON
    Matrix-Bit = 0 und TastenPin=0 --> taste festgehalten, nix zu tun
    Matrix-Bit = 0 und TastenPin=1 --> taste ausgeslassen--> sende OFF
    und dann den Tastenpin in der Matrix merken

    Das kann man nun unterschiedlich geschickt machen, aber das Prinzip bleibt
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Ort
    Herford
    Alter
    33
    Beiträge
    52
    hm das mit nix tun ..Taste neu...teste festgehalten ... usw.
    klingt als wenn es genau das wäre wonach ich Suche \/

    doch leider verstehe ich die zuordnung nicht??
    wofür steht das Matrix-Bit? bzw womit vergleiche ich es?
    TastenPin leuchtet mir ein.

  4. #4
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.969
    Hallo andi.studi!

    Es müssen zuerst alle Tasten einzeln durch setzen einzelnen Bits (RB4-RB7) eingelesen werden und danach gesamt ausgewertet werden. Es lässt sich, glaube ich, mit einmaliger Einlesung nicht realisieren.

    MfG

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Ort
    Herford
    Alter
    33
    Beiträge
    52
    guten morgren,


    @ PICtrue

    Es müssen zuerst alle Tasten einzeln durch setzen einzelnen Bits (RB4-RB7) eingelesen werden
    das einlesen einzelner Tasten funktioniert ja problemlos, aber sobald eine 2. Taste dazukommt funktioniert es nicht mehr bei jeder Taste, nur die Tasten die nicht in der gleichen Spalte oder Zeile liegen bringen das von mir erwartete Ergebnis (Ausgabe auf PORTD).

  6. #6
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.969
    Ich kenne die Programmiersprache C nicht, deswegen kann ich das in deinem Code nicht prüfen.

    Wenn die Bits am RB4-RB7 einzeln nacheinander nur für bestimmte Zeit gesetzt werden, (z.B. zuerst RB4, danach RB5 usw.), könnten zwei Tasten in einer Spalte quasi gleichzeitig (tatsächlich aber nacheinander) eingelesen werden. Die entsprechende Bitmuster für RB4-RB7 sehen dann z.B. so aus: 1000, 0100, 0010, 0001.

    Wenn jede Taste einen eigenen Bit setzen würde, sollte auch keine Probleme bei gleichzeitig gedrückten Tasten in einer Zeile geben.

    MfG

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.02.2005
    Alter
    29
    Beiträge
    830
    Zitat Zitat von andi.studi
    guten morgren,

    das einlesen einzelner Tasten funktioniert ja problemlos, aber sobald eine 2. Taste dazukommt funktioniert es nicht mehr bei jeder Taste, nur die Tasten die nicht in der gleichen Spalte oder Zeile liegen bringen das von mir erwartete Ergebnis (Ausgabe auf PORTD).
    spalten werden durchgeschaltet und zeilen ausgelesen. wenn du jetzt zwei taster in der zeile drückst bekommst du ohne dioden einen kurzen. (port 0 auf high port 1 auf low und diese beiden sind durch die zwei taster und ein zeilenstück verbunden.

    definiere mist: drücke 1 und 4 was passiert??

    mfg clemens
    Neun von zehn Stimmen in meinen Kopf sagen ich bin nicht verrückt. Die andere summt die Melodie von Tetris...

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.09.2006
    Ort
    Hamburg
    Alter
    35
    Beiträge
    987
    Als vor schlag du köntest auf rb1-3 vdd geben und über dioden rb4-7 auf rb0 legen rb0 kanste dan als interupt für die abfrage nutzen wen du nicht permanent die tasten abfragen möchtest
    Legastheniker on Bord !

    http://www.Grautier.com - Projektseite
    http://www.grautier.com/wiki/doku.php?id=bt-index - BT-BUS

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Ort
    Herford
    Alter
    33
    Beiträge
    52
    definiere mist: drücke 1 und 4 was passiert??
    taste 1 --> bit0 (portd) wird gesetzt = funktion gegeben.
    taste 4 --> bit3 (portd) wird gesetzt = funktion gegeben.

    wird aber nach der Taste 1 die Taste 4 gedrückt, springt die anzeige von bit 0 auf bit 3. = falsch bit 0 und 3 sollten high sein.

    2. beispiel.

    taste 2 --> bit1 (portd) wird gesetzt = funktion gegeben.
    taste 5 --> bit4 (portd) wird gesetzt = funktion gegeben.

    wird aber nach der Taste 2 die Taste 5 gedrückt, geht die anzeige aus (alles low). = falsch bit 1 und 4 sollten high sein.


    spalten werden durchgeschaltet und Zeilen ausgelesen. wenn du jetzt zwei taster in der zeile drückst bekommst du ohne dioden einen kurzen. (port 0 auf high port 1 auf low und diese beiden sind durch die zwei taster und ein zeilenstück verbunden.
    wieso bekomme ich einen Kurzschlüß?
    ich definiere doch nur die gerade abgefragte Spalte als Ausgang mit logisch 0, alle anderen spalten werde als Eingang definiert und haben dank der integrierten und aktivierten pull up wiederstände des PORTB logisch 1 signal. dies sollte doch einen Kurzschluß verhindern bei mehr als 2 Tasten in einer Zeile.

    beispiel zeile 3 (funktioniert)
    taste 7 und taste 8 werden auch bei demeinsamen drücken richtig dargestellt. (bit 6 und 7 von portD sind high.

    zeile 1 (mist)
    anzeige geht aus beim drücken einer weiteren taste.


    Wenn jede Taste einen eigenen Bit setzen würde, sollte auch keine Probleme bei gleichzeitig gedrückten Tasten in einer Zeile geben.
    jede Taste setzt ja ein bit in der Variablen scan jede neue taste wird mit scan verodert. klappt leider nicht bei allen tasten.


    2 Tasten abzufragen, das muss doch auch ohne Dioden oder Interrupts gehen. habe das auch mehrmals schon gelesen, leider hapert es an meiner Umsetzung.

    hilfe

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Ort
    Herford
    Alter
    33
    Beiträge
    52
    ich hab das jetzt mal ans display angeschloßen,
    die unteren beiden zeilen funktionieren einwandfrei.

    was ist an diesen denn anders??

    Code:
    //*******1.Spalte(1,4,7,*)*************************************************************************
    TRIS_KEY = 0b11110000;
    	spalte2 = 1;
    	spalte3 = 1;
    	spalte1 = 0;
    TRIS_KEY = 0b11111100;
    	Nop();
    	if (zeile1==0) code = code | 1;		//1
    	if (zeile2==0) code = code | 8;		//4
    	if (zeile3==0) code = code | 64;	//7
    	if (zeile4==0) code = code |512;    //*
    
    //*******2.Spalte(2,5,8,0)*************************************************************************
    TRIS_KEY = 0b11110000;
    	spalte1 = 1;
    	spalte2 = 0;
    TRIS_KEY = 0b11111010;
    	Nop();
    	if (zeile1==0) code = code |  2; 	//2
    	if (zeile2==0) code = code | 16; 	//5
    	if (zeile3==0) code = code |128; 	//8
    	if (zeile4==0) code = code |1024; 	//0
    
    
    //*******3.Spalte(3,6,9,#)*************************************************************************	
    TRIS_KEY = 0b11110000;
    	spalte2 = 1;
    	spalte3 = 0;
    TRIS_KEY = 0b11110110;
    	Nop();
    	if (zeile1==0) code = code |  4; 	//3
    	if (zeile2==0) code = code | 32; 	//6
    	if (zeile3==0) code = code |256; 	//9
    	if (zeile4==0) code = code |2048; 	//#
    
    	return code;
    }

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •