Stand-alone HMD demo system built on mbed FRDM-K64F.

Dependencies:   SDFileSystem mbed FATFileSystem

Committer:
maruishi
Date:
Tue Jul 29 11:41:59 2014 +0000
Revision:
0:9bbe50de69d8
FRDM-K64F based 3D Head-mount-display for Interface(CQ Pub)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maruishi 0:9bbe50de69d8 1 #include "mbed.h"
maruishi 0:9bbe50de69d8 2 #include "SDFileSystem.h"
maruishi 0:9bbe50de69d8 3
maruishi 0:9bbe50de69d8 4 DigitalOut myled(LED_GREEN);
maruishi 0:9bbe50de69d8 5 Serial pc(PTC17, PTC16);
maruishi 0:9bbe50de69d8 6 DigitalOut lcd_rs1(PTB19);
maruishi 0:9bbe50de69d8 7 DigitalOut lcd_cs1(PTB18);
maruishi 0:9bbe50de69d8 8 DigitalOut lcd_cs2(PTC1);
maruishi 0:9bbe50de69d8 9 DigitalOut lcd_rst(PTC8);
maruishi 0:9bbe50de69d8 10
maruishi 0:9bbe50de69d8 11 DigitalIn push_sw(SW2);
maruishi 0:9bbe50de69d8 12
maruishi 0:9bbe50de69d8 13 SPI spi(PTD2,PTD3,PTD1);
maruishi 0:9bbe50de69d8 14 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd");
maruishi 0:9bbe50de69d8 15
maruishi 0:9bbe50de69d8 16 /*
maruishi 0:9bbe50de69d8 17 LCDモジュールへのコマンドの送信(1バイト)
maruishi 0:9bbe50de69d8 18 */
maruishi 0:9bbe50de69d8 19 void lcd_command_write(unsigned char c)
maruishi 0:9bbe50de69d8 20 {
maruishi 0:9bbe50de69d8 21 lcd_rs1 = 0;
maruishi 0:9bbe50de69d8 22 spi.write(c);
maruishi 0:9bbe50de69d8 23 }
maruishi 0:9bbe50de69d8 24
maruishi 0:9bbe50de69d8 25 /*
maruishi 0:9bbe50de69d8 26 LCDモジュールへのデータの送信(1バイト)
maruishi 0:9bbe50de69d8 27 */
maruishi 0:9bbe50de69d8 28 void lcd_data_write(unsigned char c)
maruishi 0:9bbe50de69d8 29 {
maruishi 0:9bbe50de69d8 30 lcd_rs1 = 1;
maruishi 0:9bbe50de69d8 31 spi.write(c);
maruishi 0:9bbe50de69d8 32 }
maruishi 0:9bbe50de69d8 33
maruishi 0:9bbe50de69d8 34 /*
maruishi 0:9bbe50de69d8 35 LCDモジュールへのデータの送信(lenバイト)
maruishi 0:9bbe50de69d8 36 */
maruishi 0:9bbe50de69d8 37 void lcd_writeData(unsigned char* buff,int len)
maruishi 0:9bbe50de69d8 38 {
maruishi 0:9bbe50de69d8 39 int i;
maruishi 0:9bbe50de69d8 40 lcd_rs1 = 1;
maruishi 0:9bbe50de69d8 41 for(i=0; i<len; i++) {
maruishi 0:9bbe50de69d8 42 spi.write(*(buff+i));
maruishi 0:9bbe50de69d8 43 }
maruishi 0:9bbe50de69d8 44 }
maruishi 0:9bbe50de69d8 45
maruishi 0:9bbe50de69d8 46 /*
maruishi 0:9bbe50de69d8 47 LCDモジュールの初期化処理
maruishi 0:9bbe50de69d8 48 */
maruishi 0:9bbe50de69d8 49 void lcd_controllerInitial()
maruishi 0:9bbe50de69d8 50 {
maruishi 0:9bbe50de69d8 51 int i;
maruishi 0:9bbe50de69d8 52
maruishi 0:9bbe50de69d8 53 /*
maruishi 0:9bbe50de69d8 54 LCD初期化用データ
maruishi 0:9bbe50de69d8 55 cmd : true = コマンド
maruishi 0:9bbe50de69d8 56 false = データ
maruishi 0:9bbe50de69d8 57 data : 送出する内容
maruishi 0:9bbe50de69d8 58 */
maruishi 0:9bbe50de69d8 59 const struct lcd_init_data {
maruishi 0:9bbe50de69d8 60 bool cmd;
maruishi 0:9bbe50de69d8 61 unsigned char data;
maruishi 0:9bbe50de69d8 62 } lcd_init_data_table[] = {
maruishi 0:9bbe50de69d8 63 { true, 0xB1 }, // FRMCTR1
maruishi 0:9bbe50de69d8 64 { false, 0x01 },
maruishi 0:9bbe50de69d8 65 { false, 0x2C },
maruishi 0:9bbe50de69d8 66 { false, 0x2D },
maruishi 0:9bbe50de69d8 67
maruishi 0:9bbe50de69d8 68 { true, 0xB2 }, // FRMCTR2
maruishi 0:9bbe50de69d8 69 { false, 0x01 },
maruishi 0:9bbe50de69d8 70 { false, 0x2C },
maruishi 0:9bbe50de69d8 71 { false, 0x2D },
maruishi 0:9bbe50de69d8 72
maruishi 0:9bbe50de69d8 73 { true, 0xB3 }, // FRMCTR3
maruishi 0:9bbe50de69d8 74 { false, 0x01 },
maruishi 0:9bbe50de69d8 75 { false, 0x2C },
maruishi 0:9bbe50de69d8 76 { false, 0x2D },
maruishi 0:9bbe50de69d8 77 { false, 0x01 },
maruishi 0:9bbe50de69d8 78 { false, 0x2C },
maruishi 0:9bbe50de69d8 79 { false, 0x2D },
maruishi 0:9bbe50de69d8 80
maruishi 0:9bbe50de69d8 81 { true, 0xB4 }, // INVCTR
maruishi 0:9bbe50de69d8 82 { false, 0x07 },
maruishi 0:9bbe50de69d8 83
maruishi 0:9bbe50de69d8 84 { true, 0xC0 }, // PWCTR1
maruishi 0:9bbe50de69d8 85 { false, 0xA2 },
maruishi 0:9bbe50de69d8 86 { false, 0x02 },
maruishi 0:9bbe50de69d8 87 { false, 0x84 },
maruishi 0:9bbe50de69d8 88
maruishi 0:9bbe50de69d8 89 { true, 0xC1 }, // PWCTR2
maruishi 0:9bbe50de69d8 90 { false, 0xC5 },
maruishi 0:9bbe50de69d8 91
maruishi 0:9bbe50de69d8 92 { true, 0xC2 }, // PWCTR3
maruishi 0:9bbe50de69d8 93 { false, 0x0A },
maruishi 0:9bbe50de69d8 94 { false, 0x00 },
maruishi 0:9bbe50de69d8 95
maruishi 0:9bbe50de69d8 96 { true, 0xC3 }, // PWCTR4
maruishi 0:9bbe50de69d8 97 { false, 0x8A },
maruishi 0:9bbe50de69d8 98 { false, 0x2A },
maruishi 0:9bbe50de69d8 99
maruishi 0:9bbe50de69d8 100 { true, 0xC4 }, // PWCTR5
maruishi 0:9bbe50de69d8 101 { false, 0x8A },
maruishi 0:9bbe50de69d8 102 { false, 0xEE },
maruishi 0:9bbe50de69d8 103
maruishi 0:9bbe50de69d8 104 { true, 0xC5 }, // VMCTR1
maruishi 0:9bbe50de69d8 105 { false, 0x0E },
maruishi 0:9bbe50de69d8 106
maruishi 0:9bbe50de69d8 107 { true, 0x36 },
maruishi 0:9bbe50de69d8 108 { false, 0xA8 },
maruishi 0:9bbe50de69d8 109
maruishi 0:9bbe50de69d8 110 { true, 0xe0 }, // GAMCTRP1
maruishi 0:9bbe50de69d8 111 { false, 0x02 },
maruishi 0:9bbe50de69d8 112 { false, 0x1c },
maruishi 0:9bbe50de69d8 113 { false, 0x07 },
maruishi 0:9bbe50de69d8 114 { false, 0x12 },
maruishi 0:9bbe50de69d8 115 { false, 0x37 },
maruishi 0:9bbe50de69d8 116 { false, 0x32 },
maruishi 0:9bbe50de69d8 117 { false, 0x29 },
maruishi 0:9bbe50de69d8 118 { false, 0x2d },
maruishi 0:9bbe50de69d8 119 { false, 0x29 },
maruishi 0:9bbe50de69d8 120 { false, 0x25 },
maruishi 0:9bbe50de69d8 121 { false, 0x2b },
maruishi 0:9bbe50de69d8 122 { false, 0x39 },
maruishi 0:9bbe50de69d8 123 { false, 0x00 },
maruishi 0:9bbe50de69d8 124 { false, 0x01 },
maruishi 0:9bbe50de69d8 125 { false, 0x03 },
maruishi 0:9bbe50de69d8 126 { false, 0x10 },
maruishi 0:9bbe50de69d8 127
maruishi 0:9bbe50de69d8 128 { true, 0xe1 },
maruishi 0:9bbe50de69d8 129 { false, 0x03 },
maruishi 0:9bbe50de69d8 130 { false, 0x1d },
maruishi 0:9bbe50de69d8 131 { false, 0x07 },
maruishi 0:9bbe50de69d8 132 { false, 0x06 },
maruishi 0:9bbe50de69d8 133 { false, 0x2e },
maruishi 0:9bbe50de69d8 134 { false, 0x2c },
maruishi 0:9bbe50de69d8 135 { false, 0x29 },
maruishi 0:9bbe50de69d8 136 { false, 0x2d },
maruishi 0:9bbe50de69d8 137 { false, 0x2e },
maruishi 0:9bbe50de69d8 138 { false, 0x2e },
maruishi 0:9bbe50de69d8 139 { false, 0x37 },
maruishi 0:9bbe50de69d8 140 { false, 0x3f },
maruishi 0:9bbe50de69d8 141 { false, 0x00 },
maruishi 0:9bbe50de69d8 142 { false, 0x00 },
maruishi 0:9bbe50de69d8 143 { false, 0x02 },
maruishi 0:9bbe50de69d8 144 { false, 0x10 },
maruishi 0:9bbe50de69d8 145
maruishi 0:9bbe50de69d8 146 { true, 0x2a }, // CASET
maruishi 0:9bbe50de69d8 147 { false, 0x00 },
maruishi 0:9bbe50de69d8 148 { false, 0x01 },
maruishi 0:9bbe50de69d8 149 { false, 0x00 },
maruishi 0:9bbe50de69d8 150 { false, 0xA0 },
maruishi 0:9bbe50de69d8 151
maruishi 0:9bbe50de69d8 152 { true, 0x2b }, // RASET
maruishi 0:9bbe50de69d8 153 { false, 0x00 },
maruishi 0:9bbe50de69d8 154 { false, 0x02 },
maruishi 0:9bbe50de69d8 155 { false, 0x00 },
maruishi 0:9bbe50de69d8 156 { false, 0x81 },
maruishi 0:9bbe50de69d8 157
maruishi 0:9bbe50de69d8 158 { true, 0x3A },
maruishi 0:9bbe50de69d8 159 { false, 0x05 }, // 16bit/pixel
maruishi 0:9bbe50de69d8 160 { true, 0x29 },
maruishi 0:9bbe50de69d8 161 };
maruishi 0:9bbe50de69d8 162
maruishi 0:9bbe50de69d8 163 lcd_rs1 = 0;
maruishi 0:9bbe50de69d8 164 lcd_cs1 = 0;
maruishi 0:9bbe50de69d8 165 lcd_cs2 = 0;
maruishi 0:9bbe50de69d8 166
maruishi 0:9bbe50de69d8 167 spi.write(0x11);
maruishi 0:9bbe50de69d8 168 wait(0.120);
maruishi 0:9bbe50de69d8 169
maruishi 0:9bbe50de69d8 170 for(i=0; i<sizeof(lcd_init_data_table)/sizeof(lcd_init_data_table[0]); i++) {
maruishi 0:9bbe50de69d8 171 if (lcd_init_data_table[i].cmd == true) {
maruishi 0:9bbe50de69d8 172 lcd_rs1 = 0;
maruishi 0:9bbe50de69d8 173 spi.write(lcd_init_data_table[i].data);
maruishi 0:9bbe50de69d8 174 } else {
maruishi 0:9bbe50de69d8 175 lcd_rs1 = 1;
maruishi 0:9bbe50de69d8 176 spi.write(lcd_init_data_table[i].data);
maruishi 0:9bbe50de69d8 177 }
maruishi 0:9bbe50de69d8 178 }
maruishi 0:9bbe50de69d8 179 wait(0.120);
maruishi 0:9bbe50de69d8 180 lcd_cs1 = 1;
maruishi 0:9bbe50de69d8 181 lcd_cs2 = 1;
maruishi 0:9bbe50de69d8 182 }
maruishi 0:9bbe50de69d8 183
maruishi 0:9bbe50de69d8 184 void LCD_updateDisplay(int displayNo,unsigned char* buff)
maruishi 0:9bbe50de69d8 185 {
maruishi 0:9bbe50de69d8 186 if (displayNo == 0) {
maruishi 0:9bbe50de69d8 187 lcd_cs1 = 0;
maruishi 0:9bbe50de69d8 188 } else {
maruishi 0:9bbe50de69d8 189 lcd_cs2 = 0;
maruishi 0:9bbe50de69d8 190 }
maruishi 0:9bbe50de69d8 191 lcd_command_write(0x2C);
maruishi 0:9bbe50de69d8 192 lcd_data_write(0);
maruishi 0:9bbe50de69d8 193 lcd_writeData((unsigned char*)buff,128*160*2);
maruishi 0:9bbe50de69d8 194 lcd_cs1 = 1;
maruishi 0:9bbe50de69d8 195 lcd_cs2 = 1;
maruishi 0:9bbe50de69d8 196 }
maruishi 0:9bbe50de69d8 197
maruishi 0:9bbe50de69d8 198 /*
maruishi 0:9bbe50de69d8 199 LCD位置調整用の十字線表示を行う
maruishi 0:9bbe50de69d8 200 */
maruishi 0:9bbe50de69d8 201 void adjustScreen()
maruishi 0:9bbe50de69d8 202 {
maruishi 0:9bbe50de69d8 203 unsigned char fb[128*160*2];
maruishi 0:9bbe50de69d8 204 int i;
maruishi 0:9bbe50de69d8 205
maruishi 0:9bbe50de69d8 206 memset(fb,0,sizeof(fb));
maruishi 0:9bbe50de69d8 207 for(i=0; i<128; i++) {
maruishi 0:9bbe50de69d8 208 fb[(80 + i*160)*2 ] = 0xff;
maruishi 0:9bbe50de69d8 209 fb[(80 + i*160)*2 + 1] = 0xff;
maruishi 0:9bbe50de69d8 210 }
maruishi 0:9bbe50de69d8 211 for(i=0; i<160; i++) {
maruishi 0:9bbe50de69d8 212 fb[(160*64 + i)*2 ] = 0xff;
maruishi 0:9bbe50de69d8 213 fb[(160*64 + i)*2 + 1] = 0xff;
maruishi 0:9bbe50de69d8 214 }
maruishi 0:9bbe50de69d8 215 LCD_updateDisplay(0,fb);
maruishi 0:9bbe50de69d8 216 LCD_updateDisplay(1,fb);
maruishi 0:9bbe50de69d8 217 while(1);
maruishi 0:9bbe50de69d8 218 }
maruishi 0:9bbe50de69d8 219
maruishi 0:9bbe50de69d8 220 int main()
maruishi 0:9bbe50de69d8 221 {
maruishi 0:9bbe50de69d8 222 unsigned char fb[2][128*160*2];
maruishi 0:9bbe50de69d8 223 FILE *fp;
maruishi 0:9bbe50de69d8 224 int size;
maruishi 0:9bbe50de69d8 225
maruishi 0:9bbe50de69d8 226 pc.baud(115200);
maruishi 0:9bbe50de69d8 227
maruishi 0:9bbe50de69d8 228 /* LCD制御用のSPI初期設定 */
maruishi 0:9bbe50de69d8 229 spi.format(8,0);
maruishi 0:9bbe50de69d8 230 spi.frequency(15000000);
maruishi 0:9bbe50de69d8 231
maruishi 0:9bbe50de69d8 232 /* LCDモジュールのリセット */
maruishi 0:9bbe50de69d8 233 lcd_rst = 0;
maruishi 0:9bbe50de69d8 234 wait(0.1);
maruishi 0:9bbe50de69d8 235 lcd_rst = 1;
maruishi 0:9bbe50de69d8 236 wait(0.1);
maruishi 0:9bbe50de69d8 237
maruishi 0:9bbe50de69d8 238 lcd_cs1 = 1;
maruishi 0:9bbe50de69d8 239 lcd_cs2 = 1;
maruishi 0:9bbe50de69d8 240
maruishi 0:9bbe50de69d8 241 /* LCDモジュールの初期化処理の呼び出し */
maruishi 0:9bbe50de69d8 242 lcd_controllerInitial();
maruishi 0:9bbe50de69d8 243
maruishi 0:9bbe50de69d8 244 if(push_sw == 1) {
maruishi 0:9bbe50de69d8 245 /* 起動時にSW2が押されていない場合は、SDカードからのビデオ再生を実行 */
maruishi 0:9bbe50de69d8 246
maruishi 0:9bbe50de69d8 247 /* ビデオファイルのオープン */
maruishi 0:9bbe50de69d8 248 fp = fopen("/sd/video.rgb", "r");
maruishi 0:9bbe50de69d8 249
maruishi 0:9bbe50de69d8 250 while (true) {
maruishi 0:9bbe50de69d8 251 size = fread(fb, sizeof(char), 128*160*2*2, fp);
maruishi 0:9bbe50de69d8 252 if(size == 128*160*2*2) {
maruishi 0:9bbe50de69d8 253 myled = !myled;
maruishi 0:9bbe50de69d8 254 LCD_updateDisplay(0,fb[0]);
maruishi 0:9bbe50de69d8 255 LCD_updateDisplay(1,fb[1]);
maruishi 0:9bbe50de69d8 256 } else {
maruishi 0:9bbe50de69d8 257 /* 指定したサイズがリード出来ない場合には、ファイル終端と判断 */
maruishi 0:9bbe50de69d8 258 fseek(fp,0L,SEEK_SET);
maruishi 0:9bbe50de69d8 259 }
maruishi 0:9bbe50de69d8 260
maruishi 0:9bbe50de69d8 261 /* もしSW2が押されていたら、ファイルをクローズし、LCDを黒画像にする */
maruishi 0:9bbe50de69d8 262 if(push_sw == 0){
maruishi 0:9bbe50de69d8 263 fclose(fp);
maruishi 0:9bbe50de69d8 264 memset(fb[0],0,sizeof(fb[0]));
maruishi 0:9bbe50de69d8 265 LCD_updateDisplay(0,fb[0]);
maruishi 0:9bbe50de69d8 266 LCD_updateDisplay(1,fb[0]);
maruishi 0:9bbe50de69d8 267 while(1);
maruishi 0:9bbe50de69d8 268 }
maruishi 0:9bbe50de69d8 269 }
maruishi 0:9bbe50de69d8 270 } else {
maruishi 0:9bbe50de69d8 271 /* 起動時にSW2が押されている場合は、LCD調整画面を表示 */
maruishi 0:9bbe50de69d8 272 adjustScreen();
maruishi 0:9bbe50de69d8 273 }
maruishi 0:9bbe50de69d8 274
maruishi 0:9bbe50de69d8 275 }