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;