====== 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]]