hi @ all![]()
vielen dank für alles, und vorallem danke ich PicNick,
super idee!!!
nun läuft es auch endlich stabiel
hier nen ausschnitt:
musste aber: if ( Matrix[index] ^ ( PORTB & maske ) ) // änderung (alt=0/neu=1)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; }
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







Zitieren

Lesezeichen