fork 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.  
  17. #define LCD_DB p3
  18. #define LCD_DB7 p3_3
  19. #define LCD_DB6 p3_2
  20. #define LCD_DB5 p3_1
  21. #define LCD_DB4 p3_0
  22. #define LCD_STB p3_4
  23. #define LCD_RS p3_5
  24. #define LCD_LGT p3_6
  25. #define PWRKEY p3_7
  26.  
  27. #define KEY_INTERVAL 3 //キーパッド サンプリング間隔[ms]
  28.  
  29. #define AUTOLIGHTOFF 10000 //バックライトオフまでの時間(ms) 1000*10→10秒
  30. #define AUTOPOWEROFF 90000 //オートパワーオフまでの時間(ms) 1000*60*1.5→1.5分
  31.  
  32.  
  33. #define SPACE ' ' //空白
  34. //#define PI pi //円周率
  35. #define PI (atan(1.0) * 4.0) //円周率
  36.  
  37. //#define ERRORMESSAGE
  38.  
  39. /* キー・ID定義 */
  40. #define KEYID_BKLGT 0x72
  41. #define KEYID_71 0x71
  42. #define KEYID_MODE 0x70
  43.  
  44. #define KEYID_RIGHT 0x34 //右 →
  45. #define KEYID_LEFT 0x31 //左 ←
  46. #define KEYID_UP 0x33 //上 ↑
  47. #define KEYID_DOWN 0x32 //下 ↓ 
  48. #define KEYID_SELECT 0x30 //中央(決定)
  49.  
  50. #define KEYID_NUM0 0x20
  51. #define KEYID_NUMPOINT 0x01
  52. #define KEYID_NUM1 0x22
  53. #define KEYID_NUM2 0x03
  54. #define KEYID_NUM3 0x02
  55. #define KEYID_NUM4 0x24
  56. #define KEYID_NUM5 0x05
  57. #define KEYID_NUM6 0x04
  58. #define KEYID_NUM7 0x26
  59. #define KEYID_NUM8 0x07
  60. #define KEYID_NUM9 0x06
  61. #define KEYID_NUMDEL 0x17
  62. #define KEYID_NUMAC 0x16
  63. #define KEYID_NUMEQUAL 0x10
  64. #define KEYID_NUMPLUS 0x13
  65. #define KEYID_NUMMINUS 0x12
  66. #define KEYID_NUMX 0x15
  67. #define KEYID_NUMSLASH 0x14
  68. #define KEYID_NUM11 0x11
  69. #define KEYID_NUM00 0x00
  70.  
  71. #define KEYID_INV 0x50 //正負
  72. #define KEYID_NEG 0x47 //逆数
  73. #define KEYID_SQUARE 0x51 //二乗
  74. #define KEYID_SQROOT 0x52 //平方根
  75. #define KEYID_POWER 0x53 //累乗(xのy乗)
  76.  
  77. #define KEYID_LOG10 0x25 //log10
  78. #define KEYID_LN 0x27 //loge(ネイピア数)
  79.  
  80. #define KEYID_DEGRAD 0xff //度数法・弧度法 モード変更(ラーージーーーアーーーーーン!ディィィーーーーグリーーー!)
  81. #define KEYID_SIN 0xff //未指定
  82. #define KEYID_COS 0xff //未指定
  83. #define KEYID_TAN 0xff
  84.  
  85. #define MODEID_PWROFF 00 //電源OFF
  86. #define MODEID_IFX 01 //(InFiX mode).....中間記法
  87. #define MODEID_RPN 02 //(Reverse Polish Notation mode).....逆ポーランド記法
  88. #define MODEID_LOGICAL 03 //論理演算モード(2進数、8進数、10進数、16進数)
  89. #define MODEID_CHMOD 0xff //モードチェンジ用画面表示#
  90. #define MODEID_DEFAULT 02 //初期状態
  91.  
  92. #define CHMOD_SCROLLY_0 Lcd_line_print(2,MsgChmod2);Lcd_line_print(3,MsgChmod3);Lcd_line_print(4,MsgChmod4);
  93. #define CHMOD_SCROLLY_1 Lcd_line_print(2,MsgChmod3);Lcd_line_print(3,MsgChmod4);Lcd_line_print(4,MsgChmod5);
  94. #define CHMOD_SCROLLY_2 Lcd_line_print(2,MsgChmod4);Lcd_line_print(3,MsgChmod5);Lcd_line_print(4,MsgChmod6);
  95. #define CHMOD_SCROLLY_3 Lcd_line_print(2,MsgChmod5);Lcd_line_print(3,MsgChmod6);Lcd_line_print(4,MsgChmod7);
  96. #define CHMOD_SCROLLY_4 Lcd_line_print(2,MsgChmod6);Lcd_line_print(3,MsgChmod7);Lcd_line_print(4,MsgChmod8);
  97. #define CHMOD_SCROLLY_MAX 4
  98. #define CHMOD_SCROLLY_MIN 0
  99. #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;}
  100.  
  101. /*======================================*/
  102. /* プロトタイプ宣言 */
  103. /*======================================*/
  104. void init( void );
  105. void timer( unsigned long timer_set );
  106. unsigned char dipsw_get( void );
  107.  
  108. unsigned char chmod(void);
  109. void mode_rpn(void);
  110. void mode_infix(void);
  111. void mode_logical(void);
  112.  
  113. void Lcd_init(void); //LCD初期化
  114. void Lcd_output(char *str); //
  115. void Lcd_clear(void);
  116. void Lcd_black(void);
  117. void Lcd_cmd(char cmd);
  118. void Lcd_data(char asci);
  119. void Lcd_out(char code, char flag);
  120. void Lcd_locate(char x, char y); //カーソルの位置指定
  121. void Lcd_cursol(char c_mode); //カーソルの表示を変更
  122. void Lcd_line_print(char y,char *str); //LCDに出力。行数指定有り
  123. void Lowspeed_Lcd_line_print(char y,unsigned long w,char *str); //LCDに出力。行数指定有り。タイプライターっぽく遅延しながら表示
  124. void Lcd_Itostring(char y, int digit, unsigned long data, char *buffer, char z);
  125. void Lcd_line_print_cgram(char y);
  126. void Lcd_backlight(char z);
  127. char Lcd_backlight_stat(void);
  128.  
  129. void Delay(long usec);
  130. void Delay_ms(unsigned long msec);
  131.  
  132. //void Itostring(int digit, unsigned long data, char *buffer);
  133. //void Ltostring(int digit, unsigned long long data, char *buffer);
  134. void Ltostring_int(int digit, unsigned long long data, char *buffer);
  135. void Ltostring_decimal(int digit, unsigned long long data, char *buffer);
  136.  
  137. void Keypad_read(void);
  138.  
  139. void Poweroff(void);
  140.  
  141. unsigned char Check_key_bit(unsigned char keyid,const char *buffer);
  142.  
  143. void stackin(char in,char digits,char position,char *stack);
  144.  
  145.  
  146. void myftoa(char *string, double f, int figure);
  147.  
  148. double myatof(const char *string);
  149.  
  150. unsigned long long POW(int a, int b);
  151.  
  152. void mode_infomation(void);
  153.  
  154. double DegtoRad(double degree);
  155. double RadtoDeg(double radian);
  156.  
  157. void error_handing(void);
  158. /*======================================*/
  159. /* グローバル変数の宣言 */
  160. /*======================================*/
  161. unsigned long cnt0; /* timer関数用 */
  162. unsigned char cnt1; /* main内で使用 */
  163. char cnt2;
  164. char cnt3;
  165. unsigned char pwrhold = 0;
  166. char backlight_stat = 0;
  167. char key0 = 0;
  168. char keystat[8] = {0,0,0,0,0,0,0,0};
  169. char keynow[8] = {0,0,0,0,0,0,0,0};
  170. char keypast[8] = {0,0,0,0,0,0,0,0};
  171. char keypast0[8] = {0,0,0,0,0,0,0,0};
  172. char keypast1[8] = {0,0,0,0,0,0,0,0};
  173. //char keypast2[8] = {0,0,0,0,0,0,0,0};
  174. //char keypast3[8] = {0,0,0,0,0,0,0,0};
  175. //char keypast4[8] = {0,0,0,0,0,0,0,0};
  176. char keypast5[8] = {0,0,0,0,0,0,0,0};
  177. char key0to1[8] = {0,0,0,0,0,0,0,0};
  178. char key1to0[8] = {0,0,0,0,0,0,0,0};
  179. unsigned long delayms = 0;
  180. char Is_InfomationMode = 0;
  181.  
  182. /************************************************************************/
  183. /* メインプログラム */
  184. /************************************************************************/
  185. void main( void )
  186. {
  187. unsigned char mode = MODEID_DEFAULT;
  188. /* マイコン機能の初期化 */
  189. init(); /* 初期化 */
  190. asm(" fset I "); /* 全体の割り込み許可 */
  191.  
  192. while(1){
  193. Lcd_init();
  194. Lcd_clear();
  195. Lcd_cursol(4);
  196. Lcd_clear();
  197. switch(mode){
  198. case MODEID_PWROFF: //電源OFF
  199. Poweroff();
  200. break;
  201.  
  202. case MODEID_IFX: //中間記法(普通の数式)モード
  203. mode_infix(); //中間記法(InFiX mode)
  204. mode = MODEID_CHMOD;
  205. break;
  206.  
  207. case MODEID_RPN: //RPN(逆ポーランド記法)モード
  208. mode_rpn();
  209. mode = MODEID_CHMOD;
  210. break;
  211. case MODEID_LOGICAL:
  212. mode_logical();
  213. mode = MODEID_CHMOD;
  214. break;
  215. case MODEID_CHMOD:
  216. default:
  217. mode = chmod(); //モード変更画面
  218. break;
  219. }
  220. }
  221. }//←←←←←←←メイン関数終了
  222.  
  223. unsigned char chmod(void){ //チェンジモード モードIDを返します
  224. char cursorX,cursorY,scrollY,i;
  225. char MsgChmod1[21] = " *** ChangeMODE 0-2 ";
  226. char MsgChmod2[21] = "0.PWR OFF ";
  227. char MsgChmod3[21] = "1.InFiX MODE ";
  228. char MsgChmod4[21] = "2.RPN MODE ";
  229. char MsgChmod5[21] = "3.Logical operation ";
  230. char MsgChmod6[21] = "4.Undefined ... ";
  231. char MsgChmod7[21] = "5.Undefined ... ";
  232. char MsgChmod8[21] = "6.Undefined ... ";
  233.  
  234. Lcd_line_print(1,MsgChmod1);
  235.  
  236. cursorX = 1;cursorY = 2;scrollY = 0;
  237.  
  238. CHMOD_SCROLLY_PRINTLCD
  239. Lcd_locate(cursorX,cursorY);
  240. printf("/*** Change MODE ***/\n");
  241.  
  242. while(1)
  243. {
  244. Delay_ms(1);
  245. for(i=0;i<=7;i++)
  246. {
  247. key0to1[i] = keystat[i] & ~keypast5[i];
  248. keypast5[i] = keystat[i];
  249. }
  250. if(Check_key_bit(KEYID_RIGHT,key0to1))
  251. {
  252. cursorX++;
  253. Lcd_locate(cursorX,cursorY);
  254. }
  255. if(Check_key_bit(KEYID_LEFT,key0to1))
  256. {
  257. cursorX--;
  258. Lcd_locate(cursorX,cursorY);
  259. }
  260. if(Check_key_bit(KEYID_DOWN,key0to1))
  261. {
  262. cursorY++;
  263. Lcd_locate(cursorX,cursorY);
  264. }
  265. if(Check_key_bit(KEYID_UP,key0to1))
  266. {
  267. cursorY--;
  268. Lcd_locate(cursorX,cursorY);
  269. }
  270. if(Check_key_bit(KEYID_SELECT,key0to1)){
  271. switch(cursorY + scrollY){
  272. case 2:
  273. return MODEID_PWROFF;
  274. break;
  275. case 3:
  276. return MODEID_IFX;
  277. break;
  278. case 4:
  279. return MODEID_RPN;
  280. break;
  281. case 5:
  282. return MODEID_LOGICAL;
  283. return 3;
  284. break;
  285. case 6:
  286. return 4;
  287. break;
  288. }
  289. }
  290. if(Check_key_bit(KEYID_NUM0,key0to1)){
  291. return MODEID_PWROFF;
  292. }
  293. if(Check_key_bit(KEYID_NUM1,key0to1)){
  294. return MODEID_IFX;
  295. }
  296. if(Check_key_bit(KEYID_NUM2,key0to1)){
  297. return MODEID_RPN;
  298. }
  299. if(Check_key_bit(KEYID_NUM3,key0to1)){
  300. return MODEID_LOGICAL;
  301. }
  302. if(cursorY > 4)
  303. {
  304. scrollY++;
  305. cursorY = 4;
  306. CHMOD_SCROLLY_PRINTLCD
  307. Lcd_locate(cursorX,cursorY);
  308. }
  309. if(cursorY < 2)
  310. {
  311. scrollY--;
  312. cursorY = 2;
  313. CHMOD_SCROLLY_PRINTLCD
  314. Lcd_locate(cursorX,cursorY);
  315. }
  316. if(cursorX > 20) {cursorX = 1;Lcd_locate(cursorX,cursorY);}
  317. if(cursorX < 1) {cursorX = 20;Lcd_locate(cursorX,cursorY);}
  318. }
  319. return MODEID_CHMOD;
  320. } //←←←←←←←chmod関数終了
  321.  
  322. void mode_infix(void){ //Infixモード(中間記法)
  323. printf("/*** Infix MODE ***/\n");
  324. return;
  325. } //←←←←←←←mode_infix関数終了
  326.  
  327. void mode_rpn(void){ //RPNモード(逆ポーランド記法)
  328. unsigned char i = 0;
  329. char demical = 0;
  330. char MsgPrint1[25] = "\0";
  331. char MsgPrint2[25] = "\0";
  332. char MsgPrint3[25] = "\0";
  333. char MsgPrint4[25] = "\0";
  334.  
  335. char KeyStack1[21];
  336. char KeyStack2[21];
  337. char KeyStack3[21];
  338. char KeyStack4[21];
  339. char KeyStack5[21];
  340. char KeyStack6[21];
  341.  
  342. double Stack[7] = {0,0,0,0,0,0,0};
  343.  
  344. char Is_nextStackShift = 0;
  345. char cursor = 0;
  346. char cursormode = 4;
  347. char RefreshLCD = 1;
  348. char cursorpast = cursor;
  349.  
  350. for(i=0;i<=20;i++)
  351. {
  352. KeyStack1[i] = SPACE;
  353. KeyStack2[i] = SPACE;
  354. KeyStack3[i] = SPACE;
  355. KeyStack4[i] = SPACE;
  356. KeyStack5[i] = SPACE;
  357. KeyStack6[i] = SPACE;
  358. }
  359. KeyStack1[20] = '\0';
  360. KeyStack2[20] = '\0';
  361. KeyStack3[20] = '\0';
  362. KeyStack4[20] = '\0';
  363. KeyStack5[20] = '\0';
  364. KeyStack6[20] = '\0';
  365.  
  366. printf("/*** RPN MODE ***/\n");
  367.  
  368. while(1)
  369. { //printf("While Head\n");
  370. Delay_ms(1);
  371. for(i=0;i<=7;i++)
  372. {
  373. key0to1[i] = keystat[i] & ~keypast5[i];
  374. keypast5[i] = keystat[i];
  375. }
  376. {
  377. if(cursor > 19) cursor = 0;
  378. if(Check_key_bit(KEYID_MODE,key0to1)) //モードキーが押された時の処理
  379. {
  380. while(Check_key_bit(KEYID_MODE,keystat)); //モードキーが離されるまで待つ
  381. return; //main()関数に戻る
  382. }
  383. if(Check_key_bit(0x73,key0to1)) //テスト用のキー。あとで変更する
  384. {
  385. cursormode++;
  386. if(cursormode >= 5) cursormode = 1;
  387. Lcd_cursol(cursormode);
  388. }
  389.  
  390. if(Check_key_bit(KEYID_LEFT,key0to1)) //方向キー ←
  391. {
  392. if(cursor) cursor--;
  393. while(Check_key_bit(KEYID_LEFT,keystat))
  394. {
  395. if(Check_key_bit(KEYID_NUM0,key0to1)) cursor = 0;
  396. if(Check_key_bit(KEYID_NUM1,key0to1)) cursor--;
  397. if(Check_key_bit(KEYID_NUM2,key0to1)) cursor -= 2;
  398. if(Check_key_bit(KEYID_NUM3,key0to1)) cursor -= 3;
  399. if(Check_key_bit(KEYID_NUM4,key0to1)) cursor -= 4;
  400. if(Check_key_bit(KEYID_NUM5,key0to1)) cursor -= 5;
  401. if(Check_key_bit(KEYID_NUM6,key0to1)) cursor -= 6;
  402. if(Check_key_bit(KEYID_NUM7,key0to1)) cursor -= 7;
  403. if(Check_key_bit(KEYID_NUM8,key0to1)) cursor -= 8;
  404. if(Check_key_bit(KEYID_NUM9,key0to1)) cursor -= 9;
  405. if(cursor > 19) cursor = 0;
  406. if(cursorpast != cursor) Lcd_locate(cursor+1,4);
  407. cursorpast = cursor;
  408. for(i=0;i<=7;i++)
  409. {
  410. key0to1[i] = keystat[i] & ~keypast5[i];
  411. keypast5[i] = keystat[i];
  412. }
  413. }
  414. }
  415.  
  416. if(Check_key_bit(KEYID_RIGHT,key0to1)) //方向キー →
  417. {
  418. if(cursor<=19) cursor++;
  419. while(Check_key_bit(KEYID_RIGHT,keystat))
  420. {
  421. if(Check_key_bit(KEYID_NUM0,key0to1)) cursor = 19;
  422. if(Check_key_bit(KEYID_NUM1,key0to1)) cursor++;
  423. if(Check_key_bit(KEYID_NUM2,key0to1)) cursor += 2;
  424. if(Check_key_bit(KEYID_NUM3,key0to1)) cursor += 3;
  425. if(Check_key_bit(KEYID_NUM4,key0to1)) cursor += 4;
  426. if(Check_key_bit(KEYID_NUM5,key0to1)) cursor += 5;
  427. if(Check_key_bit(KEYID_NUM6,key0to1)) cursor += 6;
  428. if(Check_key_bit(KEYID_NUM7,key0to1)) cursor += 7;
  429. if(Check_key_bit(KEYID_NUM8,key0to1)) cursor += 8;
  430. if(Check_key_bit(KEYID_NUM9,key0to1)) cursor += 9;
  431. if(cursor > 19) cursor = 0;
  432. if(cursorpast != cursor) Lcd_locate(cursor+1,4);
  433. cursorpast = cursor;
  434. for(i=0;i<=7;i++)
  435. {
  436. key0to1[i] = keystat[i] & ~keypast5[i];
  437. keypast5[i] = keystat[i];
  438. }
  439. }
  440. }
  441.  
  442. if(Check_key_bit(KEYID_NUMAC,key0to1)) //AC押した時
  443. {
  444. printf("Check key AC\n");
  445. Is_nextStackShift = 0;
  446. Lcd_clear();
  447. cursor = 0;
  448. for(i=0;i<=19;i++)
  449. {
  450. KeyStack1[i] = SPACE;
  451. KeyStack2[i] = SPACE;
  452. KeyStack3[i] = SPACE;
  453. KeyStack4[i] = SPACE;
  454. }
  455. for(i=0;i<=6;i++)
  456. {
  457. Stack[i] = 0;
  458. }
  459. RefreshLCD = 1;
  460. }
  461.  
  462. if(Check_key_bit(KEYID_NUMDEL,key0to1)) //DEL押した時
  463. {
  464. printf("Check key DEL\n");
  465. if(cursor) cursor--; //cursorが"0"以外なら実行
  466. if(cursor <= 19) stackin(0x7f,19,cursor,KeyStack1); //0x7f…アスキーコードで「DEL」をあらわす
  467. Is_nextStackShift = 0;
  468. RefreshLCD = 1;
  469. i = 0;
  470. while(Check_key_bit(KEYID_NUMDEL,keystat))
  471. {
  472. i++;
  473. Delay_ms(10);
  474. if(Check_key_bit(KEYID_NUMAC,keystat))
  475. {
  476. for(i=0;i<=19;i++)
  477. {
  478. KeyStack1[i] = SPACE;
  479. }
  480. cursor = 0;
  481. break;
  482. }
  483. if(i >= 150)
  484. {
  485. for(i=0;i<=19;i++)
  486. {
  487. KeyStack1[i] = SPACE;
  488. }
  489. cursor = 0;
  490. break;
  491. }
  492. }
  493. i = 0;
  494. }
  495.  
  496. if(Check_key_bit(KEYID_NUMPOINT,key0to1)) //小数点キー押した時
  497. { printf("Check key Dot\n");
  498. if(Is_nextStackShift)
  499. {
  500. Is_nextStackShift = 0;
  501. Stack[6] = Stack[5];
  502. Stack[5] = Stack[4];
  503. Stack[4] = Stack[3];
  504. Stack[3] = Stack[2];
  505. Stack[2] = Stack[1];
  506. cursor = 0;
  507. for(i=0;i<=19;i++)
  508. {
  509. KeyStack1[i] = SPACE;
  510. }
  511. }
  512. stackin('.',19,cursor,KeyStack1);
  513. ++cursor;
  514. RefreshLCD = 1;
  515. }
  516.  
  517. if(Check_key_bit(KEYID_NUM0,key0to1)) //数字キー 0
  518. {
  519. if(Is_nextStackShift)
  520. {
  521. Is_nextStackShift = 0;
  522. Stack[6] = Stack[5];
  523. Stack[5] = Stack[4];
  524. Stack[4] = Stack[3];
  525. Stack[3] = Stack[2];
  526. Stack[2] = Stack[1];
  527. cursor = 0;
  528. for(i=0;i<=19;i++)
  529. {
  530. KeyStack1[i] = SPACE;
  531. }
  532. }
  533. printf("Check key 0\n");
  534. stackin('0',19,cursor,KeyStack1);
  535. ++cursor;
  536. RefreshLCD = 1;
  537. }
  538.  
  539. if(Check_key_bit(KEYID_NUM1,key0to1)) //数字キー 1
  540. {
  541. if(Is_nextStackShift)
  542. {
  543. Is_nextStackShift = 0;
  544. Stack[6] = Stack[5];
  545. Stack[5] = Stack[4];
  546. Stack[4] = Stack[3];
  547. Stack[3] = Stack[2];
  548. Stack[2] = Stack[1];
  549. cursor = 0;
  550. for(i=0;i<=19;i++)
  551. {
  552. KeyStack1[i] = SPACE;
  553. }
  554. }
  555. printf("Check key 1\n");
  556. stackin('1',19,cursor,KeyStack1);
  557. ++cursor;
  558. RefreshLCD = 1;
  559. }
  560.  
  561. if(Check_key_bit(KEYID_NUM2,key0to1)) //数字キー 2
  562. {
  563. if(Is_nextStackShift)
  564. {
  565. Is_nextStackShift = 0;
  566. Stack[6] = Stack[5];
  567. Stack[5] = Stack[4];
  568. Stack[4] = Stack[3];
  569. Stack[3] = Stack[2];
  570. Stack[2] = Stack[1];
  571. cursor = 0;
  572. for(i=0;i<=19;i++)
  573. {
  574. KeyStack1[i] = SPACE;
  575. }
  576. }
  577. printf("Check key 2\n");
  578. stackin('2',19,cursor,KeyStack1);
  579. ++cursor;
  580. RefreshLCD = 1;
  581. }
  582.  
  583. if(Check_key_bit(KEYID_NUM3,key0to1)) //数字キー 3
  584. {
  585. if(Is_nextStackShift)
  586. {
  587. Is_nextStackShift = 0;
  588. Stack[6] = Stack[5];
  589. Stack[5] = Stack[4];
  590. Stack[4] = Stack[3];
  591. Stack[3] = Stack[2];
  592. Stack[2] = Stack[1];
  593. cursor = 0;
  594. for(i=0;i<=19;i++)
  595. {
  596. KeyStack1[i] = SPACE;
  597. }
  598. }
  599. printf("Check key 3\n");
  600. stackin('3',19,cursor,KeyStack1);
  601. ++cursor;
  602. RefreshLCD = 1;
  603. }
  604.  
  605. if(Check_key_bit(KEYID_NUM4,key0to1)) //数字キー 4
  606. {
  607. if(Is_nextStackShift)
  608. {
  609. Is_nextStackShift = 0;
  610. Stack[6] = Stack[5];
  611. Stack[5] = Stack[4];
  612. Stack[4] = Stack[3];
  613. Stack[3] = Stack[2];
  614. Stack[2] = Stack[1];
  615. cursor = 0;
  616. for(i=0;i<=19;i++)
  617. {
  618. KeyStack1[i] = SPACE;
  619. }
  620. }
  621. printf("Check key 4\n");
  622. stackin('4',19,cursor,KeyStack1);
  623. ++cursor;
  624. RefreshLCD = 1;
  625. }
  626.  
  627. if(Check_key_bit(KEYID_NUM5,key0to1)) //数字キー 5
  628. {
  629. if(Is_nextStackShift)
  630. {
  631. Is_nextStackShift = 0;
  632. Stack[6] = Stack[5];
  633. Stack[5] = Stack[4];
  634. Stack[4] = Stack[3];
  635. Stack[3] = Stack[2];
  636. Stack[2] = Stack[1];
  637. cursor = 0;
  638. for(i=0;i<=19;i++)
  639. {
  640. KeyStack1[i] = SPACE;
  641. }
  642. }
  643. printf("Check key 5\n");
  644. stackin('5',19,cursor,KeyStack1);
  645. ++cursor;
  646. RefreshLCD = 1;
  647. }
  648.  
  649. if(Check_key_bit(KEYID_NUM6,key0to1)) //数字キー 6
  650. {
  651. if(Is_nextStackShift)
  652. {
  653. Is_nextStackShift = 0;
  654. Stack[6] = Stack[5];
  655. Stack[5] = Stack[4];
  656. Stack[4] = Stack[3];
  657. Stack[3] = Stack[2];
  658. Stack[2] = Stack[1];
  659. cursor = 0;
  660. for(i=0;i<=19;i++)
  661. {
  662. KeyStack1[i] = SPACE;
  663. }
  664. }
  665. printf("Check key 6\n");
  666. stackin('6',19,cursor,KeyStack1);
  667. ++cursor;
  668. RefreshLCD = 1;
  669. }
  670.  
  671. if(Check_key_bit(KEYID_NUM7,key0to1)) //数字キー 7
  672. {
  673. if(Is_nextStackShift)
  674. {
  675. Is_nextStackShift = 0;
  676. Stack[6] = Stack[5];
  677. Stack[5] = Stack[4];
  678. Stack[4] = Stack[3];
  679. Stack[3] = Stack[2];
  680. Stack[2] = Stack[1];
  681. cursor = 0;
  682. for(i=0;i<=19;i++)
  683. {
  684. KeyStack1[i] = SPACE;
  685. }
  686. }
  687. printf("Check key 7\n");
  688. stackin('7',19,cursor,KeyStack1);
  689. ++cursor;
  690. RefreshLCD = 1;
  691. }
  692.  
  693. if(Check_key_bit(KEYID_NUM8,key0to1)) //数字キー 8
  694. {
  695. if(Is_nextStackShift)
  696. {
  697. Is_nextStackShift = 0;
  698. Stack[6] = Stack[5];
  699. Stack[5] = Stack[4];
  700. Stack[4] = Stack[3];
  701. Stack[3] = Stack[2];
  702. Stack[2] = Stack[1];
  703. cursor = 0;
  704. for(i=0;i<=19;i++)
  705. {
  706. KeyStack1[i] = SPACE;
  707. }
  708. }
  709. printf("Check key 8\n");
  710. stackin('8',19,cursor,KeyStack1);
  711. ++cursor;
  712. RefreshLCD = 1;
  713. }
  714.  
  715. if(Check_key_bit(KEYID_NUM9,key0to1)) //数字キー 9
  716. {
  717. if(Is_nextStackShift)
  718. {
  719. Is_nextStackShift = 0;
  720. Stack[6] = Stack[5];
  721. Stack[5] = Stack[4];
  722. Stack[4] = Stack[3];
  723. Stack[3] = Stack[2];
  724. Stack[2] = Stack[1];
  725. cursor = 0;
  726. //Lcd_clear();
  727. for(i=0;i<=19;i++)
  728. {
  729. KeyStack1[i] = SPACE;
  730. }
  731. }
  732. printf("Check key 9\n");
  733. stackin('9',19,cursor,KeyStack1);
  734. ++cursor;
  735. RefreshLCD = 1;
  736. }
  737. if(Check_key_bit(KEYID_NUMEQUAL,key0to1)) //イコール= キー
  738. {
  739. Stack[6] = Stack[5];
  740. Stack[5] = Stack[4];
  741. Stack[4] = Stack[3];
  742. Stack[3] = Stack[2];
  743. if(Is_nextStackShift)
  744. {
  745. Stack[2] = Stack[1];
  746. }else{
  747. Stack[2] = myatof(KeyStack1);
  748. }
  749. Stack[1] = 0;
  750. printf("Check key Equal\n");
  751. cursor = 0;
  752. for(i=0;i<=19;i++)
  753. {
  754. KeyStack1[i] = SPACE;
  755. }
  756. Is_nextStackShift = 0;
  757. RefreshLCD = 1;
  758. }
  759. if(Check_key_bit(KEYID_NUMPLUS,key0to1)) //プラス + 押した時
  760. {
  761. printf("Check key PLUS +\n");
  762. if(~Is_nextStackShift)
  763. {
  764. Stack[1] = myatof(KeyStack1);
  765. }
  766. Stack[1] += Stack[2];
  767. myftoa(KeyStack1,Stack[1],0);
  768. Stack[2] = Stack[3];
  769. Stack[3] = Stack[4];
  770. Stack[4] = Stack[5];
  771. Stack[5] = Stack[6];
  772. Is_nextStackShift = 1;
  773. Stack[6] = 0;
  774. RefreshLCD = 1;
  775. }
  776. if(Check_key_bit(KEYID_NUMMINUS,key0to1)) //マイナス - 押した時
  777. {
  778. printf("Check key MINUS\n");
  779. if(~Is_nextStackShift)
  780. {
  781. Stack[1] = myatof(KeyStack1);
  782. }
  783. Stack[1] = Stack[2] - Stack[1];
  784. myftoa(KeyStack1,Stack[1],0);
  785. Stack[2] = Stack[3];
  786. Stack[3] = Stack[4];
  787. Stack[4] = Stack[5];
  788. Stack[5] = Stack[6];
  789. Is_nextStackShift = 1;
  790. Stack[6] = 0;
  791. RefreshLCD = 1;
  792. }
  793. if(Check_key_bit(KEYID_NUMX,key0to1)) //かける× 押した時
  794. {
  795. printf("Check key X(KAKEZAN)\n");
  796. if(~Is_nextStackShift)
  797. {
  798. Stack[1] = myatof(KeyStack1);
  799. }
  800. Stack[1] *= Stack[2];
  801. myftoa(KeyStack1,Stack[1],0);
  802. Stack[2] = Stack[3];
  803. Stack[3] = Stack[4];
  804. Stack[4] = Stack[5];
  805. Stack[5] = Stack[6];
  806. Is_nextStackShift = 1;
  807. Stack[6] = 0;
  808. RefreshLCD = 1;
  809. }
  810. if(Check_key_bit(KEYID_NUMSLASH,key0to1)) //割る÷ 押した時
  811. {
  812. printf("Check key WARIZAN\n");
  813. if(~Is_nextStackShift)
  814. {
  815. Stack[1] = myatof(KeyStack1);
  816. }
  817. Stack[1] = Stack[2] / Stack[1];
  818. myftoa(KeyStack1,Stack[1],0);
  819. Stack[2] = Stack[3];
  820. Stack[3] = Stack[4];
  821. Stack[4] = Stack[5];
  822. Stack[5] = Stack[6];
  823. Is_nextStackShift = 1;
  824. Stack[6] = 0;
  825. RefreshLCD = 1;
  826. }
  827. if(Check_key_bit(KEYID_INV,key0to1)) // 逆数
  828. {
  829. if(~Is_nextStackShift)
  830. {
  831. Stack[1] = myatof(KeyStack1);
  832. }
  833. Stack[1] = 1 / Stack[1];
  834. myftoa(KeyStack1,Stack[1],0);
  835. RefreshLCD = 1;
  836. Is_nextStackShift = 1;
  837. }
  838. if(Check_key_bit(KEYID_NEG,key0to1)) // 正負変換
  839. {
  840. if((KeyStack1[0]==SPACE)||(KeyStack1[1]==SPACE))
  841. {
  842. RefreshLCD = 1;
  843. KeyStack1[0] = '-';
  844. cursor = 1;
  845. }else
  846. {
  847. if(~Is_nextStackShift)
  848. {
  849. Stack[1] = myatof(KeyStack1);
  850. }
  851. Stack[1] = 0 - Stack[1];
  852. myftoa(KeyStack1,Stack[1],0);
  853. RefreshLCD = 1;
  854. Is_nextStackShift = 1;
  855. }
  856. }
  857. if(Check_key_bit(KEYID_SQUARE,key0to1)) // 二乗
  858. {
  859. if(~Is_nextStackShift)
  860. {
  861. Stack[1] = myatof(KeyStack1);
  862. }
  863. Stack[1] = Stack[1] * Stack[1];
  864. myftoa(KeyStack1,Stack[1],0);
  865. RefreshLCD = 1;
  866. Is_nextStackShift = 1;
  867. }
  868. if(Check_key_bit(KEYID_SQROOT,key0to1)) // 平方根
  869. {
  870. if(~Is_nextStackShift)
  871. {
  872. Stack[1] = myatof(KeyStack1);
  873. }
  874. Stack[1] = sqrt(Stack[1]);
  875. myftoa(KeyStack1,Stack[1],0);
  876. RefreshLCD = 1;
  877. Is_nextStackShift = 1;
  878. }
  879. if(Check_key_bit(KEYID_POWER,key0to1)) //累乗(xのy乗) Stack2^Stack1
  880. {
  881. if(~Is_nextStackShift)
  882. {
  883. Stack[1] = myatof(KeyStack1);
  884. }
  885. Stack[1] = pow(Stack[2],Stack[1]);
  886. myftoa(KeyStack1,Stack[1],0);
  887. Stack[2] = Stack[3];
  888. Stack[3] = Stack[4];
  889. Stack[4] = Stack[5];
  890. Stack[5] = Stack[6];
  891. Is_nextStackShift = 1;
  892. Stack[6] = 0;
  893. RefreshLCD = 1;
  894. }
  895. if(Check_key_bit(KEYID_LOG10,key0to1)) //常用対数 log10
  896. {
  897. if(~Is_nextStackShift)
  898. {
  899. Stack[1] = myatof(KeyStack1);
  900. }
  901. Stack[1] = log10(Stack[1]);
  902. myftoa(KeyStack1,Stack[1],0);
  903. RefreshLCD = 1;
  904. Is_nextStackShift = 1;
  905. }
  906. if(Check_key_bit(KEYID_LN,key0to1)) //自然対数 log e (ネイピア数
  907. {
  908. if(~Is_nextStackShift)
  909. {
  910. Stack[1] = myatof(KeyStack1);
  911. }
  912. Stack[1] = log(Stack[1]);
  913. myftoa(KeyStack1,Stack[1],0);
  914. RefreshLCD = 1;
  915. Is_nextStackShift = 1;
  916. }
  917. }
  918. //printf("cursor: %d\n",cursor);
  919. if(RefreshLCD == 1)
  920. {
  921. myftoa(KeyStack2,Stack[2],0);
  922. myftoa(KeyStack3,Stack[3],0);
  923. myftoa(KeyStack4,Stack[4],0);
  924. Lcd_cursol(1);
  925. Lcd_line_print(1,KeyStack4);
  926. Lcd_line_print(2,KeyStack3);
  927. Lcd_line_print(3,KeyStack2);
  928. Lcd_line_print(4,KeyStack1);
  929. RefreshLCD = 0;
  930. Lcd_locate(cursor+1,4);
  931. Lcd_cursol(cursormode);/*
  932. printf("\nStack1 : %g\n",Stack[1]);
  933. printf("\nStack2 : %g\n",Stack[2]);
  934. printf("\nStack3 : %g\n",Stack[3]);
  935. printf("\nStack4 : %g\n",Stack[4]);
  936. printf("\nStack5 : %g\n",Stack[5]);
  937. printf("\nStack6 : %g\n",Stack[6]);*/
  938. printf("KeyStack1 : %s\n",KeyStack1);
  939. printf("KeyStack2 : %s\n",KeyStack2);
  940. printf("KeyStack3 : %s\n",KeyStack3);
  941. printf("KeyStack4 : %s\n",KeyStack4);
  942. }
  943. if(errno) //エラー時の処理
  944. {
  945. error_handing();
  946. RefreshLCD = 0;
  947. }
  948. if(cursorpast != cursor) Lcd_locate(cursor+1,4);
  949. cursorpast = cursor;
  950. }
  951.  
  952. } //←←←←←←←mode_rpn関数終了
  953.  
  954. void mode_logical(void)
  955. {
  956. } //←←←←←←←mode_logical関数終了
  957.  
  958. /************************************************************************/
  959. /* R8C/38A スペシャルファンクションレジスタ(SFR)の初期化 */
  960. /************************************************************************/
  961. void init( void )
  962. {
  963. int i;
  964.  
  965. /* クロックをXINクロック(20MHz)に変更 */
  966. prc0 = 1; /* プロテクト解除 */
  967. cm13 = 1; /* P4_6,P4_7をXIN-XOUT端子にする*/
  968. cm05 = 0; /* XINクロック発振 */
  969. for(i=0; i<50; i++ ); /* 安定するまで少し待つ(約10ms) */
  970. ocd2 = 0; /* システムクロックをXINにする */
  971. prc0 = 0; /* プロテクトON */
  972.  
  973. /* ポートの入出力設定 0:入力 1:出力 76543210 */
  974. prc2 = 1; /* PD0のプロテクト解除 */
  975. pd0 = 0x00; /* */
  976. pd1 = 0xd0; /* 5:RXD0 4:TXD0 3-0:DIP SW 1101 0000 */
  977. p2 = 0xc0;
  978. pd2 = 0xfe; /* */
  979. pd3 = 0xff; /*LCD 0-DB4~3-DB7 4-Enable 5-RS 6-BkLGT*/
  980. p3 = 0x00;
  981. p4 = 0x00; /* P4_5のLED:初期は消灯 */
  982. pd4 = 0xb8; /* 7:XOUT 6:XIN 5:LED 2:VREF */
  983. pd5 = 0x00; /* キーマトリックス・入力 プルアップON */
  984. pu12 = 1;pu13 = 1;
  985. pd6 = 0xff; /* キーマトリックス・出力 */
  986. drr14 = 1; drr15 = 1;
  987. pd7 = 0x00; /* 電池電圧検出用とか */
  988.  
  989. pd8 = 0xff; /* */
  990. pd9 = 0x00; /* 0-5 IN */
  991. //p9 = 0x38;
  992. pur0 = 0x04; /* P1_3~P1_0のプルアップON */
  993.  
  994. vlt22 = 1; /* P9_0~P9_5 入力スレッショルド→0.35×VCCにセット */
  995. vlt23 = 0; /* */
  996.  
  997.  
  998. /* タイマRBの設定 */
  999. /* 割り込み周期 = 1 / 20[MHz] * (TRBPRE+1) * (TRBPR+1)
  1000.   = 1 / (20*10^6) * 200 * 100
  1001.   = 0.001[s] = 1[ms]
  1002.   */
  1003. trbmr = 0x00; /* 動作モード、分周比設定 */
  1004. trbpre = 200-1; /* プリスケーラレジスタ */
  1005. trbpr = 100-1; /* プライマリレジスタ */
  1006. trbic = 0x06; /* 割り込み優先レベル設定 */
  1007. trbcr = 0x01; /* カウント開始 */
  1008.  
  1009.  
  1010. /* タイマRD リセット同期PWMモードの設定*/
  1011. /* PWM周期 = 1 / 20[MHz] * カウントソース * (TRDGRA0+1)
  1012.   = 1 / (20*10^6) * 8 * 40000
  1013.   = 0.016[s] = 16[ms]
  1014.   */
  1015. trdpsr0 = 0x08; /* TRDIOB0,C0,D0端子設定 */
  1016. trdpsr1 = 0x05; /* TRDIOA1,B1,C1,D1端子設定 */
  1017. trdmr = 0xf0; /* バッファレジスタ設定 */
  1018. trdfcr = 0x01; /* リセット同期PWMモードに設定 */
  1019. trdcr0 = 0x23; /* ソースカウントの選択:f8 */
  1020. trdgra0 = trdgrc0 ; /* 周期 */
  1021. trdgrb0 = trdgrd0 = 0; /* P2_2端子のON幅設定 */
  1022. trdgra1 = trdgrc1 = 0; /* P2_4端子のON幅設定 */
  1023. trdgrb1 = trdgrd1 ; /* P2_5端子のON幅設定 */
  1024. trdoer1 = 0xcd; /* 出力端子の選択 */
  1025. trdstr = 0x0d; /* TRD0カウント開始 */
  1026.  
  1027. //Delay_ms(2);
  1028. p4 = 0x20; /* P4_5のLED:初期は点灯 */
  1029.  
  1030. init_uart0_printf( SPEED_9600 );
  1031. "\n/* START Function Calcrator Alpha Ver. */\n"
  1032. "/* Made by Toyoda Kouhei ( ->kuriuzu ) */ \n"
  1033. "/* This is UART Debug Console */\n"
  1034. );
  1035. }
  1036.  
  1037. /************************************************************************/
  1038. /* タイマRB 割り込み処理 */
  1039. /************************************************************************/
  1040. #pragma interrupt intTRB(vect=24)
  1041. void intTRB( void )
  1042. {
  1043. delayms++;
  1044. cnt0++;
  1045. cnt1++;
  1046. cnt2++;
  1047. if(cnt2 == KEY_INTERVAL){
  1048. cnt2 = 0;
  1049. Keypad_read();
  1050. }
  1051. }
  1052.  
  1053. /************************************************************************/
  1054. /* タイマ本体 */
  1055. /* 引数 タイマ値 1=1ms */
  1056. /************************************************************************/
  1057. void timer( unsigned long timer_set )
  1058. {
  1059. delayms = 0;
  1060. while( delayms < timer_set );
  1061. }
  1062.  
  1063. /************************************************************************/
  1064. /* ディップスイッチ値読み込み */
  1065. /* 戻り値 スイッチ値 0~15 */
  1066. /************************************************************************/
  1067. unsigned char dipsw_get( void )
  1068. {
  1069. unsigned char sw;
  1070.  
  1071. sw = p1 & 0x0f; /* P1_3~P1_0読み込み */
  1072.  
  1073. return sw;
  1074. }
  1075.  
  1076.  
  1077.  
  1078. //----- ディレイ関数 msec単位 -----
  1079.  
  1080. void Delay_ms(unsigned long msec) //!注意!最大-1[ms]の誤差が出ます。!注意!
  1081. {
  1082. delayms = 0;
  1083. while(delayms < msec)
  1084. {
  1085. _asm(
  1086. "fset I;"
  1087. "wait;"
  1088. "nop;"
  1089. "nop;"
  1090. "nop;"
  1091. "nop;"
  1092. );
  1093. }
  1094. }
  1095.  
  1096. //----- ディレイ関数 1usec単位 -----
  1097.  
  1098. void Delay(long usec)
  1099. {
  1100. usec = (usec * 20000) / 45000;
  1101. while(usec--){}
  1102. }
  1103.  
  1104. //----------------------------------------------------
  1105. // 液晶表示器制御ライブラリ
  1106. //----------------------------------------------------
  1107.  
  1108. //----- LCD初期化関数 -----
  1109.  
  1110. void Lcd_init()
  1111. {
  1112. Delay(20000); //20msec wait
  1113. Lcd_out(0x03, 1); //8bit mode set
  1114. Delay(5000); //5msec wait
  1115. Lcd_out(0x03, 1); //8bit mode set
  1116. Delay(1000);
  1117. Lcd_out(0x03, 1); //8bit mode set
  1118. Delay(1000);
  1119. Lcd_out(0x02, 1); //4bit mode set
  1120. Delay(1000);
  1121. Lcd_cmd(0x2C); //DL=0 4bit mode
  1122. Lcd_cmd(0x08); //display off C=D=B=0
  1123. Lcd_cmd(0x0E); //display on D=B=1 C=0
  1124. Lcd_cmd(0x06); //entry I/D=1 S=0
  1125. Lcd_cmd(0x01); //all clear
  1126. }
  1127.  
  1128. //----- データ出力サブ関数 -----
  1129.  
  1130. void Lcd_out(char code, char flag)
  1131. {
  1132. LCD_DB = (LCD_DB & 0xf0) | (code & 0x0f);
  1133. //出力データ下位4ビットを出力
  1134. if (flag == 0) //表示データかコマンドか
  1135. LCD_RS = 1; //表示データの場合RS=1
  1136. else
  1137. LCD_RS = 0; //コマンドデータの場合RS=0
  1138. asm("NOP"); //NOP スキュー確保
  1139. LCD_STB = 1; //STB ON
  1140. asm("NOP");
  1141. asm("NOP"); //パルス幅確保230nsec以上
  1142. asm("NOP");
  1143. asm("NOP");
  1144. LCD_STB = 0; //STB OFF
  1145. }
  1146.  
  1147. //----- 1文字表示関数 -----
  1148.  
  1149. void Lcd_data(char asci)
  1150. {
  1151. Lcd_out(asci>>4, 0); //上位4ビット出力
  1152. Lcd_out(asci, 0); //下位4ビット出力
  1153. Delay(50); //50μsec待ち
  1154. }
  1155.  
  1156. //----- コマンド出力関数 -----
  1157.  
  1158. void Lcd_cmd(char cmd)
  1159. {
  1160. Lcd_out(cmd>>4, 1); //上位4ビット出力
  1161. Lcd_out(cmd, 1); //下位4ビット出力
  1162. if((cmd == 0x01) || (cmd == 0x02))
  1163. Delay(2000); //2msec待ち
  1164. else
  1165. Delay(50); //50usec待ち
  1166. }
  1167.  
  1168. //----- 全消去関数 -----
  1169.  
  1170. void Lcd_clear()
  1171. {
  1172. Lcd_cmd(0x01); //初期化コマンド出力
  1173. }
  1174.  
  1175. //----- 文字列出力関数 -----
  1176.  
  1177. void Lcd_output(char *str)
  1178. {
  1179. while(*str != 0x00) //文字列の終わり判定
  1180. {
  1181. Lcd_data(*str); //文字列1文字出力
  1182. str++; //ポインタ+1
  1183. }
  1184. }
  1185.  
  1186. //----- カーソル位置に移動 -----
  1187.  
  1188. void Lcd_locate(char x, char y)
  1189. {
  1190. char i;
  1191. if (y == 1){
  1192. Lcd_cmd(0x02);
  1193. x--;
  1194. while ( x ){
  1195. Lcd_cmd(0x14);
  1196. x--;
  1197. }
  1198. }else if (y == 2){
  1199. Lcd_cmd(0x02);
  1200. x--;
  1201. for (i=1;i<=40;i++){
  1202. Lcd_cmd(0x14);
  1203. }
  1204. while ( x ){
  1205. Lcd_cmd(0x14);
  1206. x--;
  1207. }
  1208. }else if (y == 3){
  1209. Lcd_cmd(0x02);
  1210. x--;
  1211. for (i=1;i<=20;i++){
  1212. Lcd_cmd(0x14);
  1213. }
  1214. while ( x ){
  1215. Lcd_cmd(0x14);
  1216. x--;
  1217. }
  1218. }else if (y == 4){
  1219. Lcd_cmd(0x02);
  1220. x--;
  1221. for (i=1;i<=60;i++){
  1222. Lcd_cmd(0x14);
  1223. }
  1224. while ( x ){
  1225. Lcd_cmd(0x14);
  1226. x--;
  1227. }
  1228. }
  1229. }
  1230.  
  1231. //----- カーソル表示制御 -----
  1232.  
  1233. void Lcd_cursol(char c_mode)
  1234. {
  1235. switch ( c_mode){
  1236. case 1: // 1.カーソルOFF、ブリンクOFF
  1237. Lcd_cmd(0x0c);
  1238. break;
  1239. case 2: // 2.カーソルOFF、ブリンクON
  1240. Lcd_cmd(0x0d);
  1241. break;
  1242. case 3: // 3.カーソルON、ブリンクOFF
  1243. Lcd_cmd(0x0e);
  1244. break;
  1245. case 4: // 4.カーソルON、ブリンクON
  1246. Lcd_cmd(0x0f);
  1247. break;
  1248. }
  1249. }
  1250.  
  1251. //----- 文字列出力関数(行指定あり) -----
  1252.  
  1253. void Lcd_line_print(char y,char *str)
  1254. {
  1255. if (y == 1){
  1256. Lcd_cmd(0x80);
  1257. } else if(y == 2){
  1258. Lcd_cmd(0xC0);
  1259. }else if(y == 3){
  1260. Lcd_cmd(0x94);
  1261. }else if(y == 4){
  1262. Lcd_cmd(0xD4);
  1263. }
  1264. while(*str != 0x00){ //文字列の終わり判定
  1265. Lcd_data(*str); //文字列1文字出力
  1266. str++; //ポインタ+1
  1267. }
  1268. }
  1269.  
  1270. void Lowspeed_Lcd_line_print(char y,unsigned long w,char *str)
  1271. {
  1272. if (y == 1){
  1273. Lcd_cmd(0x80);
  1274. } else if(y == 2){
  1275. Lcd_cmd(0xC0);
  1276. }else if(y == 3){
  1277. Lcd_cmd(0x94);
  1278. }else if(y == 4){
  1279. Lcd_cmd(0xD4);
  1280. }
  1281. while(*str != 0x00){ //文字列の終わり判定
  1282. Lcd_data(*str); //文字列1文字出力
  1283. Delay_ms(w);
  1284. str++; //ポインタ+1
  1285. }
  1286. }
  1287.  
  1288. void Lcd_black(void){
  1289. char lp;
  1290. Lcd_cmd(0x80);
  1291. for(lp=0;lp<=0x67;lp++){
  1292. Lcd_data(0xff);
  1293. }
  1294. }
  1295.  
  1296. void Lcd_line_print_cgram(char y)
  1297. {
  1298. char lp;
  1299. if (y == 1){
  1300. Lcd_cmd(0x80);
  1301. } else if(y == 2){
  1302. Lcd_cmd(0xC0);
  1303. }else if(y == 3){
  1304. Lcd_cmd(0x94);
  1305. }else if(y == 4){
  1306. Lcd_cmd(0xD4);
  1307. }
  1308. while(lp <= 0x0f){ //文字列の終わり判定
  1309. Lcd_data(lp); //文字列1文字出力
  1310. Delay_ms(250);
  1311. lp++; //ポインタ+1
  1312. }
  1313. }
  1314. void Lcd_backlight(char z) //バックライト 0....OFF 1....ON
  1315. {
  1316. backlight_stat = z;
  1317. LCD_LGT = z;
  1318. }
  1319. char Lcd_backlight_stat(void) //バックライト 0....OFF 1....ON
  1320. {
  1321. return LCD_LGT;
  1322. }
  1323. /* //使われない関数
  1324. void Itostring(int digit, unsigned long data, char *buffer)
  1325. {
  1326. char i;
  1327. buffer += digit; //文字列の最後
  1328. for(i=digit; i>0; i--) //最下位桁から上位へ
  1329. {
  1330. buffer--; //ポインター1
  1331. *buffer = (data % 10) + '0'; //その桁数値を文字にして格納
  1332. data = data / 10; //桁-1
  1333. }
  1334. }
  1335.  
  1336. void Ltostring(int digit, unsigned long long data, char *buffer)
  1337. {
  1338. char i;
  1339. buffer += digit; //文字列の最後
  1340. for(i=digit; i>0; i--) //最下位桁から上位へ
  1341. {
  1342. buffer--; //ポインター1
  1343. *buffer = (data % 10) + '0'; //その桁数値を文字にして格納
  1344. data = data / 10; //桁-1
  1345. }
  1346. }
  1347. */
  1348.  
  1349. void Ltostring_int(int digit, unsigned long long data, char *buffer)
  1350. {
  1351. char i;
  1352. buffer += digit; //文字列の最後
  1353. for(i=digit; i>0; i--) //最下位桁から上位へ
  1354. {
  1355. buffer--; //ポインター1
  1356. *buffer = (data % 10) + '0'; //その桁数値を文字にして格納
  1357. data = data / 10; //桁-1
  1358. }
  1359. }
  1360. void Ltostring_decimal(int digit, unsigned long long data, char *buffer)
  1361. {
  1362. char i;
  1363. char not_space = 0;
  1364. char number;
  1365. buffer += digit; //文字列の最後
  1366. for(i=digit; i>0; i--) //最下位桁から上位へ
  1367. {
  1368. buffer--; //ポインター1
  1369. number = data % 10;
  1370. if(number != 0)
  1371. {
  1372. not_space = 1;
  1373. }
  1374. if(not_space)
  1375. {
  1376. *buffer = number + '0'; //その桁数値を文字にして格納
  1377. }else{
  1378. *buffer = SPACE;
  1379. }
  1380. data = data / 10; //桁-1
  1381. }
  1382. if(~not_space)
  1383. {
  1384. *buffer = number + '0';
  1385. }
  1386. }
  1387.  
  1388. void Keypad_read(void)
  1389. {
  1390. keypast[key0] = keystat[key0];
  1391. keypast1[key0] = keypast0[key0];
  1392. keypast0[key0] = keynow[key0];
  1393. keynow[key0] = ~p5;
  1394.  
  1395. /* 3msごとに実行したい処理とかを記述 */
  1396. if(p5 != 0xff){
  1397. cnt0 = 0;
  1398. Lcd_backlight(backlight_stat);
  1399. }
  1400.  
  1401. /*以下、通常のキーパッド読み込み業務*/
  1402. if((keypast1[key0]==keypast0[key0])&(keypast0[key0]==keynow[key0])){keystat[key0] = keynow[key0];}
  1403. switch(key0){
  1404. case 0:
  1405. key0++;
  1406. p6 = ~0x02;
  1407. break;
  1408. case 1:
  1409. key0++;
  1410. p6 = ~0x04;
  1411. break;
  1412. case 2:
  1413. key0++;
  1414. p6 = ~0x08;
  1415. break;
  1416. case 3:
  1417. key0++;
  1418. p6 = ~0x10;
  1419. break;
  1420. case 4:
  1421. key0++;
  1422. p6 = ~0x20;
  1423. break;
  1424. case 5:
  1425. key0++;
  1426. p6 = ~0x40;
  1427. break;
  1428. case 6:
  1429. key0++;
  1430. p6 = ~0x80;
  1431. break;
  1432. default:
  1433. key0 = 0;
  1434. p6 = ~0x01;
  1435. /* 以下、24[ms]ごとに実行したい処理を記述 */
  1436. if(p9_0){pwrhold++;}else{pwrhold = 0;} //電源ボタンのポーリング
  1437. if(pwrhold & ~Is_InfomationMode){
  1438. mode_infomation(); //
  1439. }
  1440. if(Check_key_bit(KEYID_BKLGT,keystat) && (!Check_key_bit(KEYID_BKLGT,keypast))) //バックライトボタンのポーリング
  1441. {
  1442. Lcd_backlight(~Lcd_backlight_stat());
  1443. }
  1444. if(cnt0 >= AUTOLIGHTOFF) /* バックライト・オフの時間が来たか確認 */
  1445. {
  1446. if(cnt0 > AUTOPOWEROFF) /* オートパワーオフの時間が来たら電源OFF */
  1447. {
  1448. Poweroff();
  1449. }
  1450. else
  1451. { /* オートパワーオフの時間が来てなかったらバックライトOFF */
  1452. if(Lcd_backlight_stat)
  1453. {
  1454. Lcd_backlight(0);
  1455. backlight_stat = 1;
  1456. }
  1457. }
  1458. }
  1459. /* 終わり */
  1460. break;
  1461. }
  1462. }
  1463. void Poweroff(void)
  1464. {
  1465. char MsgPwrOFF1[21] = " *** PWR OFF *** ";
  1466. char MsgPwrOFF2[21] = " ";
  1467. char MsgPwrOFF3[21] = "GOOD - BYE ";
  1468. char MsgPwrOFF4[21] = " Made By Kuriuzu";
  1469. Lcd_line_print(1,MsgPwrOFF1);
  1470. Lcd_line_print(2,MsgPwrOFF2);
  1471. Lcd_line_print(3,MsgPwrOFF3);
  1472. Lcd_line_print(4,MsgPwrOFF4);
  1473. printf("/*** POWER OFF !!! ***/\n");
  1474. Delay(500000);
  1475. Delay(500000);
  1476. Delay(500000);
  1477. Delay(500000);
  1478. Delay(500000);
  1479. Delay(500000);
  1480. Delay(500000);
  1481. Delay(500000);
  1482. Delay(500000);
  1483. Delay(500000);
  1484. Lcd_backlight(1); /*電解コンデンサの電荷放電のためバックライトON*/
  1485. asm(" fclr I "); /* 全体の割り込み禁止 */
  1486. while(p9_0);
  1487. Delay(250000);
  1488. p4 = 0x00;
  1489. Lcd_backlight(0); /*電解コンデンサの電荷放電のためバックライトON*/
  1490. while(1);
  1491. }
  1492.  
  1493. unsigned char Check_key_bit(unsigned char keyid,const char *buffer)
  1494. {
  1495. if(keyid == 0xff) return 0; //0xff
  1496. buffer += (0x07 & (keyid>>4));
  1497. return (*buffer >> (0x07 & keyid)) & 0x01;
  1498. }
  1499.  
  1500. void stackin(char in,char digits,char position,char *stack) //in : 入力 digits:桁数 position;カーソル位置 stack (入力がD、dならcursor位置の文字削除)
  1501. {
  1502. int i = 0;
  1503. int j = 0;
  1504. char point = 0;
  1505. char buffer[35];
  1506. buffer[digits + 1] = SPACE;
  1507. if(position >= digits)
  1508. {
  1509. printf("ERROR : stackin() POSITION Over Digits\n");
  1510. return;
  1511. }else{
  1512. for(i=0;i<=digits;i++)
  1513. {
  1514. buffer[j] = *(stack + i);
  1515. j++;
  1516. }
  1517. if(in == 0x7f){ //DELキー押された時の処理
  1518. //↓カーソル位置(position)より後ろの配列を一個前にシフト
  1519. for(i = position;i <digits;i++)
  1520. {
  1521. buffer[i] = buffer[i+1];
  1522. }
  1523. buffer[digits] = SPACE;
  1524.  
  1525. }else if(buffer[position] == SPACE)
  1526. {
  1527. buffer[position] = in;
  1528. }else{
  1529. //↓カーソル位置(position)より後ろの配列を一個後ろにシフト
  1530. for(i = digits;i >=position;i--)
  1531. {
  1532. buffer[i] = buffer[i-1];
  1533. }
  1534. buffer[position] = in;
  1535. }
  1536. for(i=0;i<=digits;i++)
  1537. {
  1538. *stack = buffer[i];
  1539. stack++;
  1540. }
  1541. }
  1542. }
  1543.  
  1544. void myftoa(char *string, double f, int figure)
  1545. {
  1546. double requiddigit; //その数を表すのに必要な桁数を格納
  1547. int Integralpart = 1;//整数部桁数
  1548. int Decimalpart = 17;//小数部桁数
  1549. unsigned long long Decimal;//小数部のデータ
  1550. if(f>0)
  1551. {
  1552. //sign = 1;
  1553. *string = ' ';
  1554. }
  1555. if(f==0){
  1556. //sign = 0;
  1557. *string = SPACE;
  1558. }
  1559. if(f<0)
  1560. {
  1561. //sign = -1;
  1562. f *= -1;
  1563. *string = '-';
  1564. }
  1565. if(f)
  1566. {
  1567. requiddigit = log10(f);
  1568. }else{
  1569. requiddigit = 0;
  1570. }
  1571. if(requiddigit >= 0)
  1572. {
  1573. requiddigit = log10(f+1);
  1574. Integralpart = (int)requiddigit;
  1575. ++Integralpart;
  1576. if(Integralpart > 19) Integralpart = 19;
  1577. Decimalpart = 18 - Integralpart;
  1578. }else if(requiddigit < 0)
  1579. {
  1580. }
  1581. Decimal = (unsigned long long) POW(10,Decimalpart)*(f - (unsigned long long)f);
  1582. string++;
  1583. Ltostring_int(Integralpart,(unsigned long long) f, string);
  1584. if(Integralpart >= 19) return;
  1585. string += Integralpart;
  1586. *string = '.';
  1587. if(Integralpart >= 18) return;
  1588. string++;
  1589. Ltostring_decimal(Decimalpart,Decimal,string);
  1590.  
  1591. }
  1592.  
  1593. double myatof(const char *string){
  1594. int i;
  1595. double rtn = 0;
  1596. int decimal = 0;
  1597. double temp = 0;
  1598. int Exponent = 1; //指数表記の時に使用 m e x = m E x = m×10^x
  1599. int Is_positive = 1; //正の数・・・1 負の数・・・-1
  1600.  
  1601. while(*string != '\0')
  1602. {
  1603.  
  1604. if((*string == 'e' )|( *string == 'E')){
  1605. //指数表記の時の処理 (例:1.234×105 = 1.234e5)
  1606.  
  1607. }
  1608. else if(*string == '.' ){
  1609. //小数点 ドットが来た時の処理
  1610. decimal++;
  1611.  
  1612. }else if(*string == '-' ){
  1613. //負の数 マイナスが来た時の処理
  1614. Is_positive = -1;
  1615.  
  1616. }else if((*string >= '0')&(*string <= '9')){
  1617. if(decimal == 0)
  1618. {
  1619. rtn *= 10;
  1620. temp = *string - 0x30;
  1621. rtn += temp;
  1622. }
  1623. else{
  1624. temp = *string - 0x30;
  1625. for(i=0;i<decimal;i++){ temp /= 10;}
  1626. rtn += temp;
  1627. decimal++;
  1628.  
  1629. }
  1630. }else{
  1631.  
  1632. }
  1633. string++;
  1634. }
  1635. rtn = rtn * Is_positive * Exponent;
  1636. return rtn;
  1637. }
  1638.  
  1639. unsigned long long POW(int a, int b)
  1640. {
  1641. int i;
  1642. long long ret = 1;
  1643. for( i=0; i<b; i++)ret *= a;
  1644. return ret;
  1645. }
  1646.  
  1647. void mode_infomation(void) /*動作状態表示とか(の予定)。PWRボタンで呼び出される*/
  1648. {
  1649. unsigned int count = 0;
  1650. Is_InfomationMode = 0;
  1651. if(cnt0 <= 1000) return;
  1652. Is_InfomationMode = 1;
  1653. //Delay_ms(100);
  1654. /* */
  1655. while(p9_0)
  1656. {
  1657. Delay(1000);
  1658. count++;
  1659. if(count >= 750) Poweroff();
  1660. }
  1661.  
  1662. Is_InfomationMode = 0;
  1663. return;
  1664. }
  1665.  
  1666. double DegtoRad(double degree)
  1667. {
  1668. return degree * PI / 180.0;
  1669. }
  1670. double RadtoDeg(double radian)
  1671. {
  1672. return radian * 180.0 / PI;
  1673. }
  1674. void error_handing(void)
  1675. {
  1676. char MsgContentError[41];
  1677. char MsgError1[] = " !!!!! ERROR !!!!!";
  1678. char MsgError2[21] = " Error No. : 000";
  1679. char MsgError4[] = " Please push AC";
  1680. Lcd_clear();
  1681. strcpy(MsgContentError,strerror(errno));
  1682. Ltostring_int(3,errno,&MsgError2[17]);
  1683. Lcd_line_print(1,MsgError1);
  1684. Lcd_line_print(2,MsgError2);
  1685. Lcd_line_print(3,MsgContentError);
  1686. Lcd_line_print(4,MsgError4);
  1687. errno = 0;
  1688. }
  1689.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty