目次

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

概要

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

緑色の部品がPS2のインターフェイス用のものです。確か中国へ出張の折に購入したものです。
2つ差込がありますが上のほうだけ使用しています。

回路図

ソースコード

ps2.c
//********************************************************************** 
 
/*
			【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キーから打ち込んだデータがハイパーターミナルに表示されます。

著作権表示 copyright notice

このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。詳細
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.Details