hi @ all

vielen dank für alles, und vorallem danke ich PicNick,

super idee!!!

nun läuft es auch endlich stabiel

hier nen ausschnitt:
Code:
#define MAXB  12  // bestimmt die grösse von keybuffer (keybuffer[MAXB])//0..255


static int keybuffer[MAXB]={0,0,0,0,0,0,0,0,0,0,0,0};    //funktion bufferlöschne schreiben und in die init packen
static uint8 keycount=0;   

void  KEY_Check (uint8 index, uint8 maske)
{
static uint8 Matrix[12]= {0x10,0x10,0x10,0x20,0x20,0x20,0x40,0x40,0x40,0x80,0x80,0x80}; 
unsigned int code;
static uint8 i=1;

    if ( Matrix[index] ^ ( PORTB & maske ) )    // änderung (alt=0/neu=1) 
   	{
/*******************************************sende breakcode, taste losgelassen********************/
        if ( PORTB&maske)                                       
		{	switch(index+100) 
			{
				case  100:  code=0x2001; break; 
				case  101:  code=0x2002; break;
				case  102:  code=0x2004; break;
				case  103:  code=0x2008; break;
				case  104:  code=0x2010; break; 
				case  105:  code=0x2020; break;
				case  106:  code=0x2040; break;
				case  107:  code=0x2080; break;
				case  108:  code=0x2100; break; 
				case  109:  code=0x2200; break;
				case  110:  code=0x2400; break;
				case  111:  code=0x2800; break;
			}        
		}
/*******************************************sende makecode, taste gedrückt**********************/
        else	 
		{	switch(index) 
			{
				case  0:  code=0x0001; break; 
				case  1:  code=0x0002; break;
				case  2:  code=0x0004; break;
				case  3:  code=0x0008; break;
				case  4:  code=0x0010; break; 
				case  5:  code=0x0020; break;
				case  6:  code=0x0040; break;
				case  7:  code=0x0080; break;
				case  8:  code=0x0100; break; 
				case  9:  code=0x0200; break;
				case  10: code=0x0400; break;
				case  11: code=0x0800; break;
			}			
		}
       	Matrix[index] = PORTB & maske;  // merken Matrix[index] ist null bei gedrükter Taste 	 

// füllt puffer mit make und break code	////////////////////////////////////////////////////////
//	keybuffer[keycount++]=code;			// code in aktuelles feld speichern und feld um 1 erhöhen	
//	if (keycount>MAXB-1) keycount=0 ;	// wenn feld ende erreicht gehe zu feld anfang
	
		if(code<=0x0800)
		{
			keybuffer[keycount] |= code; i=0;
		}	
	 	if (code>=0x2000 && i==0)
		{	
			 keycount++; i=1;		
		}
			
		if (keycount>MAXB-1) keycount=0;		
   	}
}



uint8 KEY_scancheck (void)
{
	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;

TRIS_KEY = 0b11111100;
spalte1 = 0;     
    KEY_Check (0 , 0x10); 	//1
    KEY_Check (3 , 0x20);	//4
    KEY_Check (6 , 0x40);	//7
  	KEY_Check (9 , 0x80);	//*
spalte1 = 1;

TRIS_KEY = 0b11111010;
spalte2 = 0;     
    KEY_Check (1 , 0x10);	//2
    KEY_Check (4 , 0x20);	//5
    KEY_Check (7 , 0x40);	//8
    KEY_Check (10, 0x80);	//0
spalte2 = 1;
  
TRIS_KEY = 0b11110110;
spalte3 = 0;  
    KEY_Check (2 , 0x10);	//3
    KEY_Check (5 , 0x20);	//6
    KEY_Check (8 , 0x40);	//9
    KEY_Check (11 ,0x80); 	//#
spalte3 = 1;                       
}
musste aber: if ( Matrix[index] ^ ( PORTB & maske ) ) // änderung (alt=0/neu=1)
heisen und nicht ^= // brauchte etwas länger um das zu finden

nun versuch ich die funktion uint8 KEY_scancheck (void) über einen timer interrupt in regelmässigen abständen auszuführen.

wünscht mir glück

und nochmals danke


mfg andi