firmware of NBCTRLV1 / AYC01

Dependencies:   SDFileSystemEx mbed

Committer:
bkc_mbed
Date:
Mon Apr 18 00:36:37 2016 +0000
Revision:
1:29f0e76a9999
Parent:
0:722cc5360dc3
v1.30

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bkc_mbed 0:722cc5360dc3 1 //
bkc_mbed 0:722cc5360dc3 2 // NLGPLAY : NLG file player for mbed
bkc_mbed 0:722cc5360dc3 3 //
bkc_mbed 0:722cc5360dc3 4 // example to write :
bkc_mbed 0:722cc5360dc3 5 // ./lpc21isp -bin file.bin /dev/cu.usbserial-??? 115200 12000
bkc_mbed 0:722cc5360dc3 6 //
bkc_mbed 0:722cc5360dc3 7 // 20151008: updated.
bkc_mbed 1:29f0e76a9999 8 // 20160418: imporved file/dir selector
bkc_mbed 1:29f0e76a9999 9 // improved init sequence
bkc_mbed 0:722cc5360dc3 10 //
bkc_mbed 0:722cc5360dc3 11
bkc_mbed 0:722cc5360dc3 12 #include <stdio.h>
bkc_mbed 0:722cc5360dc3 13
bkc_mbed 0:722cc5360dc3 14 #include "mbed.h"
bkc_mbed 0:722cc5360dc3 15 #include "SDFileSystem.h"
bkc_mbed 0:722cc5360dc3 16 #include "lcd.h"
bkc_mbed 0:722cc5360dc3 17
bkc_mbed 0:722cc5360dc3 18 #include "nlg_mini.h"
bkc_mbed 0:722cc5360dc3 19
bkc_mbed 0:722cc5360dc3 20 // SPIモード
bkc_mbed 0:722cc5360dc3 21 // #define USE_SPI
bkc_mbed 0:722cc5360dc3 22
bkc_mbed 0:722cc5360dc3 23 #ifdef TARGET_LPC1114
bkc_mbed 0:722cc5360dc3 24 // 高速I/Oモード(LPC1114専用)
bkc_mbed 0:722cc5360dc3 25 #define USE_FASTIO
bkc_mbed 0:722cc5360dc3 26 #endif
bkc_mbed 0:722cc5360dc3 27
bkc_mbed 0:722cc5360dc3 28 // ピンアサイン切り替え
bkc_mbed 0:722cc5360dc3 29 #include "pindef.h"
bkc_mbed 0:722cc5360dc3 30
bkc_mbed 0:722cc5360dc3 31
bkc_mbed 0:722cc5360dc3 32 #define PRG_NAME "NLGPLAY"
bkc_mbed 1:29f0e76a9999 33 #define PRG_VER_BASE "V1.30"
bkc_mbed 0:722cc5360dc3 34
bkc_mbed 0:722cc5360dc3 35 #ifndef USE_SPI
bkc_mbed 0:722cc5360dc3 36 #define PRG_VER PRG_VER_BASE
bkc_mbed 0:722cc5360dc3 37 #else
bkc_mbed 0:722cc5360dc3 38 #define PRG_VER PRG_VER_BASE "S"
bkc_mbed 0:722cc5360dc3 39 #endif
bkc_mbed 0:722cc5360dc3 40
bkc_mbed 0:722cc5360dc3 41
bkc_mbed 0:722cc5360dc3 42 //#pragma O3
bkc_mbed 0:722cc5360dc3 43 //#pragma Otime
bkc_mbed 0:722cc5360dc3 44
bkc_mbed 0:722cc5360dc3 45
bkc_mbed 0:722cc5360dc3 46
bkc_mbed 0:722cc5360dc3 47 // (pinname, mode)
bkc_mbed 0:722cc5360dc3 48 DigitalIn sw_play(DP_PLAY, PullUp);
bkc_mbed 0:722cc5360dc3 49 DigitalIn sw_next(DP_NEXT, PullUp);
bkc_mbed 0:722cc5360dc3 50 DigitalIn sw_prev(DP_PREV, PullUp);
bkc_mbed 0:722cc5360dc3 51
bkc_mbed 0:722cc5360dc3 52 #define MAX_PATH 128
bkc_mbed 0:722cc5360dc3 53 #define MAX_FILENAME 64
bkc_mbed 0:722cc5360dc3 54 #define MAX_DIR 64
bkc_mbed 0:722cc5360dc3 55
bkc_mbed 0:722cc5360dc3 56 // Global Variable
bkc_mbed 0:722cc5360dc3 57 struct
bkc_mbed 0:722cc5360dc3 58 {
bkc_mbed 0:722cc5360dc3 59 bool stop;
bkc_mbed 0:722cc5360dc3 60 bool prev;
bkc_mbed 0:722cc5360dc3 61 bool one_mode;
bkc_mbed 0:722cc5360dc3 62
bkc_mbed 0:722cc5360dc3 63 int idx;
bkc_mbed 0:722cc5360dc3 64 int max_entries;
bkc_mbed 0:722cc5360dc3 65
bkc_mbed 0:722cc5360dc3 66 char playlist[MAX_FILENAME];
bkc_mbed 0:722cc5360dc3 67 char file[MAX_FILENAME];
bkc_mbed 0:722cc5360dc3 68 char cwd[MAX_DIR];
bkc_mbed 0:722cc5360dc3 69
bkc_mbed 0:722cc5360dc3 70 NLG_CTX nlg;
bkc_mbed 0:722cc5360dc3 71 int total_sec;
bkc_mbed 0:722cc5360dc3 72 } g;
bkc_mbed 0:722cc5360dc3 73
bkc_mbed 0:722cc5360dc3 74 // キーコード
bkc_mbed 0:722cc5360dc3 75 #define SW_PLAY 1
bkc_mbed 0:722cc5360dc3 76 #define SW_NEXT 2
bkc_mbed 0:722cc5360dc3 77 #define SW_PREV 4
bkc_mbed 0:722cc5360dc3 78
bkc_mbed 0:722cc5360dc3 79
bkc_mbed 0:722cc5360dc3 80 // ボタンが離されるのを待つ
bkc_mbed 0:722cc5360dc3 81 void wait_key_up(void)
bkc_mbed 0:722cc5360dc3 82 {
bkc_mbed 0:722cc5360dc3 83 while(!sw_next || !sw_play || !sw_prev);
bkc_mbed 0:722cc5360dc3 84 }
bkc_mbed 0:722cc5360dc3 85
bkc_mbed 0:722cc5360dc3 86 // ボタンの入力を待つ
bkc_mbed 0:722cc5360dc3 87 void wait_key_down(void)
bkc_mbed 0:722cc5360dc3 88 {
bkc_mbed 0:722cc5360dc3 89 while(sw_next && sw_play && sw_prev);
bkc_mbed 0:722cc5360dc3 90 }
bkc_mbed 0:722cc5360dc3 91
bkc_mbed 0:722cc5360dc3 92 // キー入力
bkc_mbed 0:722cc5360dc3 93 int get_key(void)
bkc_mbed 0:722cc5360dc3 94 {
bkc_mbed 0:722cc5360dc3 95 int key = 0;
bkc_mbed 0:722cc5360dc3 96
bkc_mbed 0:722cc5360dc3 97 if (!sw_next)
bkc_mbed 0:722cc5360dc3 98 key |= SW_NEXT;
bkc_mbed 0:722cc5360dc3 99 if (!sw_play)
bkc_mbed 0:722cc5360dc3 100 key |= SW_PLAY;
bkc_mbed 0:722cc5360dc3 101 if (!sw_prev)
bkc_mbed 0:722cc5360dc3 102 key |= SW_PREV;
bkc_mbed 0:722cc5360dc3 103 return key;
bkc_mbed 0:722cc5360dc3 104 }
bkc_mbed 0:722cc5360dc3 105
bkc_mbed 0:722cc5360dc3 106 // キー開放待ち
bkc_mbed 0:722cc5360dc3 107 void wait_relkey(void)
bkc_mbed 0:722cc5360dc3 108 {
bkc_mbed 0:722cc5360dc3 109 wait_key_up();
bkc_mbed 0:722cc5360dc3 110 wait(0.1);
bkc_mbed 0:722cc5360dc3 111 }
bkc_mbed 0:722cc5360dc3 112
bkc_mbed 0:722cc5360dc3 113 // キー待ち
bkc_mbed 0:722cc5360dc3 114 int wait_anykey(void)
bkc_mbed 0:722cc5360dc3 115 {
bkc_mbed 0:722cc5360dc3 116 wait_key_down();
bkc_mbed 0:722cc5360dc3 117 int key = get_key();
bkc_mbed 0:722cc5360dc3 118
bkc_mbed 0:722cc5360dc3 119 wait(0.1);
bkc_mbed 0:722cc5360dc3 120 wait_relkey();
bkc_mbed 0:722cc5360dc3 121
bkc_mbed 0:722cc5360dc3 122 return key;
bkc_mbed 0:722cc5360dc3 123 }
bkc_mbed 0:722cc5360dc3 124
bkc_mbed 0:722cc5360dc3 125 // LED
bkc_mbed 0:722cc5360dc3 126 DigitalOut led1(LED1, 0);
bkc_mbed 0:722cc5360dc3 127 DigitalOut led2(LED2, 0);
bkc_mbed 0:722cc5360dc3 128
bkc_mbed 0:722cc5360dc3 129 // SPI: MOSI, MISO, SCLK, CS
bkc_mbed 0:722cc5360dc3 130 SDFileSystem sd(DP_MOSI, DP_MISO, DP_SCLK, DP_SCS, "sd");
bkc_mbed 0:722cc5360dc3 131
bkc_mbed 0:722cc5360dc3 132 // LCD
bkc_mbed 0:722cc5360dc3 133 LCD lcd;
bkc_mbed 0:722cc5360dc3 134
bkc_mbed 0:722cc5360dc3 135 #define _WAIT for(int wcnt=0; wcnt < 2; wcnt++)
bkc_mbed 0:722cc5360dc3 136
bkc_mbed 0:722cc5360dc3 137
bkc_mbed 0:722cc5360dc3 138 ////////////////
bkc_mbed 0:722cc5360dc3 139 // 高速IO
bkc_mbed 0:722cc5360dc3 140
bkc_mbed 0:722cc5360dc3 141 #define DBS IO_01 // DATA
bkc_mbed 0:722cc5360dc3 142 #define CTS IO_02 // CTRL
bkc_mbed 0:722cc5360dc3 143 #define RCK IO_04 // LATCH
bkc_mbed 0:722cc5360dc3 144 #define SCK IO_03 // SCLK
bkc_mbed 0:722cc5360dc3 145
bkc_mbed 0:722cc5360dc3 146
bkc_mbed 0:722cc5360dc3 147 DigitalOut io01(DP_IO01, 0); // P1_4
bkc_mbed 0:722cc5360dc3 148 DigitalOut io02(DP_IO02, 0); // P0_3
bkc_mbed 0:722cc5360dc3 149 DigitalOut io03(DP_IO03, 0); // P1_8
bkc_mbed 0:722cc5360dc3 150 DigitalOut io04(DP_IO04, 0); // P0_11
bkc_mbed 0:722cc5360dc3 151
bkc_mbed 0:722cc5360dc3 152 #if 0
bkc_mbed 0:722cc5360dc3 153 // NBV3での試し機能
bkc_mbed 0:722cc5360dc3 154 #define IO_A0 io05
bkc_mbed 0:722cc5360dc3 155 #define IO_WR io06
bkc_mbed 0:722cc5360dc3 156
bkc_mbed 0:722cc5360dc3 157 DigitalOut io05(DP_IO05, 0); // P1_9
bkc_mbed 0:722cc5360dc3 158 DigitalOut io06(DP_IO06, 0); // P1_2
bkc_mbed 0:722cc5360dc3 159
bkc_mbed 0:722cc5360dc3 160 #endif
bkc_mbed 0:722cc5360dc3 161
bkc_mbed 0:722cc5360dc3 162 #define IO_01 (1 << 4) // DBS P1_4
bkc_mbed 0:722cc5360dc3 163 #define IO_02 (1 << 3) // CTS P0_3
bkc_mbed 0:722cc5360dc3 164 #define IO_03 (1 << 8) // SCK P1_8
bkc_mbed 0:722cc5360dc3 165 #define IO_04 (1 << 11) // RCK P0_11
bkc_mbed 0:722cc5360dc3 166
bkc_mbed 0:722cc5360dc3 167 #ifdef USE_FASTIO
bkc_mbed 0:722cc5360dc3 168
bkc_mbed 0:722cc5360dc3 169 // ポート出力
bkc_mbed 0:722cc5360dc3 170 #define DATA_HI LPC_GPIO1->DATA |= DBS
bkc_mbed 0:722cc5360dc3 171 #define DATA_LO LPC_GPIO1->DATA &= ~DBS
bkc_mbed 0:722cc5360dc3 172 #define CTRL_HI LPC_GPIO0->DATA |= CTS
bkc_mbed 0:722cc5360dc3 173 #define CTRL_LO LPC_GPIO0->DATA &= ~CTS
bkc_mbed 0:722cc5360dc3 174 #define SCK_HI LPC_GPIO1->DATA |= SCK
bkc_mbed 0:722cc5360dc3 175 #define SCK_LO LPC_GPIO1->DATA &= ~SCK
bkc_mbed 0:722cc5360dc3 176 #define RCK_HI LPC_GPIO0->DATA |= RCK
bkc_mbed 0:722cc5360dc3 177 #define RCK_LO LPC_GPIO0->DATA &= ~RCK
bkc_mbed 0:722cc5360dc3 178
bkc_mbed 0:722cc5360dc3 179 // 出力設定
bkc_mbed 0:722cc5360dc3 180 #define PORT_DIR LPC_GPIO0->DIR |= (IO_02 | IO_04); \
bkc_mbed 0:722cc5360dc3 181 LPC_GPIO1->DIR |= (IO_01 | IO_03)
bkc_mbed 0:722cc5360dc3 182
bkc_mbed 0:722cc5360dc3 183 #else
bkc_mbed 0:722cc5360dc3 184
bkc_mbed 0:722cc5360dc3 185 // ポート出力
bkc_mbed 0:722cc5360dc3 186 #define DATA_HI io01 = 1
bkc_mbed 0:722cc5360dc3 187 #define DATA_LO io01 = 0
bkc_mbed 0:722cc5360dc3 188 #define CTRL_HI io02 = 1
bkc_mbed 0:722cc5360dc3 189 #define CTRL_LO io02 = 0
bkc_mbed 0:722cc5360dc3 190 #define SCK_HI io03 = 1
bkc_mbed 0:722cc5360dc3 191 #define SCK_LO io03 = 0
bkc_mbed 0:722cc5360dc3 192 #define RCK_HI io04 = 1
bkc_mbed 0:722cc5360dc3 193 #define RCK_LO io04 = 0
bkc_mbed 0:722cc5360dc3 194
bkc_mbed 0:722cc5360dc3 195 // 出力設定
bkc_mbed 0:722cc5360dc3 196 #define PORT_DIR
bkc_mbed 0:722cc5360dc3 197
bkc_mbed 0:722cc5360dc3 198 #endif
bkc_mbed 0:722cc5360dc3 199
bkc_mbed 0:722cc5360dc3 200 SPI *spi;
bkc_mbed 0:722cc5360dc3 201
bkc_mbed 0:722cc5360dc3 202 // I/O初期化
bkc_mbed 0:722cc5360dc3 203 void ioInit()
bkc_mbed 0:722cc5360dc3 204 {
bkc_mbed 0:722cc5360dc3 205 // SPIインスタンスの取得
bkc_mbed 0:722cc5360dc3 206 spi = sd.getSPI();
bkc_mbed 0:722cc5360dc3 207 // 出力
bkc_mbed 0:722cc5360dc3 208 PORT_DIR;
bkc_mbed 0:722cc5360dc3 209 }
bkc_mbed 0:722cc5360dc3 210
bkc_mbed 0:722cc5360dc3 211
bkc_mbed 0:722cc5360dc3 212 #ifndef USE_SPI
bkc_mbed 0:722cc5360dc3 213 // 8x2ビットモード
bkc_mbed 0:722cc5360dc3 214
bkc_mbed 0:722cc5360dc3 215 #define SHIFTOUT io8x2Out
bkc_mbed 0:722cc5360dc3 216
bkc_mbed 0:722cc5360dc3 217 // 8bit 出力
bkc_mbed 0:722cc5360dc3 218 void byteOut(unsigned char data)
bkc_mbed 0:722cc5360dc3 219 {
bkc_mbed 0:722cc5360dc3 220 int i;
bkc_mbed 0:722cc5360dc3 221
bkc_mbed 0:722cc5360dc3 222 for(i = 0; i < 8; i++)
bkc_mbed 0:722cc5360dc3 223 {
bkc_mbed 0:722cc5360dc3 224 if (data & 0x80)
bkc_mbed 0:722cc5360dc3 225 DATA_HI;
bkc_mbed 0:722cc5360dc3 226 else
bkc_mbed 0:722cc5360dc3 227 DATA_LO;
bkc_mbed 0:722cc5360dc3 228
bkc_mbed 0:722cc5360dc3 229 data <<= 1;
bkc_mbed 0:722cc5360dc3 230
bkc_mbed 0:722cc5360dc3 231 SCK_HI;
bkc_mbed 0:722cc5360dc3 232 SCK_LO;
bkc_mbed 0:722cc5360dc3 233 }
bkc_mbed 0:722cc5360dc3 234 }
bkc_mbed 0:722cc5360dc3 235
bkc_mbed 0:722cc5360dc3 236 // 8x2ビット出力 or 16bit出力選択可能
bkc_mbed 0:722cc5360dc3 237 void io8x2Out(unsigned int ctrl, unsigned int data)
bkc_mbed 0:722cc5360dc3 238 {
bkc_mbed 0:722cc5360dc3 239 int i;
bkc_mbed 0:722cc5360dc3 240 // シフトレジスタ直列モード
bkc_mbed 0:722cc5360dc3 241 if (g.one_mode)
bkc_mbed 0:722cc5360dc3 242 {
bkc_mbed 0:722cc5360dc3 243 // データ順
bkc_mbed 0:722cc5360dc3 244 // <- CCCCCCCC76543210
bkc_mbed 0:722cc5360dc3 245
bkc_mbed 0:722cc5360dc3 246 byteOut(ctrl);
bkc_mbed 0:722cc5360dc3 247 byteOut(data);
bkc_mbed 0:722cc5360dc3 248
bkc_mbed 0:722cc5360dc3 249 // ラッチ
bkc_mbed 0:722cc5360dc3 250 RCK_HI;
bkc_mbed 0:722cc5360dc3 251 RCK_LO;
bkc_mbed 0:722cc5360dc3 252 }
bkc_mbed 0:722cc5360dc3 253 else
bkc_mbed 0:722cc5360dc3 254 {
bkc_mbed 0:722cc5360dc3 255 // シフトレジスタ並列モード
bkc_mbed 0:722cc5360dc3 256 for(i = 0; i < 8; i++)
bkc_mbed 0:722cc5360dc3 257 {
bkc_mbed 0:722cc5360dc3 258 /* 2ビット分のデータをそれぞれ出力 */
bkc_mbed 0:722cc5360dc3 259 if (ctrl & 0x80)
bkc_mbed 0:722cc5360dc3 260 CTRL_HI;
bkc_mbed 0:722cc5360dc3 261 else
bkc_mbed 0:722cc5360dc3 262 CTRL_LO;
bkc_mbed 0:722cc5360dc3 263
bkc_mbed 0:722cc5360dc3 264 if (data & 0x80)
bkc_mbed 0:722cc5360dc3 265 DATA_HI;
bkc_mbed 0:722cc5360dc3 266 else
bkc_mbed 0:722cc5360dc3 267 DATA_LO;
bkc_mbed 0:722cc5360dc3 268
bkc_mbed 0:722cc5360dc3 269 ctrl <<= 1;
bkc_mbed 0:722cc5360dc3 270 data <<= 1;
bkc_mbed 0:722cc5360dc3 271 // シフトクロック
bkc_mbed 0:722cc5360dc3 272 SCK_HI;
bkc_mbed 0:722cc5360dc3 273 SCK_LO;
bkc_mbed 0:722cc5360dc3 274 }
bkc_mbed 0:722cc5360dc3 275
bkc_mbed 0:722cc5360dc3 276 // ラッチ
bkc_mbed 0:722cc5360dc3 277 RCK_HI;
bkc_mbed 0:722cc5360dc3 278 RCK_LO;
bkc_mbed 0:722cc5360dc3 279 }
bkc_mbed 0:722cc5360dc3 280 }
bkc_mbed 0:722cc5360dc3 281
bkc_mbed 0:722cc5360dc3 282 #else
bkc_mbed 0:722cc5360dc3 283
bkc_mbed 0:722cc5360dc3 284 // 16bitモード
bkc_mbed 0:722cc5360dc3 285 #define SHIFTOUT io16Out
bkc_mbed 0:722cc5360dc3 286
bkc_mbed 0:722cc5360dc3 287
bkc_mbed 0:722cc5360dc3 288
bkc_mbed 0:722cc5360dc3 289 // 16bit 出力
bkc_mbed 0:722cc5360dc3 290 void io16Out(unsigned char ctrl, unsigned char data)
bkc_mbed 0:722cc5360dc3 291 {
bkc_mbed 0:722cc5360dc3 292 spi->write(ctrl);
bkc_mbed 0:722cc5360dc3 293 spi->write(data);
bkc_mbed 0:722cc5360dc3 294
bkc_mbed 0:722cc5360dc3 295 // byteOut(ctrl);
bkc_mbed 0:722cc5360dc3 296 // byteOut(data);
bkc_mbed 0:722cc5360dc3 297
bkc_mbed 0:722cc5360dc3 298 // LATCH
bkc_mbed 0:722cc5360dc3 299 RCK_HI;
bkc_mbed 0:722cc5360dc3 300 RCK_LO;
bkc_mbed 0:722cc5360dc3 301 }
bkc_mbed 0:722cc5360dc3 302
bkc_mbed 0:722cc5360dc3 303 #endif
bkc_mbed 0:722cc5360dc3 304
bkc_mbed 0:722cc5360dc3 305 /* 制御信号定義 */
bkc_mbed 0:722cc5360dc3 306 #define CS_FM3 (1 << 0)
bkc_mbed 0:722cc5360dc3 307 #define CS_PSG (1 << 1)
bkc_mbed 0:722cc5360dc3 308 #define CS_FM1 (1 << 2)
bkc_mbed 0:722cc5360dc3 309 #define CS_FM2 (1 << 3)
bkc_mbed 0:722cc5360dc3 310 #define A0 (1 << 4)
bkc_mbed 0:722cc5360dc3 311 #define WR (1 << 5)
bkc_mbed 0:722cc5360dc3 312 #define ICL (1 << 6)
bkc_mbed 0:722cc5360dc3 313 #define CTL (1 << 7)
bkc_mbed 0:722cc5360dc3 314
bkc_mbed 0:722cc5360dc3 315
bkc_mbed 0:722cc5360dc3 316 /* アクティブローの制御信号 */
bkc_mbed 0:722cc5360dc3 317 #define ACTLOW (CS_PSG | CS_FM1 | CS_FM2 | CS_FM3 | WR | ICL)
bkc_mbed 0:722cc5360dc3 318
bkc_mbed 0:722cc5360dc3 319
bkc_mbed 0:722cc5360dc3 320 /* NBV2互換出力 */
bkc_mbed 0:722cc5360dc3 321 void regOutBase(int addr, int data, int select)
bkc_mbed 0:722cc5360dc3 322 {
bkc_mbed 0:722cc5360dc3 323 /* アドレスを出力 */
bkc_mbed 0:722cc5360dc3 324 /* A0をローにして待つ */
bkc_mbed 0:722cc5360dc3 325 int ctrl = ACTLOW;
bkc_mbed 0:722cc5360dc3 326
bkc_mbed 0:722cc5360dc3 327 /* 裏レジスタ */
bkc_mbed 0:722cc5360dc3 328 if (addr >= 0x100)
bkc_mbed 0:722cc5360dc3 329 ctrl |= CTL;
bkc_mbed 0:722cc5360dc3 330 addr &= 0xff;
bkc_mbed 0:722cc5360dc3 331
bkc_mbed 0:722cc5360dc3 332 SHIFTOUT(ctrl, 0x00);
bkc_mbed 0:722cc5360dc3 333 SHIFTOUT(ctrl & ~(select | WR), addr);
bkc_mbed 0:722cc5360dc3 334 SHIFTOUT(ctrl, addr);
bkc_mbed 0:722cc5360dc3 335
bkc_mbed 0:722cc5360dc3 336 /* チップ処理待ち */
bkc_mbed 0:722cc5360dc3 337
bkc_mbed 0:722cc5360dc3 338 /* データを出力 */
bkc_mbed 0:722cc5360dc3 339 /* A0をハイにして待つ */
bkc_mbed 0:722cc5360dc3 340 ctrl |= A0;
bkc_mbed 0:722cc5360dc3 341 SHIFTOUT(ctrl, 0x00);
bkc_mbed 0:722cc5360dc3 342 SHIFTOUT(ctrl & ~(select | WR), data);
bkc_mbed 0:722cc5360dc3 343 SHIFTOUT(ctrl, data);
bkc_mbed 0:722cc5360dc3 344
bkc_mbed 0:722cc5360dc3 345 /* チップ処理待ち */
bkc_mbed 0:722cc5360dc3 346 }
bkc_mbed 0:722cc5360dc3 347
bkc_mbed 0:722cc5360dc3 348 /* 出力 */
bkc_mbed 0:722cc5360dc3 349 #define regPSGOut(addr, data) regOutBase(addr, data, CS_PSG)
bkc_mbed 0:722cc5360dc3 350 #define regFMOut(addr, data) regOutBase(addr, data, CS_FM1)
bkc_mbed 0:722cc5360dc3 351 #define regFM2Out(addr, data) regOutBase(addr, data, CS_FM2)
bkc_mbed 0:722cc5360dc3 352
bkc_mbed 0:722cc5360dc3 353 /* 音源出力 */
bkc_mbed 0:722cc5360dc3 354 #define WritePSG regPSGOut
bkc_mbed 0:722cc5360dc3 355 #define WriteOPM regFMOut
bkc_mbed 0:722cc5360dc3 356 #define WriteOPM2 regFM2Out
bkc_mbed 0:722cc5360dc3 357
bkc_mbed 0:722cc5360dc3 358
bkc_mbed 0:722cc5360dc3 359 /* ミュート */
bkc_mbed 0:722cc5360dc3 360 void boardMute(void)
bkc_mbed 0:722cc5360dc3 361 {
bkc_mbed 0:722cc5360dc3 362 int i;
bkc_mbed 0:722cc5360dc3 363
bkc_mbed 0:722cc5360dc3 364 /* PSG初期化 */
bkc_mbed 0:722cc5360dc3 365 regPSGOut(0x00,0);
bkc_mbed 0:722cc5360dc3 366 regPSGOut(0x01,0);
bkc_mbed 0:722cc5360dc3 367
bkc_mbed 0:722cc5360dc3 368 regPSGOut(0x06, 0x00);
bkc_mbed 0:722cc5360dc3 369 regPSGOut(0x07, 0x3f); // ALL OFF
bkc_mbed 0:722cc5360dc3 370 regPSGOut(0x08, 0x00); // CH.A 0
bkc_mbed 0:722cc5360dc3 371 regPSGOut(0x09, 0x00); // CH.B 0
bkc_mbed 0:722cc5360dc3 372 regPSGOut(0x0a, 0x00); // CH.C 0
bkc_mbed 0:722cc5360dc3 373
bkc_mbed 0:722cc5360dc3 374 /* MUTE(disable) */
bkc_mbed 0:722cc5360dc3 375 for(i = 0x20; i < 0x28; i++)
bkc_mbed 0:722cc5360dc3 376 {
bkc_mbed 0:722cc5360dc3 377 regFMOut(i, 0x00);
bkc_mbed 0:722cc5360dc3 378 regFM2Out(i, 0x00);
bkc_mbed 0:722cc5360dc3 379 }
bkc_mbed 0:722cc5360dc3 380
bkc_mbed 0:722cc5360dc3 381 // KEYOFF
bkc_mbed 0:722cc5360dc3 382 for(i = 0x00; i < 0x08; i++)
bkc_mbed 0:722cc5360dc3 383 {
bkc_mbed 0:722cc5360dc3 384 regFMOut(0x08, i & 0x07);
bkc_mbed 0:722cc5360dc3 385 regFM2Out(0x08, i & 0x07);
bkc_mbed 0:722cc5360dc3 386 }
bkc_mbed 0:722cc5360dc3 387
bkc_mbed 0:722cc5360dc3 388 // FORCE RELEASE
bkc_mbed 0:722cc5360dc3 389 for(i= 0x00; i < 0x20; i++)
bkc_mbed 0:722cc5360dc3 390 {
bkc_mbed 0:722cc5360dc3 391 regFMOut(0xE0 + i, 0x0f);
bkc_mbed 0:722cc5360dc3 392 regFM2Out(0xE0 + i, 0x0f);
bkc_mbed 0:722cc5360dc3 393 }
bkc_mbed 0:722cc5360dc3 394
bkc_mbed 0:722cc5360dc3 395 // OPLL ミュート
bkc_mbed 0:722cc5360dc3 396 for(i= 0x00; i <= 0x08; i++)
bkc_mbed 0:722cc5360dc3 397 {
bkc_mbed 0:722cc5360dc3 398 regFMOut(0x20 + i, 0x00);
bkc_mbed 0:722cc5360dc3 399 regFMOut(0x30 + i, 0x0f);
bkc_mbed 0:722cc5360dc3 400 regFM2Out(0x20 + i, 0x00);
bkc_mbed 0:722cc5360dc3 401 regFM2Out(0x30 + i, 0x0f);
bkc_mbed 0:722cc5360dc3 402 }
bkc_mbed 0:722cc5360dc3 403
bkc_mbed 0:722cc5360dc3 404 }
bkc_mbed 0:722cc5360dc3 405
bkc_mbed 0:722cc5360dc3 406 /* ボード初期化 */
bkc_mbed 0:722cc5360dc3 407 void boardInit(void)
bkc_mbed 0:722cc5360dc3 408 {
bkc_mbed 0:722cc5360dc3 409 wait_ms(20);
bkc_mbed 0:722cc5360dc3 410 /* ICLのみをLOW(アクティブ)にする */
bkc_mbed 0:722cc5360dc3 411 SHIFTOUT(ACTLOW & ~(ICL), 0);
bkc_mbed 0:722cc5360dc3 412 wait_ms(150);
bkc_mbed 0:722cc5360dc3 413
bkc_mbed 0:722cc5360dc3 414 /* 元に戻す */
bkc_mbed 0:722cc5360dc3 415 SHIFTOUT(ACTLOW, 0);
bkc_mbed 0:722cc5360dc3 416 wait_ms(10);
bkc_mbed 0:722cc5360dc3 417 }
bkc_mbed 0:722cc5360dc3 418
bkc_mbed 0:722cc5360dc3 419 //////////////////////////////////////////
bkc_mbed 0:722cc5360dc3 420
bkc_mbed 0:722cc5360dc3 421 // 表示
bkc_mbed 0:722cc5360dc3 422 void dispTime()
bkc_mbed 0:722cc5360dc3 423 {
bkc_mbed 0:722cc5360dc3 424 char buf[16];
bkc_mbed 0:722cc5360dc3 425 sprintf(buf, "%02d:%02d",
bkc_mbed 0:722cc5360dc3 426 g.total_sec / 60,
bkc_mbed 0:722cc5360dc3 427 g.total_sec % 60);
bkc_mbed 0:722cc5360dc3 428
bkc_mbed 0:722cc5360dc3 429 lcd.setCursor(3,1);
bkc_mbed 0:722cc5360dc3 430 lcd.printStr(buf);
bkc_mbed 0:722cc5360dc3 431 }
bkc_mbed 0:722cc5360dc3 432
bkc_mbed 0:722cc5360dc3 433 #define WAIT_US 10000 // 10ms
bkc_mbed 0:722cc5360dc3 434 #define SEC_US 1000000 // 1sec
bkc_mbed 0:722cc5360dc3 435 #define NEXT_MAX_US 300000 // 300ms
bkc_mbed 0:722cc5360dc3 436
bkc_mbed 0:722cc5360dc3 437 /* NLGの再生 */
bkc_mbed 0:722cc5360dc3 438 int PlayNLG_Loop(void)
bkc_mbed 0:722cc5360dc3 439 {
bkc_mbed 0:722cc5360dc3 440 int cmd;
bkc_mbed 0:722cc5360dc3 441 int addr, data;
bkc_mbed 0:722cc5360dc3 442
bkc_mbed 0:722cc5360dc3 443 int result = 0;
bkc_mbed 0:722cc5360dc3 444
bkc_mbed 0:722cc5360dc3 445 int us = 0;
bkc_mbed 0:722cc5360dc3 446 int diff_us = 0;
bkc_mbed 0:722cc5360dc3 447
bkc_mbed 0:722cc5360dc3 448 int count_us = 0;
bkc_mbed 0:722cc5360dc3 449 int total_us = 0;
bkc_mbed 0:722cc5360dc3 450
bkc_mbed 0:722cc5360dc3 451 // NEXTボタンのカウンタ
bkc_mbed 0:722cc5360dc3 452 int next_count = 0;
bkc_mbed 0:722cc5360dc3 453
bkc_mbed 0:722cc5360dc3 454 bool wait_skip = false;
bkc_mbed 0:722cc5360dc3 455
bkc_mbed 0:722cc5360dc3 456
bkc_mbed 0:722cc5360dc3 457 // GetTickUsNLG
bkc_mbed 0:722cc5360dc3 458 int tick_us = GetTickUsNLG(&g.nlg);
bkc_mbed 0:722cc5360dc3 459
bkc_mbed 0:722cc5360dc3 460 // printf("tick_us:%d\n", tick_us);
bkc_mbed 0:722cc5360dc3 461
bkc_mbed 0:722cc5360dc3 462 g.total_sec = 0;
bkc_mbed 0:722cc5360dc3 463
bkc_mbed 0:722cc5360dc3 464 // タイマースタート
bkc_mbed 0:722cc5360dc3 465 Timer t;
bkc_mbed 0:722cc5360dc3 466 t.start();
bkc_mbed 0:722cc5360dc3 467
bkc_mbed 0:722cc5360dc3 468 // 表示
bkc_mbed 0:722cc5360dc3 469 dispTime();
bkc_mbed 0:722cc5360dc3 470
bkc_mbed 0:722cc5360dc3 471 // LED消灯
bkc_mbed 0:722cc5360dc3 472 led1 = 0;
bkc_mbed 0:722cc5360dc3 473 led2 = 0;
bkc_mbed 0:722cc5360dc3 474
bkc_mbed 0:722cc5360dc3 475 // LEDカウンタ
bkc_mbed 0:722cc5360dc3 476 int led_cnt1 = 0;
bkc_mbed 0:722cc5360dc3 477 int led_cnt2 = 0;
bkc_mbed 0:722cc5360dc3 478
bkc_mbed 0:722cc5360dc3 479 // ループ
bkc_mbed 0:722cc5360dc3 480 while(!g.stop)
bkc_mbed 0:722cc5360dc3 481 {
bkc_mbed 0:722cc5360dc3 482 /* ウエイトの処理 */
bkc_mbed 0:722cc5360dc3 483 while (count_us >= WAIT_US)
bkc_mbed 0:722cc5360dc3 484 {
bkc_mbed 0:722cc5360dc3 485 // ボタンチェック
bkc_mbed 0:722cc5360dc3 486 if (!sw_next)
bkc_mbed 0:722cc5360dc3 487 {
bkc_mbed 0:722cc5360dc3 488 // NEXTが押されている
bkc_mbed 0:722cc5360dc3 489 if (next_count < NEXT_MAX_US)
bkc_mbed 0:722cc5360dc3 490 next_count += count_us;
bkc_mbed 0:722cc5360dc3 491 else
bkc_mbed 0:722cc5360dc3 492 {
bkc_mbed 0:722cc5360dc3 493 // 早送り
bkc_mbed 0:722cc5360dc3 494 next_count = NEXT_MAX_US;
bkc_mbed 0:722cc5360dc3 495 wait_skip = true;
bkc_mbed 0:722cc5360dc3 496 }
bkc_mbed 0:722cc5360dc3 497 }
bkc_mbed 0:722cc5360dc3 498 else
bkc_mbed 0:722cc5360dc3 499 {
bkc_mbed 0:722cc5360dc3 500 // NEXTが離されている
bkc_mbed 0:722cc5360dc3 501 wait_skip = false;
bkc_mbed 0:722cc5360dc3 502
bkc_mbed 0:722cc5360dc3 503 // 一瞬だけボタンが押された場合、次の曲へ
bkc_mbed 0:722cc5360dc3 504 if (next_count > 0 && next_count < NEXT_MAX_US)
bkc_mbed 0:722cc5360dc3 505 {
bkc_mbed 0:722cc5360dc3 506 next_count = 0;
bkc_mbed 0:722cc5360dc3 507 goto song_end;
bkc_mbed 0:722cc5360dc3 508 }
bkc_mbed 0:722cc5360dc3 509
bkc_mbed 0:722cc5360dc3 510 // 早送りの終了
bkc_mbed 0:722cc5360dc3 511 if (next_count == NEXT_MAX_US)
bkc_mbed 0:722cc5360dc3 512 {
bkc_mbed 0:722cc5360dc3 513 next_count = 0;
bkc_mbed 0:722cc5360dc3 514 }
bkc_mbed 0:722cc5360dc3 515 }
bkc_mbed 0:722cc5360dc3 516 // PREVが押された
bkc_mbed 0:722cc5360dc3 517 if (!sw_prev)
bkc_mbed 0:722cc5360dc3 518 {
bkc_mbed 0:722cc5360dc3 519 g.prev = true;
bkc_mbed 0:722cc5360dc3 520 goto song_end;
bkc_mbed 0:722cc5360dc3 521 }
bkc_mbed 0:722cc5360dc3 522
bkc_mbed 0:722cc5360dc3 523 // PLAYが押された
bkc_mbed 0:722cc5360dc3 524 if (!sw_play)
bkc_mbed 0:722cc5360dc3 525 {
bkc_mbed 0:722cc5360dc3 526 g.stop = true;
bkc_mbed 0:722cc5360dc3 527 goto song_end;
bkc_mbed 0:722cc5360dc3 528 }
bkc_mbed 0:722cc5360dc3 529
bkc_mbed 0:722cc5360dc3 530 // スキップでなければ次のタイミングまで待つ
bkc_mbed 0:722cc5360dc3 531 while(!wait_skip && (us = t.read_us()) + diff_us < count_us);
bkc_mbed 0:722cc5360dc3 532
bkc_mbed 0:722cc5360dc3 533 // タイマーリセット
bkc_mbed 0:722cc5360dc3 534 if (!wait_skip)
bkc_mbed 0:722cc5360dc3 535 t.reset();
bkc_mbed 0:722cc5360dc3 536
bkc_mbed 0:722cc5360dc3 537 // 差分を計算
bkc_mbed 0:722cc5360dc3 538 diff_us += us;
bkc_mbed 0:722cc5360dc3 539 while(diff_us >= count_us)
bkc_mbed 0:722cc5360dc3 540 diff_us -= count_us;
bkc_mbed 0:722cc5360dc3 541
bkc_mbed 0:722cc5360dc3 542 // 積算する
bkc_mbed 0:722cc5360dc3 543 total_us += count_us;
bkc_mbed 0:722cc5360dc3 544 count_us = 0;
bkc_mbed 0:722cc5360dc3 545
bkc_mbed 0:722cc5360dc3 546 // 1秒で積算カウントをリセットする
bkc_mbed 0:722cc5360dc3 547 if (total_us >= SEC_US)
bkc_mbed 0:722cc5360dc3 548 {
bkc_mbed 0:722cc5360dc3 549 while(total_us >= SEC_US)
bkc_mbed 0:722cc5360dc3 550 {
bkc_mbed 0:722cc5360dc3 551 g.total_sec++;
bkc_mbed 0:722cc5360dc3 552 total_us -= SEC_US;
bkc_mbed 0:722cc5360dc3 553 }
bkc_mbed 0:722cc5360dc3 554 // 表示
bkc_mbed 0:722cc5360dc3 555 dispTime();
bkc_mbed 0:722cc5360dc3 556 }
bkc_mbed 0:722cc5360dc3 557 }
bkc_mbed 0:722cc5360dc3 558
bkc_mbed 0:722cc5360dc3 559 /* コマンドの読み出し */
bkc_mbed 0:722cc5360dc3 560 cmd = ReadNLG(&g.nlg);
bkc_mbed 0:722cc5360dc3 561 if (cmd == EOF)
bkc_mbed 0:722cc5360dc3 562 {
bkc_mbed 0:722cc5360dc3 563 result = EOF;
bkc_mbed 0:722cc5360dc3 564 break;
bkc_mbed 0:722cc5360dc3 565 }
bkc_mbed 0:722cc5360dc3 566
bkc_mbed 0:722cc5360dc3 567 if (cmd < 0x80)
bkc_mbed 0:722cc5360dc3 568 {
bkc_mbed 0:722cc5360dc3 569 addr = ReadNLG(&g.nlg);
bkc_mbed 0:722cc5360dc3 570 data = ReadNLG(&g.nlg);
bkc_mbed 0:722cc5360dc3 571
bkc_mbed 0:722cc5360dc3 572 // 裏レジスタ
bkc_mbed 0:722cc5360dc3 573 if (cmd >= 0x40)
bkc_mbed 0:722cc5360dc3 574 addr |= 0x100;
bkc_mbed 0:722cc5360dc3 575
bkc_mbed 0:722cc5360dc3 576 switch(cmd & 0x3f)
bkc_mbed 0:722cc5360dc3 577 {
bkc_mbed 0:722cc5360dc3 578 case CMD_PSG:
bkc_mbed 0:722cc5360dc3 579 WritePSG(addr, data);
bkc_mbed 0:722cc5360dc3 580 break;
bkc_mbed 0:722cc5360dc3 581 case CMD_FM1:
bkc_mbed 0:722cc5360dc3 582 WriteOPM(addr, data);
bkc_mbed 0:722cc5360dc3 583 break;
bkc_mbed 0:722cc5360dc3 584 case CMD_FM2:
bkc_mbed 0:722cc5360dc3 585 WriteOPM2(addr, data);
bkc_mbed 0:722cc5360dc3 586 break;
bkc_mbed 0:722cc5360dc3 587 }
bkc_mbed 0:722cc5360dc3 588 }
bkc_mbed 0:722cc5360dc3 589 else
bkc_mbed 0:722cc5360dc3 590 {
bkc_mbed 0:722cc5360dc3 591 /* コマンドの処理 */
bkc_mbed 0:722cc5360dc3 592 switch (cmd)
bkc_mbed 0:722cc5360dc3 593 {
bkc_mbed 0:722cc5360dc3 594 case CMD_IRQ:
bkc_mbed 0:722cc5360dc3 595 count_us += tick_us;
bkc_mbed 0:722cc5360dc3 596
bkc_mbed 0:722cc5360dc3 597 // LED1
bkc_mbed 0:722cc5360dc3 598 led_cnt1++;
bkc_mbed 0:722cc5360dc3 599 if (led_cnt1 >= 48)
bkc_mbed 0:722cc5360dc3 600 {
bkc_mbed 0:722cc5360dc3 601 led_cnt1 = 0;
bkc_mbed 0:722cc5360dc3 602 led1 = !led1;
bkc_mbed 0:722cc5360dc3 603 }
bkc_mbed 0:722cc5360dc3 604
bkc_mbed 0:722cc5360dc3 605 // LED2
bkc_mbed 0:722cc5360dc3 606 led_cnt2++;
bkc_mbed 0:722cc5360dc3 607 if (led_cnt2 >= 192)
bkc_mbed 0:722cc5360dc3 608 {
bkc_mbed 0:722cc5360dc3 609 led_cnt2 = 0;
bkc_mbed 0:722cc5360dc3 610 led2 = !led2;
bkc_mbed 0:722cc5360dc3 611 }
bkc_mbed 0:722cc5360dc3 612 break;
bkc_mbed 0:722cc5360dc3 613 case CMD_CTC0:
bkc_mbed 0:722cc5360dc3 614 data = ReadNLG(&g.nlg);
bkc_mbed 0:722cc5360dc3 615 SetCTC0_NLG(&g.nlg, data);
bkc_mbed 0:722cc5360dc3 616 tick_us = GetTickUsNLG(&g.nlg);
bkc_mbed 0:722cc5360dc3 617 // printf("CTC0:%d tick_us:%d\n", data, tick_us);
bkc_mbed 0:722cc5360dc3 618
bkc_mbed 0:722cc5360dc3 619 break;
bkc_mbed 0:722cc5360dc3 620 case CMD_CTC3:
bkc_mbed 0:722cc5360dc3 621 data = ReadNLG(&g.nlg);
bkc_mbed 0:722cc5360dc3 622 SetCTC3_NLG(&g.nlg, data);
bkc_mbed 0:722cc5360dc3 623 tick_us = GetTickUsNLG(&g.nlg);
bkc_mbed 0:722cc5360dc3 624 // printf("CTC3:%d tick_us:%d\n", data, tick_us);
bkc_mbed 0:722cc5360dc3 625 break;
bkc_mbed 0:722cc5360dc3 626 }
bkc_mbed 0:722cc5360dc3 627 }
bkc_mbed 0:722cc5360dc3 628 }
bkc_mbed 0:722cc5360dc3 629
bkc_mbed 0:722cc5360dc3 630 song_end:
bkc_mbed 0:722cc5360dc3 631
bkc_mbed 0:722cc5360dc3 632 return result;
bkc_mbed 0:722cc5360dc3 633 }
bkc_mbed 0:722cc5360dc3 634
bkc_mbed 0:722cc5360dc3 635
bkc_mbed 0:722cc5360dc3 636 // ファイルを再生する
bkc_mbed 0:722cc5360dc3 637 int play_file(const char *filename)
bkc_mbed 0:722cc5360dc3 638 {
bkc_mbed 0:722cc5360dc3 639 /* NLGファイルを開く */
bkc_mbed 0:722cc5360dc3 640 if (OpenNLG(&g.nlg, filename) < 0)
bkc_mbed 0:722cc5360dc3 641 {
bkc_mbed 0:722cc5360dc3 642 return -1;
bkc_mbed 0:722cc5360dc3 643 }
bkc_mbed 0:722cc5360dc3 644
bkc_mbed 0:722cc5360dc3 645 /* 再生する */
bkc_mbed 0:722cc5360dc3 646 PlayNLG_Loop();
bkc_mbed 0:722cc5360dc3 647
bkc_mbed 0:722cc5360dc3 648 /* NLGファイルを閉じる */
bkc_mbed 0:722cc5360dc3 649 CloseNLG(&g.nlg);
bkc_mbed 0:722cc5360dc3 650
bkc_mbed 0:722cc5360dc3 651 return 0;
bkc_mbed 0:722cc5360dc3 652 }
bkc_mbed 0:722cc5360dc3 653
bkc_mbed 0:722cc5360dc3 654 // error_sdcard()
bkc_mbed 0:722cc5360dc3 655 // エラー!
bkc_mbed 0:722cc5360dc3 656 void error_sdcard(void)
bkc_mbed 0:722cc5360dc3 657 {
bkc_mbed 0:722cc5360dc3 658 lcd.printStr2("SD CARD", "ERROR!");
bkc_mbed 0:722cc5360dc3 659
bkc_mbed 0:722cc5360dc3 660 while(1);
bkc_mbed 0:722cc5360dc3 661 }
bkc_mbed 0:722cc5360dc3 662
bkc_mbed 0:722cc5360dc3 663 // COM mode
bkc_mbed 0:722cc5360dc3 664 void loop_for_com(void)
bkc_mbed 0:722cc5360dc3 665 {
bkc_mbed 0:722cc5360dc3 666 int sw, val;
bkc_mbed 0:722cc5360dc3 667 int adr = 0x00;
bkc_mbed 0:722cc5360dc3 668 int baud = 9600;
bkc_mbed 0:722cc5360dc3 669 char buf[16];
bkc_mbed 0:722cc5360dc3 670 Serial pc(DP_TX, DP_RX);
bkc_mbed 0:722cc5360dc3 671
bkc_mbed 0:722cc5360dc3 672 lcd.cls();
bkc_mbed 0:722cc5360dc3 673 lcd.printStrY(0, "COM MODE");
bkc_mbed 0:722cc5360dc3 674
bkc_mbed 0:722cc5360dc3 675 sprintf(buf, "%-8d", baud);
bkc_mbed 0:722cc5360dc3 676 lcd.printStrY(1, buf);
bkc_mbed 0:722cc5360dc3 677
bkc_mbed 0:722cc5360dc3 678 pc.printf("COM\n");
bkc_mbed 0:722cc5360dc3 679
bkc_mbed 0:722cc5360dc3 680 // タイマースタート
bkc_mbed 0:722cc5360dc3 681 Timer t;
bkc_mbed 0:722cc5360dc3 682 t.start();
bkc_mbed 0:722cc5360dc3 683
bkc_mbed 0:722cc5360dc3 684 while(1)
bkc_mbed 0:722cc5360dc3 685 {
bkc_mbed 0:722cc5360dc3 686
bkc_mbed 0:722cc5360dc3 687 sw = pc.getc();
bkc_mbed 0:722cc5360dc3 688
bkc_mbed 0:722cc5360dc3 689 // 0は同期リセット
bkc_mbed 0:722cc5360dc3 690 if (sw == 0x00)
bkc_mbed 0:722cc5360dc3 691 continue;
bkc_mbed 0:722cc5360dc3 692
bkc_mbed 0:722cc5360dc3 693 if (sw >= 1 && sw <= 3)
bkc_mbed 0:722cc5360dc3 694 {
bkc_mbed 0:722cc5360dc3 695 adr = pc.getc();
bkc_mbed 0:722cc5360dc3 696 val = pc.getc();
bkc_mbed 0:722cc5360dc3 697 }
bkc_mbed 0:722cc5360dc3 698
bkc_mbed 0:722cc5360dc3 699 switch(sw)
bkc_mbed 0:722cc5360dc3 700 {
bkc_mbed 0:722cc5360dc3 701 case 1:
bkc_mbed 0:722cc5360dc3 702 regFMOut(adr, val);
bkc_mbed 0:722cc5360dc3 703 break;
bkc_mbed 0:722cc5360dc3 704 case 2:
bkc_mbed 0:722cc5360dc3 705 regFM2Out(adr, val);
bkc_mbed 0:722cc5360dc3 706 break;
bkc_mbed 0:722cc5360dc3 707 case 3:
bkc_mbed 0:722cc5360dc3 708 regPSGOut(adr, val);
bkc_mbed 0:722cc5360dc3 709 break;
bkc_mbed 0:722cc5360dc3 710 case 0x0f:
bkc_mbed 0:722cc5360dc3 711 // 通信速度設定
bkc_mbed 0:722cc5360dc3 712 val = pc.getc();
bkc_mbed 0:722cc5360dc3 713 baud = (9600 * val);
bkc_mbed 0:722cc5360dc3 714 sprintf(buf, "%-8d", baud);
bkc_mbed 0:722cc5360dc3 715 lcd.printStrY(1, buf);
bkc_mbed 0:722cc5360dc3 716
bkc_mbed 0:722cc5360dc3 717 pc.baud(baud);
bkc_mbed 0:722cc5360dc3 718 break;
bkc_mbed 0:722cc5360dc3 719 case 0x10:
bkc_mbed 0:722cc5360dc3 720 //
bkc_mbed 0:722cc5360dc3 721 val = pc.getc();
bkc_mbed 0:722cc5360dc3 722 val = (val * 10000);
bkc_mbed 0:722cc5360dc3 723 while(t.read_us() < val);
bkc_mbed 0:722cc5360dc3 724 pc.putc('.');
bkc_mbed 0:722cc5360dc3 725 t.reset();
bkc_mbed 0:722cc5360dc3 726 break;
bkc_mbed 0:722cc5360dc3 727 case 0x11:
bkc_mbed 0:722cc5360dc3 728 t.reset();
bkc_mbed 0:722cc5360dc3 729 break;
bkc_mbed 0:722cc5360dc3 730 }
bkc_mbed 0:722cc5360dc3 731
bkc_mbed 0:722cc5360dc3 732 // pc.printf("sw = %02x, adr = %02x, val = %02x\n", sw, adr, val);
bkc_mbed 0:722cc5360dc3 733 }
bkc_mbed 0:722cc5360dc3 734 }
bkc_mbed 0:722cc5360dc3 735
bkc_mbed 0:722cc5360dc3 736
bkc_mbed 0:722cc5360dc3 737 // chk_isdir
bkc_mbed 0:722cc5360dc3 738 // ディレクトリか否か
bkc_mbed 0:722cc5360dc3 739 // return : bool
bkc_mbed 0:722cc5360dc3 740 // false if not directory
bkc_mbed 0:722cc5360dc3 741
bkc_mbed 0:722cc5360dc3 742 bool chk_isdir(const char *cwd, const char *dir)
bkc_mbed 0:722cc5360dc3 743 {
bkc_mbed 0:722cc5360dc3 744 char tmp[256];
bkc_mbed 0:722cc5360dc3 745 sprintf(tmp,"%s/%s", cwd, dir);
bkc_mbed 0:722cc5360dc3 746
bkc_mbed 0:722cc5360dc3 747 DIR *dp = opendir(tmp);
bkc_mbed 0:722cc5360dc3 748 if (!dp)
bkc_mbed 0:722cc5360dc3 749 return false;
bkc_mbed 0:722cc5360dc3 750
bkc_mbed 0:722cc5360dc3 751 closedir(dp);
bkc_mbed 0:722cc5360dc3 752 return true;
bkc_mbed 0:722cc5360dc3 753 }
bkc_mbed 0:722cc5360dc3 754
bkc_mbed 0:722cc5360dc3 755 #define EXT_LIST ".lst"
bkc_mbed 0:722cc5360dc3 756 #define EXT_NLG ".nlg"
bkc_mbed 0:722cc5360dc3 757
bkc_mbed 0:722cc5360dc3 758 // get_fileentry
bkc_mbed 0:722cc5360dc3 759 // index : index of list , -1 = return number of entries
bkc_mbed 0:722cc5360dc3 760 // is_mode : 0 = normal mode
bkc_mbed 0:722cc5360dc3 761 // mode = MODE_GETDIR | MODE_GETLIST | MODE_FILE
bkc_mbed 0:722cc5360dc3 762 // return : int
bkc_mbed 0:722cc5360dc3 763 // -1 = not found or error
bkc_mbed 0:722cc5360dc3 764
bkc_mbed 0:722cc5360dc3 765 #define MODE_FILE 0
bkc_mbed 0:722cc5360dc3 766 #define MODE_GETDIR 1
bkc_mbed 0:722cc5360dc3 767 #define MODE_GETLIST 2
bkc_mbed 0:722cc5360dc3 768
bkc_mbed 0:722cc5360dc3 769 int get_fileentry(int index, int mode)
bkc_mbed 0:722cc5360dc3 770 {
bkc_mbed 0:722cc5360dc3 771 // return -1 if entry is zero.
bkc_mbed 0:722cc5360dc3 772 int count = 0;
bkc_mbed 0:722cc5360dc3 773 DIR *dp = opendir(g.cwd);
bkc_mbed 0:722cc5360dc3 774
bkc_mbed 0:722cc5360dc3 775 g.file[0] = 0;
bkc_mbed 0:722cc5360dc3 776
bkc_mbed 0:722cc5360dc3 777 if (!dp)
bkc_mbed 0:722cc5360dc3 778 return -1;
bkc_mbed 0:722cc5360dc3 779
bkc_mbed 0:722cc5360dc3 780 struct dirent *dent = NULL;
bkc_mbed 0:722cc5360dc3 781
bkc_mbed 0:722cc5360dc3 782 while(1)
bkc_mbed 0:722cc5360dc3 783 {
bkc_mbed 0:722cc5360dc3 784 // エントリの読み出し
bkc_mbed 0:722cc5360dc3 785 dent = readdir(dp);
bkc_mbed 0:722cc5360dc3 786
bkc_mbed 0:722cc5360dc3 787 // 失敗
bkc_mbed 0:722cc5360dc3 788 if (!dent)
bkc_mbed 0:722cc5360dc3 789 break;
bkc_mbed 0:722cc5360dc3 790
bkc_mbed 0:722cc5360dc3 791 // リソースか隠しファイル
bkc_mbed 0:722cc5360dc3 792 if (dent->d_name[0] == '.')
bkc_mbed 0:722cc5360dc3 793 continue;
bkc_mbed 0:722cc5360dc3 794
bkc_mbed 0:722cc5360dc3 795 // 拡張子の取得
bkc_mbed 0:722cc5360dc3 796 char *ext = strrchr(dent->d_name, '.');
bkc_mbed 0:722cc5360dc3 797
bkc_mbed 0:722cc5360dc3 798 switch(mode)
bkc_mbed 0:722cc5360dc3 799 {
bkc_mbed 0:722cc5360dc3 800 // ディレクトリモード
bkc_mbed 0:722cc5360dc3 801 case MODE_GETDIR:
bkc_mbed 0:722cc5360dc3 802 // ディレクトリでなければ継続
bkc_mbed 0:722cc5360dc3 803 if (!chk_isdir(g.cwd, dent->d_name))
bkc_mbed 0:722cc5360dc3 804 continue;
bkc_mbed 0:722cc5360dc3 805 break;
bkc_mbed 0:722cc5360dc3 806
bkc_mbed 0:722cc5360dc3 807 // プレイリストモード
bkc_mbed 0:722cc5360dc3 808 case MODE_GETLIST:
bkc_mbed 0:722cc5360dc3 809 // リストでなければ無視
bkc_mbed 0:722cc5360dc3 810 if (!ext || strcasecmp(ext, EXT_LIST) != 0)
bkc_mbed 0:722cc5360dc3 811 continue;
bkc_mbed 0:722cc5360dc3 812 break;
bkc_mbed 0:722cc5360dc3 813
bkc_mbed 0:722cc5360dc3 814 // ファイルモード
bkc_mbed 0:722cc5360dc3 815 case MODE_FILE:
bkc_mbed 0:722cc5360dc3 816 // NLGファイルでなければ継続
bkc_mbed 0:722cc5360dc3 817 if (!ext || strcasecmp(ext, EXT_NLG) != 0)
bkc_mbed 0:722cc5360dc3 818 continue;
bkc_mbed 0:722cc5360dc3 819 break;
bkc_mbed 0:722cc5360dc3 820 }
bkc_mbed 0:722cc5360dc3 821
bkc_mbed 0:722cc5360dc3 822 // カウントアップ
bkc_mbed 0:722cc5360dc3 823 count++;
bkc_mbed 0:722cc5360dc3 824
bkc_mbed 0:722cc5360dc3 825 // カウントモードかカウントがindex未満で継続
bkc_mbed 0:722cc5360dc3 826 if (index < 0 || count <= index)
bkc_mbed 0:722cc5360dc3 827 continue;
bkc_mbed 0:722cc5360dc3 828
bkc_mbed 0:722cc5360dc3 829 // ファイル名をコピーして終了
bkc_mbed 0:722cc5360dc3 830 strcpy(g.file, dent->d_name);
bkc_mbed 0:722cc5360dc3 831 break;
bkc_mbed 0:722cc5360dc3 832
bkc_mbed 0:722cc5360dc3 833 }
bkc_mbed 0:722cc5360dc3 834 closedir(dp);
bkc_mbed 0:722cc5360dc3 835 return count;
bkc_mbed 0:722cc5360dc3 836 }
bkc_mbed 0:722cc5360dc3 837
bkc_mbed 0:722cc5360dc3 838
bkc_mbed 0:722cc5360dc3 839 //
bkc_mbed 0:722cc5360dc3 840 // タイトル表示
bkc_mbed 0:722cc5360dc3 841 //
bkc_mbed 0:722cc5360dc3 842 int putTitle()
bkc_mbed 0:722cc5360dc3 843 {
bkc_mbed 0:722cc5360dc3 844 int count_ms = 0;
bkc_mbed 0:722cc5360dc3 845 int diff_us = 0;
bkc_mbed 0:722cc5360dc3 846 int us = 0;
bkc_mbed 0:722cc5360dc3 847 int key = get_key();
bkc_mbed 0:722cc5360dc3 848
bkc_mbed 0:722cc5360dc3 849 // キー入力時はキャンセル
bkc_mbed 0:722cc5360dc3 850 if (key)
bkc_mbed 0:722cc5360dc3 851 return key;
bkc_mbed 0:722cc5360dc3 852
bkc_mbed 0:722cc5360dc3 853 lcd.printStr2(PRG_NAME, PRG_VER);
bkc_mbed 0:722cc5360dc3 854 Timer t;
bkc_mbed 0:722cc5360dc3 855 t.start();
bkc_mbed 0:722cc5360dc3 856
bkc_mbed 0:722cc5360dc3 857 // 1500msまでループする
bkc_mbed 0:722cc5360dc3 858 while(count_ms < 1500)
bkc_mbed 0:722cc5360dc3 859 {
bkc_mbed 0:722cc5360dc3 860 while((us = t.read_us()) + diff_us < 1000);
bkc_mbed 0:722cc5360dc3 861 t.reset();
bkc_mbed 0:722cc5360dc3 862
bkc_mbed 0:722cc5360dc3 863 // キー入力があれば終了
bkc_mbed 0:722cc5360dc3 864 key = get_key();
bkc_mbed 0:722cc5360dc3 865 if (key)
bkc_mbed 0:722cc5360dc3 866 return key;
bkc_mbed 0:722cc5360dc3 867
bkc_mbed 0:722cc5360dc3 868 // 差分を現在の時間に足して次の差分を作る
bkc_mbed 0:722cc5360dc3 869 diff_us += us;
bkc_mbed 0:722cc5360dc3 870
bkc_mbed 0:722cc5360dc3 871 while(diff_us >= 1000)
bkc_mbed 0:722cc5360dc3 872 {
bkc_mbed 0:722cc5360dc3 873 count_ms++;
bkc_mbed 0:722cc5360dc3 874 diff_us -= 1000;
bkc_mbed 0:722cc5360dc3 875 }
bkc_mbed 0:722cc5360dc3 876 }
bkc_mbed 0:722cc5360dc3 877
bkc_mbed 0:722cc5360dc3 878 return 0;
bkc_mbed 0:722cc5360dc3 879 }
bkc_mbed 0:722cc5360dc3 880
bkc_mbed 0:722cc5360dc3 881 // 情報の表示
bkc_mbed 0:722cc5360dc3 882 void show_info(int files)
bkc_mbed 0:722cc5360dc3 883 {
bkc_mbed 0:722cc5360dc3 884 char buf[16];
bkc_mbed 0:722cc5360dc3 885
bkc_mbed 0:722cc5360dc3 886 Timer t;
bkc_mbed 0:722cc5360dc3 887 int result_us = 0;
bkc_mbed 0:722cc5360dc3 888 t.reset();
bkc_mbed 0:722cc5360dc3 889 t.start();
bkc_mbed 0:722cc5360dc3 890
bkc_mbed 0:722cc5360dc3 891 // 実際の書き込み時間を計測する
bkc_mbed 0:722cc5360dc3 892 regFMOut(0x20, 0x00);
bkc_mbed 0:722cc5360dc3 893 regFMOut(0x20, 0x00);
bkc_mbed 0:722cc5360dc3 894 regFMOut(0x20, 0x00);
bkc_mbed 0:722cc5360dc3 895 regFMOut(0x20, 0x00);
bkc_mbed 0:722cc5360dc3 896 regFMOut(0x20, 0x00);
bkc_mbed 0:722cc5360dc3 897
bkc_mbed 0:722cc5360dc3 898 // 経過時間を得る
bkc_mbed 0:722cc5360dc3 899 result_us = t.read_us();
bkc_mbed 0:722cc5360dc3 900 t.stop();
bkc_mbed 0:722cc5360dc3 901
bkc_mbed 0:722cc5360dc3 902 // 平均値
bkc_mbed 0:722cc5360dc3 903 result_us /= 5;
bkc_mbed 0:722cc5360dc3 904
bkc_mbed 0:722cc5360dc3 905 // 結果表示
bkc_mbed 0:722cc5360dc3 906 printf("result_us=%dus\n", result_us);
bkc_mbed 0:722cc5360dc3 907 sprintf(buf, "R:%dus", result_us);
bkc_mbed 0:722cc5360dc3 908 lcd.printStrY(1, buf);
bkc_mbed 0:722cc5360dc3 909 wait(3);
bkc_mbed 0:722cc5360dc3 910
bkc_mbed 0:722cc5360dc3 911 // コンパイル時の日付
bkc_mbed 0:722cc5360dc3 912 sprintf(buf, "%8s", __DATE__);
bkc_mbed 0:722cc5360dc3 913 lcd.printStrYscr(1, buf);
bkc_mbed 0:722cc5360dc3 914 wait(3);
bkc_mbed 0:722cc5360dc3 915
bkc_mbed 0:722cc5360dc3 916 if (files < 0)
bkc_mbed 0:722cc5360dc3 917 lcd.printStrY(1, "NO FILES");
bkc_mbed 0:722cc5360dc3 918 else
bkc_mbed 0:722cc5360dc3 919 {
bkc_mbed 0:722cc5360dc3 920 sprintf(buf, "%3dfiles", files);
bkc_mbed 0:722cc5360dc3 921 lcd.printStrY(1, buf);
bkc_mbed 0:722cc5360dc3 922 }
bkc_mbed 0:722cc5360dc3 923 wait(3);
bkc_mbed 0:722cc5360dc3 924 lcd.cls();
bkc_mbed 0:722cc5360dc3 925 }
bkc_mbed 0:722cc5360dc3 926
bkc_mbed 0:722cc5360dc3 927 // ビットテスト
bkc_mbed 0:722cc5360dc3 928
bkc_mbed 0:722cc5360dc3 929 void bit_test()
bkc_mbed 0:722cc5360dc3 930 {
bkc_mbed 0:722cc5360dc3 931 char buf[9];
bkc_mbed 0:722cc5360dc3 932 lcd.printStrY(0, "BIT_TEST");
bkc_mbed 0:722cc5360dc3 933
bkc_mbed 0:722cc5360dc3 934 wait_key_up();
bkc_mbed 0:722cc5360dc3 935
bkc_mbed 0:722cc5360dc3 936 int pin = 0;
bkc_mbed 0:722cc5360dc3 937 int mode = 0;
bkc_mbed 0:722cc5360dc3 938 char sig;
bkc_mbed 0:722cc5360dc3 939
bkc_mbed 0:722cc5360dc3 940 while(1)
bkc_mbed 0:722cc5360dc3 941 {
bkc_mbed 0:722cc5360dc3 942 // 表示
bkc_mbed 0:722cc5360dc3 943 if (mode & 1)
bkc_mbed 0:722cc5360dc3 944 sig = 'C'; // コントロール
bkc_mbed 0:722cc5360dc3 945 else
bkc_mbed 0:722cc5360dc3 946 sig = 'D'; // データ
bkc_mbed 0:722cc5360dc3 947
bkc_mbed 0:722cc5360dc3 948 if (mode & 2)
bkc_mbed 0:722cc5360dc3 949 strcpy(buf,"00");
bkc_mbed 0:722cc5360dc3 950 else
bkc_mbed 0:722cc5360dc3 951 sprintf(buf, "%c%d", sig, pin);
bkc_mbed 0:722cc5360dc3 952
bkc_mbed 0:722cc5360dc3 953 lcd.printStrY(1, buf);
bkc_mbed 0:722cc5360dc3 954
bkc_mbed 0:722cc5360dc3 955 // 出力
bkc_mbed 0:722cc5360dc3 956 if (mode & 2)
bkc_mbed 0:722cc5360dc3 957 {
bkc_mbed 0:722cc5360dc3 958 SHIFTOUT(0xff, 0x00);
bkc_mbed 0:722cc5360dc3 959 }
bkc_mbed 0:722cc5360dc3 960 else
bkc_mbed 0:722cc5360dc3 961 {
bkc_mbed 0:722cc5360dc3 962 int bit = (1 << pin);
bkc_mbed 0:722cc5360dc3 963 if (mode & 1)
bkc_mbed 0:722cc5360dc3 964 SHIFTOUT(0xff & ~(bit), 0); // コントロール
bkc_mbed 0:722cc5360dc3 965 else
bkc_mbed 0:722cc5360dc3 966 SHIFTOUT(0xff, bit); // データ
bkc_mbed 0:722cc5360dc3 967 }
bkc_mbed 0:722cc5360dc3 968
bkc_mbed 0:722cc5360dc3 969 // キー待ち
bkc_mbed 0:722cc5360dc3 970 int key = wait_anykey();
bkc_mbed 0:722cc5360dc3 971
bkc_mbed 0:722cc5360dc3 972 // 再生
bkc_mbed 0:722cc5360dc3 973 if (key & SW_PLAY)
bkc_mbed 0:722cc5360dc3 974 {
bkc_mbed 0:722cc5360dc3 975 mode ^= 2;
bkc_mbed 0:722cc5360dc3 976 continue;
bkc_mbed 0:722cc5360dc3 977 }
bkc_mbed 0:722cc5360dc3 978 // 次
bkc_mbed 0:722cc5360dc3 979 if (key & SW_NEXT)
bkc_mbed 0:722cc5360dc3 980 {
bkc_mbed 0:722cc5360dc3 981 pin++;
bkc_mbed 0:722cc5360dc3 982 if (pin > 7)
bkc_mbed 0:722cc5360dc3 983 {
bkc_mbed 0:722cc5360dc3 984 pin = 0;
bkc_mbed 0:722cc5360dc3 985 mode = (mode + 1) & 1;
bkc_mbed 0:722cc5360dc3 986 }
bkc_mbed 0:722cc5360dc3 987 }
bkc_mbed 0:722cc5360dc3 988 // 前
bkc_mbed 0:722cc5360dc3 989 if (key & SW_PREV)
bkc_mbed 0:722cc5360dc3 990 {
bkc_mbed 0:722cc5360dc3 991 pin--;
bkc_mbed 0:722cc5360dc3 992 if (pin < 0)
bkc_mbed 0:722cc5360dc3 993 {
bkc_mbed 0:722cc5360dc3 994 pin = 7;
bkc_mbed 0:722cc5360dc3 995 mode = (mode - 1) & 1;
bkc_mbed 0:722cc5360dc3 996 }
bkc_mbed 0:722cc5360dc3 997 }
bkc_mbed 0:722cc5360dc3 998 }
bkc_mbed 0:722cc5360dc3 999 }
bkc_mbed 0:722cc5360dc3 1000
bkc_mbed 0:722cc5360dc3 1001 //
bkc_mbed 0:722cc5360dc3 1002 // ファイル選択表示
bkc_mbed 0:722cc5360dc3 1003 void disp_filesel(int mode)
bkc_mbed 0:722cc5360dc3 1004 {
bkc_mbed 0:722cc5360dc3 1005 char buf[16];
bkc_mbed 1:29f0e76a9999 1006 char buf_mode[16];
bkc_mbed 1:29f0e76a9999 1007
bkc_mbed 0:722cc5360dc3 1008 char *mode_name;
bkc_mbed 0:722cc5360dc3 1009 switch(mode)
bkc_mbed 0:722cc5360dc3 1010 {
bkc_mbed 0:722cc5360dc3 1011 case MODE_GETLIST:
bkc_mbed 1:29f0e76a9999 1012 mode_name = "LIST";
bkc_mbed 0:722cc5360dc3 1013 break;
bkc_mbed 0:722cc5360dc3 1014 case MODE_GETDIR:
bkc_mbed 1:29f0e76a9999 1015 mode_name = "DIR ";
bkc_mbed 0:722cc5360dc3 1016 break;
bkc_mbed 0:722cc5360dc3 1017 default:
bkc_mbed 1:29f0e76a9999 1018 mode_name = "FILE";
bkc_mbed 0:722cc5360dc3 1019 }
bkc_mbed 0:722cc5360dc3 1020
bkc_mbed 1:29f0e76a9999 1021 sprintf(buf_mode, "%s %03d", mode_name, g.idx + 1);
bkc_mbed 0:722cc5360dc3 1022 strncpy(buf, g.file, 8);
bkc_mbed 0:722cc5360dc3 1023 buf[8] = 0;
bkc_mbed 0:722cc5360dc3 1024
bkc_mbed 0:722cc5360dc3 1025 // 表示
bkc_mbed 1:29f0e76a9999 1026 lcd.printStr2(buf, buf_mode);
bkc_mbed 0:722cc5360dc3 1027 }
bkc_mbed 0:722cc5360dc3 1028
bkc_mbed 0:722cc5360dc3 1029 //
bkc_mbed 0:722cc5360dc3 1030 // ファイル/ディレクトリ選択
bkc_mbed 0:722cc5360dc3 1031 // mode = MODE_GETLIST | MODE_GETDIR | MODE_FILE
bkc_mbed 0:722cc5360dc3 1032 //
bkc_mbed 0:722cc5360dc3 1033 int file_select(int mode)
bkc_mbed 0:722cc5360dc3 1034 {
bkc_mbed 0:722cc5360dc3 1035 // ファイル数を得る
bkc_mbed 0:722cc5360dc3 1036 int files = get_fileentry(-1, mode);
bkc_mbed 0:722cc5360dc3 1037
bkc_mbed 0:722cc5360dc3 1038 // 最大エントリー
bkc_mbed 0:722cc5360dc3 1039 g.max_entries = files - 1;
bkc_mbed 0:722cc5360dc3 1040
bkc_mbed 0:722cc5360dc3 1041 // ファイル名の取得
bkc_mbed 0:722cc5360dc3 1042 get_fileentry(g.idx, mode);
bkc_mbed 0:722cc5360dc3 1043
bkc_mbed 0:722cc5360dc3 1044 // 表示
bkc_mbed 0:722cc5360dc3 1045 disp_filesel(mode);
bkc_mbed 0:722cc5360dc3 1046
bkc_mbed 0:722cc5360dc3 1047 // リリース待ち
bkc_mbed 0:722cc5360dc3 1048 wait_relkey();
bkc_mbed 0:722cc5360dc3 1049
bkc_mbed 0:722cc5360dc3 1050 while(1)
bkc_mbed 0:722cc5360dc3 1051 {
bkc_mbed 0:722cc5360dc3 1052 // ファイル名の取得
bkc_mbed 0:722cc5360dc3 1053 get_fileentry(g.idx, mode);
bkc_mbed 0:722cc5360dc3 1054
bkc_mbed 0:722cc5360dc3 1055 // 表示
bkc_mbed 0:722cc5360dc3 1056 disp_filesel(mode);
bkc_mbed 0:722cc5360dc3 1057
bkc_mbed 0:722cc5360dc3 1058 // キー待ち
bkc_mbed 0:722cc5360dc3 1059 int key = wait_anykey();
bkc_mbed 0:722cc5360dc3 1060
bkc_mbed 0:722cc5360dc3 1061 // 次のエントリ
bkc_mbed 0:722cc5360dc3 1062 if (key & SW_NEXT)
bkc_mbed 0:722cc5360dc3 1063 {
bkc_mbed 0:722cc5360dc3 1064 if (g.idx < g.max_entries)
bkc_mbed 0:722cc5360dc3 1065 g.idx++;
bkc_mbed 0:722cc5360dc3 1066 else
bkc_mbed 0:722cc5360dc3 1067 g.idx = 0;
bkc_mbed 0:722cc5360dc3 1068 }
bkc_mbed 0:722cc5360dc3 1069
bkc_mbed 0:722cc5360dc3 1070 // 前のエントリ
bkc_mbed 0:722cc5360dc3 1071 if (key & SW_PREV)
bkc_mbed 0:722cc5360dc3 1072 {
bkc_mbed 0:722cc5360dc3 1073 if (g.idx > 0)
bkc_mbed 0:722cc5360dc3 1074 g.idx--;
bkc_mbed 0:722cc5360dc3 1075 else
bkc_mbed 0:722cc5360dc3 1076 g.idx = g.max_entries;
bkc_mbed 0:722cc5360dc3 1077 }
bkc_mbed 0:722cc5360dc3 1078 // 再生ボタンを押した
bkc_mbed 0:722cc5360dc3 1079 if (key & SW_PLAY)
bkc_mbed 0:722cc5360dc3 1080 break;
bkc_mbed 0:722cc5360dc3 1081 }
bkc_mbed 0:722cc5360dc3 1082
bkc_mbed 0:722cc5360dc3 1083 return g.idx;
bkc_mbed 0:722cc5360dc3 1084 }
bkc_mbed 0:722cc5360dc3 1085
bkc_mbed 0:722cc5360dc3 1086 // get_playlist()
bkc_mbed 0:722cc5360dc3 1087 // index = リスト位置, -1でエントリ数を返す
bkc_mbed 0:722cc5360dc3 1088 int get_playlist(int index)
bkc_mbed 0:722cc5360dc3 1089 {
bkc_mbed 0:722cc5360dc3 1090 int count = 0;
bkc_mbed 0:722cc5360dc3 1091 FILE *fp = fopen(g.playlist, "r");
bkc_mbed 0:722cc5360dc3 1092
bkc_mbed 0:722cc5360dc3 1093 g.file[0] = 0;
bkc_mbed 0:722cc5360dc3 1094
bkc_mbed 0:722cc5360dc3 1095 // プレイリストが開けない
bkc_mbed 0:722cc5360dc3 1096 if (!fp)
bkc_mbed 0:722cc5360dc3 1097 return -1;
bkc_mbed 0:722cc5360dc3 1098
bkc_mbed 0:722cc5360dc3 1099 while(1)
bkc_mbed 0:722cc5360dc3 1100 {
bkc_mbed 0:722cc5360dc3 1101 // プレイリストから一行読み込む
bkc_mbed 0:722cc5360dc3 1102 char *p = fgets(g.file, MAX_FILENAME, fp);
bkc_mbed 0:722cc5360dc3 1103
bkc_mbed 0:722cc5360dc3 1104 // EOFなので終了
bkc_mbed 0:722cc5360dc3 1105 if (!p)
bkc_mbed 0:722cc5360dc3 1106 break;
bkc_mbed 0:722cc5360dc3 1107
bkc_mbed 0:722cc5360dc3 1108 // サイズ
bkc_mbed 0:722cc5360dc3 1109 int len = strlen(g.file);
bkc_mbed 0:722cc5360dc3 1110
bkc_mbed 0:722cc5360dc3 1111 // CR/LFをトリムする
bkc_mbed 0:722cc5360dc3 1112 while(len > 0 && (unsigned char)g.file[len - 1] < 0x20)
bkc_mbed 0:722cc5360dc3 1113 {
bkc_mbed 0:722cc5360dc3 1114 g.file[len - 1] = 0x00;
bkc_mbed 0:722cc5360dc3 1115 len--;
bkc_mbed 0:722cc5360dc3 1116 }
bkc_mbed 0:722cc5360dc3 1117
bkc_mbed 0:722cc5360dc3 1118 // 空行は飛ばす
bkc_mbed 0:722cc5360dc3 1119 if (!len)
bkc_mbed 0:722cc5360dc3 1120 continue;
bkc_mbed 0:722cc5360dc3 1121
bkc_mbed 0:722cc5360dc3 1122 count++;
bkc_mbed 0:722cc5360dc3 1123
bkc_mbed 0:722cc5360dc3 1124 // カウントモードかカウントがindex未満で継続
bkc_mbed 0:722cc5360dc3 1125 if (index < 0 || count <= index)
bkc_mbed 0:722cc5360dc3 1126 continue;
bkc_mbed 0:722cc5360dc3 1127 else
bkc_mbed 0:722cc5360dc3 1128 break;
bkc_mbed 0:722cc5360dc3 1129 }
bkc_mbed 0:722cc5360dc3 1130
bkc_mbed 0:722cc5360dc3 1131 // プレイリストを閉じる
bkc_mbed 0:722cc5360dc3 1132 fclose(fp);
bkc_mbed 0:722cc5360dc3 1133
bkc_mbed 0:722cc5360dc3 1134 #if defined(__MICROLIB) && defined(__ARMCC_VERSION)
bkc_mbed 0:722cc5360dc3 1135 free(fp);
bkc_mbed 0:722cc5360dc3 1136 #endif
bkc_mbed 0:722cc5360dc3 1137
bkc_mbed 0:722cc5360dc3 1138 return count;
bkc_mbed 0:722cc5360dc3 1139 }
bkc_mbed 0:722cc5360dc3 1140
bkc_mbed 0:722cc5360dc3 1141
bkc_mbed 0:722cc5360dc3 1142 // グローバル変数初期化
bkc_mbed 0:722cc5360dc3 1143 void init_globe(void)
bkc_mbed 0:722cc5360dc3 1144 {
bkc_mbed 0:722cc5360dc3 1145 memset(&g, 0, sizeof(g));
bkc_mbed 0:722cc5360dc3 1146 strcpy(g.cwd,"/sd");
bkc_mbed 0:722cc5360dc3 1147 }
bkc_mbed 0:722cc5360dc3 1148
bkc_mbed 0:722cc5360dc3 1149 // パスの作成
bkc_mbed 0:722cc5360dc3 1150 void make_path(char *path, const char *dir, const char *file)
bkc_mbed 0:722cc5360dc3 1151 {
bkc_mbed 0:722cc5360dc3 1152 sprintf(path, "%s/%s", dir, file);
bkc_mbed 0:722cc5360dc3 1153 }
bkc_mbed 0:722cc5360dc3 1154
bkc_mbed 0:722cc5360dc3 1155 // 再生モード
bkc_mbed 0:722cc5360dc3 1156 void play_mode(void)
bkc_mbed 0:722cc5360dc3 1157 {
bkc_mbed 0:722cc5360dc3 1158 int files = -1;
bkc_mbed 0:722cc5360dc3 1159
bkc_mbed 0:722cc5360dc3 1160 // プレイリストモードか否か
bkc_mbed 0:722cc5360dc3 1161 if (g.playlist[0])
bkc_mbed 0:722cc5360dc3 1162 files = get_playlist(-1);
bkc_mbed 0:722cc5360dc3 1163 else
bkc_mbed 0:722cc5360dc3 1164 files = get_fileentry(-1, MODE_FILE);
bkc_mbed 0:722cc5360dc3 1165
bkc_mbed 0:722cc5360dc3 1166 // エラー表示
bkc_mbed 0:722cc5360dc3 1167 if (files < 0)
bkc_mbed 0:722cc5360dc3 1168 error_sdcard();
bkc_mbed 0:722cc5360dc3 1169
bkc_mbed 0:722cc5360dc3 1170 g.max_entries = files - 1;
bkc_mbed 0:722cc5360dc3 1171
bkc_mbed 0:722cc5360dc3 1172 bool repeat_flag = false;
bkc_mbed 0:722cc5360dc3 1173
bkc_mbed 0:722cc5360dc3 1174 // ファイルが無い
bkc_mbed 0:722cc5360dc3 1175 if (files < 1)
bkc_mbed 0:722cc5360dc3 1176 {
bkc_mbed 0:722cc5360dc3 1177 lcd.cls();
bkc_mbed 0:722cc5360dc3 1178 lcd.printStrY(0, "NO FILES");
bkc_mbed 0:722cc5360dc3 1179 wait(1);
bkc_mbed 0:722cc5360dc3 1180 }
bkc_mbed 0:722cc5360dc3 1181
bkc_mbed 0:722cc5360dc3 1182 // 再生モードループ
bkc_mbed 0:722cc5360dc3 1183 while(1)
bkc_mbed 0:722cc5360dc3 1184 {
bkc_mbed 0:722cc5360dc3 1185 char path[MAX_PATH];
bkc_mbed 0:722cc5360dc3 1186 char buf[16];
bkc_mbed 0:722cc5360dc3 1187
bkc_mbed 0:722cc5360dc3 1188 // プレイリストかどうか?
bkc_mbed 0:722cc5360dc3 1189 if (g.playlist[0])
bkc_mbed 0:722cc5360dc3 1190 get_playlist(g.idx);
bkc_mbed 0:722cc5360dc3 1191 else
bkc_mbed 0:722cc5360dc3 1192 get_fileentry(g.idx, MODE_FILE);
bkc_mbed 0:722cc5360dc3 1193
bkc_mbed 0:722cc5360dc3 1194 // フルパスを作成
bkc_mbed 0:722cc5360dc3 1195 make_path(path, g.cwd, g.file);
bkc_mbed 0:722cc5360dc3 1196
bkc_mbed 0:722cc5360dc3 1197 // 曲番号
bkc_mbed 0:722cc5360dc3 1198 sprintf(buf, "%2d ", g.idx + 1);
bkc_mbed 0:722cc5360dc3 1199
bkc_mbed 0:722cc5360dc3 1200 // ファイル名名表示
bkc_mbed 0:722cc5360dc3 1201 lcd.cls();
bkc_mbed 0:722cc5360dc3 1202 lcd.printStrY(0, g.file);
bkc_mbed 0:722cc5360dc3 1203 lcd.printStrY(1, buf);
bkc_mbed 0:722cc5360dc3 1204
bkc_mbed 0:722cc5360dc3 1205 // 再生開始
bkc_mbed 0:722cc5360dc3 1206 play_file(path);
bkc_mbed 0:722cc5360dc3 1207
bkc_mbed 0:722cc5360dc3 1208 // ミュート
bkc_mbed 0:722cc5360dc3 1209 boardMute();
bkc_mbed 0:722cc5360dc3 1210
bkc_mbed 0:722cc5360dc3 1211 // キー開放待ち
bkc_mbed 0:722cc5360dc3 1212 wait_relkey();
bkc_mbed 0:722cc5360dc3 1213
bkc_mbed 0:722cc5360dc3 1214
bkc_mbed 0:722cc5360dc3 1215 // 再生ボタンが押された
bkc_mbed 0:722cc5360dc3 1216 if (g.stop)
bkc_mbed 0:722cc5360dc3 1217 {
bkc_mbed 0:722cc5360dc3 1218 // ストップ表示
bkc_mbed 0:722cc5360dc3 1219 lcd.printStrY(1, " STOP ");
bkc_mbed 0:722cc5360dc3 1220
bkc_mbed 0:722cc5360dc3 1221 g.stop = false;
bkc_mbed 0:722cc5360dc3 1222 g.prev = false;
bkc_mbed 0:722cc5360dc3 1223 g.total_sec = 0;
bkc_mbed 0:722cc5360dc3 1224
bkc_mbed 0:722cc5360dc3 1225 // ボード初期化
bkc_mbed 0:722cc5360dc3 1226 boardInit();
bkc_mbed 0:722cc5360dc3 1227
bkc_mbed 0:722cc5360dc3 1228 // ファイル選択
bkc_mbed 0:722cc5360dc3 1229 file_select(MODE_FILE);
bkc_mbed 0:722cc5360dc3 1230 continue;
bkc_mbed 0:722cc5360dc3 1231 }
bkc_mbed 0:722cc5360dc3 1232
bkc_mbed 0:722cc5360dc3 1233 // 前の曲を再生
bkc_mbed 0:722cc5360dc3 1234 if (g.prev)
bkc_mbed 0:722cc5360dc3 1235 {
bkc_mbed 0:722cc5360dc3 1236 g.prev = false;
bkc_mbed 0:722cc5360dc3 1237
bkc_mbed 0:722cc5360dc3 1238 // 同じ曲を再生
bkc_mbed 0:722cc5360dc3 1239 if (g.total_sec >= 2)
bkc_mbed 0:722cc5360dc3 1240 continue;
bkc_mbed 0:722cc5360dc3 1241
bkc_mbed 0:722cc5360dc3 1242 if (g.idx > 0)
bkc_mbed 0:722cc5360dc3 1243 g.idx--;
bkc_mbed 0:722cc5360dc3 1244 else
bkc_mbed 0:722cc5360dc3 1245 g.idx = g.max_entries;
bkc_mbed 0:722cc5360dc3 1246
bkc_mbed 0:722cc5360dc3 1247 continue;
bkc_mbed 0:722cc5360dc3 1248 }
bkc_mbed 0:722cc5360dc3 1249
bkc_mbed 0:722cc5360dc3 1250 // 繰り返しではない
bkc_mbed 0:722cc5360dc3 1251 if (!repeat_flag)
bkc_mbed 0:722cc5360dc3 1252 {
bkc_mbed 0:722cc5360dc3 1253 if (g.idx < g.max_entries)
bkc_mbed 0:722cc5360dc3 1254 g.idx++;
bkc_mbed 0:722cc5360dc3 1255 else
bkc_mbed 0:722cc5360dc3 1256 g.idx = 0;
bkc_mbed 0:722cc5360dc3 1257 }
bkc_mbed 0:722cc5360dc3 1258 repeat_flag = false;
bkc_mbed 0:722cc5360dc3 1259 }
bkc_mbed 0:722cc5360dc3 1260 }
bkc_mbed 0:722cc5360dc3 1261
bkc_mbed 0:722cc5360dc3 1262
bkc_mbed 0:722cc5360dc3 1263
bkc_mbed 0:722cc5360dc3 1264 //
bkc_mbed 0:722cc5360dc3 1265 // メニュー選択
bkc_mbed 0:722cc5360dc3 1266 //
bkc_mbed 0:722cc5360dc3 1267 #define MENU_FILE 0
bkc_mbed 0:722cc5360dc3 1268 #define MENU_DIR 1
bkc_mbed 0:722cc5360dc3 1269 #define MENU_LIST 2
bkc_mbed 0:722cc5360dc3 1270 #define MENU_INFO 3
bkc_mbed 0:722cc5360dc3 1271 #define MENU_COM 4
bkc_mbed 0:722cc5360dc3 1272 #define MENU_TEST 5
bkc_mbed 0:722cc5360dc3 1273 #define MENU_SMODE 6
bkc_mbed 0:722cc5360dc3 1274 #define MENU_MAX 6
bkc_mbed 0:722cc5360dc3 1275
bkc_mbed 0:722cc5360dc3 1276 // メニュー文字列
bkc_mbed 0:722cc5360dc3 1277 const char *menu_modes[] =
bkc_mbed 0:722cc5360dc3 1278 {
bkc_mbed 0:722cc5360dc3 1279 "FILE", // 0
bkc_mbed 0:722cc5360dc3 1280 "DIR", // 1
bkc_mbed 0:722cc5360dc3 1281 "LIST", // 2
bkc_mbed 0:722cc5360dc3 1282 "INFO", // 3
bkc_mbed 0:722cc5360dc3 1283 "COM", // 4
bkc_mbed 0:722cc5360dc3 1284 "TEST", // 5
bkc_mbed 0:722cc5360dc3 1285 "Sx16", // 6
bkc_mbed 0:722cc5360dc3 1286 };
bkc_mbed 0:722cc5360dc3 1287
bkc_mbed 0:722cc5360dc3 1288 // メニュー選択表示
bkc_mbed 0:722cc5360dc3 1289 void menu_disp(int sel)
bkc_mbed 0:722cc5360dc3 1290 {
bkc_mbed 0:722cc5360dc3 1291 char buf[16];
bkc_mbed 0:722cc5360dc3 1292
bkc_mbed 0:722cc5360dc3 1293 // 表示
bkc_mbed 0:722cc5360dc3 1294 lcd.printStrY(0, "MENU SEL");
bkc_mbed 0:722cc5360dc3 1295 sprintf(buf, "%02d %-4s", sel, menu_modes[sel]);
bkc_mbed 0:722cc5360dc3 1296 lcd.printStrY(1, buf);
bkc_mbed 0:722cc5360dc3 1297 }
bkc_mbed 0:722cc5360dc3 1298
bkc_mbed 0:722cc5360dc3 1299 // モード選択
bkc_mbed 0:722cc5360dc3 1300 int menu_select()
bkc_mbed 0:722cc5360dc3 1301 {
bkc_mbed 0:722cc5360dc3 1302 int count = 0;
bkc_mbed 0:722cc5360dc3 1303
bkc_mbed 0:722cc5360dc3 1304 // 初期表示
bkc_mbed 0:722cc5360dc3 1305 menu_disp(0);
bkc_mbed 0:722cc5360dc3 1306
bkc_mbed 0:722cc5360dc3 1307 // リリース待ち
bkc_mbed 0:722cc5360dc3 1308 wait_key_up();
bkc_mbed 0:722cc5360dc3 1309
bkc_mbed 0:722cc5360dc3 1310 while(1)
bkc_mbed 0:722cc5360dc3 1311 {
bkc_mbed 0:722cc5360dc3 1312 // キー待ち
bkc_mbed 0:722cc5360dc3 1313 int key = wait_anykey();
bkc_mbed 0:722cc5360dc3 1314
bkc_mbed 0:722cc5360dc3 1315 // 次
bkc_mbed 0:722cc5360dc3 1316 if (key & SW_NEXT)
bkc_mbed 0:722cc5360dc3 1317 {
bkc_mbed 0:722cc5360dc3 1318 if (count < MENU_MAX)
bkc_mbed 0:722cc5360dc3 1319 count++;
bkc_mbed 0:722cc5360dc3 1320 else
bkc_mbed 0:722cc5360dc3 1321 count = 0;
bkc_mbed 0:722cc5360dc3 1322 }
bkc_mbed 0:722cc5360dc3 1323 // 前
bkc_mbed 0:722cc5360dc3 1324 if (key & SW_PREV)
bkc_mbed 0:722cc5360dc3 1325 {
bkc_mbed 0:722cc5360dc3 1326 if (count > 0)
bkc_mbed 0:722cc5360dc3 1327 count--;
bkc_mbed 0:722cc5360dc3 1328 else
bkc_mbed 0:722cc5360dc3 1329 count = MENU_MAX;
bkc_mbed 0:722cc5360dc3 1330 }
bkc_mbed 0:722cc5360dc3 1331 // 再生
bkc_mbed 0:722cc5360dc3 1332 if (key & SW_PLAY)
bkc_mbed 0:722cc5360dc3 1333 break;
bkc_mbed 0:722cc5360dc3 1334
bkc_mbed 0:722cc5360dc3 1335 // 表示
bkc_mbed 0:722cc5360dc3 1336 menu_disp(count);
bkc_mbed 0:722cc5360dc3 1337 }
bkc_mbed 0:722cc5360dc3 1338
bkc_mbed 0:722cc5360dc3 1339 return count;
bkc_mbed 0:722cc5360dc3 1340 }
bkc_mbed 0:722cc5360dc3 1341
bkc_mbed 0:722cc5360dc3 1342 // メニューモード
bkc_mbed 0:722cc5360dc3 1343 void menu_mode(void)
bkc_mbed 0:722cc5360dc3 1344 {
bkc_mbed 0:722cc5360dc3 1345 int files = 0;
bkc_mbed 0:722cc5360dc3 1346 char path[MAX_PATH];
bkc_mbed 0:722cc5360dc3 1347
bkc_mbed 0:722cc5360dc3 1348 menu_start:
bkc_mbed 0:722cc5360dc3 1349
bkc_mbed 0:722cc5360dc3 1350 // ボードの初期化
bkc_mbed 0:722cc5360dc3 1351 boardInit();
bkc_mbed 0:722cc5360dc3 1352
bkc_mbed 0:722cc5360dc3 1353 int sw = menu_select();
bkc_mbed 0:722cc5360dc3 1354 switch(sw)
bkc_mbed 0:722cc5360dc3 1355 {
bkc_mbed 0:722cc5360dc3 1356 // ファイル選択
bkc_mbed 0:722cc5360dc3 1357 case MENU_FILE:
bkc_mbed 0:722cc5360dc3 1358 file_select(MODE_FILE);
bkc_mbed 0:722cc5360dc3 1359 break;
bkc_mbed 0:722cc5360dc3 1360 // ディレクトリ選択
bkc_mbed 0:722cc5360dc3 1361 case MENU_DIR:
bkc_mbed 0:722cc5360dc3 1362 file_select(MODE_GETDIR);
bkc_mbed 0:722cc5360dc3 1363 // パスを結合し、インデックスを初期化
bkc_mbed 0:722cc5360dc3 1364 make_path(path, g.cwd, g.file);
bkc_mbed 0:722cc5360dc3 1365 strcpy(g.cwd, path);
bkc_mbed 0:722cc5360dc3 1366 g.idx = 0;
bkc_mbed 0:722cc5360dc3 1367 break;
bkc_mbed 0:722cc5360dc3 1368 // プレイリスト選択
bkc_mbed 0:722cc5360dc3 1369 case MENU_LIST:
bkc_mbed 0:722cc5360dc3 1370 file_select(MODE_GETLIST);
bkc_mbed 0:722cc5360dc3 1371 break;
bkc_mbed 0:722cc5360dc3 1372 // 情報モード
bkc_mbed 0:722cc5360dc3 1373 case MENU_INFO:
bkc_mbed 0:722cc5360dc3 1374 files = get_fileentry(-1, MODE_FILE);
bkc_mbed 0:722cc5360dc3 1375 show_info(files);
bkc_mbed 0:722cc5360dc3 1376 goto menu_start;
bkc_mbed 0:722cc5360dc3 1377 // 通信モード
bkc_mbed 0:722cc5360dc3 1378 case MENU_COM:
bkc_mbed 0:722cc5360dc3 1379 loop_for_com();
bkc_mbed 0:722cc5360dc3 1380 break;
bkc_mbed 0:722cc5360dc3 1381 // テストモード
bkc_mbed 0:722cc5360dc3 1382 case MENU_TEST:
bkc_mbed 0:722cc5360dc3 1383 bit_test();
bkc_mbed 0:722cc5360dc3 1384 break;
bkc_mbed 0:722cc5360dc3 1385 // ストレートモード
bkc_mbed 0:722cc5360dc3 1386 case MENU_SMODE:
bkc_mbed 0:722cc5360dc3 1387 g.one_mode = true;
bkc_mbed 0:722cc5360dc3 1388 lcd.printStr2("","Sx16 ON");
bkc_mbed 0:722cc5360dc3 1389 wait(0.5);
bkc_mbed 0:722cc5360dc3 1390 goto menu_start;
bkc_mbed 0:722cc5360dc3 1391 }
bkc_mbed 0:722cc5360dc3 1392 }
bkc_mbed 0:722cc5360dc3 1393
bkc_mbed 0:722cc5360dc3 1394 //
bkc_mbed 0:722cc5360dc3 1395 // main
bkc_mbed 0:722cc5360dc3 1396 //
bkc_mbed 0:722cc5360dc3 1397 int main()
bkc_mbed 0:722cc5360dc3 1398 {
bkc_mbed 0:722cc5360dc3 1399 // 初期化
bkc_mbed 0:722cc5360dc3 1400 init_globe();
bkc_mbed 0:722cc5360dc3 1401
bkc_mbed 0:722cc5360dc3 1402 // I/O初期化
bkc_mbed 0:722cc5360dc3 1403 ioInit();
bkc_mbed 0:722cc5360dc3 1404
bkc_mbed 1:29f0e76a9999 1405 // シフトレジスタの初期化
bkc_mbed 1:29f0e76a9999 1406 SHIFTOUT(ACTLOW & ~(ICL), 0x00);
bkc_mbed 1:29f0e76a9999 1407
bkc_mbed 0:722cc5360dc3 1408 // 立ち上がり待ち
bkc_mbed 0:722cc5360dc3 1409 wait_ms(20);
bkc_mbed 0:722cc5360dc3 1410
bkc_mbed 0:722cc5360dc3 1411 // LCD初期化
bkc_mbed 0:722cc5360dc3 1412 lcd.init();
bkc_mbed 0:722cc5360dc3 1413
bkc_mbed 1:29f0e76a9999 1414 // ICLなどをHにする
bkc_mbed 1:29f0e76a9999 1415 SHIFTOUT(ACTLOW, 0x00);
bkc_mbed 1:29f0e76a9999 1416
bkc_mbed 1:29f0e76a9999 1417 // 消音する
bkc_mbed 1:29f0e76a9999 1418 boardMute();
bkc_mbed 1:29f0e76a9999 1419
bkc_mbed 0:722cc5360dc3 1420 // タイトル表示
bkc_mbed 0:722cc5360dc3 1421 int key = putTitle();
bkc_mbed 1:29f0e76a9999 1422
bkc_mbed 0:722cc5360dc3 1423
bkc_mbed 0:722cc5360dc3 1424 // NEXTボタンでメニュー表示
bkc_mbed 0:722cc5360dc3 1425 if (key & SW_NEXT)
bkc_mbed 0:722cc5360dc3 1426 menu_mode();
bkc_mbed 0:722cc5360dc3 1427
bkc_mbed 0:722cc5360dc3 1428 // 再生モード
bkc_mbed 0:722cc5360dc3 1429 play_mode();
bkc_mbed 0:722cc5360dc3 1430 }