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.  
  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. #define NAPIER (exp(1)) //ネイピア数
  37.  
  38. //#define ERRORMESSAGE
  39.  
  40. /* キー・ID定義 */
  41. #define KEYID_BKLGT 0x72
  42. #define KEYID_71 0x71
  43. #define KEYID_MODE 0x70
  44.  
  45. #define KEYID_RIGHT 0x34 //右 →
  46. #define KEYID_LEFT 0x31 //左 ←
  47. #define KEYID_UP 0x33 //上 ↑
  48. #define KEYID_DOWN 0x32 //下 ↓ 
  49. #define KEYID_SELECT 0x30 //中央(決定)
  50.  
  51. #define KEYID_NUM0 0x20
  52. #define KEYID_NUMPOINT 0x01
  53. #define KEYID_NUM1 0x22
  54. #define KEYID_NUM2 0x03
  55. #define KEYID_NUM3 0x02
  56. #define KEYID_NUM4 0x24
  57. #define KEYID_NUM5 0x05
  58. #define KEYID_NUM6 0x04
  59. #define KEYID_NUM7 0x26
  60. #define KEYID_NUM8 0x07
  61. #define KEYID_NUM9 0x06
  62. #define KEYID_NUMDEL 0x17
  63. #define KEYID_NUMAC 0x16
  64. #define KEYID_NUMEQUAL 0x10
  65. #define KEYID_NUMPLUS 0x13
  66. #define KEYID_NUMMINUS 0x12
  67. #define KEYID_NUMX 0x15
  68. #define KEYID_NUMSLASH 0x14
  69. #define KEYID_NUM11 0x11
  70. #define KEYID_NUM00 0x00
  71.  
  72. #define KEYID_INV 0x50 //正負
  73. #define KEYID_NEG 0x47 //逆数
  74. #define KEYID_SQUARE 0x51 //二乗
  75. #define KEYID_SQROOT 0x52 //平方根
  76. #define KEYID_POWER 0x53 //累乗(xのy乗)
  77.  
  78. #define KEYID_ANGLEUNIT 0x35 //角度の単位 度数法・弧度法 モード変更(ラーージーーーアーーーーーン!ディィィーーーーグリーーー!)
  79. #define ANGLEUNIT_DEG 0 //度数法なら0
  80. #define ANGLEUNIT_RAD 1 //弧度法なら1
  81. #define KEYID_SIN 0x40 //サイン
  82. #define KEYID_COS 0x37 //コサイン
  83. #define KEYID_TAN 0x36 //タンジェント
  84.  
  85. #define KEYID_PI 0x65 //円周率を挿入
  86. #define KEYID_NAPIER 0x66 //ネイピア数を挿入(未実装)
  87. #define KEYID_LOG10 0x57 //log10
  88. #define KEYID_LN 0x56 //loge(ネイピア数)
  89.  
  90.  
  91. #define MODEID_PWROFF 00 //電源OFF
  92. #define MODEID_IFX 01 //(InFiX mode).....中間記法
  93. #define MODEID_RPN 02 //(Reverse Polish Notation mode).....逆ポーランド記法
  94. #define MODEID_LOGICAL 03 //論理演算モード(2進数、8進数、10進数、16進数)
  95. #define MODEID_CHMOD 0xff //モードチェンジ用画面表示
  96. #define MODEID_DEFAULT 02 //初期状態
  97.  
  98. #define CHMOD_SCROLLY_0 Lcd_line_print(2,MsgChmod2);Lcd_line_print(3,MsgChmod3);Lcd_line_print(4,MsgChmod4);
  99. #define CHMOD_SCROLLY_1 Lcd_line_print(2,MsgChmod3);Lcd_line_print(3,MsgChmod4);Lcd_line_print(4,MsgChmod5);
  100. #define CHMOD_SCROLLY_2 Lcd_line_print(2,MsgChmod4);Lcd_line_print(3,MsgChmod5);Lcd_line_print(4,MsgChmod6);
  101. #define CHMOD_SCROLLY_3 Lcd_line_print(2,MsgChmod5);Lcd_line_print(3,MsgChmod6);Lcd_line_print(4,MsgChmod7);
  102. #define CHMOD_SCROLLY_4 Lcd_line_print(2,MsgChmod6);Lcd_line_print(3,MsgChmod7);Lcd_line_print(4,MsgChmod8);
  103. #define CHMOD_SCROLLY_MAX 4
  104. #define CHMOD_SCROLLY_MIN 0
  105. #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;}
  106.  
  107. /*======================================*/
  108. /* プロトタイプ宣言 */
  109. /*======================================*/
  110. void init( void );
  111. void timer( unsigned long timer_set );
  112. unsigned char dipsw_get( void );
  113.  
  114. unsigned char chmod(void);
  115. void mode_rpn(void);
  116. void mode_infix(void);
  117. void mode_logical(void);
  118.  
  119. void Lcd_init(void); //LCD初期化
  120. void Lcd_output(char *str); //
  121. void Lcd_clear(void);
  122. void Lcd_black(void);
  123. void Lcd_cmd(char cmd);
  124. void Lcd_data(char asci);
  125. void Lcd_out(char code, char flag);
  126. void Lcd_locate(char x, char y); //カーソルの位置指定
  127. void Lcd_cursol(char c_mode); //カーソルの表示を変更
  128. void Lcd_line_print(char y,char *str); //LCDに出力。行数指定有り
  129. void Lowspeed_Lcd_line_print(char y,unsigned long w,char *str); //LCDに出力。行数指定有り。タイプライターっぽく遅延しながら表示
  130. void Lcd_Itostring(char y, int digit, unsigned long data, char *buffer, char z);
  131. void Lcd_line_print_cgram(char y);
  132. void Lcd_backlight(char z);
  133. char Lcd_backlight_stat(void);
  134.  
  135. void Delay(long usec);
  136. void Delay_ms(unsigned long msec);
  137.  
  138. //void Itostring(int digit, unsigned long data, char *buffer);
  139. //void Ltostring(int digit, unsigned long long data, char *buffer);
  140. void Ltostring_int(int digit, unsigned long long data, char *buffer);
  141. void Ltostring_decimal(int digit, unsigned long long data, char *buffer);
  142.  
  143. void Keypad_read(void);
  144.  
  145. void Poweroff(void);
  146.  
  147. unsigned char Check_key_bit(unsigned char keyid,const char *buffer);
  148.  
  149. void stackin(char in,char digits,char position,char *stack);
  150.  
  151.  
  152. void myftoa(char *string, double f, int figure);
  153.  
  154. double myatof(const char *string);
  155.  
  156. unsigned long long POW(int a, int b);
  157.  
  158. void mode_infomation(void);
  159.  
  160. double DegtoRad(double degree);
  161. double RadtoDeg(double radian);
  162. double mysin(double Angle , char AngleUnit); //Angle:角度 AngleUnit:角度の単位(ANGLEUNIT_DEG,ANGLEUNIT_RAD)
  163. double mycos(double Angle , char AngleUnit); //Angle:角度 AngleUnit:角度の単位(ANGLEUNIT_DEG,ANGLEUNIT_RAD)
  164. double mytan(double Angle , char AngleUnit); //Angle:角度 AngleUnit:角度の単位(ANGLEUNIT_DEG,ANGLEUNIT_RAD)
  165. double myasin(double Angle , char AngleUnit); //Angle:角度 AngleUnit:角度の単位(ANGLEUNIT_DEG,ANGLEUNIT_RAD)
  166. double myacos(double Angle , char AngleUnit); //Angle:角度 AngleUnit:角度の単位(ANGLEUNIT_DEG,ANGLEUNIT_RAD)
  167. double myatan(double Angle , char AngleUnit); //Angle:角度 AngleUnit:角度の単位(ANGLEUNIT_DEG,ANGLEUNIT_RAD)
  168.  
  169. void error_handing(void);
  170. /*======================================*/
  171. /* グローバル変数の宣言 */
  172. /*======================================*/
  173. unsigned long cnt0; /* timer関数用 */
  174. unsigned char cnt1; /* main内で使用 */
  175. char cnt2;
  176. char cnt3;
  177. unsigned char pwrhold = 0;
  178. char backlight_stat = 0;
  179. char key0 = 0;
  180. char keystat[8] = {0,0,0,0,0,0,0,0};
  181. char keynow[8] = {0,0,0,0,0,0,0,0};
  182. char keypast[8] = {0,0,0,0,0,0,0,0};
  183. char keypast0[8] = {0,0,0,0,0,0,0,0};
  184. char keypast1[8] = {0,0,0,0,0,0,0,0};
  185. //char keypast2[8] = {0,0,0,0,0,0,0,0};
  186. //char keypast3[8] = {0,0,0,0,0,0,0,0};
  187. //char keypast4[8] = {0,0,0,0,0,0,0,0};
  188. char keypast5[8] = {0,0,0,0,0,0,0,0};
  189. char key0to1[8] = {0,0,0,0,0,0,0,0};
  190. char key1to0[8] = {0,0,0,0,0,0,0,0};
  191. unsigned long delayms = 0;
  192. char Is_InfomationMode = 0;
  193. char angleunitmode = ANGLEUNIT_DEG;
  194.  
  195. /************************************************************************/
  196. /* メインプログラム */
  197. /************************************************************************/
  198. void main( void )
  199. {
  200. unsigned char mode = MODEID_DEFAULT;
  201. /* マイコン機能の初期化 */
  202. init(); /* 初期化 */
  203. asm(" fset I "); /* 全体の割り込み許可 */
  204.  
  205. while(1){
  206. Lcd_init();
  207. Lcd_clear();
  208. Lcd_cursol(4);
  209. Lcd_clear();
  210. switch(mode){
  211. case MODEID_PWROFF: //電源OFF
  212. Poweroff();
  213. break;
  214.  
  215. case MODEID_IFX: //中間記法(普通の数式)モード
  216. mode_infix(); //中間記法(InFiX mode)
  217. mode = MODEID_CHMOD;
  218. break;
  219.  
  220. case MODEID_RPN: //RPN(逆ポーランド記法)モード
  221. mode_rpn();
  222. mode = MODEID_CHMOD;
  223. break;
  224. case MODEID_LOGICAL:
  225. mode_logical();
  226. mode = MODEID_CHMOD;
  227. break;
  228. case MODEID_CHMOD:
  229. default:
  230. mode = chmod(); //モード変更画面
  231. break;
  232. }
  233. }
  234. }//←←←←←←←メイン関数終了
  235.  
  236. unsigned char chmod(void){ //チェンジモード モードIDを返します
  237. char cursorX,cursorY,scrollY,i;
  238. char MsgChmod1[21] = " *** ChangeMODE 0-2 ";
  239. char MsgChmod2[21] = "0.PWR OFF ";
  240. char MsgChmod3[21] = "1.InFiX MODE ";
  241. char MsgChmod4[21] = "2.RPN MODE ";
  242. char MsgChmod5[21] = "3.Logical operation ";
  243. char MsgChmod6[21] = "4.Undefined ... ";
  244. char MsgChmod7[21] = "5.Undefined ... ";
  245. char MsgChmod8[21] = "6.Undefined ... ";
  246.  
  247. Lcd_line_print(1,MsgChmod1);
  248.  
  249. cursorX = 1;cursorY = 2;scrollY = 0;
  250.  
  251. CHMOD_SCROLLY_PRINTLCD
  252. Lcd_locate(cursorX,cursorY);
  253. printf("/*** Change MODE ***/\n");
  254.  
  255. while(1)
  256. {
  257. Delay_ms(1);
  258. for(i=0;i<=7;i++)
  259. {
  260. key0to1[i] = keystat[i] & ~keypast5[i];
  261. keypast5[i] = keystat[i];
  262. }
  263. if(Check_key_bit(KEYID_RIGHT,key0to1))
  264. {
  265. cursorX++;
  266. Lcd_locate(cursorX,cursorY);
  267. }
  268. if(Check_key_bit(KEYID_LEFT,key0to1))
  269. {
  270. cursorX--;
  271. Lcd_locate(cursorX,cursorY);
  272. }
  273. if(Check_key_bit(KEYID_DOWN,key0to1))
  274. {
  275. cursorY++;
  276. Lcd_locate(cursorX,cursorY);
  277. }
  278. if(Check_key_bit(KEYID_UP,key0to1))
  279. {
  280. cursorY--;
  281. Lcd_locate(cursorX,cursorY);
  282. }
  283. if(Check_key_bit(KEYID_SELECT,key0to1)){
  284. switch(cursorY + scrollY){
  285. case 2:
  286. return MODEID_PWROFF;
  287. break;
  288. case 3:
  289. return MODEID_IFX;
  290. break;
  291. case 4:
  292. return MODEID_RPN;
  293. break;
  294. case 5:
  295. return MODEID_LOGICAL;
  296. return 3;
  297. break;
  298. case 6:
  299. return 4;
  300. break;
  301. }
  302. }
  303. if(Check_key_bit(KEYID_NUM0,key0to1)){
  304. return MODEID_PWROFF;
  305. }
  306. if(Check_key_bit(KEYID_NUM1,key0to1)){
  307. return MODEID_IFX;
  308. }
  309. if(Check_key_bit(KEYID_NUM2,key0to1)){
  310. return MODEID_RPN;
  311. }
  312. if(Check_key_bit(KEYID_NUM3,key0to1)){
  313. return MODEID_LOGICAL;
  314. }
  315. if(cursorY > 4)
  316. {
  317. scrollY++;
  318. cursorY = 4;
  319. CHMOD_SCROLLY_PRINTLCD
  320. Lcd_locate(cursorX,cursorY);
  321. }
  322. if(cursorY < 2)
  323. {
  324. scrollY--;
  325. cursorY = 2;
  326. CHMOD_SCROLLY_PRINTLCD
  327. Lcd_locate(cursorX,cursorY);
  328. }
  329. if(cursorX > 20) {cursorX = 1;Lcd_locate(cursorX,cursorY);}
  330. if(cursorX < 1) {cursorX = 20;Lcd_locate(cursorX,cursorY);}
  331. }
  332. return MODEID_CHMOD;
  333. } //←←←←←←←chmod関数終了
  334.  
  335. void mode_infix(void){ //Infixモード(中間記法)
  336. printf("/*** Infix MODE ***/\n");
  337. return;
  338. } //←←←←←←←mode_infix関数終了
  339.  
  340. void mode_rpn(void){ //RPNモード(逆ポーランド記法)
  341. unsigned char i = 0;
  342. char demical = 0;
  343. char MsgPrint1[25] = "\0";
  344. char MsgPrint2[25] = "\0";
  345. char MsgPrint3[25] = "\0";
  346. char MsgPrint4[25] = "\0";
  347.  
  348. char KeyStack1[21];
  349. char KeyStack2[21];
  350. char KeyStack3[21];
  351. char KeyStack4[21];
  352. char KeyStack5[21];
  353. char KeyStack6[21];
  354.  
  355. double Stack[7] = {0,0,0,0,0,0,0};
  356.  
  357. char Is_nextStackShift = 0;
  358. char cursor = 0;
  359. char cursormode = 4;
  360. char RefreshLCD = 1;
  361. char cursorpast = cursor;
  362.  
  363. for(i=0;i<=20;i++)
  364. {
  365. KeyStack1[i] = SPACE;
  366. KeyStack2[i] = SPACE;
  367. KeyStack3[i] = SPACE;
  368. KeyStack4[i] = SPACE;
  369. KeyStack5[i] = SPACE;
  370. KeyStack6[i] = SPACE;
  371. }
  372. KeyStack1[20] = '\0';
  373. KeyStack2[20] = '\0';
  374. KeyStack3[20] = '\0';
  375. KeyStack4[20] = '\0';
  376. KeyStack5[20] = '\0';
  377. KeyStack6[20] = '\0';
  378.  
  379. printf("/*** RPN MODE ***/\n");
  380.  
  381. while(1)
  382. { //printf("While Head\n");
  383. Delay_ms(1);
  384. for(i=0;i<=7;i++)
  385. {
  386. key0to1[i] = keystat[i] & ~keypast5[i];
  387. keypast5[i] = keystat[i];
  388. }
  389. {
  390. if(cursor > 19) cursor = 0;
  391. if(Check_key_bit(KEYID_MODE,key0to1)) //モードキーが押された時の処理
  392. {
  393. while(Check_key_bit(KEYID_MODE,keystat)); //モードキーが離されるまで待つ
  394. return; //main()関数に戻る
  395. }
  396. if(Check_key_bit(0x74,key0to1)) //テスト用のキー。あとで変更する
  397. {
  398. cursormode++;
  399. if(cursormode >= 5) cursormode = 1;
  400. Lcd_cursol(cursormode);
  401. }
  402. if(Check_key_bit(0x73,key0to1)) //テスト用のキー。あとで変更する
  403. {
  404. cursormode++;
  405. if(cursormode >= 5) cursormode = 1;
  406. Lcd_cursol(cursormode);
  407. }
  408.  
  409. if(Check_key_bit(KEYID_LEFT,key0to1)) //方向キー ←
  410. {
  411. if(cursor) cursor--;
  412. while(Check_key_bit(KEYID_LEFT,keystat))
  413. {
  414. if(Check_key_bit(KEYID_NUM0,key0to1)) cursor = 0;
  415. if(Check_key_bit(KEYID_NUM1,key0to1)) cursor--;
  416. if(Check_key_bit(KEYID_NUM2,key0to1)) cursor -= 2;
  417. if(Check_key_bit(KEYID_NUM3,key0to1)) cursor -= 3;
  418. if(Check_key_bit(KEYID_NUM4,key0to1)) cursor -= 4;
  419. if(Check_key_bit(KEYID_NUM5,key0to1)) cursor -= 5;
  420. if(Check_key_bit(KEYID_NUM6,key0to1)) cursor -= 6;
  421. if(Check_key_bit(KEYID_NUM7,key0to1)) cursor -= 7;
  422. if(Check_key_bit(KEYID_NUM8,key0to1)) cursor -= 8;
  423. if(Check_key_bit(KEYID_NUM9,key0to1)) cursor -= 9;
  424. if(cursor > 19) cursor = 0;
  425. if(cursorpast != cursor) Lcd_locate(cursor+1,4);
  426. cursorpast = cursor;
  427. for(i=0;i<=7;i++)
  428. {
  429. key0to1[i] = keystat[i] & ~keypast5[i];
  430. keypast5[i] = keystat[i];
  431. }
  432. }
  433. }
  434.  
  435. if(Check_key_bit(KEYID_RIGHT,key0to1)) //方向キー →
  436. {
  437. if(cursor<=19) cursor++;
  438. while(Check_key_bit(KEYID_RIGHT,keystat))
  439. {
  440. if(Check_key_bit(KEYID_NUM0,key0to1)) cursor = 19;
  441. if(Check_key_bit(KEYID_NUM1,key0to1)) cursor++;
  442. if(Check_key_bit(KEYID_NUM2,key0to1)) cursor += 2;
  443. if(Check_key_bit(KEYID_NUM3,key0to1)) cursor += 3;
  444. if(Check_key_bit(KEYID_NUM4,key0to1)) cursor += 4;
  445. if(Check_key_bit(KEYID_NUM5,key0to1)) cursor += 5;
  446. if(Check_key_bit(KEYID_NUM6,key0to1)) cursor += 6;
  447. if(Check_key_bit(KEYID_NUM7,key0to1)) cursor += 7;
  448. if(Check_key_bit(KEYID_NUM8,key0to1)) cursor += 8;
  449. if(Check_key_bit(KEYID_NUM9,key0to1)) cursor += 9;
  450. if(cursor > 19) cursor = 0;
  451. if(cursorpast != cursor) Lcd_locate(cursor+1,4);
  452. cursorpast = cursor;
  453. for(i=0;i<=7;i++)
  454. {
  455. key0to1[i] = keystat[i] & ~keypast5[i];
  456. keypast5[i] = keystat[i];
  457. }
  458. }
  459. }
  460.  
  461. if(Check_key_bit(KEYID_NUMAC,key0to1)) //AC押した時
  462. {
  463. printf("Check key AC\n");
  464. Is_nextStackShift = 0;
  465. Lcd_clear();
  466. cursor = 0;
  467. for(i=0;i<=19;i++)
  468. {
  469. KeyStack1[i] = SPACE;
  470. KeyStack2[i] = SPACE;
  471. KeyStack3[i] = SPACE;
  472. KeyStack4[i] = SPACE;
  473. }
  474. for(i=0;i<=6;i++)
  475. {
  476. Stack[i] = 0;
  477. }
  478. RefreshLCD = 1;
  479. }
  480.  
  481. if(Check_key_bit(KEYID_NUMDEL,key0to1)) //DEL押した時
  482. {
  483. printf("Check key DEL\n");
  484. if(cursor) cursor--; //cursorが"0"以外なら実行
  485. if(cursor <= 19) stackin(0x7f,19,cursor,KeyStack1); //0x7f…アスキーコードで「DEL」をあらわす
  486. Is_nextStackShift = 0;
  487. RefreshLCD = 1;
  488. i = 0;
  489. while(Check_key_bit(KEYID_NUMDEL,keystat))
  490. {
  491. i++;
  492. Delay_ms(10);
  493. if(Check_key_bit(KEYID_NUMAC,keystat))
  494. {
  495. for(i=0;i<=19;i++)
  496. {
  497. KeyStack1[i] = SPACE;
  498. }
  499. cursor = 0;
  500. break;
  501. }
  502. if(i >= 150)
  503. {
  504. for(i=0;i<=19;i++)
  505. {
  506. KeyStack1[i] = SPACE;
  507. }
  508. cursor = 0;
  509. break;
  510. }
  511. }
  512. i = 0;
  513. }
  514.  
  515. if(Check_key_bit(KEYID_NUMPOINT,key0to1)) //小数点キー押した時
  516. { printf("Check key Dot\n");
  517. if(Is_nextStackShift)
  518. {
  519. Is_nextStackShift = 0;
  520. Stack[6] = Stack[5];
  521. Stack[5] = Stack[4];
  522. Stack[4] = Stack[3];
  523. Stack[3] = Stack[2];
  524. Stack[2] = Stack[1];
  525. cursor = 0;
  526. for(i=0;i<=19;i++)
  527. {
  528. KeyStack1[i] = SPACE;
  529. }
  530. }
  531. stackin('.',19,cursor,KeyStack1);
  532. ++cursor;
  533. RefreshLCD = 1;
  534. }
  535.  
  536. if(Check_key_bit(KEYID_NUM0,key0to1)) //数字キー 0
  537. {
  538. if(Is_nextStackShift)
  539. {
  540. Is_nextStackShift = 0;
  541. Stack[6] = Stack[5];
  542. Stack[5] = Stack[4];
  543. Stack[4] = Stack[3];
  544. Stack[3] = Stack[2];
  545. Stack[2] = Stack[1];
  546. cursor = 0;
  547. for(i=0;i<=19;i++)
  548. {
  549. KeyStack1[i] = SPACE;
  550. }
  551. }
  552. printf("Check key 0\n");
  553. stackin('0',19,cursor,KeyStack1);
  554. ++cursor;
  555. RefreshLCD = 1;
  556. }
  557.  
  558. if(Check_key_bit(KEYID_NUM1,key0to1)) //数字キー 1
  559. {
  560. if(Is_nextStackShift)
  561. {
  562. Is_nextStackShift = 0;
  563. Stack[6] = Stack[5];
  564. Stack[5] = Stack[4];
  565. Stack[4] = Stack[3];
  566. Stack[3] = Stack[2];
  567. Stack[2] = Stack[1];
  568. cursor = 0;
  569. for(i=0;i<=19;i++)
  570. {
  571. KeyStack1[i] = SPACE;
  572. }
  573. }
  574. printf("Check key 1\n");
  575. stackin('1',19,cursor,KeyStack1);
  576. ++cursor;
  577. RefreshLCD = 1;
  578. }
  579.  
  580. if(Check_key_bit(KEYID_NUM2,key0to1)) //数字キー 2
  581. {
  582. if(Is_nextStackShift)
  583. {
  584. Is_nextStackShift = 0;
  585. Stack[6] = Stack[5];
  586. Stack[5] = Stack[4];
  587. Stack[4] = Stack[3];
  588. Stack[3] = Stack[2];
  589. Stack[2] = Stack[1];
  590. cursor = 0;
  591. for(i=0;i<=19;i++)
  592. {
  593. KeyStack1[i] = SPACE;
  594. }
  595. }
  596. printf("Check key 2\n");
  597. stackin('2',19,cursor,KeyStack1);
  598. ++cursor;
  599. RefreshLCD = 1;
  600. }
  601.  
  602. if(Check_key_bit(KEYID_NUM3,key0to1)) //数字キー 3
  603. {
  604. if(Is_nextStackShift)
  605. {
  606. Is_nextStackShift = 0;
  607. Stack[6] = Stack[5];
  608. Stack[5] = Stack[4];
  609. Stack[4] = Stack[3];
  610. Stack[3] = Stack[2];
  611. Stack[2] = Stack[1];
  612. cursor = 0;
  613. for(i=0;i<=19;i++)
  614. {
  615. KeyStack1[i] = SPACE;
  616. }
  617. }
  618. printf("Check key 3\n");
  619. stackin('3',19,cursor,KeyStack1);
  620. ++cursor;
  621. RefreshLCD = 1;
  622. }
  623.  
  624. if(Check_key_bit(KEYID_NUM4,key0to1)) //数字キー 4
  625. {
  626. if(Is_nextStackShift)
  627. {
  628. Is_nextStackShift = 0;
  629. Stack[6] = Stack[5];
  630. Stack[5] = Stack[4];
  631. Stack[4] = Stack[3];
  632. Stack[3] = Stack[2];
  633. Stack[2] = Stack[1];
  634. cursor = 0;
  635. for(i=0;i<=19;i++)
  636. {
  637. KeyStack1[i] = SPACE;
  638. }
  639. }
  640. printf("Check key 4\n");
  641. stackin('4',19,cursor,KeyStack1);
  642. ++cursor;
  643. RefreshLCD = 1;
  644. }
  645.  
  646. if(Check_key_bit(KEYID_NUM5,key0to1)) //数字キー 5
  647. {
  648. if(Is_nextStackShift)
  649. {
  650. Is_nextStackShift = 0;
  651. Stack[6] = Stack[5];
  652. Stack[5] = Stack[4];
  653. Stack[4] = Stack[3];
  654. Stack[3] = Stack[2];
  655. Stack[2] = Stack[1];
  656. cursor = 0;
  657. for(i=0;i<=19;i++)
  658. {
  659. KeyStack1[i] = SPACE;
  660. }
  661. }
  662. printf("Check key 5\n");
  663. stackin('5',19,cursor,KeyStack1);
  664. ++cursor;
  665. RefreshLCD = 1;
  666. }
  667.  
  668. if(Check_key_bit(KEYID_NUM6,key0to1)) //数字キー 6
  669. {
  670. if(Is_nextStackShift)
  671. {
  672. Is_nextStackShift = 0;
  673. Stack[6] = Stack[5];
  674. Stack[5] = Stack[4];
  675. Stack[4] = Stack[3];
  676. Stack[3] = Stack[2];
  677. Stack[2] = Stack[1];
  678. cursor = 0;
  679. for(i=0;i<=19;i++)
  680. {
  681. KeyStack1[i] = SPACE;
  682. }
  683. }
  684. printf("Check key 6\n");
  685. stackin('6',19,cursor,KeyStack1);
  686. ++cursor;
  687. RefreshLCD = 1;
  688. }
  689.  
  690. if(Check_key_bit(KEYID_NUM7,key0to1)) //数字キー 7
  691. {
  692. if(Is_nextStackShift)
  693. {
  694. Is_nextStackShift = 0;
  695. Stack[6] = Stack[5];
  696. Stack[5] = Stack[4];
  697. Stack[4] = Stack[3];
  698. Stack[3] = Stack[2];
  699. Stack[2] = Stack[1];
  700. cursor = 0;
  701. for(i=0;i<=19;i++)
  702. {
  703. KeyStack1[i] = SPACE;
  704. }
  705. }
  706. printf("Check key 7\n");
  707. stackin('7',19,cursor,KeyStack1);
  708. ++cursor;
  709. RefreshLCD = 1;
  710. }
  711.  
  712. if(Check_key_bit(KEYID_NUM8,key0to1)) //数字キー 8
  713. {
  714. if(Is_nextStackShift)
  715. {
  716. Is_nextStackShift = 0;
  717. Stack[6] = Stack[5];
  718. Stack[5] = Stack[4];
  719. Stack[4] = Stack[3];
  720. Stack[3] = Stack[2];
  721. Stack[2] = Stack[1];
  722. cursor = 0;
  723. for(i=0;i<=19;i++)
  724. {
  725. KeyStack1[i] = SPACE;
  726. }
  727. }
  728. printf("Check key 8\n");
  729. stackin('8',19,cursor,KeyStack1);
  730. ++cursor;
  731. RefreshLCD = 1;
  732. }
  733.  
  734. if(Check_key_bit(KEYID_NUM9,key0to1)) //数字キー 9
  735. {
  736. if(Is_nextStackShift)
  737. {
  738. Is_nextStackShift = 0;
  739. Stack[6] = Stack[5];
  740. Stack[5] = Stack[4];
  741. Stack[4] = Stack[3];
  742. Stack[3] = Stack[2];
  743. Stack[2] = Stack[1];
  744. cursor = 0;
  745. //Lcd_clear();
  746. for(i=0;i<=19;i++)
  747. {
  748. KeyStack1[i] = SPACE;
  749. }
  750. }
  751. printf("Check key 9\n");
  752. stackin('9',19,cursor,KeyStack1);
  753. ++cursor;
  754. RefreshLCD = 1;
  755. }
  756. if(Check_key_bit(KEYID_NUMEQUAL,key0to1)) //イコール= キー
  757. {
  758. Stack[6] = Stack[5];
  759. Stack[5] = Stack[4];
  760. Stack[4] = Stack[3];
  761. Stack[3] = Stack[2];
  762. if(Is_nextStackShift)
  763. {
  764. Stack[2] = Stack[1];
  765. }else{
  766. Stack[2] = myatof(KeyStack1);
  767. }
  768. Stack[1] = 0;
  769. printf("Check key Equal\n");
  770. cursor = 0;
  771. for(i=0;i<=19;i++)
  772. {
  773. KeyStack1[i] = SPACE;
  774. }
  775. Is_nextStackShift = 0;
  776. RefreshLCD = 1;
  777. }
  778. if(Check_key_bit(KEYID_NUMPLUS,key0to1)) //プラス + 押した時
  779. {
  780. printf("Check key PLUS +\n");
  781. if(~Is_nextStackShift)
  782. {
  783. Stack[1] = myatof(KeyStack1);
  784. }
  785. Stack[1] += Stack[2];
  786. myftoa(KeyStack1,Stack[1],0);
  787. Stack[2] = Stack[3];
  788. Stack[3] = Stack[4];
  789. Stack[4] = Stack[5];
  790. Stack[5] = Stack[6];
  791. Is_nextStackShift = 1;
  792. Stack[6] = 0;
  793. RefreshLCD = 1;
  794. }
  795. if(Check_key_bit(KEYID_NUMMINUS,key0to1)) //マイナス - 押した時
  796. {
  797. printf("Check key MINUS\n");
  798. if(~Is_nextStackShift)
  799. {
  800. Stack[1] = myatof(KeyStack1);
  801. }
  802. Stack[1] = Stack[2] - Stack[1];
  803. myftoa(KeyStack1,Stack[1],0);
  804. Stack[2] = Stack[3];
  805. Stack[3] = Stack[4];
  806. Stack[4] = Stack[5];
  807. Stack[5] = Stack[6];
  808. Is_nextStackShift = 1;
  809. Stack[6] = 0;
  810. RefreshLCD = 1;
  811. }
  812. if(Check_key_bit(KEYID_NUMX,key0to1)) //かける× 押した時
  813. {
  814. printf("Check key X(KAKEZAN)\n");
  815. if(~Is_nextStackShift)
  816. {
  817. Stack[1] = myatof(KeyStack1);
  818. }
  819. Stack[1] *= Stack[2];
  820. myftoa(KeyStack1,Stack[1],0);
  821. Stack[2] = Stack[3];
  822. Stack[3] = Stack[4];
  823. Stack[4] = Stack[5];
  824. Stack[5] = Stack[6];
  825. Is_nextStackShift = 1;
  826. Stack[6] = 0;
  827. RefreshLCD = 1;
  828. }
  829. if(Check_key_bit(KEYID_NUMSLASH,key0to1)) //割る÷ 押した時
  830. {
  831. printf("Check key WARIZAN\n");
  832. if(~Is_nextStackShift)
  833. {
  834. Stack[1] = myatof(KeyStack1);
  835. }
  836. Stack[1] = Stack[2] / Stack[1];
  837. myftoa(KeyStack1,Stack[1],0);
  838. Stack[2] = Stack[3];
  839. Stack[3] = Stack[4];
  840. Stack[4] = Stack[5];
  841. Stack[5] = Stack[6];
  842. Is_nextStackShift = 1;
  843. Stack[6] = 0;
  844. RefreshLCD = 1;
  845. }
  846. if(Check_key_bit(KEYID_INV,key0to1)) // 逆数
  847. {
  848. if(~Is_nextStackShift)
  849. {
  850. Stack[1] = myatof(KeyStack1);
  851. }
  852. Stack[1] = 1 / Stack[1];
  853. myftoa(KeyStack1,Stack[1],0);
  854. RefreshLCD = 1;
  855. Is_nextStackShift = 1;
  856. }
  857. if(Check_key_bit(KEYID_NEG,key0to1)) // 正負変換
  858. {
  859. if(KeyStack1[0]==SPACE)
  860. {
  861. RefreshLCD = 1;
  862. KeyStack1[0] = '-';
  863. cursor = 1;
  864. }else
  865. {
  866. if(~Is_nextStackShift)
  867. {
  868. Stack[1] = myatof(KeyStack1);
  869. }
  870. Stack[1] = 0 - Stack[1];
  871. myftoa(KeyStack1,Stack[1],0);
  872. RefreshLCD = 1;
  873. Is_nextStackShift = 1;
  874. }
  875. }
  876. if(Check_key_bit(KEYID_SQUARE,key0to1)) // 二乗
  877. {
  878. if(~Is_nextStackShift)
  879. {
  880. Stack[1] = myatof(KeyStack1);
  881. }
  882. Stack[1] = Stack[1] * Stack[1];
  883. myftoa(KeyStack1,Stack[1],0);
  884. RefreshLCD = 1;
  885. Is_nextStackShift = 1;
  886. }
  887. if(Check_key_bit(KEYID_SQROOT,key0to1)) // 平方根
  888. {
  889. if(~Is_nextStackShift)
  890. {
  891. Stack[1] = myatof(KeyStack1);
  892. }
  893. Stack[1] = sqrt(Stack[1]);
  894. myftoa(KeyStack1,Stack[1],0);
  895. RefreshLCD = 1;
  896. Is_nextStackShift = 1;
  897. }
  898. if(Check_key_bit(KEYID_POWER,key0to1)) //累乗(xのy乗) Stack2^Stack1
  899. {
  900. if(~Is_nextStackShift)
  901. {
  902. Stack[1] = myatof(KeyStack1);
  903. }
  904. Stack[1] = pow(Stack[2],Stack[1]);
  905. myftoa(KeyStack1,Stack[1],0);
  906. Stack[2] = Stack[3];
  907. Stack[3] = Stack[4];
  908. Stack[4] = Stack[5];
  909. Stack[5] = Stack[6];
  910. Is_nextStackShift = 1;
  911. Stack[6] = 0;
  912. RefreshLCD = 1;
  913. }
  914. if(Check_key_bit(KEYID_LOG10,key0to1)) //常用対数 log10
  915. {
  916. if(~Is_nextStackShift)
  917. {
  918. Stack[1] = myatof(KeyStack1);
  919. }
  920. Stack[1] = log10(Stack[1]);
  921. myftoa(KeyStack1,Stack[1],0);
  922. RefreshLCD = 1;
  923. Is_nextStackShift = 1;
  924. }
  925. if(Check_key_bit(KEYID_LN,key0to1)) //自然対数 log e (ネイピア数
  926. {
  927. if(~Is_nextStackShift)
  928. {
  929. Stack[1] = myatof(KeyStack1);
  930. }
  931. Stack[1] = log(Stack[1]);
  932. myftoa(KeyStack1,Stack[1],0);
  933. RefreshLCD = 1;
  934. Is_nextStackShift = 1;
  935. }
  936. if(Check_key_bit(KEYID_SIN,key0to1)) //正弦サイン
  937. {
  938. if(~Is_nextStackShift)
  939. {
  940. Stack[1] = myatof(KeyStack1);
  941. }
  942. Stack[1] = mysin(Stack[1],angleunitmode);
  943. myftoa(KeyStack1,Stack[1],0);
  944. RefreshLCD = 1;
  945. Is_nextStackShift = 1;
  946. }
  947. if(Check_key_bit(KEYID_COS,key0to1)) //コサイン
  948. {
  949. if(~Is_nextStackShift)
  950. {
  951. Stack[1] = myatof(KeyStack1);
  952. }
  953. Stack[1] = mycos(Stack[1],angleunitmode);
  954. myftoa(KeyStack1,Stack[1],0);
  955. RefreshLCD = 1;
  956. Is_nextStackShift = 1;
  957. }
  958. if(Check_key_bit(KEYID_TAN,key0to1)) //タンジェント
  959. {
  960. if(~Is_nextStackShift)
  961. {
  962. Stack[1] = myatof(KeyStack1);
  963. }
  964. Stack[1] = mytan(Stack[1],angleunitmode);
  965. myftoa(KeyStack1,Stack[1],0);
  966. RefreshLCD = 1;
  967. Is_nextStackShift = 1;
  968. }
  969. if(Check_key_bit(KEYID_PI,key0to1)) //円周率キー
  970. {
  971. Stack[1] = PI;
  972. myftoa(KeyStack1,Stack[1],0);
  973. RefreshLCD = 1;
  974. Is_nextStackShift = 1;
  975. }
  976. if(Check_key_bit(KEYID_NAPIER,key0to1)) //ネイピア数キー
  977. {
  978. Stack[1] = NAPIER;
  979. myftoa(KeyStack1,Stack[1],0);
  980. RefreshLCD = 1;
  981. Is_nextStackShift = 1;
  982. }
  983. }
  984. //printf("cursor: %d\n",cursor);
  985. if(RefreshLCD == 1)
  986. {
  987. myftoa(KeyStack2,Stack[2],0);
  988. myftoa(KeyStack3,Stack[3],0);
  989. myftoa(KeyStack4,Stack[4],0);
  990. Lcd_cursol(1);
  991. Lcd_line_print(1,KeyStack4);
  992. Lcd_line_print(2,KeyStack3);
  993. Lcd_line_print(3,KeyStack2);
  994. Lcd_line_print(4,KeyStack1);
  995. RefreshLCD = 0;
  996. Lcd_locate(cursor+1,4);
  997. Lcd_cursol(cursormode);/*
  998.   printf("\nStack1 : %g\n",Stack[1]);
  999.   printf("\nStack2 : %g\n",Stack[2]);
  1000.   printf("\nStack3 : %g\n",Stack[3]);
  1001.   printf("\nStack4 : %g\n",Stack[4]);
  1002.   printf("\nStack5 : %g\n",Stack[5]);
  1003.   printf("\nStack6 : %g\n",Stack[6]);*/
  1004. printf("KeyStack1 : %s\n",KeyStack1);
  1005. printf("KeyStack2 : %s\n",KeyStack2);
  1006. printf("KeyStack3 : %s\n",KeyStack3);
  1007. printf("KeyStack4 : %s\n",KeyStack4);
  1008. }
  1009. if(errno) //エラー時の処理
  1010. {
  1011. error_handing();
  1012. RefreshLCD = 0;
  1013. }
  1014. if(cursorpast != cursor) Lcd_locate(cursor+1,4);
  1015. cursorpast = cursor;
  1016. }
  1017.  
  1018. } //←←←←←←←mode_rpn関数終了
  1019.  
  1020. void mode_logical(void)
  1021. {
  1022. } //←←←←←←←mode_logical関数終了
  1023.  
  1024. /************************************************************************/
  1025. /* R8C/38A スペシャルファンクションレジスタ(SFR)の初期化 */
  1026. /************************************************************************/
  1027. void init( void )
  1028. {
  1029. int i;
  1030.  
  1031. /* クロックをXINクロック(20MHz)に変更 */
  1032. prc0 = 1; /* プロテクト解除 */
  1033. cm13 = 1; /* P4_6,P4_7をXIN-XOUT端子にする*/
  1034. cm05 = 0; /* XINクロック発振 */
  1035. for(i=0; i<50; i++ ); /* 安定するまで少し待つ(約10ms) */
  1036. ocd2 = 0; /* システムクロックをXINにする */
  1037. prc0 = 0; /* プロテクトON */
  1038.  
  1039. /* ポートの入出力設定 0:入力 1:出力 76543210 */
  1040. prc2 = 1; /* PD0のプロテクト解除 */
  1041. pd0 = 0x00; /* */
  1042. pd1 = 0xd0; /* 5:RXD0 4:TXD0 3-0:DIP SW 1101 0000 */
  1043. p2 = 0xc0;
  1044. pd2 = 0xfe; /* */
  1045. pd3 = 0xff; /*LCD 0-DB4~3-DB7 4-Enable 5-RS 6-BkLGT*/
  1046. p3 = 0x00;
  1047. p4 = 0x00; /* P4_5のLED:初期は消灯 */
  1048. pd4 = 0xb8; /* 7:XOUT 6:XIN 5:LED 2:VREF */
  1049. pd5 = 0x00; /* キーマトリックス・入力 プルアップON */
  1050. pu12 = 1;pu13 = 1;
  1051. pd6 = 0xff; /* キーマトリックス・出力 */
  1052. drr14 = 1; drr15 = 1;
  1053. pd7 = 0x00; /* 電池電圧検出用とか */
  1054.  
  1055. pd8 = 0xff; /* */
  1056. pd9 = 0x00; /* 0-5 IN */
  1057. //p9 = 0x38;
  1058. pur0 = 0x04; /* P1_3~P1_0のプルアップON */
  1059.  
  1060. vlt22 = 1; /* P9_0~P9_5 入力スレッショルド→0.35×VCCにセット */
  1061. vlt23 = 0; /* */
  1062.  
  1063.  
  1064. /* タイマRBの設定 */
  1065. /* 割り込み周期 = 1 / 20[MHz] * (TRBPRE+1) * (TRBPR+1)
  1066.   = 1 / (20*10^6) * 200 * 100
  1067.   = 0.001[s] = 1[ms]
  1068.   */
  1069. trbmr = 0x00; /* 動作モード、分周比設定 */
  1070. trbpre = 200-1; /* プリスケーラレジスタ */
  1071. trbpr = 100-1; /* プライマリレジスタ */
  1072. trbic = 0x06; /* 割り込み優先レベル設定 */
  1073. trbcr = 0x01; /* カウント開始 */
  1074.  
  1075.  
  1076. /* タイマRD リセット同期PWMモードの設定*/
  1077. /* PWM周期 = 1 / 20[MHz] * カウントソース * (TRDGRA0+1)
  1078.   = 1 / (20*10^6) * 8 * 40000
  1079.   = 0.016[s] = 16[ms]
  1080.   */
  1081. trdpsr0 = 0x08; /* TRDIOB0,C0,D0端子設定 */
  1082. trdpsr1 = 0x05; /* TRDIOA1,B1,C1,D1端子設定 */
  1083. trdmr = 0xf0; /* バッファレジスタ設定 */
  1084. trdfcr = 0x01; /* リセット同期PWMモードに設定 */
  1085. trdcr0 = 0x23; /* ソースカウントの選択:f8 */
  1086. trdgra0 = trdgrc0 ; /* 周期 */
  1087. trdgrb0 = trdgrd0 = 0; /* P2_2端子のON幅設定 */
  1088. trdgra1 = trdgrc1 = 0; /* P2_4端子のON幅設定 */
  1089. trdgrb1 = trdgrd1 ; /* P2_5端子のON幅設定 */
  1090. trdoer1 = 0xcd; /* 出力端子の選択 */
  1091. trdstr = 0x0d; /* TRD0カウント開始 */
  1092.  
  1093. //Delay_ms(2);
  1094. p4 = 0x20; /* P4_5のLED:初期は点灯 */
  1095.  
  1096. init_uart0_printf( SPEED_9600 );
  1097. "\n/* START Function Calcrator Alpha Ver. */\n"
  1098. "/* Made by kuriuzu */ \n"
  1099. "/* This is UART Debug Console */\n"
  1100. );
  1101. }
  1102.  
  1103. /************************************************************************/
  1104. /* タイマRB 割り込み処理 */
  1105. /************************************************************************/
  1106. #pragma interrupt intTRB(vect=24)
  1107. void intTRB( void )
  1108. {
  1109. delayms++;
  1110. cnt0++;
  1111. cnt1++;
  1112. cnt2++;
  1113. if(cnt2 == KEY_INTERVAL){
  1114. cnt2 = 0;
  1115. Keypad_read();
  1116. }
  1117. }
  1118.  
  1119. /************************************************************************/
  1120. /* タイマ本体 */
  1121. /* 引数 タイマ値 1=1ms */
  1122. /************************************************************************/
  1123. void timer( unsigned long timer_set )
  1124. {
  1125. delayms = 0;
  1126. while( delayms < timer_set );
  1127. }
  1128.  
  1129. /************************************************************************/
  1130. /* ディップスイッチ値読み込み */
  1131. /* 戻り値 スイッチ値 0~15 */
  1132. /************************************************************************/
  1133. unsigned char dipsw_get( void )
  1134. {
  1135. unsigned char sw;
  1136.  
  1137. sw = p1 & 0x0f; /* P1_3~P1_0読み込み */
  1138.  
  1139. return sw;
  1140. }
  1141.  
  1142.  
  1143.  
  1144. //----- ディレイ関数 msec単位 -----
  1145.  
  1146. void Delay_ms(unsigned long msec) //!注意!最大-1[ms]の誤差が出ます。!注意!
  1147. {
  1148. delayms = 0;
  1149. while(delayms < msec)
  1150. {
  1151. _asm(
  1152. "fset I;"
  1153. "wait;"
  1154. "nop;"
  1155. "nop;"
  1156. "nop;"
  1157. "nop;"
  1158. );
  1159. }
  1160. }
  1161.  
  1162. //----- ディレイ関数 1usec単位 -----
  1163.  
  1164. void Delay(long usec)
  1165. {
  1166. usec = (usec * 20000) / 45000;
  1167. while(usec--){}
  1168. }
  1169.  
  1170. //----------------------------------------------------
  1171. // 液晶表示器制御ライブラリ
  1172. //----------------------------------------------------
  1173.  
  1174. //----- LCD初期化関数 -----
  1175.  
  1176. void Lcd_init()
  1177. {
  1178. Delay(20000); //20msec wait
  1179. Lcd_out(0x03, 1); //8bit mode set
  1180. Delay(5000); //5msec wait
  1181. Lcd_out(0x03, 1); //8bit mode set
  1182. Delay(1000);
  1183. Lcd_out(0x03, 1); //8bit mode set
  1184. Delay(1000);
  1185. Lcd_out(0x02, 1); //4bit mode set
  1186. Delay(1000);
  1187. Lcd_cmd(0x2C); //DL=0 4bit mode
  1188. Lcd_cmd(0x08); //display off C=D=B=0
  1189. Lcd_cmd(0x0E); //display on D=B=1 C=0
  1190. Lcd_cmd(0x06); //entry I/D=1 S=0
  1191. Lcd_cmd(0x01); //all clear
  1192. }
  1193.  
  1194. //----- データ出力サブ関数 -----
  1195.  
  1196. void Lcd_out(char code, char flag)
  1197. {
  1198. LCD_DB = (LCD_DB & 0xf0) | (code & 0x0f);
  1199. //出力データ下位4ビットを出力
  1200. if (flag == 0) //表示データかコマンドか
  1201. LCD_RS = 1; //表示データの場合RS=1
  1202. else
  1203. LCD_RS = 0; //コマンドデータの場合RS=0
  1204. asm("NOP"); //NOP スキュー確保
  1205. LCD_STB = 1; //STB ON
  1206. asm("NOP");
  1207. asm("NOP"); //パルス幅確保230nsec以上
  1208. asm("NOP");
  1209. asm("NOP");
  1210. LCD_STB = 0; //STB OFF
  1211. }
  1212.  
  1213. //----- 1文字表示関数 -----
  1214.  
  1215. void Lcd_data(char asci)
  1216. {
  1217. Lcd_out(asci>>4, 0); //上位4ビット出力
  1218. Lcd_out(asci, 0); //下位4ビット出力
  1219. Delay(50); //50μsec待ち
  1220. }
  1221.  
  1222. //----- コマンド出力関数 -----
  1223.  
  1224. void Lcd_cmd(char cmd)
  1225. {
  1226. Lcd_out(cmd>>4, 1); //上位4ビット出力
  1227. Lcd_out(cmd, 1); //下位4ビット出力
  1228. if((cmd == 0x01) || (cmd == 0x02))
  1229. Delay(2000); //2msec待ち
  1230. else
  1231. Delay(50); //50usec待ち
  1232. }
  1233.  
  1234. //----- 全消去関数 -----
  1235.  
  1236. void Lcd_clear()
  1237. {
  1238. Lcd_cmd(0x01); //初期化コマンド出力
  1239. }
  1240.  
  1241. //----- 文字列出力関数 -----
  1242.  
  1243. void Lcd_output(char *str)
  1244. {
  1245. while(*str != 0x00) //文字列の終わり判定
  1246. {
  1247. Lcd_data(*str); //文字列1文字出力
  1248. str++; //ポインタ+1
  1249. }
  1250. }
  1251.  
  1252. //----- カーソル位置に移動 -----
  1253.  
  1254. void Lcd_locate(char x, char y)
  1255. {
  1256. char i;
  1257. if (y == 1){
  1258. Lcd_cmd(0x02);
  1259. x--;
  1260. while ( x ){
  1261. Lcd_cmd(0x14);
  1262. x--;
  1263. }
  1264. }else if (y == 2){
  1265. Lcd_cmd(0x02);
  1266. x--;
  1267. for (i=1;i<=40;i++){
  1268. Lcd_cmd(0x14);
  1269. }
  1270. while ( x ){
  1271. Lcd_cmd(0x14);
  1272. x--;
  1273. }
  1274. }else if (y == 3){
  1275. Lcd_cmd(0x02);
  1276. x--;
  1277. for (i=1;i<=20;i++){
  1278. Lcd_cmd(0x14);
  1279. }
  1280. while ( x ){
  1281. Lcd_cmd(0x14);
  1282. x--;
  1283. }
  1284. }else if (y == 4){
  1285. Lcd_cmd(0x02);
  1286. x--;
  1287. for (i=1;i<=60;i++){
  1288. Lcd_cmd(0x14);
  1289. }
  1290. while ( x ){
  1291. Lcd_cmd(0x14);
  1292. x--;
  1293. }
  1294. }
  1295. }
  1296.  
  1297. //----- カーソル表示制御 -----
  1298.  
  1299. void Lcd_cursol(char c_mode)
  1300. {
  1301. switch ( c_mode){
  1302. case 1: // 1.カーソルOFF、ブリンクOFF
  1303. Lcd_cmd(0x0c);
  1304. break;
  1305. case 2: // 2.カーソルOFF、ブリンクON
  1306. Lcd_cmd(0x0d);
  1307. break;
  1308. case 3: // 3.カーソルON、ブリンクOFF
  1309. Lcd_cmd(0x0e);
  1310. break;
  1311. case 4:
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty