// button_task.c // // --- public domain, no warranty. #include #include #include "lcd_task.h" #define PADDR ((_UB *)0xffffd1) #define PADR ((_UB *)0xffffd3) LOCAL ID ButtonTsk; #define MAX_COUNTER 2500 #define MIN_COUNTER 25 EXPORT W Delay = 100; EXPORT W Counter = 500; /* ボタン処理タスク */ LOCAL void button_task(void) { INT lcd_update; W prev_delay; UB sts; *PADDR = 0x00; // all input (for MCU mode 1/2/5/7) lcd_update = 1; while (1) { tk_dly_tsk(10); sts = (*PADR & 0x0f) ^ 0x0f; // PA0-PA3, '1':off prev_delay = Delay; /* 押されたボタンに応じた処理 */ switch (sts) { case 1: if (Counter < MAX_COUNTER) { Counter++; Delay = (Counter / 5) / 5 * 5; } break; case 2: if (Counter > MIN_COUNTER) { Counter--; Delay = (Counter / 5) / 5 * 5; } break; default: break; } lcd_update |= (prev_delay != Delay); /* 不必要な画面描画を抑止 */ if (lcd_update) { LCDBuf[24] = '0' + (Delay / 100) % 10; LCDBuf[25] = '0' + (Delay / 10) % 10; LCDBuf[26] = '0' + (Delay / 1) % 10; LCDBuf[27] = 'm'; LCDBuf[28] = 's'; LCDBuf[29] = 'e'; LCDBuf[30] = 'c'; tk_wup_tsk(LCDTsk); lcd_update = 0; } } tk_exd_tsk(); } /* ボタン処理タスク・起動部分 */ EXPORT ER button_task_init(W start) { W er; T_CTSK ctsk; /* 終了処理 */ if (start < 0) { er = E_OK; goto fin2; } /* 処理タスク作成 */ ctsk.exinf = NULL; ctsk.tskatr = TA_HLNG; ctsk.task = button_task; ctsk.itskpri = 28; ctsk.stksz = 512; er = tk_cre_tsk(&ctsk); if (er < E_OK) { tm_putstring((UB *)"button_task_init: tk_cre_tsk\n"); goto fin0; } ButtonTsk = er; /* 処理タスク起動 */ er = tk_sta_tsk(ButtonTsk, 0); if (er < E_OK) { tm_putstring((UB *)"button_task_init: tk_sta_tsk\n"); goto fin1; } goto fin0; fin2: tk_ter_tsk(ButtonTsk); fin1: tk_del_tsk(ButtonTsk); fin0: return er; }