Nicht, dass die folgenden Programmzeilen besonders elegant oder effizient wären, aber zum Verständnis, was ich meine:
(beschränkt auf das Wesentliche)
Code:
static char Matrix[12];
//--------------------------------------------------------------
void KEY_Check (int index, int maske)
{
if ( Matrix[index] ^= ( PORTB & maske ) ) // änderung alt/neu
{
if ( PORTB & maske) // alt=0,neu =1
SendKeyOFF( index)
else
SendKeyON( index )
Matrix[index] = PORTB & maske; // merken
}
}
signed int KEY_Scancode (void)
{
spalte1 = 0; spalte2 = 1; spalte3 = 1;
KEY_Check (0 , 1);
KEY_Check (1 , 2);
KEY_Check (2 , 4);
KEY_Check (3 , 8);
spalte1 = 1; spalte2 = 0; spalte3 = 1;
KEY_Check (4 , 1);
KEY_Check (5 , 2);
KEY_Check (6 , 4);
KEY_Check (7 , 8);
spalte1 = 1; spalte2 = 1; spalte3 = 0;
KEY_Check (8 , 1);
KEY_Check (9 , 2);
KEY_Check (10 , 4);
KEY_Check (11 , 8);
}
Nebeneffekt "at first", weil ja alle Matrixbits auf 0 stehen: ALLE Tasten on, und dann gleich ALLE Tásten OFF.
Man müsste daher ganz am Anfang alle tasten auf "aus" stellen
for (int ix=0; ix < 12; ix++)
Matrix[ix] = 0xFF;
Lesezeichen