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

Dependencies:   SDFileSystem mbed FATFileSystem

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }