10キー変換(RS232C:TTLレベル)ユニット

概要

パソコンでよく使われるPS2インターフェイスの「10キー」が秋葉原ではとても安く(数百円)手に入ります。 これをなんとか利用できないものでしょうか? 例えば、DDS(ダイレクト・デジタル・シンセサイザ)等の周波数設定には、デジスイッチやロータリーエンコー ダがよく使われますが、それよりももっと直感的で分かりやすい「10キー」は如何でしょうか? 10キーから、12800000と入力すると、12.8Mhzの周波数が出力されるテストオッシレータ等に応用できれば 最高ですね。 緑色の部品がPS2のインターフェイス用のものです。確か中国へ出張の折に購入したものです。 2つ差込がありますが上のほうだけ使用しています。

回路図

ソースコード

//********************************************************************** /* 【PS/2→RS232C】 ・ PS/2の信号をRS232C（9600bps）に変換して送信します。 ・PORTA.0＝Clock ・PORTA.1＝Data ・PORTB.3＝keyからのデータを受信したらLEDを点滅させる。 ・PORTB.4＝RS232Cに送信する時にLEDを点滅させる。 ・PORTB.0＝ブザー出力（PWM3Khz） ・PS/2Libraryを使用する場合は、割り込み処理は禁止します。 */ //********************************************************************** void Pwm_Change_DutyEx(unsigned int duty_ratio) { CCPR1L = duty_ratio >> 2; CCP1CON.F6 = duty_ratio & 0b00000001; CCP1CON.F7 = (duty_ratio & 0b00000010) >> 1; } //********************************************************************** void Usart_Write_StringEx(char *buf) { static int len, i; len = strlen(buf); for (i = 0; i < len; i++) { PORTB.F3 = 1; Usart_Write(buf[i]); Delay_ms(2); PORTB.F3 = 0; } } //********************************************************************** void buzzer(unsigned short cnt, unsigned short interval) { short i, j; for (i = 0; i < cnt; i++) { Pwm_Start(); PORTB.F4 = 1; for (j = 0; j < interval; j++) Delay_ms(1); Pwm_Stop(); PORTB.F4 = 0; for (j = 0; j < interval; j++) Delay_ms(1); } } //********************************************************************** void main() { static unsigned short keydata, special, down, keyCnt; static unsigned char buf[10]; // OSCCON = 0b01110000; // クロックは8Mhz CMCON = 0b00000111; // コンパレータは使用しない。 ANSEL = 0b00000000; // A/D変換は使用しない。 TRISA = 0b11111111; TRISB = 0b00000100; PORTB = 0x00; OPTION_REG = 0b10000111; PIE1.TMR1IE = 1; PIR1.TMR1IF = 0; T1CON = 0b00110001; INTCON = 0b01100000; // Pwm_Init(3000); // 3Khz Pwm_Change_DutyEx(1024 / 2); // Usart_Init(9600); // Ps2_Init(&PORTA); // INTCON.GIE = 0; // 割り込みを使用してはいけません！！！ // buzzer(3, 100); // keyCnt = 0; // while (1) { if (Ps2_Key_Read(&keydata, &special, &down) == 1) { if (down && !special && keydata) { if ((keydata == '/') && (keyCnt == 0)) { keyCnt++; continue; } keyCnt = 0; // PORTB.F3 = 1; Usart_Write(keydata); PORTB.F3 = 0; buzzer(1, 100); continue; } if (down && special && (keydata == 13)) { // enter-key if ((keydata == 13) && (keyCnt == 0)) { keyCnt++; continue; } keyCnt = 0; // PORTB.F3 = 1; Usart_Write(keydata); PORTB.F3 = 0; buzzer(1, 100); continue; } } } } //*********************************************************************

動作確認

本ユニットの出力にRS232Cレベル変換ユニットを接続して、PCのハイパーターミナルに表示させてみました。 10キーから打ち込んだデータがハイパーターミナルに表示されます。