//--------------------------------------------------------------------------- /* Trevaでキャプチャしちゃおうよ ============================================================================= 拡張端子の接続関係 (P/ECE上部から順に1〜8) 1.P14/FOSC1/DCLK(125番ビン)へ 2.GND 3.33Ωを通して DSIO(120番ピン)へ 4.P12/EXCL2/TBUF2/DST2(123番ピン)へ 5.VDD(+3.3V) 6.P06/#SCLK1/DMAACK3(101番ピン)へ 7.P05/SOUT1/#DMAEND2(100番ピン)へ 8.P04/SIN1/#DMAACK2(99番ピン)へ ============================================================================= 各レジスタへのアドレス CPUデータシートP.51,P.52,P.53参照 #define P0CF (*(volatile unsigned char*)0x402D0) //P0機能選択レジスタ #define P0D (*(volatile unsigned char*)0x402D1) //P0入出力兼用ポートデータレジスタ #define P0IOC (*(volatile unsigned char*)0x402D2) //P0I/O制御レジスタ #define P1CF (*(volatile unsigned char*)0x402D4) //P1機能選択レジスタ #define P1D (*(volatile unsigned char*)0x402D5) //P1入出力兼用ポートデータレジスタ #define P1IOC (*(volatile unsigned char*)0x402D6) //P1I/O制御レジスタ #define PCFEX (*(volatile unsigned char*)0x402DF) //ポート機能拡張レジスタ ============================================================================= 拡張端子1:P14を入力用で使用するには @(PCFEX &= 0xFE)で0bit目を0にして、P12,P14を汎用ポートとして  使用できるようにする。 A(P1CF &= 0xEF)で4bit目を0にして、P14をP14として使用できるよ  うにする。 B(P1IOC &= 0xEF)で4bit目を0にして、P14を入力ポートとして設定  する。 C((P1D &= 0x10) >> 4)でP14の値を参照できます。値は0か1です。 ============================================================================= 拡張端子1:P14を出力用で使用するには @(PCFEX &= 0xFE)で0bit目を0にして、P12,P14を汎用ポートとして  使用できるようにする。 A(P1CF &= 0xEF)で4bit目を0にして、P14をP14として使用できるよ  うにする。 B(P1IOC |= 0x10)で4bit目を1にして、P14を出力ポートとして設定  する。 C(P1D &= 0xEF)でLow、(P1D |= 0x10)でHighになる。 ============================================================================= 拡張端子4:P12を入力用で使用するには @(PCFEX &= 0xFE)で0bit目を0にして、P12,P14を汎用ポートとして  使用できるようにする。 A(P1CF &= 0xFB)で2bit目を0にして、P12をP12として使用できるよ  うにする。 B(P1IOC &= 0xFB)で2bit目を0にして、P12を入力ポートとして設定  する。 C((P1D &= 0x04) >> 2)でP12の値を参照できます。値は0か1です。 ============================================================================= 拡張端子4:P12を出力用で使用するには @(PCFEX &= 0xFE)で0bit目を0にして、P12,P14を汎用ポートとして  使用できるようにする。 A(P1CF &= 0xFB)で2bit目を0にして、P12をP12として使用できるよ  うにする。 B(P1IOC |= 0x04)で2bit目を1にして、P12を出力ポートとして設定  する。 C(P1D &= 0xFB)でLow、(P1D |= 0x04)でHighになる。 ============================================================================= 拡張端子6:P06を入力用で使用するには @(PCFEX &= 0xBF)で6bit目を0にして、P06を汎用ポートとして  使用できるようにする。 A(P0CF &= 0xBF)で6bit目を0にして、P06をP06として使用できるよ  うにする。 B(P0IOC &= 0xBF)で6bit目を0にして、P06を入力ポートとして設定  する。 C((P0D &= 0x40) >> 6)でP06の値を参照できます。値は0か1です。 ============================================================================= 拡張端子6:P06を出力用で使用するには @(PCFEX &= 0xBF)で6bit目を0にして、P06を汎用ポートとして  使用できるようにする。 A(P0CF &= 0xBF)で6bit目を0にして、P06をP06として使用できるよ  うにする。 B(P0IOC |= 0x40)で6bit目を1にして、P06を出力ポートとして設定  する。 C(P0D &= 0xBF)でLow、(P0D |= 0x40)でHighになる。 ============================================================================= 拡張端子7:P05を入力用で使用するには @(PCFEX &= 0xDF)で5bit目を0にして、P05を汎用ポートとして  使用できるようにする。 A(P0CF &= 0xDF)で5bit目を0にして、P05をP05として使用できるよ  うにする。 B(P0IOC &= 0xDF)で5bit目を0にして、P05を入力ポートとして設定  する。 C((P0D &= 0x20) >> 5)でP05の値を参照できます。値は0か1です。 ============================================================================= 拡張端子7:P05を出力用で使用するには @(PCFEX &= 0xDF)で5bit目を0にして、P05を汎用ポートとして  使用できるようにする。 A(P0CF &= 0xDF)で5bit目を0にして、P05をP05として使用できるよ  うにする。 B(P0IOC |= 0x20)で5bit目を1にして、P05を出力ポートとして設定  する。 C(P0D &= 0xDF)でLow、(P0D |= 0x20)でHighになる。 ============================================================================= 拡張端子8:P04を入力用で使用するには @(PCFEX &= 0xEF)で4bit目を0にして、P04を汎用ポートとして  使用できるようにする。 A(P0CF &= 0xEF)で4bit目を0にして、P04をP04として使用できるよ  うにする。 B(P0IOC &= 0xEF)で4bit目を0にして、P04を入力ポートとして設定  する。 C((P0D &= 0x10) >> 4)でP04の値を参照できます。値は0か1です。 ============================================================================= 拡張端子8:P04を出力用で使用するには @(PCFEX &= 0xEF)で4bit目を0にして、P04を汎用ポートとして  使用できるようにする。 A(P0CF &= 0xEF)で4bit目を0にして、P04をP04として使用できるよ  うにする。 B(P0IOC |= 0x10)で4bit目を1にして、P04を出力ポートとして設定  する。 C(P0D &= 0xEF)でLow、(P0D |= 0x10)でHighになる。 ============================================================================= P/ECEで使用できるポートをすべて出力用で使用する場合には次の ように設定する //P04,P05,P06,P12,P14を汎用ポートとして使用できるようにする //0x8E = &B10001110 PCFEX &= 0x8E; //P04,P05,P06の機能をI/Oポートとして使用できるようにする //0x8F = &B10001111 P0CF &= 0x8F; //P12,P14の機能をI/Oポートとして使用できるようにする //0xEB = &B11101011 P1CF &= 0xEB; //P04,P05,P06を出力ポートとして使用できるようにする //0x70 = &B01110000 P0IOC |= 0x70; //P12,P14を出力ポートとして使用できるようにする //0x14 = &B00010100 P1IOC |= 0x14; */ //--------------------------------------------------------------------------- //■■ ファイルインクルード ■■■■■■■■■■■■■■■■■■■■■■■■■ //--------------------------------------------------------------------------- #include #include #include #include #include //--------------------------------------------------------------------------- //■■ 定数定義 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //--------------------------------------------------------------------------- //各レジスタへのアドレス //CPUデータシートP.51,P.52,P.53参照 #define P0CF (*(volatile unsigned char*)0x402D0) //P0機能選択レジスタ #define P0D (*(volatile unsigned char*)0x402D1) //P0入出力兼用ポートデータレジスタ #define P0IOC (*(volatile unsigned char*)0x402D2) //P0I/O制御レジスタ #define P1CF (*(volatile unsigned char*)0x402D4) //P1機能選択レジスタ #define P1D (*(volatile unsigned char*)0x402D5) //P1入出力兼用ポートデータレジスタ #define P1IOC (*(volatile unsigned char*)0x402D6) //P1I/O制御レジスタ #define PCFEX (*(volatile unsigned char*)0x402DF) //ポート機能拡張レジスタ //定数 #define MAX_CAPTURE_BUFF 2 //キャプチャバッファの最大数 #define MAX_ARRAY_BUFF 5 //配列バッファ数 #define MAX_CHAIN 2 //フレームチェーン数 //--------------------------------------------------------------------------- //■■ グローバルオブジェクト ■■■■■■■■■■■■■■■■■■■■■■■■ //--------------------------------------------------------------------------- BYTE g_bDraw = 1; //画面表示フラグ BYTE g_TrevaBuff[MAX_CAPTURE_BUFF][96 * 72 * 2]; //Trevaからのキャプチャバッファ //1Pixel = 16bit W96 * H72 BYTE g_ArrayBuff[MAX_CHAIN][MAX_ARRAY_BUFF][128 * 88]; //配列バッファ volatile BYTE g_nWriteBuffIndex = 0; //書き込みバッファのインデックス volatile BYTE g_nReadBuffIndex = 0; //読み込みバッファのインデックス volatile BYTE g_nWriteChainIndex = 0; //書き込みフレームチェーンのインデックス volatile BYTE g_nReadChainIndex = (MAX_CHAIN - 1); //読み込みフレームチェーンのインデックス int g_nTrevaView_X = 0; //Trevaの画像を表示する左上X座標 int g_nTrevaView_Y = 0; //Trevaの画像を表示する左上Y座標 int g_CaptureThreadID; //キャプチャスレッドのID int g_CreateColorDataThreadID; //擬似多階調カラーデータ作成スレッドのID volatile BYTE g_bSync = 0; //画面同期フラグ BYTE g_nViewBuffIndex = 0; //描画バッファインデックス //擬似階調色変換テーブル BYTE g_ColorTable[MAX_ARRAY_BUFF * (4 * MAX_ARRAY_BUFF - (MAX_ARRAY_BUFF - 1))] = { 0,0,0,0,0, 1,0,0,0,0, 1,0,1,0,0, 1,0,1,0,1, 1,1,1,0,1, 1,1,1,1,1, 2,1,1,1,1, 2,1,2,1,1, 2,1,2,1,2, 2,2,2,1,2, 2,2,2,2,2, 3,2,2,2,2, 3,2,3,2,2, 3,2,3,2,3, 3,3,3,2,3, 3,3,3,3,3, }; //--------------------------------------------------------------------------- //■■ 関数プロトタイプ宣言 ■■■■■■■■■■■■■■■■■■■■■■■■■ //--------------------------------------------------------------------------- //I/Oポートの初期化 void Init_IO(void); //1bit分データを取得する inline int Read_bit(void); //1byte分データを取得する inline int Read_byte(void); //フレームの同期を取る inline int Sync_Frame(void); //1フレーム分のデータを取得 inline void Read_Frame(void); //Trevaの画像を描画する位置を設定 //int x,y フレームの左上を指定 //クリッピングはしないので注意 void SetTrevaView(int x,int y); //1フレームを画面に描画 //BYTE InversFlag 1で上下反転 inline void Draw_Frame(BYTE InverseFlag); //画面の同期が取れないときの画面を描画 inline void DrawNoSync(void); //配列バッファ初期化 void InitArrayBuff(void); //キャプチャ画像から配列バッファに擬似階調画像を作成 inline void CreatePseudoColorBuff(void); //画像読み込みスレッド void CaptureThread(void); //擬似多階調データ作成スレッド void CreateColorDataThread(void); //--------------------------------------------------------------------------- //■■ インプリメント ■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //--------------------------------------------------------------------------- void Init_IO(void) { //I/Oポートの初期化 //Trevaでのキャプチャでは、P/ECEのI/Oポートで、キャプチャ //タイミングの基準とするクロックの出力と、Trevaからの画像 //データを1bitずつもらうデータの入力を行います。 //で、このプログラムではP14をクロック出力、P12をデータ入力 //として使用します。 //P14・P12を汎用ポートとして設定 PCFEX &= 0xFE; //P14・P12の使用を許可させる P1CF &= 0x6B; //P14を出力用ポートとして設定する P1IOC |= 0x10; //P12を入力用ポートとして設定する P1IOC &= 0xFB; } //--------------------------------------------------------------------------- int Read_bit(void) { //1bit分データを取得する //クロック信号を01と出力すると、信号が1になった時 //(立ち上がりエッヂ)でTrevaから何かデータが1bit //送られてくるので、それを取得する int d; //データ //P14にクロック信号'0'(Low)を出力 //~(1<<4) = 0xEF P1D &= ~(1<<4); //立ち上がりでP12からデータを1bit読み込む d = ((P1D & (1<<2)) >> 2); //P14にクロック信号'1'(High)を出力 //(1<<4) = 0x10 P1D |= (1<<4); //読み込み結果を返す return d; } //--------------------------------------------------------------------------- int Read_byte(void) { //1byte分データを取得する //クロック信号を01と出力すると、信号が1になった時 //(立ち上がりエッヂ)でTrevaから何かデータが1bit //送られてくるので、それを取得する int d = 0; //データ int c = 8; //カウンタ //1bit読み込みを8回繰り返す while(c) { //TrevaからのデータはMSB(最上位ビット)から //送られてくるので、現在のデータを1bit上位(左)にシフト d <<= 1; //P14にクロック信号'0'(Low)を出力 //~(1<<4) = 0xEF P1D &= ~(1<<4); //立ち上がりでP12からデータを1bit読み込む d |= ((P1D & (1<<2)) >> 2); //P14にクロック信号'1'(High)を出力 //(1<<4) = 0x10 P1D |= (1<<4); //カウンタ更新 c--; } //読み込み結果を返す return d; } //--------------------------------------------------------------------------- int Sync_Frame(void) { //フレームの同期を取る //Trevaのフレーム同期の取り方 //詳しいことは、Trevaを解析している「ぱ研」のページを見ていただくとして //「ぱ研」http://www.paken.org:8080/ //@100bit連続して'1'が来るのを待つ //Aマジックナンバー'0xAA55FF'が来るのを待つ //Bマジックナンバーを確認したら、続く29byte分のデータを無視する //Cこの後に画像データが来ます。 int c = 0; //カウンタ int magic = 0; //マジックナンバーチェック用 DWORD retry = 0; //失敗カウンタ //@100bit連続して'1'が来るのを待ちます c = 0; while(c < 100) { //'1'が来たらカウントアップ if(Read_bit() == 1) c++; else { c = 0; //'0'が来たらカウントリセット retry++; //失敗カウンタ更新 //失敗が続いたら、同期が取れないとして、戻る if(retry >= 50000) return 0; } } //Aマジックナンバー'0xAA55FF'が来るのを待つ magic = 0; retry = 0; while((magic & 0xffffff) != 0xAA55FF) { //失敗カウンタ更新 retry++; //ずーっとマジックナンバーが来なかったら、 //同期が取れないとして、戻る if(retry >= 60000) return 0; //現在のデータを上位に1bitシフト magic <<= 1; //デ―タを1bit取得 if(Read_bit() == 1) magic |= 0x1; } //Bマジックナンバーを確認したら、続く29byte分のデータを無視する for(c = 0;c < 29;++c) Read_byte(); //1byte取得するけど使わない //画像データを取得するタイミングになったので、1を返す return 1; } //--------------------------------------------------------------------------- void Read_Frame(void) { //1フレーム分のデータを取得 int x,y; //ループカウンタ BYTE data = 0; //データ取得用バッファ int Index = 0; //画像データを保持する配列のインデックス //Trevaの画面の解像度は96 * 72で1Pixelにつき2byteの //情報を持っています。 //2byteのうちの上位1byteが色差(UV)で、下位1byteが輝度(Y) //となっています。 //Y方向ループ for(y = 0;y < 72;++y) { //X方向ループ for(x = 0;x < 96;++x) { //1ピクセルの情報を取得 data = Read_byte(); //上位バイトを取得 g_TrevaBuff[g_nWriteBuffIndex][Index] = data; Index++; data = Read_byte(); //下位バイトを取得 g_TrevaBuff[g_nWriteBuffIndex][Index] = data; Index++; } } //書き込みバッファのインデックスを更新 g_nWriteBuffIndex++; if(g_nWriteBuffIndex >= MAX_CAPTURE_BUFF) g_nWriteBuffIndex = 0; } //--------------------------------------------------------------------------- void SetTrevaView(int x,int y) { //Trevaの画像を描画する位置を設定 //int x,y フレームの左上を指定 //クリッピングはしないので注意 g_nTrevaView_X = x; g_nTrevaView_Y = y; } //--------------------------------------------------------------------------- void Draw_Frame(BYTE InversFlag) { //1フレームを画面に描画 //BYTE InversFlag 1で上下反転 /* int tx,ty; //ループカウンタ int offset; //Trevaの1ラインを描画してから、 //次のラインの描画位置までのオフセット BYTE *tr_ptr; //Trevaの画像データへのポインタ BYTE *pvram; //P/ECEの仮想VRAMへのポインタ //オフセットを算出 offset = 128 - (g_nTrevaView_X + 96) + g_nTrevaView_X; //フレームデータの下位1バイトを右に6bitシフトして //反転したものを画素データとする //ポインタ初期化 tr_ptr = &g_TrevaBuff[g_nReadBuffIndex][1]; pvram = &vbuff[g_nTrevaView_Y * 128 + g_nTrevaView_X]; //Y方向ループ for(ty = 0;ty < 72;++ty) { //X方向ループ for(tx = 0;tx < 96;++tx) { *pvram = (~(*tr_ptr >> 6) & 0x03); //1ピクセル分ポインタを進める tr_ptr += 2; pvram++; } //P/ECEの仮想VRAMのポインタを次のラインに移動 pvram += offset; } //読み込みバッファのインデックスを更新 g_nReadBuffIndex++; if(g_nReadBuffIndex >= MAX_CAPTURE_BUFF) g_nReadBuffIndex = 0; */ } //--------------------------------------------------------------------------- void DrawNoSync(void) { //画面の同期が取れないときの画面を描画 int tx,ty; //ループカウンタ int offset; //Trevaの1ラインを描画してから、 //次のラインの描画位置までのオフセット BYTE *pvram; //P/ECEの仮想VRAMへのポインタ //オフセットを算出 offset = 128 - (g_nTrevaView_X + 96) + g_nTrevaView_X; //Trevaの画像領域を白で初期化 //ポインタ初期化 pvram = (pceLCDSetBuffer(INVALIDPTR) + g_nTrevaView_Y * 128 + g_nTrevaView_X); //Y方向ループ for(ty = 0;ty < 72;++ty) { //X方向ループ for(tx = 0;tx < 96;++tx) { *pvram = 0; //1ピクセル分ポインタを進める pvram++; } //P/ECEの仮想VRAMのポインタを次のラインに移動 pvram += offset; } //Trevaの画面枠を描画 pceLCDLine(3, g_nTrevaView_X,g_nTrevaView_Y, g_nTrevaView_X + 95,g_nTrevaView_Y); pceLCDLine(3, g_nTrevaView_X + 95,g_nTrevaView_Y, g_nTrevaView_X + 95,g_nTrevaView_Y + 71); pceLCDLine(3, g_nTrevaView_X + 95,g_nTrevaView_Y + 71, g_nTrevaView_X,g_nTrevaView_Y + 71); pceLCDLine(3, g_nTrevaView_X,g_nTrevaView_Y + 71, g_nTrevaView_X,g_nTrevaView_Y); //メッセージを描画 pceFontSetPos(g_nTrevaView_X + ((96 - 80) / 2), g_nTrevaView_Y + ((72 - 10) / 2)); pceFontPrintf("同期が取れません"); } //--------------------------------------------------------------------------- void InitArrayBuff(void) { //配列バッファ初期化 int i,j; //フレームチェーンループ for(i = 0;i < MAX_CHAIN;++i) { //すべて白で初期化 for(j = 0;j < MAX_ARRAY_BUFF;++i) memset(g_ArrayBuff[i][j],0,128*88); } } //--------------------------------------------------------------------------- void CreatePseudoColorBuff(void) { //キャプチャ画像から配列バッファに擬似階調画像を作成 //この関数は、Trevaから新しいキャプチャ画像が取得できた時に //呼ばれるもので、g_nTrevaView_X,g_nTrevaView_Yに表示枠の左 //上座標が格納されていることと、最新のキャプチャ画像が、 //g_TrevaBuff[g_nReadBuffIndex][]に格納されていることが前提 //条件である。 //これらの情報から、新しいキャプチャ画像の擬似階調色バッファ //を自動作成する BYTE x,y,i; WORD tc; //作成ループ for(y = 0;y < 72;++y) { for(x = 0;x < 96;++x) { //Trevaからのピクセルデータを取得(輝度のみ) //tc = g_TrevaBuff[g_nReadBuffIndex][96 * 2 * y + x * 2 + 1]; tc = g_TrevaBuff[g_nReadBuffIndex][192 * y + (x << 1) + 1]; /* //ちょっと明るく調整 tc += 20; if(tc >= 255) tc = 255; */ //256階調の輝度を16階調に落とす tc >>= 4; //画像の画素値とP/ECEの画素値は白黒反転しているので、 //値を反転させる tc = ((~tc) & 0x0F); //各擬似階調色を配列バッファに格納 for(i = 0;i < MAX_ARRAY_BUFF;++i) g_ArrayBuff[g_nWriteChainIndex][i][128 * (g_nTrevaView_Y + y) + (g_nTrevaView_X + x)] = g_ColorTable[MAX_ARRAY_BUFF * tc + i]; } } //読み込みバッファのインデックスを更新 g_nReadBuffIndex++; if(g_nReadBuffIndex >= MAX_CAPTURE_BUFF) g_nReadBuffIndex = 0; //書き込みフレームチェーンのインデックスを更新 g_nWriteChainIndex++; if(g_nWriteChainIndex >= MAX_CHAIN) g_nWriteChainIndex = 0; //読み込みフレームチェーンのインデックスを更新 g_nReadChainIndex++; if(g_nReadChainIndex >= MAX_CHAIN) g_nReadChainIndex = 0; } //--------------------------------------------------------------------------- void CaptureThread(void) { //画像読み込みスレッド //無限ループ while(1) { //画面の同期を取る if(Sync_Frame() == 1) { //1フレームの画像データを取得 Read_Frame(); //同期OK g_bSync = 1; } else { //同期が取れない g_bSync = 0; } } } //--------------------------------------------------------------------------- void CreateColorDataThread(void) { //擬似多階調データ作成スレッド while(1) { //擬似多階調データ作成 CreatePseudoColorBuff(); } } //--------------------------------------------------------------------------- void pceAppInit( void ) { //液晶画面表示ストップ pceLCDDispStop(); //仮想画面用ワークエリアのポインタを設定 //(仮想画面を作成) pceLCDSetBuffer(g_ArrayBuff[0][0]); //アイドル処理を行う周期を指定します pceAppSetProcPeriod(1000 / 78); //pceAppSetProcPeriod(1000 / 60); //ポートの初期化 Init_IO(); //配列バッファ初期化 //なんか初期化するとフリーズするのでとりあえずやめ //InitArrayBuff(); //Treva画像を描画する位置を設定 SetTrevaView((128 - 96) / 2,(88 - 72) / 2); //スレッド機構初期化 thread_gr_init(); //キャプチャスレッド生成 g_CaptureThreadID = thread_create(CaptureThread); //擬似多階調カラーデータ作成スレッド生成 g_CreateColorDataThreadID = thread_create(CreateColorDataThread); //スレッドの切り替わりを許可 thread_unlock(); //液晶画面表示スタート pceLCDDispStart(); } //--------------------------------------------------------------------------- void pceAppProc(int cnt) { //画面の更新 unsigned long pad; //画面描画 if(g_bSync == 1) { //同期が取れてる //仮想VRAMを切り替え pceLCDSetBuffer(g_ArrayBuff[g_nReadChainIndex][g_nViewBuffIndex]); //表示インデックス更新 g_nViewBuffIndex++; if(g_nViewBuffIndex >= MAX_ARRAY_BUFF) g_nViewBuffIndex = 0; } else { //同期が取れない DrawNoSync(); } //トリガ情報取得 pad = pcePadGet(); //前進 /* if(pad & TRG_UP) { //P04:Low P0D &= 0xEF; //P05:Low P0D &= 0xDF; //P06:High P0D |= 0x40; } //後退進 if(pad & TRG_DN) { //P04:Low P0D &= 0xEF; //P05:High P0D |= 0x20; //P06:Low P0D &= 0xBF; } //右旋回 if(pad & TRG_RI) { //P04:High P0D |= 0x10; //P05:High P0D |= 0x20; //P06:Low P0D &= 0xBF; } //左旋回 if(pad & TRG_LF) { //P04:High P0D |= 0x10; //P05:Low P0D &= 0xDF; //P06:High P0D |= 0x40; } //A・Bボタンで停止 if((pad & TRG_B) || (pad & TRG_A)) { //P04,P05,P06,P12,P14をすべてLowにする P0D &= 0x8F; //&B10001111 P1D &= 0xEB; //&B11101011 } */ //Startボタンで液晶表示切替 if(pad & TRG_START) { switch(g_bDraw) { case 0: //画面が消えてる //液晶画面表示スタート pceLCDDispStart(); //フラグ更新 g_bDraw = 1; break; case 1: //画面がついてる //液晶画面表示ストップ pceLCDDispStop(); //フラグ更新 g_bDraw = 0; break; } } pceLCDTrans(); //画面更新 } //--------------------------------------------------------------------------- void pceAppExit( void ) { //アプリ終了時の処理 //P04,P05,P06,P12,P14をすべてLowにする P0D &= 0x8F; //&B10001111 P1D &= 0xEB; //&B11101011 //キャプチャスレッド強制終了 thread_terminate(g_CaptureThreadID); //キャプチャスレッドが終了するのを待ちます thread_wait_term(g_CaptureThreadID); //擬似多階調カラーデータ作成スレッド強制終了 thread_terminate(g_CreateColorDataThreadID); //擬似多階調カラーデータ作成スレッドが終了するのを待ちます thread_wait_term(g_CreateColorDataThreadID); //スレッドの切り替わりを許可 thread_unlock(); //スレッド機構の終了 thread_gr_stop(); } //---------------------------------------------------------------------------