====== 10キー変換(RS232C:TTLレベル)ユニット ====== ===== 概要 ===== パソコンでよく使われるPS2インターフェイスの「10キー」が秋葉原ではとても安く(数百円)手に入ります。 これをなんとか利用できないものでしょうか? 例えば、DDS(ダイレクト・デジタル・シンセサイザ)等の周波数設定には、デジスイッチやロータリーエンコーダがよく使われますが、それよりももっと直感的で分かりやすい「10キー」は如何でしょうか? 10キーから、12800000と入力すると、12.8Mhzの周波数が出力されるテストオッシレータ等に応用できれば最高ですね。 {{:imgpaste:202004:htmikan-20200429-161828.png?500}} 緑色の部品がPS2のインターフェイス用のものです。確か中国へ出張の折に購入したものです。 2つ差込がありますが上のほうだけ使用しています。 {{:imgpaste:202004:htmikan-20200429-161850.png}}{{:imgpaste:202004:htmikan-20200429-161853.png}} ===== 回路図 ===== {{:imgpaste:202004:htmikan-20200429-161906.png}} ===== ソースコード ===== //********************************************************************** /* 【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のハイパーターミナルに表示させてみました。 {{:imgpaste:202004:htmikan-20200429-162033.png?500}} {{:imgpaste:202004:htmikan-20200429-162047.png?500}} 10キーから打ち込んだデータがハイパーターミナルに表示されます。 {{:imgpaste:202004:htmikan-20200429-162059.png}} このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]] This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]