000
13.07.2024, 17:31 Uhr
DL
Default Group and Edit
|
Ich weiß, es nervt... aber lustigerweise fragen in letzter Zeit wieder Leute nach dem kleinen PS/2 Adapter für den KC85, ich dachte mit dem M052 hätte sich das erledigt. Weil gerade noch der Digispark herum lag hab ich mal fix auf der Arduino Plattform eine Kurzversion mit der PS2KeyAdvanced library zusammengestellt. Die Schaltung ist fix zusammengesteckt und der Digispark kann über USB mit dem Micronucleus geflasht werden. Es funzt natürlich auch mit anderen Boards, wie dem NANO o.ä., das ist zwar etwas größer als das Original, aber zum testen reicht es.
Die *.ino:
Quellcode: | //---------------------------------------------------------------------------- //Emulation KC85-Tastatur mit PS/2 Tastatur + Digispark und Paul Carpenter's //PS2KeyAdvanced library //---------------------------------------------------------------------------- #include <PS2KeyAdvanced.h>
#define DATAPIN 3 // PS/2 DATA #define IRQPIN 2 // PS/2 CLK #define KCDATA 4 // DATA -> KC
uint8_t mapping[][2] = // uebernommen aus KC85/5 Handbuch S148 ff. { // Returned keycode definitions 0x11-0x6c (PS2KeyAdvanced.h)-> KC-Code /*0x11*/{8,9},{60,61},{86,120},{87,119},{6,7},{122,123},{120,121}, /*0x18*/{118,119},{56,57},{40,41},{76,77},{24,25},{0,0},{126,127},{70,71}, /*0x20*/{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /*0x28*/{0,0},{0,0},{0,0},{126,127},{0,0},{0,0},{0,0},{0,0}, /*0x30*/{10,43},{116,117},{4,5},{0,21},{100,101},{36,37},{84,85},{107,53}, /*0x38*/{68,69},{58,59},{0,0},{104,75},{106,0},{27,91},{103,11},{0,0}, /*0x40*/{22,23},{2,3},{94,95},{110,111},{98,99},{16,17},{34,35},{82,83}, /*0x48*/{50,51},{64,65},{66,67},{72,73},{88,89},{78,79},{62,63},{54,55}, /*0x50*/{38,39},{112,113},{96,97},{18,19},{32,33},{48,49},{46,47},{128,1}, /*0x58*/{30,31},{80,81},{14,15},{0,0},{52,20},{0,0},{26,105},{0,0}, /*0x60*/{0,0},{124,125},{12,13},{28,29},{108,109},{44,45},{92,93},{0,124}, /*0x68*/{0,12},{0,28},{0,108},{0,44},{0,92} }; uint8_t l,s; // classes PS2KeyAdvanced keyboard;
void setup( ) { keyboard.begin( DATAPIN, IRQPIN ); keyboard.resetKey(); keyboard.setNoRepeat(1); keyboard.setNoBreak(1); pinMode(KCDATA, OUTPUT); digitalWrite(KCDATA, HIGH); }
void loop( ) { uint8_t i; uint16_t j; // Variablen Hauptprogramm if (keyboard.available()) // wenn Daten im Puffer sind { j = keyboard.read( );i=0; // j enthält nun den Advanced-Keycode l = keyboard.getLock(); // l enthält nun den Status von CAPS,Num,Scroll if (((j&0xff)>=0x11)&&((j&0xff)<=0x6c)) //aussieben { i = mapping[(j&0xff)-17][1]; // codes aus dem mapping ohne und if(j&PS2_SHIFT)i = mapping[(j&0xff)-17][0]; // mit shift } if ((j&0xff)==PS2_KEY_EUROPE2){i=74;if (j&PS2_SHIFT)i=90;} // < > if ((l&PS2_LOCK_CAPS) != (s&PS2_LOCK_CAPS )) {s=l;i=115;} // CAPS -> KC if (j==PS2_ALT_GR + PS2_KEY_EUROPE2)i=102; // altgr+< | if (j==PS2_ALT_GR + PS2_KEY_Q)i=42; // altgr+q @ if (i>0)put_kc(i); // ausgeben } }
// -----Senderoutine zum KC----- void put_kc(uint8_t y){send_kc(y);delay(12);send_kc(y);} // send twice // Byte Ausgabe void send_kc (uint8_t i) // send { uint8_t z; // Bitzähler for(z=0;z<7;z++) {(i & (1 << z))? bith():bitl();} // Einzelbits auswerten burst(); }
void bith (void){ burst();delay(7);} // Hi Impulsabstand void bitl (void){ burst();delay(4);} //Low Impulsabstand
void burst (void) // Burst, ist beim Original so, einfaches Low tut es aber auch { uint8_t t=5; // ca 140 uS do { digitalWrite(KCDATA, LOW );delayMicroseconds(14); digitalWrite(KCDATA, HIGH);delayMicroseconds(14); t--; } while(t); }
|
Edit: mal das mapping etwas logischer angeordnet, da kann man die Tastencodes für den KC besser anpassen... (0x20-0x2f ist das Keypad, meine Minitastatur hat keins, da konnte ich das ohne Aufwand nicht so recht zuordnen) Dieser Beitrag wurde am 16.07.2024 um 11:39 Uhr von DL editiert. |