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
Lesezeichen