Stand-alone HMD demo system built on mbed FRDM-K64F.
Dependencies: SDFileSystem mbed FATFileSystem
main.cpp
00001 #include "mbed.h" 00002 #include "SDFileSystem.h" 00003 00004 DigitalOut myled(LED_GREEN); 00005 Serial pc(PTC17, PTC16); 00006 DigitalOut lcd_rs1(PTB19); 00007 DigitalOut lcd_cs1(PTB18); 00008 DigitalOut lcd_cs2(PTC1); 00009 DigitalOut lcd_rst(PTC8); 00010 00011 DigitalIn push_sw(SW2); 00012 00013 SPI spi(PTD2,PTD3,PTD1); 00014 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); 00015 00016 /* 00017 LCDモジュールへのコマンドの送信(1バイト) 00018 */ 00019 void lcd_command_write(unsigned char c) 00020 { 00021 lcd_rs1 = 0; 00022 spi.write(c); 00023 } 00024 00025 /* 00026 LCDモジュールへのデータの送信(1バイト) 00027 */ 00028 void lcd_data_write(unsigned char c) 00029 { 00030 lcd_rs1 = 1; 00031 spi.write(c); 00032 } 00033 00034 /* 00035 LCDモジュールへのデータの送信(lenバイト) 00036 */ 00037 void lcd_writeData(unsigned char* buff,int len) 00038 { 00039 int i; 00040 lcd_rs1 = 1; 00041 for(i=0; i<len; i++) { 00042 spi.write(*(buff+i)); 00043 } 00044 } 00045 00046 /* 00047 LCDモジュールの初期化処理 00048 */ 00049 void lcd_controllerInitial() 00050 { 00051 int i; 00052 00053 /* 00054 LCD初期化用データ 00055 cmd : true = コマンド 00056 false = データ 00057 data : 送出する内容 00058 */ 00059 const struct lcd_init_data { 00060 bool cmd; 00061 unsigned char data; 00062 } lcd_init_data_table[] = { 00063 { true, 0xB1 }, // FRMCTR1 00064 { false, 0x01 }, 00065 { false, 0x2C }, 00066 { false, 0x2D }, 00067 00068 { true, 0xB2 }, // FRMCTR2 00069 { false, 0x01 }, 00070 { false, 0x2C }, 00071 { false, 0x2D }, 00072 00073 { true, 0xB3 }, // FRMCTR3 00074 { false, 0x01 }, 00075 { false, 0x2C }, 00076 { false, 0x2D }, 00077 { false, 0x01 }, 00078 { false, 0x2C }, 00079 { false, 0x2D }, 00080 00081 { true, 0xB4 }, // INVCTR 00082 { false, 0x07 }, 00083 00084 { true, 0xC0 }, // PWCTR1 00085 { false, 0xA2 }, 00086 { false, 0x02 }, 00087 { false, 0x84 }, 00088 00089 { true, 0xC1 }, // PWCTR2 00090 { false, 0xC5 }, 00091 00092 { true, 0xC2 }, // PWCTR3 00093 { false, 0x0A }, 00094 { false, 0x00 }, 00095 00096 { true, 0xC3 }, // PWCTR4 00097 { false, 0x8A }, 00098 { false, 0x2A }, 00099 00100 { true, 0xC4 }, // PWCTR5 00101 { false, 0x8A }, 00102 { false, 0xEE }, 00103 00104 { true, 0xC5 }, // VMCTR1 00105 { false, 0x0E }, 00106 00107 { true, 0x36 }, 00108 { false, 0xA8 }, 00109 00110 { true, 0xe0 }, // GAMCTRP1 00111 { false, 0x02 }, 00112 { false, 0x1c }, 00113 { false, 0x07 }, 00114 { false, 0x12 }, 00115 { false, 0x37 }, 00116 { false, 0x32 }, 00117 { false, 0x29 }, 00118 { false, 0x2d }, 00119 { false, 0x29 }, 00120 { false, 0x25 }, 00121 { false, 0x2b }, 00122 { false, 0x39 }, 00123 { false, 0x00 }, 00124 { false, 0x01 }, 00125 { false, 0x03 }, 00126 { false, 0x10 }, 00127 00128 { true, 0xe1 }, 00129 { false, 0x03 }, 00130 { false, 0x1d }, 00131 { false, 0x07 }, 00132 { false, 0x06 }, 00133 { false, 0x2e }, 00134 { false, 0x2c }, 00135 { false, 0x29 }, 00136 { false, 0x2d }, 00137 { false, 0x2e }, 00138 { false, 0x2e }, 00139 { false, 0x37 }, 00140 { false, 0x3f }, 00141 { false, 0x00 }, 00142 { false, 0x00 }, 00143 { false, 0x02 }, 00144 { false, 0x10 }, 00145 00146 { true, 0x2a }, // CASET 00147 { false, 0x00 }, 00148 { false, 0x01 }, 00149 { false, 0x00 }, 00150 { false, 0xA0 }, 00151 00152 { true, 0x2b }, // RASET 00153 { false, 0x00 }, 00154 { false, 0x02 }, 00155 { false, 0x00 }, 00156 { false, 0x81 }, 00157 00158 { true, 0x3A }, 00159 { false, 0x05 }, // 16bit/pixel 00160 { true, 0x29 }, 00161 }; 00162 00163 lcd_rs1 = 0; 00164 lcd_cs1 = 0; 00165 lcd_cs2 = 0; 00166 00167 spi.write(0x11); 00168 wait(0.120); 00169 00170 for(i=0; i<sizeof(lcd_init_data_table)/sizeof(lcd_init_data_table[0]); i++) { 00171 if (lcd_init_data_table[i].cmd == true) { 00172 lcd_rs1 = 0; 00173 spi.write(lcd_init_data_table[i].data); 00174 } else { 00175 lcd_rs1 = 1; 00176 spi.write(lcd_init_data_table[i].data); 00177 } 00178 } 00179 wait(0.120); 00180 lcd_cs1 = 1; 00181 lcd_cs2 = 1; 00182 } 00183 00184 void LCD_updateDisplay(int displayNo,unsigned char* buff) 00185 { 00186 if (displayNo == 0) { 00187 lcd_cs1 = 0; 00188 } else { 00189 lcd_cs2 = 0; 00190 } 00191 lcd_command_write(0x2C); 00192 lcd_data_write(0); 00193 lcd_writeData((unsigned char*)buff,128*160*2); 00194 lcd_cs1 = 1; 00195 lcd_cs2 = 1; 00196 } 00197 00198 /* 00199 LCD位置調整用の十字線表示を行う 00200 */ 00201 void adjustScreen() 00202 { 00203 unsigned char fb[128*160*2]; 00204 int i; 00205 00206 memset(fb,0,sizeof(fb)); 00207 for(i=0; i<128; i++) { 00208 fb[(80 + i*160)*2 ] = 0xff; 00209 fb[(80 + i*160)*2 + 1] = 0xff; 00210 } 00211 for(i=0; i<160; i++) { 00212 fb[(160*64 + i)*2 ] = 0xff; 00213 fb[(160*64 + i)*2 + 1] = 0xff; 00214 } 00215 LCD_updateDisplay(0,fb); 00216 LCD_updateDisplay(1,fb); 00217 while(1); 00218 } 00219 00220 int main() 00221 { 00222 unsigned char fb[2][128*160*2]; 00223 FILE *fp; 00224 int size; 00225 00226 pc.baud(115200); 00227 00228 /* LCD制御用のSPI初期設定 */ 00229 spi.format(8,0); 00230 spi.frequency(15000000); 00231 00232 /* LCDモジュールのリセット */ 00233 lcd_rst = 0; 00234 wait(0.1); 00235 lcd_rst = 1; 00236 wait(0.1); 00237 00238 lcd_cs1 = 1; 00239 lcd_cs2 = 1; 00240 00241 /* LCDモジュールの初期化処理の呼び出し */ 00242 lcd_controllerInitial(); 00243 00244 if(push_sw == 1) { 00245 /* 起動時にSW2が押されていない場合は、SDカードからのビデオ再生を実行 */ 00246 00247 /* ビデオファイルのオープン */ 00248 fp = fopen("/sd/video.rgb", "r"); 00249 00250 while (true) { 00251 size = fread(fb, sizeof(char), 128*160*2*2, fp); 00252 if(size == 128*160*2*2) { 00253 myled = !myled; 00254 LCD_updateDisplay(0,fb[0]); 00255 LCD_updateDisplay(1,fb[1]); 00256 } else { 00257 /* 指定したサイズがリード出来ない場合には、ファイル終端と判断 */ 00258 fseek(fp,0L,SEEK_SET); 00259 } 00260 00261 /* もしSW2が押されていたら、ファイルをクローズし、LCDを黒画像にする */ 00262 if(push_sw == 0){ 00263 fclose(fp); 00264 memset(fb[0],0,sizeof(fb[0])); 00265 LCD_updateDisplay(0,fb[0]); 00266 LCD_updateDisplay(1,fb[0]); 00267 while(1); 00268 } 00269 } 00270 } else { 00271 /* 起動時にSW2が押されている場合は、LCD調整画面を表示 */ 00272 adjustScreen(); 00273 } 00274 00275 }
Generated on Wed Jul 13 2022 19:52:35 by 1.7.2