| 000 05.04.2024, 17:53 Uhr
 DL
 Default Group and Edit
 
 
 
 | Analog zum Ersatz für die MC80.3x-Tastatur hier ein Vorschlag für den Betrieb einer PS/2-Tastatur als Ersatz am PC1715 unter Verwendung eines Arduino Nano. Gibt ja immer wieder Ärger damit oder fehlt ganz...
 
 Hinweis zu den 5V am Port, die scheinen nirgendwo abgesichert zu sein, da können schon mal ein paar Ampere fließen also etwas Vorsicht walten lassen !
 
  
   
 
 
 
 | Quellcode: |  | //----------------------------------------------------------------------------------------------------------------
 //Emulation Tastatur PC1715 mit PS/2 Tastatur + Arduino Nano und Paul Carpenter's PS2KeyMap+PS2KeyAdvanced library
 //----------------------------------------------------------------------------------------------------------------
 #include <PS2KeyAdvanced.h>
 #include <PS2KeyMap.h>
 //#include <Arduino.h> //nur bei VSC
 #define DATAPIN 4 //PS/2 DATA
 #define IRQPIN  3 //PS/2 CLK
 #define PCdata  6 //PC1715 DATAPIN
 #define PCclk   5 //PC1715 CLKPIN
 //Variablen
 uint16_t c,d,rdat;
 uint8_t S,x,idx;
 //von KeyMap library nicht erzeugte bzw. umdefininierte Key Codes: ,{Taste,Code}
 uint16_t Map[][ 2 ] = {
 {PS2_KEY_F1,0xd1},{PS2_KEY_F2,0xd2},{PS2_KEY_F3,0xd3},{PS2_KEY_F4,0xd4},{PS2_KEY_F5,0xcf},{PS2_KEY_F6,0xa0},//F1-6
 {PS2_KEY_F7,0xa1},{PS2_KEY_F8,0xa2},{PS2_KEY_F9,0xa3},{PS2_KEY_F10,0x83},{PS2_KEY_F11,0xc1},{PS2_KEY_F12,0xc2},//F7-12
 {PS2_ALT+PS2_KEY_F1,0xc2},{PS2_ALT+PS2_KEY_F2,0xcd},{PS2_ALT+PS2_KEY_F3,0x8e},//F13-15 Alt+F1-3
 {PS2_KEY_L_ARROW,0x88},{PS2_KEY_R_ARROW,0x86},{PS2_KEY_UP_ARROW,0x8b},{PS2_KEY_DN_ARROW,0x83},//Cursor
 {PS2_KEY_HOME,0x8c},{PS2_KEY_END,0xdd},{PS2_KEY_ENTER,0x9e},{PS2_SHIFT+PS2_KEY_ENTER,0x9d},//Home,S,Enter,NL
 {PS2_SHIFT+PS2_KEY_3,0x00},{PS2_KEY_DIV,0x2d},{PS2_SHIFT+PS2_KEY_DIV,0x5f},//..Minus,Unterstrich
 {PS2_SHIFT+PS2_KEY_F1,0xff}//S0/S1 Umschaltung Shift+F1
 };
 
 //classes
 PS2KeyAdvanced keyboard;
 PS2KeyMap keymap;
 
 void setup( )
 {
 //Serial.begin(9600); //Debug
 keyboard.begin( DATAPIN, IRQPIN );
 keyboard.typematic( 11, 1);
 keyboard.setNoRepeat(1);
 keyboard.setNoBreak(1);
 keymap.selectMap( (char *)"DE" );
 pinMode(PCdata, OUTPUT);
 pinMode(PCclk, OUTPUT);
 }
 
 void loop( )
 {
 if( keyboard.available() )
 {
 c = keyboard.read( );
 if( c > 0 )
 {
 //Statusbyte setzen
 x = 0xE0;                           //Status default E0
 if(c & PS2_SHIFT)bitSet(x,1);       //Status für Shift E2
 else if (c & PS2_CAPS)bitSet(x,3);  //Status für Caps E8
 else if (c & PS2_CTRL)bitSet(x,0);  //Status für CTRL E1
 if (S==1)bitSet(x,2);               //Status für S0/S1 E4
 d=keymap.remapKey(c );
 //die aus dem Remap fehlenden Tasten (s.0. codes) einfügen bzw redefinieren
 for( idx = 0; idx < sizeof(Map)/sizeof(Map[0]); idx ++ )
 if( rdat == Map[idx][0]  )          //Taste nachschlagen
 {
 rdat = Map[idx][1]; d &= ~0xFF; d |= rdat; //Code zuweisen
 break;
 }
 if(d==0xff)S=!S;                    //S0/S1 Umschaltung
 //Ausgabe
 if((d>0)&&((d & 0xff)<=0xDD))
 {
 Serialto_pc( x);                  //Statusbyte ausgeben
 Serialto_pc(d & 0xff);            //Tastencode ausgeben
 }
 }
 }
 }
 
 void Serialto_pc(uint8_t i)    //zum PC1715 übertragen
 {
 //Serial.print((i),HEX); //Debug
 uint8_t z;            //Bitzähler
 //bith();            // original 2x sync?
 //bith();            // geht auch ohne
 bitl();                 //Startbit
 for(z=0;z<8;z++){(i & (1 << z))? bith():bitl();} //Einzelbits auswerten
 bith();                //Stoppbit
 bith();                //Stoppbit
 }
 
 void bith (void)
 //Ausgabe 1-Bit
 {
 digitalWrite(PCdata, LOW);             // Datenbit löschen (weil Daten negiert übertragen)
 digitalWrite(PCclk, HIGH);          //Taktbit setzen
 _delay_us(20);
 digitalWrite(PCclk, LOW);            // Taktbit löschen
 }
 
 void bitl (void)
 //1 Ausgabe 0-Bit
 {
 digitalWrite(PCdata, HIGH);         // Datenbit setzen (weil Daten negiert übertragen)
 digitalWrite(PCclk, HIGH);             // Taktbit setzen
 _delay_us(20);
 digitalWrite(PCclk, LOW);             // Taktbit löschen
 }
 
 | 
 
 
 Es sind noch nicht alle (Sonder-)Tasten verteilt, hier die Tastencodes, die können ja im Programm noch ergänzt werden.
 
  
 Edit:
 - Code ergänzt, irgendwie wird in der PS2KeyMap library das Minuszeichen und der Unterstrich nicht auf DE-Tastatur umgesetzt...
 - Zeichensatzumschaltung  eingefügt
 - Datenarray auf 2D umgestellt, dürfte sich besser handhaben lassen zum ergänzen/ändern der Sonderzeichen
 Dieser Beitrag wurde am 30.06.2024 um 11:13 Uhr von DL editiert.
 |