目次

簡易電卓(PS/2テンキー)

概要

PS/2テンキーは、数値を入力するインターフェイスとして優れています。
例えば、

等の用途には打って付けだと思います。

動作原理

ハードウエアとしては、PICとPS/2テンキーとは、CLOCK信号とDATA信号の2本を接続するだけです。
ソフトウエアとしては、今回は一桁の数値の四則演算に限定しましたので、とても簡単です。

<Mini-DIN(6Pin)ピン配置>
1:DATA
2:
3:GND
4:+5V
5:CLOCK
6:

回路図

ソースコード

Calculator.c
//********************************************************************** 
/*
  『簡易電卓(四則演算)』 
*/
//********************************************************************** 
 
short	ShortToStrEx(short s, char* buf)
{
	static	char	d1, d2;
	if (s >= 0) {
		d2 = s / 10;
		d1 = s - (d2 * 10);
		buf[0] = d2 + '0';
		buf[1] = d1 + '0';
		buf[2] = 0x00;
		return(0);
	} else {
		s = 0 - s;
		d2 = s / 10;
		d1 = s - (d2 * 10);
		buf[0] = d2 + '0';
		buf[1] = d1 + '0';
		buf[2] = 0x00;
		return(-1);
	}
}
 
//********************************************************************** 
 
void main()
{
	unsigned	short	keydata, special, down;
	unsigned	char	buf[8], len;
	signed		short	dat1, dat2, kotae;
	//
	OSCCON = 0b01110000;		// クロックは8Mhz 
	CMCON  = 0b00000111;		// コンパレータは使用しない。
	ANSEL  = 0b00000000;
	TRISA  = 0b00111110;
	TRISB  = 0b00001111;
	OPTION_REG.F7 = 0;
	// LCDを初期化する。 
	Lcd_Custom_Config(&PORTB,4,5,6,7,&PORTA,0,7,6);
	Lcd_Custom_Cmd(LCD_CURSOR_OFF);
	Lcd_Custom_Cmd(LCD_CLEAR);
	Lcd_Custom_Out(1, 1, "Calculator V1");
	Delay_ms(500);
	Lcd_Custom_Cmd(LCD_CLEAR);
	//
	Ps2_Config(&PORTB, 0, 1);
	Delay_ms(100);
	//
	len = 0;
	buf[0] = 0x00;
	//
	while (1) {
		if (Ps2_Key_Read(&keydata, &special, &down)	== 1) {
			if (down && !special && keydata) {
				switch (keydata) {
				case '#':
					break;
				default:
					if (keydata == '.') {
						len = (len > 0) ? (len - 1) : len;
						buf[len] = 0x00;
					} else {
						buf[len] = keydata;
						len++;
						buf[len] = 0x00;
					}
					Lcd_Custom_Cmd(LCD_CLEAR);
					Lcd_Custom_Out(1, 1, buf);
					break;
				}
			}
			if (down && special && (keydata == 13)) {	// enter-key
				dat1 = buf[0] - '0';
				dat2 = buf[2] - '0';
				switch (buf[1]) {
				case '+':
					kotae = dat1 + dat2;
					break;
				case '-':
					kotae = dat1 - dat2;
					break;
				case '*':
					kotae = dat1 * dat2;
					break;
				case '/':
					kotae = dat1 / dat2;
					break;
				}
				if (ShortToStrEx(kotae, buf) == -1)
					Lcd_Custom_Out(2, 1, "-");
				else
					Lcd_Custom_Out(2, 1, " ");
				if (buf[0] == '0')
					Lcd_Custom_Out(2, 2, &buf[1]);
				else
					Lcd_Custom_Out(2, 2, buf);
				//
				len = 0;
			}
		}
	}
}
 
//**********************************************************************

動作確認

PS/2テンキーへの配線は、4本だけです。
黒色:GND
赤色:+5V
黄色:CLOCK信号
白色:DATA信号

実際に四則演算をしてみました。

著作権表示 copyright notice

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