fork(1) download
  1. /*======================================*/
  2. /* インクルード */
  3. /*======================================*/
  4. #include "sfr_r838a.h" /* R8C/38A SFRの定義ファイル */
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <stdio.h>
  8. #include <math.h>
  9. #include <errno.h>
  10. #include "printf_lib.h" /* printf使用ライブラリ */
  11. //#include "hd44780.h"
  12.  
  13. /*======================================*/
  14. /* シンボル定義 */
  15. /*======================================*/
  16. #define EDBZERO 50 //←←←オレ定義errno <divide by zero>
  17.  
  18. #define LCD_DB p3
  19. #define LCD_DB7 p3_3
  20. #define LCD_DB6 p3_2
  21. #define LCD_DB5 p3_1
  22. #define LCD_DB4 p3_0
  23. #define LCD_STB p3_4
  24. #define LCD_RS p3_5
  25. #define LCD_LGT p3_6
  26. #define PWRKEY p3_7
  27.  
  28. #define KEY_INTERVAL 3 //キーパッド サンプリング間隔[ms]
  29.  
  30. #define AUTOLIGHTOFF 10000 //バックライトオフまでの時間(ms) 1000*10→10秒
  31. #define AUTOPOWEROFF 90000 //オートパワーオフまでの時間(ms) 1000*60*1.5→1.5分
  32.  
  33.  
  34. #define SPACE ' ' //空白
  35. #define BLANK20 " "
  36.  
  37. //#define PI pi //円周率
  38. #define PI (atan(1.0) * 4.0) //円周率
  39. #define NAPIER (exp(1)) //ネイピア数
  40.  
  41. //#define ERRORMESSAGE
  42.  
  43. /* キー・ID定義 */
  44. #define KEYID_BKLGT 0x72
  45. #define KEYID_71 0x71
  46. #define KEYID_MODE 0x70
  47.  
  48. #define KEYID_RIGHT 0x34 //右 →
  49. #define KEYID_LEFT 0x31 //左 ←
  50. #define KEYID_UP 0x33 //上 ↑
  51. #define KEYID_DOWN 0x32 //下 ↓ 
  52. #define KEYID_SELECT 0x30 //中央(決定)
  53.  
  54. #define KEYID_NUM0 0x20
  55. #define KEYID_NUMPOINT 0x01
  56. #define KEYID_NUM1 0x22
  57. #define KEYID_NUM2 0x03
  58. #define KEYID_NUM3 0x02
  59. #define KEYID_NUM4 0x24
  60. #define KEYID_NUM5 0x05
  61. #define KEYID_NUM6 0x04
  62. #define KEYID_NUM7 0x26
  63. #define KEYID_NUM8 0x07
  64. #define KEYID_NUM9 0x06
  65. #define KEYID_NUMDEL 0x17
  66. #define KEYID_NUMAC 0x16
  67. #define KEYID_NUMEQUAL 0x10
  68. #define KEYID_NUMPLUS 0x13
  69. #define KEYID_NUMMINUS 0x12
  70. #define KEYID_NUMX 0x15
  71. #define KEYID_NUMSLASH 0x14
  72. #define KEYID_NUMNEG 0x11
  73. #define KEYID_NUM10X 0x00
  74.  
  75. #define KEYID_INV 0x50 //正負
  76. #define KEYID_NEG 0x47 //逆数
  77. #define KEYID_SQUARE 0x51 //二乗
  78. #define KEYID_SQROOT 0x52 //平方根
  79. #define KEYID_POWER 0x53 //累乗(xのy乗)
  80.  
  81. #define KEYID_ANGLEUNIT 0x57 //角度の単位 度数法・弧度法 モード変更(ラーージーーーアーーーーーン!ディィィーーーーグリーーー!)
  82. #define ANGLEUNIT_DEG 0 //度数法なら0
  83. #define ANGLEUNIT_RAD 1 //弧度法なら1
  84. #define KEYID_SIN 0x65 //サイン
  85. #define KEYID_COS 0x66 //コサイン
  86. #define KEYID_TAN 0x67 //タンジェント
  87. #define KEYID_ASIN 0x54 //アークサイン
  88. #define KEYID_ACOS 0x55 //アークコサイン
  89. #define KEYID_ATAN 0x56 //アークタンジェント
  90.  
  91.  
  92. #define KEYID_PI 0x41 //円周率を挿入
  93. #define KEYID_NAPIER 0x42 //ネイピア数を挿入
  94. #define KEYID_LOG10 0x40 //log10
  95. #define KEYID_LN 0x37 //loge(ネイピア数)
  96.  
  97. #define KEYID_DROP 0x27
  98. #define KEYID_CHANGE 0x25
  99.  
  100. #define MODEID_PWROFF 00 //電源OFF
  101. #define MODEID_IFX 01 //(InFiX mode).....中間記法
  102. #define MODEID_RPN 02 //(Reverse Polish Notation mode).....逆ポーランド記法
  103. #define MODEID_LOGICAL 03 //論理演算モード(2進数、8進数、10進数、16進数)
  104. #define MODEID_CHMOD 0xff //モードチェンジ用画面表示
  105. #define MODEID_DEFAULT 02 //初期状態
  106.  
  107. #define CHMOD_SCROLLY_0 Lcd_line_print(2,MsgChmod2);Lcd_line_print(3,MsgChmod3);Lcd_line_print(4,MsgChmod4);
  108. #define CHMOD_SCROLLY_1 Lcd_line_print(2,MsgChmod3);Lcd_line_print(3,MsgChmod4);Lcd_line_print(4,MsgChmod5);
  109. #define CHMOD_SCROLLY_2 Lcd_line_print(2,MsgChmod4);Lcd_line_print(3,MsgChmod5);Lcd_line_print(4,MsgChmod6);
  110. #define CHMOD_SCROLLY_3 Lcd_line_print(2,MsgChmod5);Lcd_line_print(3,MsgChmod6);Lcd_line_print(4,MsgChmod7);
  111. #define CHMOD_SCROLLY_4 Lcd_line_print(2,MsgChmod6);Lcd_line_print(3,MsgChmod7);Lcd_line_print(4,MsgChmod8);
  112. #define CHMOD_SCROLLY_MAX 4
  113. #define CHMOD_SCROLLY_MIN 0
  114. #define CHMOD_SCROLLY_PRINTLCD switch(scrollY){case 0: CHMOD_SCROLLY_0 break; case 1: CHMOD_SCROLLY_1 break; case 2: CHMOD_SCROLLY_2 break; case 3: CHMOD_SCROLLY_3 break; case 4: CHMOD_SCROLLY_4 break; default: scrollY=0; cursorY = 2; CHMOD_SCROLLY_0 break;}
  115.  
  116. #define X10_1 0x14 //___#_#__
  117. #define X10_2 0x08 //____#___
  118. #define X10_3 0x14 //___#_#__
  119. #define X10_4 0x00 //________
  120. #define X10_5 0x17 //___#_###
  121. #define X10_6 0x15 //___#_#_#
  122. #define X10_7 0x15 //___#_#_#
  123. #define X10_8 0x17 //___#_###
  124.  
  125. #define MYCHARCODE1 0x08
  126. #define MYCHARCODE2 0x09
  127. #define MYCHARCODE3 0x0A
  128. #define MYCHARCODE4 0x0B
  129. #define MYCHARCODE5 0x0C
  130. #define MYCHARCODE6 0x0D
  131. #define MYCHARCODE7 0x0E
  132. #define MYCHARCODE8 0x0F
  133.  
  134. #define MYCHAR1 \x08
  135. #define MYCHAR2 \x09
  136. #define MYCHAR3 \x0A
  137. #define MYCHAR4 \x0B
  138. #define MYCHAR5 \x0C
  139. #define MYCHAR6 \x0D
  140. #define MYCHAR7 \x0E
  141. #define MYCHAR8 \x0F
  142.  
  143. /*======================================*/
  144. /* メンバ宣言               */
  145. /*======================================*/
  146. struct stack{
  147. double var;
  148. struct stack far *next;
  149. };
  150.  
  151.  
  152. /*======================================*/
  153. /* プロトタイプ宣言 */
  154. /*======================================*/
  155. void init( void );
  156. void timer( unsigned long timer_set );
  157. unsigned char dipsw_get( void );
  158.  
  159. unsigned char chmod(void);
  160. void mode_rpn(void);
  161. void mode_infix(void);
  162. void mode_logical(void);
  163. void mode_testing(void);
  164.  
  165. void Lcd_init(void); //LCD初期化
  166. void Lcd_output(char *str); //
  167. void Lcd_clear(void);
  168. void Lcd_black(void);
  169. void Lcd_cmd(char cmd);
  170. void Lcd_data(char asci);
  171. void Lcd_out(char code, char flag);
  172. void Lcd_locate(char x, char y);
  173.  
  174.  
  175.  
  176.  
  177.  
  178. //カーソルの位置指定
  179. void Lcd_cursol(char c_mode); //カーソルの表示を変更
  180. void Lcd_line_print(char y,char *str); //LCDに出力。行数指定有り
  181. void Lowspeed_Lcd_line_print(char y,unsigned long w,char *str); //LCDに出力。行数指定有り。タイプライターっぽく遅延しながら表示
  182. void Lcd_Itostring(char y, int digit, unsigned long data, char *buffer, char z);
  183. void Lcd_write_cgram(char CharacterNo,const char *MyChar);
  184. void Lcd_backlight(char z);
  185. char Lcd_backlight_stat(void);
  186.  
  187. void Delay(long usec);
  188. void Delay_ms(unsigned long msec);
  189.  
  190. //void Itostring(int digit, unsigned long data, char *buffer);
  191. //void Ltostring(int digit, unsigned long long data, char *buffer);
  192. void Ltostring_int(int digit, long long data, char *buffer);
  193. void Ltostring_decimal(int digit, unsigned long long data, char *buffer);
  194.  
  195. void Keypad_read(void);
  196.  
  197. void Poweroff(void);
  198.  
  199. unsigned char Check_key_bit(unsigned char keyid,const char *buffer);
  200.  
  201. void stackin(char in,char digits,char position,char *stack);
  202.  
  203.  
  204. void myftoa(char *string, double f, int format);
  205.  
  206. double myatof(const char *string);
  207.  
  208. unsigned long long POW(int a, int b);
  209.  
  210. void mode_infomation(void);
  211.  
  212. void AddStack(struct stack far *Stack1);
  213. void DelStack(struct stack far *Stack1);
  214. void FreeStack(struct stack far *Stack1);
  215. int ExamineStackItemsNumber(struct stack far *Stack1);
  216.  
  217. double DegtoRad(double degree);
  218. double RadtoDeg(double radian);
  219. double mysin(double Angle , char AngleUnit); //Angle:角度 AngleUnit:角度の単位(ANGLEUNIT_DEG,ANGLEUNIT_RAD)
  220. double mycos(double Angle , char AngleUnit); //Angle:角度 AngleUnit:角度の単位(ANGLEUNIT_DEG,ANGLEUNIT_RAD)
  221. double mytan(double Angle , char AngleUnit); //Angle:角度 AngleUnit:角度の単位(ANGLEUNIT_DEG,ANGLEUNIT_RAD)
  222. double myasin(double Angle , char AngleUnit); //Angle:角度 AngleUnit:角度の単位(ANGLEUNIT_DEG,ANGLEUNIT_RAD)
  223. double myacos(double Angle , char AngleUnit); //Angle:角度 AngleUnit:角度の単位(ANGLEUNIT_DEG,ANGLEUNIT_RAD)
  224. double myatan(double Angle , char AngleUnit); //Angle:角度 AngleUnit:角度の単位(ANGLEUNIT_DEG,ANGLEUNIT_RAD)
  225.  
  226. void error_handing(void);
  227. /*======================================*/
  228. /* グローバル変数の宣言 */
  229. /*======================================*/
  230. unsigned long cnt0; /* timer関数用 */
  231. unsigned char cnt1; /* main内で使用 */
  232. char cnt2;
  233. char cnt3;
  234. unsigned char pwrhold = 0;
  235. char backlight_stat = 0;
  236. char key0 = 0;
  237. char keystat[8] = {0,0,0,0,0,0,0,0};
  238. char keynow[8] = {0,0,0,0,0,0,0,0};
  239. char keypast[8] = {0,0,0,0,0,0,0,0};
  240. char keypast0[8] = {0,0,0,0,0,0,0,0};
  241. char keypast1[8] = {0,0,0,0,0,0,0,0};
  242. //char keypast2[8] = {0,0,0,0,0,0,0,0};
  243. //char keypast3[8] = {0,0,0,0,0,0,0,0};
  244. //char keypast4[8] = {0,0,0,0,0,0,0,0};
  245. char keypast5[8] = {0,0,0,0,0,0,0,0};
  246. char key0to1[8] = {0,0,0,0,0,0,0,0};
  247. char key1to0[8] = {0,0,0,0,0,0,0,0};
  248. const char blank20[21] = BLANK20;
  249. unsigned long delayms = 0;
  250. char Is_InfomationMode = 0;
  251. char angleunitmode = ANGLEUNIT_DEG;
  252. char error_is = 0;
  253.  
  254.  
  255. /************************************************************************/
  256. /* メインプログラム */
  257. /************************************************************************/
  258. void main( void )
  259. {
  260. unsigned char mode = MODEID_DEFAULT;
  261.  
  262.  
  263. /* マイコン機能の初期化 */
  264. init(); /* 初期化 */
  265. asm(" fset I "); /* 全体の割り込み許可 */
  266.  
  267.  
  268.  
  269. while(1){
  270. Lcd_init();
  271. Lcd_clear();
  272. Lcd_cursol(4);
  273. Lcd_clear();
  274.  
  275. adstby = 1;
  276. Delay(10000);
  277. adst=1;
  278. Delay(10000);
  279. if(ad7 <= 100) Poweroff(); //電池電圧チェックして2V以下なら電源落とす
  280. adst=0;
  281. adstby = 0;
  282. switch(mode){
  283. case MODEID_PWROFF: //電源OFF
  284. Poweroff();
  285. break;
  286.  
  287. case MODEID_IFX: //中間記法(普通の数式)モード
  288. mode_infix(); //中間記法(InFiX mode)
  289. mode = MODEID_CHMOD;
  290. break;
  291.  
  292. case MODEID_RPN: //RPN(逆ポーランド記法)モード
  293. mode_rpn();
  294. mode = MODEID_CHMOD;
  295. break;
  296. case MODEID_LOGICAL:
  297. //mode_logical();
  298. mode_testing();
  299. mode = MODEID_CHMOD;
  300. break;
  301. case MODEID_CHMOD:
  302. default:
  303. mode = chmod(); //モード変更画面
  304. break;
  305. }
  306. }
  307. }//←←←←←←←メイン関数終了
  308.  
  309. unsigned char chmod(void){ //チェンジモード モードIDを返します
  310. char cursorX,cursorY,scrollY,i;
  311. char MsgChmod1[21] = " *** ChangeMODE 0-2 ";
  312. char MsgChmod2[21] = "0.PWR OFF ";
  313. char MsgChmod3[21] = "1.InFiX MODE ";
  314. char MsgChmod4[21] = "2.RPN MODE ";
  315. char MsgChmod5[21] = "3.Logical operation ";
  316. char MsgChmod6[21] = "4.Undefined ";
  317. char MsgChmod7[21] = "5.Undefined ... ";
  318. char MsgChmod8[21] = "6.Undefined ... ";
  319.  
  320. Lcd_line_print(1,MsgChmod1);
  321.  
  322. cursorX = 1;cursorY = 2;scrollY = 0;
  323.  
  324. CHMOD_SCROLLY_PRINTLCD
  325. Lcd_locate(cursorX,cursorY);
  326. printf("/*** Change MODE ***/\n");
  327.  
  328. while(1)
  329. {
  330. Delay_ms(1);
  331. for(i=0;i<=7;i++)
  332. {
  333. key0to1[i] = keystat[i] & ~keypast5[i];
  334. keypast5[i] = keystat[i];
  335. }
  336. if(Check_key_bit(KEYID_RIGHT,key0to1))
  337. {
  338. cursorX++;
  339. Lcd_locate(cursorX,cursorY);
  340. }
  341. if(Check_key_bit(KEYID_LEFT,key0to1))
  342. {
  343. cursorX--;
  344. Lcd_locate(cursorX,cursorY);
  345. }
  346. if(Check_key_bit(KEYID_DOWN,key0to1))
  347. {
  348. cursorY++;
  349. Lcd_locate(cursorX,cursorY);
  350. }
  351. if(Check_key_bit(KEYID_UP,key0to1))
  352. {
  353. cursorY--;
  354. Lcd_locate(cursorX,cursorY);
  355. }
  356. if(Check_key_bit(KEYID_SELECT,key0to1)){
  357. switch(cursorY + scrollY){
  358. case 2:
  359. return MODEID_PWROFF;
  360. break;
  361. case 3:
  362. return MODEID_IFX;
  363. break;
  364. case 4:
  365. return MODEID_RPN;
  366. break;
  367. case 5:
  368. return MODEID_LOGICAL;
  369. return 3;
  370. break;
  371. case 6:
  372. return 4;
  373. break;
  374. }
  375. }
  376. if(Check_key_bit(KEYID_NUM0,key0to1)){
  377. return MODEID_PWROFF;
  378. }
  379. if(Check_key_bit(KEYID_NUM1,key0to1)){
  380. return MODEID_IFX;
  381. }
  382. if(Check_key_bit(KEYID_NUM2,key0to1)){
  383. return MODEID_RPN;
  384. }
  385. if(Check_key_bit(KEYID_NUM3,key0to1)){
  386. return MODEID_LOGICAL;
  387. }
  388. if(cursorY > 4)
  389. {
  390. scrollY++;
  391. cursorY = 4;
  392. CHMOD_SCROLLY_PRINTLCD
  393. Lcd_locate(cursorX,cursorY);
  394. }
  395. if(cursorY < 2)
  396. {
  397. scrollY--;
  398. cursorY = 2;
  399. CHMOD_SCROLLY_PRINTLCD
  400. Lcd_locate(cursorX,cursorY);
  401. }
  402. if(cursorX > 20) {cursorX = 1;Lcd_locate(cursorX,cursorY);}
  403. if(cursorX < 1) {cursorX = 20;Lcd_locate(cursorX,cursorY);}
  404. }
  405. return MODEID_CHMOD;
  406. } //←←←←←←←chmod関数終了
  407.  
  408. void mode_infix(void){ //Infixモード(中間記法)
  409. printf("/*** Infix MODE ***/\n");
  410. return;
  411. } //←←←←←←←mode_infix関数終了
  412.  
  413. void mode_rpn(void){ //RPNモード(逆ポーランド記法)
  414. unsigned char i = 0;
  415. char demical = 0;
  416. //char MsgPrint1[25] = "\0";
  417. //char MsgPrint2[25] = "\0";
  418. //char MsgPrint3[25] = "\0";
  419. //char MsgPrint4[25] = "\0";
  420.  
  421. char KeyStack1[21];
  422. char KeyStack2[21];
  423. char KeyStack3[21] = " ";
  424. char KeyStack4[21] = " [ ][NOR][DEG][RPN]";//" [DEG][RPN]";
  425. /*
  426. char KeyStack5[21];
  427. char KeyStack6[21];
  428. */
  429.  
  430. //double Stack[7] = {0,0,0,0,0,0,0};
  431. double temp;
  432.  
  433. char Is_nextStackShift = 0;
  434. char cursor = 0;
  435. char cursormode = 4;
  436. char RefreshLCD = 1;
  437. char cursorpast = cursor;
  438.  
  439. const char xten[8] = { X10_1 , X10_2 , X10_3 , X10_4 , X10_5 , X10_6 , X10_7 , X10_8 };
  440.  
  441. struct stack Stack1;
  442.  
  443. unsigned int number_of_stack = 1;//スタックの個数
  444. int formatmode = 1;
  445.  
  446. Stack1.var = 0;
  447. Stack1.next = NULL;
  448.  
  449. for(i=0;i<=20;i++)
  450. {
  451. KeyStack1[i] = SPACE;
  452. KeyStack2[i] = SPACE;
  453. KeyStack3[i] = SPACE;
  454. //KeyStack4[i] = SPACE;
  455. //KeyStack5[i] = SPACE;
  456. //KeyStack6[i] = SPACE;
  457. }
  458. KeyStack1[20] = '\0';
  459. KeyStack2[20] = '\0';
  460. KeyStack3[20] = '\0';
  461. KeyStack4[20] = '\0';
  462. //KeyStack5[20] = '\0';
  463. //KeyStack6[20] = '\0';
  464.  
  465.  
  466. printf("/*** RPN MODE ***/\n");
  467.  
  468. Lcd_write_cgram(MYCHARCODE1,xten);
  469.  
  470. while(1)
  471. { //printf("While Head\n");
  472. if(errno) //エラー時の処理
  473. {
  474. error_handing();
  475. RefreshLCD = 0;
  476. while(error_is)
  477. {
  478. for(i=0;i<=7;i++)
  479. {
  480. while(keystat[i])
  481. {
  482. error_is = 0;
  483. RefreshLCD = 1;
  484. }
  485. }
  486. }
  487. Delay(500000);
  488. Delay(500000);
  489. }
  490. Delay_ms(1);
  491. for(i=0;i<=7;i++)
  492. {
  493. key0to1[i] = keystat[i] & ~keypast5[i];
  494. keypast5[i] = keystat[i];
  495. }
  496. if(RefreshLCD == 1)
  497. {
  498. number_of_stack = ExamineStackItemsNumber(&Stack1);
  499. for(i=0;i<=19;i++)
  500. {
  501. KeyStack2[i] = SPACE;
  502. KeyStack3[i] = SPACE;
  503. }
  504. if(number_of_stack >= 2) myftoa(KeyStack2,(Stack1.next -> var),formatmode);
  505. if(number_of_stack >= 3) myftoa(KeyStack3,(Stack1.next -> next -> var),formatmode);
  506. Ltostring_int(2,number_of_stack,&KeyStack4[2]);
  507. Lcd_cursol(1);
  508. Lcd_line_print(1,KeyStack4);
  509. Lcd_line_print(2,KeyStack3);
  510. Lcd_line_print(3,KeyStack2);
  511. Lcd_line_print(4,KeyStack1);
  512. RefreshLCD = 0;
  513. Lcd_locate(cursor+1,4);
  514. Lcd_cursol(cursormode);
  515. printf("KeyStack1 : %s\n",KeyStack1);
  516. printf("KeyStack2 : %s\n",KeyStack2);
  517. printf("KeyStack3 : %s\n",KeyStack3);
  518. printf("KeyStack4 : %s\n",KeyStack4);
  519. }
  520. if(cursorpast != cursor) Lcd_locate(cursor+1,4);
  521. cursorpast = cursor;
  522. {
  523. if(cursor > 19) cursor = 0;
  524.  
  525. if(Check_key_bit(0x64,key0to1)) //デバッグ用キー
  526. {
  527. if(~Is_nextStackShift)
  528. {
  529. Stack1.var = myatof(KeyStack1);
  530. }
  531. if(Stack1.var != 0)
  532. { //スタックに何か入ってたらEnter
  533. AddStack(&Stack1);
  534. cursor = 0;
  535. for(i=0;i<=19;i++)
  536. {
  537. KeyStack1[i] = SPACE;
  538. }
  539. }
  540. temp = sizeof(double);
  541. if(errno != 0) continue;
  542. Stack1.var = temp;
  543. AddStack(&Stack1);
  544. cursor = 0;
  545. for(i=0;i<=19;i++)
  546. {
  547. KeyStack1[i] = SPACE;
  548. }
  549. temp = sizeof(struct stack far *);
  550. if(errno != 0) continue;
  551. Stack1.var = temp;
  552. AddStack(&Stack1);
  553. cursor = 0;
  554. for(i=0;i<=19;i++)
  555. {
  556. KeyStack1[i] = SPACE;
  557. }
  558. temp = sizeof(struct stack);
  559. if(errno != 0) continue;
  560. Stack1.var = temp;
  561. AddStack(&Stack1);
  562. cursor = 0;
  563. for(i=0;i<=19;i++)
  564. {
  565. KeyStack1[i] = SPACE;
  566. }
  567. myftoa(KeyStack1,Stack1.var,formatmode);
  568. RefreshLCD = 1;
  569. Is_nextStackShift = 1;
  570. }
  571. if(Check_key_bit(0x63,key0to1)) //デバッグ用キー
  572. {
  573. adstby = 1;
  574. Delay(10000);
  575. adst=1;
  576. Delay(10000);
  577. if(~Is_nextStackShift)
  578. {
  579. Stack1.var = myatof(KeyStack1);
  580. }
  581. if(Stack1.var != 0)
  582. { //スタックに何か入ってたらEnter
  583. AddStack(&Stack1);
  584. cursor = 0;
  585. for(i=0;i<=19;i++)
  586. {
  587. KeyStack1[i] = SPACE;
  588. }
  589. }
  590. i = ad7;
  591. //temp = (5/256)
  592. temp = (double) i;
  593. temp *= 0.01953125;
  594. if(errno != 0) continue;
  595. Stack1.var = temp;
  596. myftoa(KeyStack1,Stack1.var,formatmode);
  597. RefreshLCD = 1;
  598. Is_nextStackShift = 1;
  599.  
  600. adst=0;
  601. adstby = 0;
  602.  
  603. }
  604. if(Check_key_bit(KEYID_MODE,key0to1)) //モードキーが押された時の処理
  605. {
  606. FreeStack(&Stack1);
  607. while(Check_key_bit(KEYID_MODE,keystat)); //モードキーが離されるまで待つ
  608. return; //main()関数に戻る
  609. }
  610. if(Check_key_bit(0x74,key0to1)) //指数表記モード SCIentific notation
  611. {
  612. ///678
  613. formatmode=0;
  614. KeyStack4[6] = 'S';
  615. KeyStack4[7] = 'c';
  616. KeyStack4[8] = 'i';
  617. if(~Is_nextStackShift)
  618. {
  619. Stack1.var = myatof(KeyStack1);
  620. }
  621. myftoa(KeyStack1,Stack1.var,formatmode);
  622. RefreshLCD = 1;
  623. }
  624. if(Check_key_bit(0x73,key0to1)) //通常表示モード NORmal notation
  625. {
  626. formatmode=1;
  627. KeyStack4[6] = 'N';
  628. KeyStack4[7] = 'o';
  629. KeyStack4[8] = 'r';
  630. if(~Is_nextStackShift)
  631. {
  632. Stack1.var = myatof(KeyStack1);
  633. }
  634. myftoa(KeyStack1,Stack1.var,formatmode);
  635. RefreshLCD = 1;
  636. }
  637.  
  638. if(Check_key_bit(KEYID_LEFT,key0to1)) //方向キー ←
  639. {
  640. if(cursor) cursor--;
  641. while(Check_key_bit(KEYID_LEFT,keystat))
  642. {
  643. if(Check_key_bit(KEYID_NUM0,key0to1)) cursor = 0;
  644. if(Check_key_bit(KEYID_NUM1,key0to1)) cursor--;
  645. if(Check_key_bit(KEYID_NUM2,key0to1)) cursor -= 2;
  646. if(Check_key_bit(KEYID_NUM3,key0to1)) cursor -= 3;
  647. if(Check_key_bit(KEYID_NUM4,key0to1)) cursor -= 4;
  648. if(Check_key_bit(KEYID_NUM5,key0to1)) cursor -= 5;
  649. if(Check_key_bit(KEYID_NUM6,key0to1)) cursor -= 6;
  650. if(Check_key_bit(KEYID_NUM7,key0to1)) cursor -= 7;
  651. if(Check_key_bit(KEYID_NUM8,key0to1)) cursor -= 8;
  652. if(Check_key_bit(KEYID_NUM9,key0to1)) cursor -= 9;
  653. if(cursor > 19) cursor = 0;
  654. if(cursorpast != cursor) Lcd_locate(cursor+1,4);
  655. cursorpast = cursor;
  656. for(i=0;i<=7;i++)
  657. {
  658. key0to1[i] = keystat[i] & ~keypast5[i];
  659. keypast5[i] = keystat[i];
  660. }
  661. }
  662. }
  663.  
  664. if(Check_key_bit(KEYID_RIGHT,key0to1)) //方向キー →
  665. {
  666. if(cursor<=19) cursor++;
  667. while(Check_key_bit(KEYID_RIGHT,keystat))
  668. {
  669. if(Check_key_bit(KEYID_NUM0,key0to1)) cursor = 19;
  670. if(Check_key_bit(KEYID_NUM1,key0to1)) cursor++;
  671. if(Check_key_bit(KEYID_NUM2,key0to1)) cursor += 2;
  672. if(Check_key_bit(KEYID_NUM3,key0to1)) cursor += 3;
  673. if(Check_key_bit(KEYID_NUM4,key0to1)) cursor += 4;
  674. if(Check_key_bit(KEYID_NUM5,key0to1)) cursor += 5;
  675. if(Check_key_bit(KEYID_NUM6,key0to1)) cursor += 6;
  676. if(Check_key_bit(KEYID_NUM7,key0to1)) cursor += 7;
  677. if(Check_key_bit(KEYID_NUM8,key0to1)) cursor += 8;
  678. if(Check_key_bit(KEYID_NUM9,key0to1)) cursor += 9;
  679. if(cursor > 19) cursor = 0;
  680. if(cursorpast != cursor) Lcd_locate(cursor+1,4);
  681. cursorpast = cursor;
  682. for(i=0;i<=7;i++)
  683. {
  684. key0to1[i] = keystat[i] & ~keypast5[i];
  685. keypast5[i] = keystat[i];
  686. }
  687. }
  688. }
  689.  
  690. if(Check_key_bit(KEYID_NUMAC,key0to1)) //AC押した時
  691. {
  692. printf("Check key AC\n");
  693. Is_nextStackShift = 0;
  694. Lcd_clear();
  695. cursor = 0;
  696. for(i=0;i<=19;i++)
  697. {
  698. KeyStack1[i] = SPACE;
  699. KeyStack2[i] = SPACE;
  700. KeyStack3[i] = SPACE;
  701. //KeyStack4[i] = SPACE;
  702. }
  703. FreeStack(&Stack1);
  704. number_of_stack = 1;
  705. RefreshLCD = 1;
  706. error_is = 0;
  707. }
  708.  
  709. if(Check_key_bit(KEYID_NUMDEL,key0to1)) //DEL押した時
  710. {
  711. printf("Check key DEL\n"); //cursorが"0"以外なら実行
  712. cursor--;
  713. if(cursor <= 19) stackin(0x7f,19,cursor,KeyStack1); //0x7f…アスキーコードで「DEL」をあらわす
  714. Is_nextStackShift = 0;
  715. RefreshLCD = 1;
  716. i = 0;
  717. while(Check_key_bit(KEYID_NUMDEL,keystat))
  718. {
  719. i++;
  720. Delay_ms(10);
  721. if(Check_key_bit(KEYID_NUMAC,keystat))
  722. {
  723. for(i=0;i<=19;i++)
  724. {
  725. KeyStack1[i] = SPACE;
  726. }
  727. cursor = 0;
  728. //break;
  729. }
  730. if(i >= 80)
  731. {
  732. for(i=0;i<=19;i++)
  733. {
  734. KeyStack1[i] = SPACE;
  735. }
  736. cursor = 0;
  737. break;
  738. }
  739. }
  740. i = 0;
  741. }
  742.  
  743. if(Check_key_bit(KEYID_NUMPOINT,key0to1)) //小数点キー押した時
  744. { printf("Check key Dot\n");
  745. if(Is_nextStackShift)
  746. {
  747. Is_nextStackShift = 0;
  748. AddStack(&Stack1);
  749. cursor = 0;
  750. for(i=0;i<=19;i++)
  751. {
  752. KeyStack1[i] = SPACE;
  753. }
  754. }
  755. stackin('.',19,cursor,KeyStack1);
  756. ++cursor;
  757. RefreshLCD = 1;
  758. }
  759.  
  760. if(Check_key_bit(KEYID_NUM0,key0to1)) //数字キー 0
  761. {
  762. if(Is_nextStackShift)
  763. {
  764. Is_nextStackShift = 0;
  765. AddStack(&Stack1);
  766. cursor = 0;
  767. for(i=0;i<=19;i++)
  768. {
  769. KeyStack1[i] = SPACE;
  770. }
  771. }
  772. printf("Check key 0\n");
  773. stackin('0',19,cursor,KeyStack1);
  774. ++cursor;
  775. RefreshLCD = 1;
  776. }
  777.  
  778. if(Check_key_bit(KEYID_NUM1,key0to1)) //数字キー 1
  779. {
  780. if(Is_nextStackShift)
  781. {
  782. Is_nextStackShift = 0;
  783. AddStack(&Stack1);
  784. cursor = 0;
  785. for(i=0;i<=19;i++)
  786. {
  787. KeyStack1[i] = SPACE;
  788. }
  789. }
  790. printf("Check key 1\n");
  791. stackin('1',19,cursor,KeyStack1);
  792. ++cursor;
  793. RefreshLCD = 1;
  794. }
  795.  
  796. if(Check_key_bit(KEYID_NUM2,key0to1)) //数字キー 2
  797. {
  798. if(Is_nextStackShift)
  799. {
  800. Is_nextStackShift = 0;
  801. AddStack(&Stack1);
  802. cursor = 0;
  803. for(i=0;i<=19;i++)
  804. {
  805. KeyStack1[i] = SPACE;
  806. }
  807. }
  808. printf("Check key 2\n");
  809. stackin('2',19,cursor,KeyStack1);
  810. ++cursor;
  811. RefreshLCD = 1;
  812. }
  813.  
  814. if(Check_key_bit(KEYID_NUM3,key0to1)) //数字キー 3
  815. {
  816. if(Is_nextStackShift)
  817. {
  818. Is_nextStackShift = 0;
  819. AddStack(&Stack1);
  820. cursor = 0;
  821. for(i=0;i<=19;i++)
  822. {
  823. KeyStack1[i] = SPACE;
  824. }
  825. }
  826. printf("Check key 3\n");
  827. stackin('3',19,cursor,KeyStack1);
  828. ++cursor;
  829. RefreshLCD = 1;
  830. }
  831.  
  832. if(Check_key_bit(KEYID_NUM4,key0to1)) //数字キー 4
  833. {
  834. if(Is_nextStackShift)
  835. {
  836. Is_nextStackShift = 0;
  837. AddStack(&Stack1);
  838. cursor = 0;
  839. for(i=0;i<=19;i++)
  840. {
  841. KeyStack1[i] = SPACE;
  842. }
  843. }
  844. printf("Check key 4\n");
  845. stackin('4',19,cursor,KeyStack1);
  846. ++cursor;
  847. RefreshLCD = 1;
  848. }
  849.  
  850. if(Check_key_bit(KEYID_NUM5,key0to1)) //数字キー 5
  851. {
  852. if(Is_nextStackShift)
  853. {
  854. Is_nextStackShift = 0;
  855. AddStack(&Stack1);
  856. cursor = 0;
  857. for(i=0;i<=19;i++)
  858. {
  859. KeyStack1[i] = SPACE;
  860. }
  861. }
  862. printf("Check key 5\n");
  863. stackin('5',19,cursor,KeyStack1);
  864. ++cursor;
  865. RefreshLCD = 1;
  866. }
  867.  
  868. if(Check_key_bit(KEYID_NUM6,key0to1)) //数字キー 6
  869. {
  870. if(Is_nextStackShift)
  871. {
  872. Is_nextStackShift = 0;
  873. AddStack(&Stack1);
  874. cursor = 0;
  875. for(i=0;i<=19;i++)
  876. {
  877. KeyStack1[i] = SPACE;
  878. }
  879. }
  880. printf("Check key 6\n");
  881. stackin('6',19,cursor,KeyStack1);
  882. ++cursor;
  883. RefreshLCD = 1;
  884. }
  885.  
  886. if(Check_key_bit(KEYID_NUM7,key0to1)) //数字キー 7
  887. {
  888. if(Is_nextStackShift)
  889. {
  890. Is_nextStackShift = 0;
  891. AddStack(&Stack1);
  892. cursor = 0;
  893. for(i=0;i<=19;i++)
  894. {
  895. KeyStack1[i] = SPACE;
  896. }
  897. }
  898. printf("Check key 7\n");
  899. stackin('7',19,cursor,KeyStack1);
  900. ++cursor;
  901. RefreshLCD = 1;
  902. }
  903.  
  904. if(Check_key_bit(KEYID_NUM8,key0to1)) //数字キー 8
  905. {
  906. if(Is_nextStackShift)
  907. {
  908. Is_nextStackShift = 0;
  909. AddStack(&Stack1);
  910. cursor = 0;
  911. for(i=0;i<=19;i++)
  912. {
  913. KeyStack1[i] = SPACE;
  914. }
  915. }
  916. printf("Check key 8\n");
  917. stackin('8',19,cursor,KeyStack1);
  918. ++cursor;
  919. RefreshLCD = 1;
  920. }
  921.  
  922. if(Check_key_bit(KEYID_NUM9,key0to1)) //数字キー 9
  923. {
  924. if(Is_nextStackShift)
  925. {
  926. Is_nextStackShift = 0;
  927. AddStack(&Stack1);
  928. cursor = 0;
  929. //Lcd_clear();
  930. for(i=0;i<=19;i++)
  931. {
  932. KeyStack1[i] = SPACE;
  933. }
  934. }
  935. printf("Check key 9\n");
  936. stackin('9',19,cursor,KeyStack1);
  937. ++cursor;
  938. RefreshLCD = 1;
  939. }
  940. if(Check_key_bit(KEYID_NUMEQUAL,key0to1)) //イコール= キー
  941. {
  942. if(Is_nextStackShift)
  943. {
  944.  
  945. }else{
  946. Stack1.var = myatof(KeyStack1);
  947. }
  948. AddStack(&Stack1);
  949. printf("Check key Equal\n");
  950. cursor = 0;
  951. for(i=0;i<=19;i++)
  952. {
  953. KeyStack1[i] = SPACE;
  954. }
  955. Is_nextStackShift = 0;
  956. RefreshLCD = 1;
  957. }
  958. if(Check_key_bit(KEYID_INV,key0to1)) // 逆数
  959. {
  960. if(~Is_nextStackShift)
  961. {
  962. Stack1.var = myatof(KeyStack1);
  963. }
  964. if(Stack1.var == 0) errno = EDBZERO;
  965. temp = 1 / Stack1.var;
  966. if(errno != 0) continue;
  967. Stack1.var = temp;
  968. myftoa(KeyStack1,Stack1.var,formatmode);
  969. RefreshLCD = 1;
  970. Is_nextStackShift = 1;
  971. }
  972. if(Check_key_bit(KEYID_NEG,key0to1)) // 正負変換
  973. {
  974. if((KeyStack1[0] == SPACE)||(KeyStack1[cursor-1] == '\x08'))
  975. {
  976. RefreshLCD = 1;
  977. //KeyStack1[0] = '-';
  978. stackin('-',19,cursor,KeyStack1);
  979. ++cursor;
  980. }else
  981. {
  982. if(~Is_nextStackShift)
  983. {
  984. Stack1.var = myatof(KeyStack1);
  985. }
  986. temp = 0 - Stack1.var;
  987. if(errno != 0) continue;
  988. Stack1.var = temp;
  989. myftoa(KeyStack1,Stack1.var,formatmode);
  990. RefreshLCD = 1;
  991. Is_nextStackShift = 1;
  992. }
  993. }
  994. if(Check_key_bit(KEYID_NUMNEG,key0to1)) // 正負変換
  995. {
  996. if((KeyStack1[0] == SPACE)||(KeyStack1[cursor-1] == '\x08'))
  997. {
  998. RefreshLCD = 1;
  999. //KeyStack1[0] = '-';
  1000. stackin('-',19,cursor,KeyStack1);
  1001. ++cursor;
  1002. }else
  1003. {
  1004. if(~Is_nextStackShift)
  1005. {
  1006. Stack1.var = myatof(KeyStack1);
  1007. }
  1008. temp = 0 - Stack1.var;
  1009. if(errno != 0) continue;
  1010. Stack1.var = temp;
  1011. myftoa(KeyStack1,Stack1.var,formatmode);
  1012. RefreshLCD = 1;
  1013. Is_nextStackShift = 1;
  1014. }
  1015. }
  1016. if(Check_key_bit(KEYID_NUM10X,key0to1)) // 10^X
  1017. {
  1018. if((KeyStack1[0]==SPACE)&&(KeyStack1[1]==SPACE)&&(KeyStack1[2]==SPACE))
  1019. {
  1020. stackin('1',19,0,KeyStack1);
  1021. stackin('\x08',19,1,KeyStack1);
  1022. RefreshLCD = 1;
  1023. cursor = 2;
  1024. }else
  1025. {
  1026. if(~Is_nextStackShift)
  1027. {
  1028. Stack1.var = myatof(KeyStack1);
  1029. }
  1030. //Stack1.var = 0 - Stack1.var;
  1031. //myftoa(KeyStack1,Stack1.var,formatmode);
  1032. stackin('\x08',19,cursor,KeyStack1);
  1033. ++cursor;
  1034. RefreshLCD = 1;
  1035. }
  1036. }
  1037. if(Check_key_bit(KEYID_SQUARE,key0to1)) // 二乗
  1038. {
  1039. if(~Is_nextStackShift)
  1040. {
  1041. Stack1.var = myatof(KeyStack1);
  1042. }
  1043. temp = Stack1.var * Stack1.var;
  1044. if(errno != 0) continue;
  1045. Stack1.var = temp;
  1046. myftoa(KeyStack1,Stack1.var,formatmode);
  1047. RefreshLCD = 1;
  1048. Is_nextStackShift = 1;
  1049. }
  1050. if(Check_key_bit(KEYID_SQROOT,key0to1)) // 平方根
  1051. {
  1052. if(~Is_nextStackShift)
  1053. {
  1054. Stack1.var = myatof(KeyStack1);
  1055. }
  1056. temp = sqrt(Stack1.var);
  1057. if(errno != 0) continue;
  1058. Stack1.var = temp;
  1059. myftoa(KeyStack1,Stack1.var,formatmode);
  1060. RefreshLCD = 1;
  1061. Is_nextStackShift = 1;
  1062. }
  1063. if(Check_key_bit(KEYID_LOG10,key0to1)) //常用対数 log10
  1064. {
  1065. if(~Is_nextStackShift)
  1066. {
  1067. Stack1.var = myatof(KeyStack1);
  1068. }
  1069. temp = log10(Stack1.var);
  1070. if(errno != 0) continue;
  1071. Stack1.var = temp;
  1072. myftoa(KeyStack1,Stack1.var,formatmode);
  1073. RefreshLCD = 1;
  1074. Is_nextStackShift = 1;
  1075. }
  1076. if(Check_key_bit(KEYID_LN,key0to1)) //自然対数 log e (ネイピア数
  1077. {
  1078. if(~Is_nextStackShift)
  1079. {
  1080. Stack1.var = myatof(KeyStack1);
  1081. }
  1082. temp = log(Stack1.var);
  1083. if(errno != 0) continue;
  1084. Stack1.var = temp;
  1085. myftoa(KeyStack1,Stack1.var,formatmode);
  1086. RefreshLCD = 1;
  1087. Is_nextStackShift = 1;
  1088. }
  1089. if(Check_key_bit(KEYID_SIN,key0to1)) //正弦サイン
  1090. {
  1091. if(~Is_nextStackShift)
  1092. {
  1093. Stack1.var = myatof(KeyStack1);
  1094. }
  1095. temp = mysin(Stack1.var,angleunitmode);
  1096. if(errno != 0) continue;
  1097. Stack1.var = temp;
  1098. myftoa(KeyStack1,Stack1.var,formatmode);
  1099. RefreshLCD = 1;
  1100. Is_nextStackShift = 1;
  1101. }
  1102. if(Check_key_bit(KEYID_ASIN,key0to1)) //アークサイン
  1103. {
  1104. if(~Is_nextStackShift)
  1105. {
  1106. Stack1.var = myatof(KeyStack1);
  1107. }
  1108. temp = myasin(Stack1.var,angleunitmode);
  1109. if(errno != 0) continue;
  1110. Stack1.var = temp;
  1111. myftoa(KeyStack1,Stack1.var,formatmode);
  1112. RefreshLCD = 1;
  1113. Is_nextStackShift = 1;
  1114. }
  1115. if(Check_key_bit(KEYID_COS,key0to1)) //コサイン
  1116. {
  1117. if(~Is_nextStackShift)
  1118. {
  1119. Stack1.var = myatof(KeyStack1);
  1120. }
  1121. temp = mycos(Stack1.var,angleunitmode);
  1122. if(errno != 0) continue;
  1123. Stack1.var = temp;
  1124. myftoa(KeyStack1,Stack1.var,formatmode);
  1125. RefreshLCD = 1;
  1126. Is_nextStackShift = 1;
  1127. }
  1128. if(Check_key_bit(KEYID_ACOS,key0to1)) //アークコサイン
  1129. {
  1130. if(~Is_nextStackShift)
  1131. {
  1132. Stack1.var = myatof(KeyStack1);
  1133. }
  1134. temp = myacos(Stack1.var,angleunitmode);
  1135. if(errno != 0) continue;
  1136. Stack1.var = temp;
  1137. myftoa(KeyStack1,Stack1.var,formatmode);
  1138. RefreshLCD = 1;
  1139. Is_nextStackShift = 1;
  1140. }
  1141. if(Check_key_bit(KEYID_TAN,key0to1)) //タンジェント
  1142. {
  1143. if(~Is_nextStackShift)
  1144. {
  1145. Stack1.var = myatof(KeyStack1);
  1146. }
  1147. temp = mytan(Stack1.var,angleunitmode);
  1148. if(errno != 0) continue;
  1149. Stack1.var = temp;
  1150. myftoa(KeyStack1,Stack1.var,formatmode);
  1151. RefreshLCD = 1;
  1152. Is_nextStackShift = 1;
  1153. }
  1154. if(Check_key_bit(KEYID_ATAN,key0to1)) //アークタンジェント
  1155. {
  1156. if(~Is_nextStackShift)
  1157. {
  1158. Stack1.var = myatof(KeyStack1);
  1159. }
  1160. temp = myatan(Stack1.var,angleunitmode);
  1161. if(errno != 0) continue;
  1162. Stack1.var = temp;
  1163. myftoa(KeyStack1,Stack1.var,formatmode);
  1164. RefreshLCD = 1;
  1165. Is_nextStackShift = 1;
  1166. }
  1167. if(Check_key_bit(KEYID_ANGLEUNIT,key0to1)) //角度の単位変更キー
  1168. {
  1169. angleunitmode = ~angleunitmode & 0x01;
  1170. if(~Is_nextStackShift)
  1171. {
  1172. Stack1.var = myatof(KeyStack1);
  1173. }
  1174. if(angleunitmode == ANGLEUNIT_DEG)
  1175. {
  1176. temp = RadtoDeg(Stack1.var);
  1177. KeyStack4[11] = 'D';
  1178. KeyStack4[12] = 'E';
  1179. KeyStack4[13] = 'G';
  1180. }
  1181. if(angleunitmode == ANGLEUNIT_RAD)
  1182. {
  1183. temp = DegtoRad(Stack1.var);
  1184. KeyStack4[11] = 'R';
  1185. KeyStack4[12] = 'A';
  1186. KeyStack4[13] = 'D';
  1187. }
  1188. if(errno != 0) continue;
  1189. Stack1.var = temp;
  1190. myftoa(KeyStack1,Stack1.var,formatmode);
  1191. RefreshLCD = 1;
  1192. Is_nextStackShift = 1;
  1193. }
  1194. if(Check_key_bit(KEYID_PI,key0to1)) //円周率キー
  1195. {
  1196. if(~Is_nextStackShift)
  1197. {
  1198. Stack1.var = myatof(KeyStack1);
  1199. }
  1200. if(Stack1.var != 0)
  1201. { //スタックに何か入ってたらEnter
  1202. AddStack(&Stack1);
  1203. cursor = 0;
  1204. for(i=0;i<=19;i++)
  1205. {
  1206. KeyStack1[i] = SPACE;
  1207. }
  1208. }
  1209. temp = PI;
  1210. if(errno != 0) continue;
  1211. Stack1.var = temp;
  1212. myftoa(KeyStack1,Stack1.var,formatmode);
  1213. RefreshLCD = 1;
  1214. Is_nextStackShift = 1;
  1215. }
  1216. if(Check_key_bit(KEYID_NAPIER,key0to1)) //ネイピア数キー
  1217. {
  1218. if(~Is_nextStackShift)
  1219. {
  1220. Stack1.var = myatof(KeyStack1);
  1221. }
  1222. if(Stack1.var != 0)
  1223. { //スタックに何か入ってたらEnter
  1224. AddStack(&Stack1);
  1225. cursor = 0;
  1226. for(i=0;i<=19;i++)
  1227. {
  1228. KeyStack1[i] = SPACE;
  1229. }
  1230. }
  1231. temp = NAPIER;
  1232. if(errno != 0) continue;
  1233. Stack1.var = temp;
  1234. myftoa(KeyStack1,Stack1.var,formatmode);
  1235. RefreshLCD = 1;
  1236. Is_nextStackShift = 1;
  1237. }
  1238.  
  1239. /* !!!! 以下、NULLポインタを参照する可能性のある処理 !!!! */
  1240. /* NULLポインタ参照を防止するためIF文でブロックする */
  1241. if(Stack1.next == NULL) continue;
  1242.  
  1243. if(Check_key_bit(KEYID_DROP,key0to1)) //ドロップ 押した時
  1244. {
  1245. Stack1.var = (Stack1.next -> var);
  1246. DelStack(&Stack1);
  1247. myftoa(KeyStack1,Stack1.var,formatmode);
  1248. Is_nextStackShift = 1;
  1249. RefreshLCD = 1;
  1250. }
  1251. if(Check_key_bit(KEYID_CHANGE,key0to1)) //チェンジ 押した時
  1252. {
  1253. if(~Is_nextStackShift)
  1254. {
  1255. Stack1.var = myatof(KeyStack1);
  1256. }
  1257. temp = Stack1.var;
  1258. Stack1.var = Stack1.next -> var;
  1259. Stack1.next -> var = temp;
  1260. myftoa(KeyStack1,Stack1.var,formatmode);
  1261. Is_nextStackShift = 1;
  1262. RefreshLCD = 1;
  1263. }
  1264. if(Check_key_bit(KEYID_NUMPLUS,key0to1)) //プラス + 押した時
  1265. {
  1266. printf("Check key PLUS +\n");
  1267. if(~Is_nextStackShift)
  1268. {
  1269. Stack1.var = myatof(KeyStack1);
  1270. }
  1271. temp = Stack1.var + (Stack1.next -> var);
  1272. if(errno != 0) continue;
  1273. Stack1.var = temp;
  1274. DelStack(&Stack1);
  1275. myftoa(KeyStack1,Stack1.var,formatmode);
  1276. Is_nextStackShift = 1;
  1277. RefreshLCD = 1;
  1278. }
  1279. if(Check_key_bit(KEYID_NUMMINUS,key0to1)) //マイナス - 押した時
  1280. {
  1281. printf("Check key MINUS\n");
  1282. if(~Is_nextStackShift)
  1283. {
  1284. Stack1.var = myatof(KeyStack1);
  1285. }
  1286. temp = (Stack1.next -> var) - Stack1.var;
  1287. if(errno != 0) continue;
  1288. Stack1.var = temp;
  1289. myftoa(KeyStack1,Stack1.var,formatmode);
  1290. DelStack(&Stack1);
  1291. Is_nextStackShift = 1;
  1292. RefreshLCD = 1;
  1293. }
  1294. if(Check_key_bit(KEYID_NUMX,key0to1)) //かける× 押した時
  1295. {
  1296. printf("Check key X(KAKEZAN)\n");
  1297. if(~Is_nextStackShift)
  1298. {
  1299. Stack1.var = myatof(KeyStack1);
  1300. }
  1301. temp = Stack1.var * (Stack1.next -> var);
  1302. if(errno != 0) continue;
  1303. Stack1.var = temp;
  1304. myftoa(KeyStack1,Stack1.var,formatmode);
  1305. DelStack(&Stack1);
  1306. Is_nextStackShift = 1;
  1307. RefreshLCD = 1;
  1308. }
  1309. if(Check_key_bit(KEYID_NUMSLASH,key0to1)) //割る÷ 押した時
  1310. {
  1311. printf("Check key WARIZAN\n");
  1312. if(~Is_nextStackShift)
  1313. {
  1314. Stack1.var = myatof(KeyStack1);
  1315. }
  1316. temp = (Stack1.next -> var) / Stack1.var;
  1317. if(Stack1.var == 0) errno = EDBZERO;
  1318. if(errno != 0) continue;
  1319. Stack1.var = temp;
  1320. myftoa(KeyStack1,Stack1.var,formatmode);
  1321. DelStack(&Stack1);
  1322. Is_nextStackShift = 1;
  1323. RefreshLCD = 1;
  1324. }
  1325. if(Check_key_bit(KEYID_POWER,key0to1)) //累乗(xのy乗) Stack2^Stack1
  1326. {
  1327. if(~Is_nextStackShift)
  1328. {
  1329. Stack1.var = myatof(KeyStack1);
  1330. }
  1331. temp = pow((Stack1.next -> var),Stack1.var);
  1332. if(errno != 0) continue;
  1333. Stack1.var = temp;
  1334. myftoa(KeyStack1,Stack1.var,formatmode);
  1335. RefreshLCD = 1;
  1336. }
  1337. }
  1338. //printf("cursor: %d\n",cursor);
  1339. }
  1340. } //←←←←←←←mode_rpn関数終了
  1341.  
  1342. void mode_logical(void)
  1343. {
  1344. } //←←←←←←←mode_logical関数終了
  1345.  
  1346. void mode_testing(void) //テスト用モード。試してみたいコード・新機能を試すためのモード
  1347. {
  1348. unsigned char i = 0;
  1349.  
  1350. }//←←←←←←←mode_testing関数終了
  1351.  
  1352. /************************************************************************/
  1353. /* R8C/38A スペシャルファンクションレジスタ(SFR)の初期化 */
  1354. /************************************************************************/
  1355. void init( void )
  1356. {
  1357. int i;
  1358.  
  1359. /* クロックをXINクロック(20MHz)に変更 */
  1360. prc0 = 1; /* プロテクト解除 */
  1361. cm13 = 1; /* P4_6,P4_7をXIN-XOUT端子にする*/
  1362. cm05 = 0; /* XINクロック発振 */
  1363. for(i=0; i<50; i++ ); /* 安定するまで少し待つ(約10ms) */
  1364. ocd2 = 0; /* システムクロックをXINにする */
  1365. prc0 = 0; /* プロテクトON */
  1366.  
  1367. /* ポートの入出力設定 0:入力 1:出力 76543210 */
  1368. prc2 = 1; /* PD0のプロテクト解除 */
  1369. pd0 = 0x00; /* */
  1370. pd1 = 0xd0; /* 5:RXD0 4:TXD0 3-0:DIP SW 1101 0000 */
  1371. p2 = 0xc0;
  1372. pd2 = 0xfe; /* */
  1373. pd3 = 0xff; /*LCD 0-DB4~3-DB7 4-Enable 5-RS 6-BkLGT*/
  1374. p3 = 0x00;
  1375. p4 = 0x00; /* P4_5のLED:初期は消灯 */
  1376. pd4 = 0xb8; /* 7:XOUT 6:XIN 5:LED 2:VREF */
  1377. pd5 = 0x00; /* キーマトリックス・入力 プルアップON */
  1378. pu12 = 1;pu13 = 1;
  1379. pd6 = 0xff; /* キーマトリックス・出力 */
  1380. drr14 = 1; drr15 = 1;
  1381. pd7 = 0x00; /* 電池電圧検出用とか */
  1382.  
  1383. pd8 = 0xff; /* */
  1384. pd9 = 0x00; /* 0-5 IN */
  1385. //p9 = 0x38;
  1386. pur0 = 0x04; /* P1_3~P1_0のプルアップON */
  1387.  
  1388. vlt22 = 1; /* P9_0~P9_5 入力スレッショルド→0.35×VCCにセット */
  1389. vlt23 = 0; /* */
  1390.  
  1391.  
  1392. /* タイマRBの設定 */
  1393. /* 割り込み周期 = 1 / 20[MHz] * (TRBPRE+1) * (TRBPR+1)
  1394.   = 1 / (20*10^6) * 200 * 100
  1395.   = 0.001[s] = 1[ms]
  1396.   */
  1397. trbmr = 0x00; /* 動作モード、分周比設定 */
  1398. trbpre = 200-1; /* プリスケーラレジスタ */
  1399. trbpr = 100-1; /* プライマリレジスタ */
  1400. trbic = 0x06; /* 割り込み優先レベル設定 */
  1401. trbcr = 0x01; /* カウント開始 */
  1402.  
  1403.  
  1404. /* タイマRD リセット同期PWMモードの設定*/
  1405. /* PWM周期 = 1 / 20[MHz] * カウントソース * (TRDGRA0+1)
  1406.   = 1 / (20*10^6) * 8 * 40000
  1407.   = 0.016[s] = 16[ms]
  1408.   */
  1409. trdpsr0 = 0x08; /* TRDIOB0,C0,D0端子設定 */
  1410. trdpsr1 = 0x05; /* TRDIOA1,B1,C1,D1端子設定 */
  1411. trdmr = 0xf0; /* バッファレジスタ設定 */
  1412. trdfcr = 0x01; /* リセット同期PWMモードに設定 */
  1413. trdcr0 = 0x23; /* ソースカウントの選択:f8 */
  1414. trdgra0 = trdgrc0 ; /* 周期 */
  1415. trdgrb0 = trdgrd0 = 0; /* P2_2端子のON幅設定 */
  1416. trdgra1 = trdgrc1 = 0; /* P2_4端子のON幅設定 */
  1417. trdgrb1 = trdgrd1 ; /* P2_5端子のON幅設定 */
  1418. trdoer1 = 0xcd; /* 出力端子の選択 */
  1419. trdstr = 0x0d; /* TRD0カウント開始 */
  1420.  
  1421. //Delay_ms(2);
  1422. p4 = 0x20; /* P4_5のLED:初期は点灯 */
  1423.  
  1424. ch2 = 1; //AN19・p7_7
  1425. ch1 = 1;
  1426. ch0 = 1;
  1427. adgsel0 = 0;
  1428. adgsel1 = 1;
  1429.  
  1430. md0 = 0; //単発モード
  1431. md1 = 0; //単発モード
  1432. md2 = 0; //単発モード
  1433. adcap0 = 0; //ADSTビットで開始
  1434. adcap1 = 0;
  1435. cks0 = 1; //f2を選択 cks1=0にする
  1436.  
  1437. bits = 0; //8bit
  1438. cks1 = 0;
  1439.  
  1440. adstby = 0;
  1441. //vcut = 1; //Vref接続
  1442.  
  1443. //smp = 1; //サンプルホールドあり
  1444.  
  1445.  
  1446. init_uart0_printf( SPEED_9600 );
  1447. "\n/* START Function Calcrator Alpha Ver. */\n"
  1448. "/* Made by kuriuzu */ \n"
  1449. "/* This is UART Debug Console */\n"
  1450. );
  1451. }
  1452.  
  1453. /************************************************************************/
  1454. /* タイマRB 割り込み処理 */
  1455. /************************************************************************/
  1456. #pragma interrupt intTRB(vect=24)
  1457. void intTRB( void )
  1458. {
  1459. delayms++;
  1460. cnt0++;
  1461. cnt1++;
  1462. cnt2++;
  1463. if(cnt2 == KEY_INTERVAL){
  1464. cnt2 = 0;
  1465. Keypad_read();
  1466. }
  1467. }
  1468.  
  1469. /************************************************************************/
  1470. /* タイマ本体 */
  1471. /* 引数 タイマ値 1=1ms */
  1472. /************************************************************************/
  1473. void timer( unsigned long timer_set )
  1474. {
  1475. delayms = 0;
  1476. while( delayms < timer_set );
  1477. }
  1478.  
  1479. /************************************************************************/
  1480. /* ディップスイッチ値読み込み */
  1481. /* 戻り値 スイッチ値 0~15 */
  1482. /************************************************************************/
  1483. unsigned char dipsw_get( void )
  1484. {
  1485. unsigned char sw;
  1486.  
  1487. sw = p1 & 0x0f; /* P1_3~P1_0読み込み */
  1488.  
  1489. return sw;
  1490. }
  1491.  
  1492.  
  1493.  
  1494. //----- ディレイ関数 msec単位 -----
  1495.  
  1496. void Delay_ms(unsigned long msec) //!注意!最大-1[ms]の誤差が出ます。!注意!
  1497. {
  1498. delayms = 0;
  1499. while(delayms < msec)
  1500. {
  1501. _asm(
  1502. "fset I;"
  1503. "wait;"
  1504. "nop;"
  1505. "nop;"
  1506. "nop;"
  1507. "nop;"
  1508. );
  1509. }
  1510. }
  1511.  
  1512. //----- ディレイ関数 1usec単位 -----
  1513.  
  1514. void Delay(long usec)
  1515. {
  1516. usec = (usec * 20000) / 45000;
  1517. while(usec--){}
  1518. }
  1519.  
  1520. //----------------------------------------------------
  1521. // 液晶表示器制御ライブラリ
  1522. //----------------------------------------------------
  1523.  
  1524. //----- LCD初期化関数 -----
  1525.  
  1526. void Lcd_init()
  1527. {
  1528. Delay(20000); //20msec wait
  1529. Lcd_out(0x03, 1); //8bit mode set
  1530. Delay(5000); //5msec wait
  1531. Lcd_out(0x03, 1); //8bit mode set
  1532. Delay(1000);
  1533. Lcd_out(0x03, 1); //8bit mode set
  1534. Delay(1000);
  1535. Lcd_out(0x02, 1); //4bit mode set
  1536. Delay(1000);
  1537. Lcd_cmd(0x2C); //DL=0 4bit mode
  1538. Lcd_cmd(0x08); //display off C=D=B=0
  1539. Lcd_cmd(0x0E); //display on D=B=1 C=0
  1540. Lcd_cmd(0x06); //entry I/D=1 S=0
  1541. Lcd_cmd(0x01); //all clear
  1542. }
  1543.  
  1544. //----- データ出力サブ関数 -----
  1545.  
  1546. void Lcd_out(char code, char flag)
  1547. {
  1548. LCD_DB = (LCD_DB & 0xf0) | (code & 0x0f);
  1549. //出力データ下位4ビットを出力
  1550. if (flag == 0) //表示データかコマンドか
  1551. LCD_RS = 1; //表示データの場合RS=1
  1552. else
  1553. LCD_RS = 0; //コマンドデータの場合RS=0
  1554. asm("NOP"); //NOP スキュー確保
  1555. LCD_STB = 1; //STB ON
  1556. asm("NOP");
  1557. asm("NOP"); //パルス幅確保230nsec以上
  1558. asm("NOP");
  1559. asm("NOP");
  1560. LCD_STB = 0; //STB OFF
  1561. }
  1562.  
  1563. //----- 1文字表示関数 -----
  1564.  
  1565. void Lcd_data(char asci)
  1566. {
  1567. Lcd_out(asci>>4, 0); //上位4ビット出力
  1568. Lcd_out(asci, 0); //下位4ビット出力
  1569. Delay(50); //50μsec待ち
  1570. }
  1571.  
  1572. //----- コマンド出力関数 -----
  1573.  
  1574. void Lcd_cmd(char cmd)
  1575. {
  1576. Lcd_out(cmd>>4, 1); //上位4ビット出力
  1577. Lcd_out(cmd, 1); //下位4ビット出力
  1578. if((cmd == 0x01) || (cmd == 0x02))
  1579. Delay(2000); //2msec待ち
  1580. else
  1581. Delay(50); //50usec待ち
  1582. }
  1583.  
  1584. //----- 全消去関数 -----
  1585.  
  1586. void Lcd_clear()
  1587. {
  1588. Lcd_cmd(0x01); //初期化コマンド出力
  1589. }
  1590.  
  1591. //----- 文字列出力関数 -----
  1592.  
  1593. void Lcd_output(char *str)
  1594. {
  1595. while(*str != 0x00) //文字列の終わり判定
  1596. {
  1597. Lcd_data(*str); //文字列1文字出力
  1598. str++; //ポインタ+1
  1599. }
  1600. }
  1601.  
  1602. //----- カーソル位置に移動 -----
  1603.  
  1604. void Lcd_locate(char x, char y)
  1605. {
  1606. char i;
  1607. if (y == 1){
  1608. Lcd_cmd(0x02);
  1609. x--;
  1610. while ( x ){
  1611. Lcd_cmd(0x14);
  1612. x--;
  1613. }
  1614. }else if (y == 2){
  1615. Lcd_cmd(0x02);
  1616. x--;
  1617. for (i=1;i<=40;i++){
  1618. Lcd_cmd(0x14);
  1619. }
  1620. while ( x ){
  1621. Lcd_cmd(0x14);
  1622. x--;
  1623. }
  1624. }else if (y == 3){
  1625. Lcd_cmd(0x02);
  1626. x--;
  1627. for (i=1;i<=20;i++){
  1628. Lcd_cmd(0x14);
  1629. }
  1630. while ( x ){
  1631. Lcd_cmd(0x14);
  1632. x--;
  1633. }
  1634. }else if (y == 4){
  1635. Lcd_cmd(0x02);
  1636. x--;
  1637. for (i=1;i<=60;i++){
  1638. Lcd_cmd(0x14);
  1639. }
  1640. while ( x ){
  1641. Lcd_cmd(0x14);
  1642. x--;
  1643. }
  1644. }
  1645. }
  1646.  
  1647. //----- カーソル表示制御 -----
  1648.  
  1649. void Lcd_cursol(char c_mode)
  1650. {
  1651. switch ( c_mode){
  1652. case 1: // 1.カーソルOFF、ブリンクOFF
  1653. Lcd_cmd(0x0c);
  1654. break;
  1655. case 2: // 2.カーソルOFF、ブリンクON
  1656. Lcd_cmd(0x0d);
  1657. break;
  1658. case 3: // 3.カーソルON、ブリンクOFF
  1659. Lcd_cmd(0x0e);
  1660. break;
  1661. case 4: // 4.カーソルON、ブリンクON
  1662. Lcd_cmd(0x0f);
  1663. break;
  1664. }
  1665. }
  1666.  
  1667. //----- 文字列出力関数(行指定あり) -----
  1668.  
  1669. void Lcd_line_print(char y,char *str)
  1670. {
  1671. if (y == 1){
  1672. Lcd_cmd(0x80);
  1673. } else if(y == 2){
  1674. Lcd_cmd(0xC0);
  1675. }else if(y == 3){
  1676. Lcd_cmd(0x94);
  1677. }else if(y == 4){
  1678. Lcd_cmd(0xD4);
  1679. }
  1680. while(*str != 0x00){ //文字列の終わり判定
  1681. Lcd_data(*str); //文字列1文字出力
  1682. str++; //ポインタ+1
  1683. }
  1684. }
  1685.  
  1686. void Lowspeed_Lcd_line_print(char y,unsigned long w,char *str)
  1687. {
  1688. if (y == 1){
  1689. Lcd_cmd(0x80);
  1690. } else if(y == 2){
  1691. Lcd_cmd(0xC0);
  1692. }else if(y == 3){
  1693. Lcd_cmd(0x94);
  1694. }else if(y == 4){
  1695. Lcd_cmd(0xD4);
  1696. }
  1697. while(*str != 0x00){ //文字列の終わり判定
  1698. Lcd_data(*str); //文字列1文字出力
  1699. Delay_ms(w);
  1700. str++; //ポインタ+1
  1701. }
  1702. }
  1703.  
  1704. void Lcd_black(void){
  1705. char lp;
  1706. Lcd_cmd(0x80);
  1707. for(lp=0;lp<=0x67;lp++){
  1708. Lcd_data(0xff);
  1709. }
  1710. }
  1711.  
  1712. void Lcd_write_cgram(char CharacterNo,const char *MyChar)
  1713. {
  1714. int i;
  1715. CharacterNo &= 0x07;
  1716. CharacterNo = 0x40 | (CharacterNo<<3);
  1717. Lcd_cmd(CharacterNo);
  1718. for(i=0;i<=7;i++)
  1719. {
  1720. Lcd_data(*MyChar);
  1721. MyChar++;
  1722. }
  1723.  
  1724. }
  1725. void Lcd_backlight(char z) //バックライト 0....OFF 1....ON
  1726. {
  1727. backlight_stat = z;
  1728. LCD_LGT = z;
  1729. }
  1730. char Lcd_backlight_stat(void) //バックライト 0....OFF 1....ON
  1731. {
  1732. return LCD_LGT;
  1733. }
  1734. /* //使われない関数
  1735. void Itostring(int digit, unsigned long data, char *buffer)
  1736. {
  1737. char i;
  1738. buffer += digit; //文字列の最後
  1739. for(i=digit; i>0; i--) //最下位桁から上位へ
  1740. {
  1741. buffer--; //ポインター1
  1742. *buffer = (data % 10) + '0'; //その桁数値を文字にして格納
  1743. data = data / 10; //桁-1
  1744. }
  1745. }
  1746.  
  1747. void Ltostring(int digit, unsigned long long data, char *buffer)
  1748. {
  1749. char i;
  1750. buffer += digit; //文字列の最後
  1751. for(i=digit; i>0; i--) //最下位桁から上位へ
  1752. {
  1753. buffer--; //ポインター1
  1754. *buffer = (data % 10) + '0'; //その桁数値を文字にして格納
  1755. data = data / 10; //桁-1
  1756. }
  1757. }
  1758. */
  1759.  
  1760. void Ltostring_int(int digit, long long data, char *buffer)
  1761. {
  1762. char i;
  1763. if(data<0)
  1764. {
  1765. data *= -1;
  1766. *buffer = '-';
  1767. buffer++;
  1768. digit--;
  1769. }
  1770. buffer += digit; //文字列の最後
  1771. for(i=digit; i>0; i--) //最下位桁から上位へ
  1772. {
  1773. buffer--; //ポインター1
  1774. *buffer = (data % 10) + '0'; //その桁数値を文字にして格納
  1775. data = data / 10; //桁-1
  1776. }
  1777. }
  1778. void Ltostring_decimal(int digit, unsigned long long data, char *buffer)
  1779. {
  1780. char i;
  1781. char not_space = 0;
  1782. char number;
  1783. buffer += digit; //文字列の最後
  1784. for(i=digit; i>0; i--) //最下位桁から上位へ
  1785. {
  1786. buffer--; //ポインター1
  1787. number = data % 10;
  1788. if(number != 0)
  1789. {
  1790. not_space = 1;
  1791. }
  1792. if(not_space)
  1793. {
  1794. *buffer = number + '0'; //その桁数値を文字にして格納
  1795. }else{
  1796. *buffer = SPACE;
  1797. }
  1798. data = data / 10; //桁-1
  1799. }
  1800. if(~not_space)
  1801. {
  1802. *buffer = number + '0';
  1803. }
  1804. }
  1805.  
  1806. void Keypad_read(void)
  1807. {
  1808. keypast[key0] = keystat[key0];
  1809. keypast1[key0] = keypast0[key0];
  1810. keypast0[key0] = keynow[key0];
  1811. keynow[key0] = ~p5;
  1812.  
  1813. /* 3msごとに実行したい処理とかを記述 */
  1814. if(p5 != 0xff){
  1815. cnt0 = 0;
  1816. Lcd_backlight(backlight_stat);
  1817. }
  1818.  
  1819. /*以下、通常のキーパッド読み込み業務*/
  1820. if((keypast1[key0]==keypast0[key0])&(keypast0[key0]==keynow[key0])){keystat[key0] = keynow[key0];}
  1821. switch(key0){
  1822. case 0:
  1823. key0++;
  1824. p6 = ~0x02;
  1825. break;
  1826. case 1:
  1827. key0++;
  1828. p6 = ~0x04;
  1829. break;
  1830. case 2:
  1831. key0++;
  1832. p6 = ~0x08;
  1833. break;
  1834. case 3:
  1835. key0++;
  1836. p6 = ~0x10;
  1837. break;
  1838. case 4:
  1839. key0++;
  1840. p6 = ~0x20;
  1841. break;
  1842. case 5:
  1843. key0++;
  1844. p6 = ~0x40;
  1845. break;
  1846. case 6:
  1847. key0++;
  1848. p6 = ~0x80;
  1849. break;
  1850. default:
  1851. key0 = 0;
  1852. p6 = ~0x01;
  1853. /* 以下、24[ms]ごとに実行したい処理を記述 */
  1854. if(p9_0){pwrhold++;}else{pwrhold = 0;} //電源ボタンのポーリング
  1855. if(pwrhold & ~Is_InfomationMode){
  1856. mode_infomation(); //
  1857. }
  1858. if(Check_key_bit(KEYID_BKLGT,keystat) && (!Check_key_bit(KEYID_BKLGT,keypast))) //バックライトボタンのポーリング
  1859. {
  1860. Lcd_backlight(~Lcd_backlight_stat());
  1861. }
  1862. /*
  1863. if(Check_key_bit(KEYID_ANGLEUNIT,keystat) && (!Check_key_bit(KEYID_ANGLEUNIT,keypast)))
  1864. {
  1865. angleunitmode = ~angleunitmode & 0x01;
  1866. if(angleunitmode == ANGLEUNIT_DEG)
  1867. {
  1868.  
  1869. {
  1870. if(angleunitmode == ANGLEUNIT_RAD)
  1871. {
  1872.  
  1873. }
  1874. } */
  1875. if(cnt0 >= AUTOLIGHTOFF) /* バックライト・オフの時間が来たか確認 */
  1876. {
  1877. if(cnt0 > AUTOPOWEROFF) /* オートパワーオフの時間が来たら電源OFF */
  1878. {
  1879. Poweroff();
  1880. }
  1881. else
  1882. { /* オートパワーオフの時間が来てなかったらバックライトOFF */
  1883. if(Lcd_backlight_stat)
  1884. {
  1885. Lcd_backlight(0);
  1886. backlight_stat = 1;
  1887. }
  1888. }
  1889. }
  1890. /* 終わり */
  1891. break;
  1892. }
  1893. }
  1894. void Poweroff(void)
  1895. {
  1896. char MsgPwrOFF1[21] = " *** PWR OFF *** ";
  1897. char MsgPwrOFF2[21] = " ";
  1898. char MsgPwrOFF3[21] = "GOOD - BYE ";
  1899. char MsgPwrOFF4[21] = " Made By Kuriuzu";
  1900. Lcd_line_print(1,MsgPwrOFF1);
  1901. Lcd_line_print(2,MsgPwrOFF2);
  1902. Lcd_line_print(3,MsgPwrOFF3);
  1903. Lcd_line_print(4,MsgPwrOFF4);
  1904. printf("/*** POWER OFF !!! ***/\n");
  1905. Delay(500000);
  1906. Delay(500000);
  1907. Delay(500000);
  1908. Delay(500000);
  1909. Delay(500000);
  1910. Delay(500000);
  1911. Delay(500000);
  1912. Delay(500000);
  1913. Delay(500000);
  1914. Delay(500000);
  1915. Lcd_backlight(1); /*電解コンデンサの電荷放電のためバックライトON*/
  1916. asm(" fclr I "); /* 全体の割り込み禁止 */
  1917. while(p9_0);
  1918. Delay(250000);
  1919. p4 = 0x00;
  1920. Lcd_backlight(0); /*電解コンデンサの電荷放電のためバックライトON*/
  1921. while(1);
  1922. }
  1923.  
  1924. unsigned char Check_key_bit(unsigned char keyid,const char *buffer)
  1925. {
  1926. if(keyid == 0xff) return 0; //0xff
  1927. buffer += (0x07 & (keyid>>4));
  1928. return (*buffer >> (0x07 & keyid)) & 0x01;
  1929. }
  1930.  
  1931. void stackin(char in,char digits,char position,char *stack) //in : 入力 digits:桁数 position;カーソル位置 stack (入力がD、dならcursor位置の文字削除)
  1932. {
  1933. int i = 0;
  1934. int j = 0;
  1935. char point = 0;
  1936. char buffer[35];
  1937. buffer[digits + 1] = SPACE;
  1938. if(position >= digits)
  1939. {
  1940. printf("ERROR : stackin() POSITION Over Digits\n");
  1941. return;
  1942. }else{
  1943. for(i=0;i<=digits;i++)
  1944. {
  1945. buffer[j] = *(stack + i);
  1946. j++;
  1947. }
  1948. if(in == 0x7f){ //DELキー押された時の処理
  1949. //↓カーソル位置(position)より後ろの配列を一個前にシフト
  1950. for(i = position;i <digits;i++)
  1951. {
  1952. buffer[i] = buffer[i+1];
  1953. }
  1954. buffer[digits] = SPACE;
  1955.  
  1956. }else if(buffer[position] == SPACE)
  1957. {
  1958. buffer[position] = in;
  1959. }else{
  1960. //↓カーソル位置(position)より後ろの配列を一個後ろにシフト
  1961. for(i = digits;i >=position;i--)
  1962. {
  1963. buffer[i] = buffer[i-1];
  1964. }
  1965. buffer[position] = in;
  1966. }
  1967. for(i=0;i<=digits;i++)
  1968. {
  1969. *stack = buffer[i];
  1970. stack++;
  1971. }
  1972. }
  1973. }
  1974.  
  1975. void myftoa(char *string, double f, int format) //string : 格納するポインタ f:数値 format:指数表記(format <= 0)or通常表示(format > 0)
  1976. {
  1977. double requiddigit = 0; //その数を表すのに必要な桁数を格納
  1978. int Integralpart = 1;//整数部桁数
  1979. int Decimalpart = 17;//小数部桁数
  1980. int Exponentpart = 2;
  1981. int i;
  1982. unsigned long long Decimal;//小数部のデータ
  1983.  
  1984. if(f>0)
  1985. {
  1986. //sign = 1;
  1987. *string = ' ';
  1988. }
  1989. if(f==0){
  1990. //sign = 0;
  1991. *string = SPACE;
  1992. }
  1993. if(f<0)
  1994. {
  1995. //sign = -1;
  1996. f *= -1;
  1997. *string = '-';
  1998. }
  1999. string++;
  2000. if(format <= 0)
  2001. {
  2002. if(f)
  2003. {
  2004. if(f>1)
  2005. {
  2006. /*
  2007. requiddigit = log10(f+1);
  2008. f = f / POW(10,requiddigit);
  2009. */
  2010. while(f>=10)
  2011. {
  2012. f /= 10;
  2013. requiddigit++;
  2014. }
  2015. }else{
  2016. /*
  2017. requiddigit = (int)(log10(f) - 1);
  2018. f = f * POW(10,requiddigit);
  2019. */
  2020. while(f<1)
  2021. {
  2022. f *= 10;
  2023. requiddigit--;
  2024. }
  2025. }
  2026. }else{
  2027. requiddigit = 1;
  2028. }
  2029. Integralpart = 1;
  2030. Decimalpart = 13;
  2031. if(abs(requiddigit)<10) Exponentpart = 1;
  2032. if(abs(requiddigit)>=100) Exponentpart = 3;
  2033. if(requiddigit<0) Exponentpart++;
  2034.  
  2035. Ltostring_int(Integralpart,(unsigned long long) f, string);
  2036. string += Integralpart;
  2037. *string = '.';
  2038. string++;
  2039. Decimal = (unsigned long long) (POW(10,Decimalpart)*(f - (unsigned long long)f) + 0.5);
  2040. Ltostring_decimal(Decimalpart,Decimal,string);
  2041. string += Decimalpart;
  2042. for(i=(3-Exponentpart);i>0;i--)
  2043. {
  2044. *string = SPACE;
  2045. string++;
  2046. }
  2047. *string = 0x08;
  2048. string++;
  2049. Ltostring_int(Exponentpart,(unsigned long long) requiddigit, string);
  2050. //string += Exponentpart;
  2051. return;
  2052. }
  2053. if(f)
  2054. {
  2055. requiddigit = log10(f);
  2056. }else{
  2057. requiddigit = 0;
  2058. }
  2059. if(requiddigit >= 0)
  2060. {
  2061. requiddigit = log10(f+1);
  2062. Integralpart = (int)requiddigit;
  2063. ++Integralpart;
  2064. if(Integralpart > 19) Integralpart = 19;
  2065. Decimalpart = 18 - Integralpart;
  2066. }else if(requiddigit < 0)
  2067. {
  2068. }
  2069. Decimal = (unsigned long long) (POW(10,Decimalpart)*(f - (unsigned long long)f) + 0.5);
  2070. Ltostring_int(Integralpart,(unsigned long long) f, string);
  2071. if(Integralpart >= 19) return;
  2072. string += Integralpart;
  2073. *string = '.';
  2074. if(Integralpart >= 18) return;
  2075. string++;
  2076. Ltostring_decimal(Decimalpart,Decimal,string);
  2077.  
  2078. }
  2079.  
  2080. double myatof(const char *string){
  2081. int i;
  2082. double rtn = 0;
  2083. int decimal = 0;
  2084. double temp = 0;
  2085. double Exponent = 1; //指数表記の時に使用 m e x = m E x = m×10^x
  2086. int Is_positive = 1; //正の数・・・1 負の数・・・-1
  2087.  
  2088. while(*string != '\0')
  2089. {
  2090.  
  2091. if((*string == '\x08')||(*string == 'e' )||( *string == 'E')){
  2092. //指数表記の時の処理 (例:1.234×105 = 1.234e5)
  2093. Exponent = myatof(string+1);
  2094. if(Exponent < 0)
  2095. {
  2096. Exponent = fabs(Exponent);
  2097. Exponent = POW(10,(int)Exponent);
  2098. Exponent = 1 / Exponent;
  2099. }else
  2100. {
  2101. Exponent = POW(10,(int)Exponent);
  2102. }
  2103. break;
  2104. }
  2105. else if(*string == '.' ){
  2106. //小数点 ドットが来た時の処理
  2107. decimal++;
  2108.  
  2109. }else if(*string == '-' ){
  2110. //負の数 マイナスが来た時の処理
  2111. Is_positive = -1;
  2112.  
  2113. }else if((*string >= '0')&(*string <= '9')){
  2114. if(decimal == 0)
  2115. {
  2116. rtn *= 10;
  2117. temp = *string - 0x30;
  2118. rtn += temp;
  2119. }
  2120. else{
  2121. temp = *string - 0x30;
  2122. for(i=0;i<decimal;i++){ temp /= 10;}
  2123. rtn += temp;
  2124. decimal++;
  2125.  
  2126. }
  2127. }else{
  2128.  
  2129. }
  2130. string++;
  2131. }
  2132. rtn = rtn * Is_positive * Exponent;
  2133. return rtn;
  2134. }
  2135.  
  2136. void AddStack(struct stack far *Stack1) //一個追加
  2137. {
  2138. struct stack far *tempStackPtr;
  2139. struct stack far *receiveStackPtr;
  2140. tempStackPtr = Stack1 -> next;
  2141. receiveStackPtr = (struct stack far *)calloc(1,sizeof(struct stack));
  2142. if(receiveStackPtr == NULL)
  2143. { /*callocに失敗した時の処理*/
  2144. errno = ENOMEM;
  2145. return;
  2146. }
  2147. Stack1 -> next = receiveStackPtr;
  2148. Stack1 -> next -> next = tempStackPtr;
  2149. Stack1 -> next -> var = Stack1 -> var;
  2150. Stack1 -> var = 0;
  2151. }
  2152. void DelStack(struct stack far *Stack1) //一個削除
  2153. {
  2154. struct stack far *tempStackPtr;
  2155. tempStackPtr = Stack1 -> next -> next;
  2156. free(Stack1 -> next);
  2157. Stack1 -> next = tempStackPtr;
  2158. }
  2159. void FreeStack(struct stack far *Stack1) //開放
  2160. {
  2161. struct stack far *nextStackPtr;
  2162. struct stack far *nowStackPtr;
  2163. nowStackPtr = Stack1 -> next;
  2164. nextStackPtr = nowStackPtr -> next;
  2165. Stack1 -> var = 0;
  2166. Stack1 -> next = NULL;
  2167. if(nowStackPtr == NULL) return;
  2168. if(nextStackPtr != NULL) FreeStack(nowStackPtr);
  2169. free(nowStackPtr);
  2170. }
  2171. int ExamineStackItemsNumber(struct stack far *Stack1) //何個あるか調べる
  2172. {
  2173. int rtn = 1;
  2174. if(Stack1 -> next != NULL) rtn += ExamineStackItemsNumber(Stack1 -> next);
  2175. return rtn;
  2176. }
  2177.  
  2178. unsigned long long POW(int a, int b)
  2179. {
  2180. int i;
  2181. long long ret = 1;
  2182. b = abs(b);
  2183. for( i=0; i<b; i++)ret *= a;
  2184. return ret;
  2185. }
  2186.  
  2187. void mode_infomation(void) /*動作状態表示とか(の予定)。PWRボタンで呼び出される*/
  2188. {
  2189. unsigned int count = 0;
  2190. Is_InfomationMode = 0;
  2191. if(cnt0 <= 1000) return;
  2192. Is_InfomationMode = 1;
  2193. //Delay_ms(100);
  2194. /* */
  2195. while(p9_0)
  2196. {
  2197. Delay(1000);
  2198. count++;
  2199. if(count >= 750) Poweroff();
  2200. }
  2201.  
  2202. Is_InfomationMode = 0;
  2203. return;
  2204. }
  2205.  
  2206. double DegtoRad(double degree)
  2207. {
  2208. return degree * PI / 180.0;
  2209. }
  2210. double RadtoDeg(double radian)
  2211. {
  2212. return radian * 180.0 / PI;
  2213. }
  2214.  
  2215. double mysin(double Angle , char AngleUnit) //Angle:角度 AngleUnit:角度の単位(ANGLEUNIT_DEG,ANGLEUNIT_RAD)
  2216. {
  2217. if(AngleUnit == ANGLEUNIT_DEG) Angle = DegtoRad(Angle);
  2218. return sin(Angle);
  2219. }
  2220. double mycos(double Angle , char AngleUnit) //Angle:角度 AngleUnit:角度の単位(ANGLEUNIT_DEG,ANGLEUNIT_RAD)
  2221. {
  2222. if(AngleUnit == ANGLEUNIT_DEG) Angle = DegtoRad(Angle);
  2223. return cos(Angle);
  2224. }
  2225. double mytan(double Angle , char AngleUnit) //Angle:角度 AngleUnit:角度の単位(0-Deg,1-Rad)
  2226. {
  2227. if(AngleUnit == ANGLEUNIT_DEG) Angle = DegtoRad(Angle);
  2228. return tan(Angle);
  2229. }
  2230. double myasin(double Angle , char AngleUnit) //Angle:角度 AngleUnit:角度の単位(0-Deg,1-Rad)
  2231. {
  2232. if(AngleUnit == ANGLEUNIT_DEG) return RadtoDeg(asin(Angle));
  2233. return asin(Angle);
  2234. }
  2235. double myacos(double Angle , char AngleUnit) //Angle:角度 AngleUnit:角度の単位(0-Deg,1-Rad)
  2236. {
  2237. if(AngleUnit == ANGLEUNIT_DEG) return RadtoDeg(acos(Angle));
  2238. return acos(Angle);
  2239. }
  2240. double myatan(double Angle , char AngleUnit) //Angle:角度 AngleUnit:角度の単位(0-Deg,1-Rad)
  2241. {
  2242. if(AngleUnit == ANGLEUNIT_DEG) return RadtoDeg(atan(Angle));
  2243. return atan(Angle);
  2244. }
  2245. void error_handing(void)
  2246. {
  2247. char MsgContentError[41];
  2248. char MsgError1[21] = " !!!!! ERROR !!!!! ";
  2249. char MsgError2[21] = " Error No.000";
  2250. char MsgError4[21] = "Please push ANY Key.";
  2251. const char MsgEdom[21] = "Math argument Error ";
  2252. const char MsgErange[21] = "Result too large Err";
  2253. const char MsgEnomem[21] = "Not enough MEMORY Er";
  2254. const char MsgEdbzero[21] = "Divide by ZERO ERROR";
  2255. const char MsgEothr[21] = "Unknown Error ";
  2256. Lcd_clear();
  2257. switch(errno){
  2258. case EDOM:
  2259. strcpy(MsgContentError,MsgEdom);
  2260. break;
  2261. case ERANGE:
  2262. strcpy(MsgContentError,MsgErange);
  2263. break;
  2264. case ENOMEM:
  2265. strcpy(MsgContentError,MsgEnomem);
  2266. break;
  2267. case EDBZERO:
  2268. strcpy(MsgContentError,MsgEdbzero);
  2269. break;
  2270. default:
  2271. strcpy(MsgContentError,MsgEothr);
  2272. break;
  2273. }
  2274. //strcpy(MsgContentError,strerror(errno));
  2275. Ltostring_int(3,errno,&MsgError2[17]);
  2276. Lcd_line_print(1,MsgError1);
  2277. Lcd_line_print(2,MsgError2);
  2278. Lcd_line_print(3,MsgContentError);
  2279. Delay(500000);
  2280. Delay(500000);
  2281. Delay(500000);
  2282. Delay(500000);
  2283. Delay(500000);
  2284. Delay(500000);
  2285. Delay(500000);
  2286. Delay(500000);
  2287. Delay(500000);
  2288. Lcd_line_print(4,MsgError4);
  2289. Delay(500000);
  2290. Delay(500000);
  2291. Delay(500000);
  2292. Delay(500000);
  2293. Delay(500000);
  2294. errno = 0;
  2295. error_is = 1;
  2296. }
  2297.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty