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
Lesezeichen