文書の表示以前のリビジョンバックリンクPDF の出力全て展開する/折り畳むODT 出力文書の先頭へ この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。 ====== 簡易電卓(PS/2テンキー) ====== ===== 概要 ===== PS/2テンキーは、数値を入力するインターフェイスとして優れています。 例えば、 * 発振器を作った場合に、「1000000」+「Enter」と入力すれば、1MHzを発振する。 * 可変電源を作った場合に、「12.5」+「Enter」と入力すれば、12.5Vを出力する。 等の用途には打って付けだと思います。 {{:imgpaste:202004:htmikan-20200429-192939.png}} ===== 動作原理 ===== ハードウエアとしては、PICとPS/2テンキーとは、CLOCK信号とDATA信号の2本を接続するだけです。 ソフトウエアとしては、今回は一桁の数値の四則演算に限定しましたので、とても簡単です。 * PS/2テンキーからのデータを受信する。 * 受信したデータをLCDに表示させる。 * Delキーが押下されると、最後に押されたデータを削除する。 * Enterキーが押下されると、計算をして結果をLCDに表示させる。 <Mini-DIN(6Pin)ピン配置> 1:DATA 2: 3:GND 4:+5V 5:CLOCK 6: {{:imgpaste:202004:htmikan-20200429-193009.png}}{{:imgpaste:202004:htmikan-20200429-193014.png}} ===== 回路図 ===== {{:imgpaste:202004:htmikan-20200429-193046.png}} ===== ソースコード ===== <code c 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; } } } } //********************************************************************** </code> ===== 動作確認 ===== {{:imgpaste:202004:htmikan-20200429-193200.png?500}} PS/2テンキーへの配線は、4本だけです。 黒色:GND 赤色:+5V 黄色:CLOCK信号 白色:DATA信号 {{:imgpaste:202004:htmikan-20200429-193214.png}}{{:imgpaste:202004:htmikan-20200429-193219.png}} 実際に四則演算をしてみました。 {{:imgpaste:202004:htmikan-20200429-193226.png}}{{:imgpaste:202004:htmikan-20200429-193229.png}} {{:imgpaste:202004:htmikan-20200429-193235.png}}{{:imgpaste:202004:htmikan-20200429-193242.png}} <callout type="warning" title="著作権表示 copyright notice"> このページは稲崎様の閉鎖した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]] </callout> elechobby/picdic/pic16f88/78.txt 最終更新: 2025/10/17 14:29by 127.0.0.1