//********************************************************************** /*   『簡易電卓(四則演算)』 */ //********************************************************************** 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; } } } } //**********************************************************************