Vol.917 25.Apr.2025

ディスクの管理 カラー画像に文字表示

D ディスクの管理  〜HDD、SDカード、USBメモリなど

by fjk

 SDカードやUSBメモリなどを使っていると、突然メモリが読めなくなるトラブルに逢うことがある。そのような時に、Windowsでは幾つかのツールが準備されている。これらのツールで、ファイルシステムの復旧はできる。しかし、場合によってはデータの回復は難しい。
 と、ツールの使用前に、ディスクの管理に関して、おさらい、

  1. ディスクの状態を確認するために、「ディスクの管理」を開く方法
    @スタートボタンをクリック、
    ・「すべてのアプリ」
    ・「Windowsツール」
    ・「コンピューターの管理」
    ・「ディスクの管理」をクリックし
    Aショートカットキー「Win」 + 「X」
    ・続けて 「K」キーを入力
    Bスタートボタンを右クリック、
    ・メニューから「ディスクの管理」
    ※ まだ、その他の方法もある・・
    【参考】 ディスク管理の使い方

    ディスクの管理

  2. ベーシックディスクとダイナミックディスク
    • 「ベーシックディスク」は、従来からあるディスク管理方式で、多くのOSに対応し、複数OSの混在も可能。容量はMBRで2TB、GPTならほぼ制限無し(8ZB)。
    • 「ダイナミックディスク」は、ディスク領域(ボリューム)を2000個作成でき、複数のボリュームでストライプ、ミラーやRAID5方式などが使用可能。しかし、利用はwindows2000以降のみ。
    • ベーシックディスク→ダイナミックディスクへの変換はそのままできるが、ダイナミックディスク→ベーシックディスクへの変換はディスクの中身をフォーマットして初期化する必要がある。
       
  3. MBR(Master_Boot_Recode)とGPT(Globally_Unique_IDentifier_Partition_Table)
    • 「MBR」は、PC/AT時代から採用されたディスク管理システムで、ほとんどのOSの起動に対応し、最大容量は2TB、パーティションの数は最大4(内一つは拡張パーティションにでき、拡張パーティションの中に論理ドライブを複数作成可)に制限される。
    • 「GPT」は、MBRの制約を克服するため、パーティション数とディスクサイズの拡張が行われた。ブートにはUEFIが用いられ、セキュアブート機能などの高度な起動が可能。また、セクターのバックアップやCRCを使用することができ、保護機能が強化されている。
    • 【参考】「分かりやすいMBRとGPTの仕組みと違い、OSからの確認方法」
       
  4. FAT32、exFatとNTFS
    • 「Fat32」(File_Allocation_Table)とは、ファイルを管理するシステムで、単一ファイルサイズの上限は4GB、メモリの最大容量は2TB。古い規格なので、MacやLinuxなどの多くのOSに対応し、USBメモリやデジカメなど、その汎用性が高い。
      【参考】「FAT32ファイルサイズ4GB制限とパーティションサイズ制限の解除方法」
    • 「exFAT」とは、フラッシュドライブ向けに最適化された規格のFATで、WindowsとMacの両方に対応。基本的機能はFAT32と同じだが、ファイル・ボリューム最大サイズは256TB。
    • 「NTFS」とは、WindowsNTから採用されたファイルシステムで、ファイル・ボリュームの最大サイズはexFATと同様256TB。exFATに比べ、ディスク領域の節約とセキュリティの強化が可能。しかし、Macでは読込のみ可能で書込ができない。
      【参考】 partitionwizard
       
  5. コマンドラインによるディスクの管理
    「ディスクの管理画面」からでも、フォーマットなどいくつかの機能が使えるが、コマンドラインから以下のツールを使うと、もっと多くの管理ができる。
    @ chkdsk  ーーーーー> abc807で紹介
    A CrystalDiskInfo ーー> abc809で紹介
    B diskpart ーーーーー> 以下を参照

● diskpartの使い方 (コマンドプロンプトを管理者権限付で開きdiskpartと入力)
diskpartはWindowsでディスク、パーティション、ボリュームの管理を行うための強力なツールで、ディスクの初期化、パーティションの作成や削除、ボリュームの拡張や縮小などが行える。
<利用例>
・ディスクの一覧表示
 DISKPART> list disk
;ボリューム一覧の表示
 
・パーティションの作成
 DISKPART> select disk 1
;disk1にフォーカスを移動
 DISKPART> create patition primary size=50000
;パーティションの作成
 
・パーテションの削除
 DISKPART> select disk 1
;フォーカスに移動
 DISKPART> list partition
;パーティション一覧の表示
 DISKPART> select partition 1
;partition1にフォーカスを移動
 DISKPART> delete partition
;パーティションの削除
 
・ボリュームの拡張
 DISKPART> select volume 2
;ボリューム2にフォーカスを移動
 DISKPART> extend
;空き領域に領域を拡張
 
・新しいディスクの初期化
 DISKPART> select disk 2
;disk2にフォーカスを移動
 DISKPART> clean
;パーティション・領域の削除
 DISKPART> create partition primary
;パーティションの作成
 DISKPART> format fs=ntfs quick
;領域をNTFSでフォーマットする
 DISKPART> assigne letter=E
;ドライブ文字にEを割り付ける

【参考】diskpartの詳細・使い方(Microsoft)


P PICでSDカードを使う(4) 〜画像にファイル名も表示

by fjk

 abc916まで、SDカードのBMP画像データを読出し、QT095Bに表示することができたが、さらにファイル名も表示できるよう、以下の文字表示機能も追加した。

・5x7ドットのアスキー文字、8x16ドット文字、16x16ドット文字を256色で表示。
・文字の背景に、背景色(bcl:但しbcl=1は黒)または透明(bcl=0)を選択できる。
 
※ 文字表示画面と文字画面の上下の向きが合わないことがある。
 そこで、GIMPで画像を回転や左右反転したBMPファイルを作ることで対応した。

【ハード】
 abc916の回路をそのまま利用した(ピン名も同じ)。
 
【ソフト】
 プログラムが長くなり、判りにくくなってきたので、いくつかのファイルに分割することにした。

<ターミナルコマンド> []はオプション
X:
カウンタ表示ON/OFF
C:
画面消去
G[n]:
グラフィックテスト
T:
マウントテスト
R:
SDから読出し(txtファイルのみ)
W:
SDにカウント値を書込む
F[name]:
ファイル名[name]をセット
U:
SDから読出し16進数でダンプ
V:
BMPファイルの画像を表示
P[str]:
文字表示テスト(strは表示文字)
<ファイルリスト>
abc917-18857.c
// メインファイル
myProject.h
// 自作ヘッダーファィル
myFunction.c
// 自作関数ファイル
QT095B.h
// OLEDヘッダーファイル
QT095B.c
// OLED関数ファイル

  ☆MCCジェネレートファイル
  mcc_genarated_fileの内
    eusart.cに次項で説明の2行を追加
 


背景色(有・透明)文字表示例

画像と名前の表示例

★eusart.cの変更
 eusart.c内に自作した割り込みハンドラーのmyEusart()関数などを直接記述していたが、myFunction.c内にmyEusart()を記述することで、eusart.cには以下の2行(赤字)を追加記述するだけとした(eusartのHandlerも使ってみたが、何故か上手くいかなかったので・・)。

**
  Section: Included Files
*/
#include "eusart.h"
#include "../myProject.h"

  //ーーー<途中省略>ーーー

void EUSART_Receive_ISR(void)
{
  //ーーー<途中省略>ーーー

  // or set custom function using EUSART_SetRxInterruptHandler()
    myEusart();
}

【自作関数・ヘッダー】 myProject.h/myFunction.c(zip)
 よく使用する自作関数をmyFunctuion.c内に纏めて記述した。さらに、myProject.hにマクロの宣言や自作関数のプロトタイプ宣言なども記述した。


/*********************************(myProject.h)******
 *   プロジェクト個別条件指定ファイル 【強化版】  *
 *   (main.cと同じフォルダーに作成)             *
 ****************************************************/
#include "mcc_generated_files/mcc.h"
#include <string.h>

#define  ON    1
#define  OFF   0

/***** PIC電源電圧 ***********************/
//--- VCC宣言無しは5V(VCC=50と同じ)
#define VCC   50                // 電源電圧は5V
//#define VCC   33              // 電源電圧は3.3V

/***** EUSARTモジュール *******************/
#define EU_BFSIZE  120

#define ECHO  ON                // エコー有り
//#define ECHO  OFF             // エコー無し
// ** EXCEL_VBAと通信する場合は ECHO OFF にすること

/*=== Eusart受信割り込みハンドラー ==========
 *    eusrt.cのEUSART_Recive_ISRに追加すること    */
void myEusart(void);

/*=== 文字列シリアル出力関数 ===*/
//--- Eusartへ文字列送信
/*   *str: 出力する文字列    */
void EU_Write(char *str);

//--- Eusartへ改行を送信
void EU_Write_CR(void);

//--- Eusartへ文字列送信(改行付)
/*   *str: 出力する文字列   */
void EU_Puts(char *str);

/***** MSSPモジュール *********************/
#define MASTER 1
#define SRAVE  2
//#define I2CMODE MASTER        // マスターとして使用
//#define I2CMODE SRAVE         // スレーブとして使用
//--- MSSPが一つしか無い場合は I2C宣言無し
//#define I2C  1                // I2C1を使用
//#define I2C  2                // I2C2を使用

#if I2CMODE == MASTER
    #if I2C == 1
        #include "mcc_generated_files/examples/i2c1_master_example.h"
    #elif I2C == 2
        #include "mcc_generated_files/examples/i2c2_master_example.h"
    #else
        #include "mcc_generated_files/examples/i2c_master_example.h"
    #endif
 //   #define I2CLCD_Adr 0x3c   // LCDのI2Cアドレス
#endif

/******  SPIモジュール  *******/
#define SPIMODE MASTER          // マスターとして使用
//#define SPIMODE SRAVE         // スレーブとして使用

//#define SPI_EXCHG(b)  (SPI1_ExchangeByte(b))
#define  SPI_EXCHG(b)  (SPI2_ExchangeByte(b))
#define  SSPEN_ON()     SSP2CON1bits.SSPEN = 1
#define  SSPEN_OFF()    SSP2CON1bits.SSPEN = 0

/******  Font ROM 使用条件 ********/
//#define USE_FONT_ROM          // フォントROMを使用する場合
//#define ROM_MAP2              // 全角フォントアドレス2(新)を使用

/******  Delay Macros  ********/
#define __delay_us(x) _delay((uint32_t)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((uint32_t)((x)*(_XTAL_FREQ/4000.0))) 

/*==  文字列変換関数  ===========*/
//---- 16進文字列を10進数に変換
/*   *str: 変換したい文字列
 *  rtn  : 変換した数値(符号無し32ビット)*/ 
uint32_t my_xtoi(char *str);

//---  16進数(負号無し)を文字列に変換
/*    *str: 変換後に格納される文字列のポインタ
 *    wd:   変換したい負号無し16ビット整数
 *    dg:   16進数の桁数、指定桁数が少ない場合上位の数は無視)*/
void my_utoa(char *str, uint16_t wd, uint8_t dg);

//---  10進数(符号無し)を文字列に変換
/*    *str: 変換後に格納される文字列のポインタ
 *    wd:   変換したい負号無し16ビット整数 */
void my_itoa(char *str, uint16_t wd);

/******* End of File ********/

/********************(myFunction.c)******
 *  自作汎用関数
 ****************************************/
#include <string.h>
#include "myProject.h"          // #define EU_BFSIZE

/***  EUSARTシリアル関数 **********************/
extern char    RBuf[];          // 受信文字Buffer
extern uint8_t SFlg;            // 受信フラグ
static uint8_t sIdx = 0;        // 受信文字列Index

/*--- Eusart受信割り込みハンドラー -------------
 *    eusrt.cのEUSART_Recive_ISRに追加すること
 *---------------------------------------------*/
void myEusart(void){
    char ch;
    ch = EUSART_Read();
    #if ECHO == ON
        EUSART_Write(ch);
    #endif
    if((ch == 0x0a)||(ch == 0x0d)){   // 改行処理
        RBuf[sIdx] = 0;
        sIdx = 0;
        SFlg = 1;
    }else if((ch == 0x08)&&(sIdx > 0)){ // BS処理
        sIdx--;
    }else{
        if(sIdx < EU_BFSIZE) RBuf[sIdx++] = ch;
    }
}

/*--- Eusartへ文字列を送信 ---------------------
 *   *str:送信したい文字列データ
 *---------------------------------------------*/
void EU_Write(char *str){
    while(*str != 0){           // 文字列終りまで
        EUSART_Write(*str++);   // 1文字送信
    }
}

/*--- Eusartへ改行を送信 ----------------------*/
void EU_Write_CR(void){
    EUSART_Write('\n');
}

/*--- Eusartへ文字列送信(改行付)--------------
 *   *str:送信したい文字列データ
 *---------------------------------------------*/
 void EU_Puts(char *str){
    EU_Write(str);
    EU_Write_CR();
}

/*---- 16進文字列を10進数に変換[=xtoi()/C90]----
 *    *str:10進数に変化したい16進数文字列
 *  RETURN:変換された32ビット符号無し整数
 *---------------------------------------------*/
uint32_t my_xtoi(char *str){
    uint32_t dec;
    dec = strtoul(str,NULL,16);
    return (uint32_t)dec;
}

/*--- 下位4ビットを16進数文字に変換 ------------
 *    n:符号無し16bit整数(最下位の4bitのみ有効)   
 *  RETURN:16進数に対応するアスキー文字
 *---------------------------------------------*/
uint8_t my_utoa2(uint16_t n){
    n &= 0x0F;
    if(n < 10)  return '0'+ (uint8_t)n;
    else        return 'A'+ ((uint8_t)n - 10);
}

/*--- 1ワード(16ビット)を16進文字に変換 -------
 *   *str:変換結果を格納する文字列
 *    wd :変換したい符号無し16ビットデータ
 *    dg :16進数文字列の桁数
 *----------------------------------------------*/
void my_utoa(char *str, uint16_t wd, uint8_t dg){
    if(dg > 3)  *str++ = my_utoa2(wd >> 12);
    if(dg > 2)  *str++ = my_utoa2(wd >> 8);
    if(dg > 1)  *str++ = my_utoa2(wd >> 4);
    *str++ = my_utoa2(wd);
    *str = '\0';
}

/*---  文字列を逆順に入替 -----------------------
 *   *str:文字順を入れ替えたい文字列
 *-----------------------------------------------*/
void reverseString(char *str) {
    uint8_t i, length;
    length = (uint8_t)strlen(str);
    for (int i = 0; i < length / 2; i++) {
        char temp = str[i];
        str[i] = str[length - 1 - i];
        str[length - 1 - i] = temp;
    }
}

/*--- 10進数文字列変換(下位から変換)----------
 *   *str:変換結果を格納する文字列
 *    wd :変換したい符号無し16ビットデータ
 *-----------------------------------------------*/
void my_itoa2(char *str, uint16_t wd){
    uint8_t i;
    for(int i = 0; i < 6; i++){
        *str++ = '0' + (wd % 10);
        wd = wd / 10;
        if(wd == 0)	break;
    }
    *str = '\0';
}

/*---  10進数文字列変換 -------------------------
 *   *str:変換結果を格納する文字列
 *    wd :変換したい符号無し16ビットデータ
 *-----------------------------------------------*/
void my_itoa(char *str, uint16_t wd){
    my_itoa2(str, wd);
    reverseString(str);
}
/******* End of File ********/


【SDカードの読み書きと文字表示】 abc917-18857.c(zip)


/*******************(abc917-18857.c)[秋月slot版]***
 *  SDカードの読み書きと文字表示                  *
 **************************************************/

#include "mcc_generated_files/mcc.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "myProject.h"
#include "QT095B.h"

#define  OLED_BF_SIZE  80
enum { NON = 0, TXT, CSV, BIN = 8, BMP };

//--- File Systme 用変数
FRESULT  result;                // FatFs処理結果
FATFS    drive;                 // FatFsオブジェクトへのポインタ
FIL      file;                  // ドライブ番号、ex: "0:"
	
//--- Fileアプリ用変数
char     FilNam[16] = "FLOWER.BMP";
uint8_t  F_ext = BMP;           // 1:TXT, 2:CSV, 8:BIN, 9:BMP
uint16_t Length[2];             // 送受信用文字数格納配列
char     Buffer[192];           // データ受信用バッファー
char     Msg[40];               // コメント等送信用文字列

//--- タイマーカウンター用変数
uint8_t  tMode = 1;             // タイマカウンタ表示モードフラグ
uint8_t  tFlag;                 // タイマーフラグ
uint16_t Counter;               // タイマーカウンタ

//---- EUSART用変数
char     RBuf[EU_BFSIZE];       // 受信データーバッファー
uint8_t  SFlg;                  // 受信状態フラグ

//---- OLED用変数
uint8_t  CrtLn = 0;             // 現在行(ページ)位置
uint8_t  gBf[OLED_BF_SIZE];     // グラフィック表示用
char msg1[] = "Test QT095B";

//---- テスト用半角文字
char h[2][16]={
      { 0x00,0xC0,0x38,0x06,0x38,0xC0,0x60,0x00,
        0x3C,0x03,0x02,0x02,0x02,0x03,0x3C,0x00},   // A
      { 0x78,0x84,0x02,0x02,0x02,0x84,0xF8,0x00,
        0x08,0x10,0x21,0x21,0x21,0x10,0x0F,0x00}    // 9
    };

//--- テスト用全角文字
char k[2][32]={
    {	0x00,0x10,0x60,0x01,0x06,0x04,0xE4,0x24,
     	0x2F,0x24,0xE4,0x24,0x2F,0x24,0xE4,0x04,
     	0x00,0xC0,0x30,0x0C,0x03,0x90,0x95,0x55,
     	0x55,0x35,0x1F,0x35,0x55,0x55,0x91,0x90},   // 漢
    {	0x00,0x1C,0x04,0x04,0x24,0x24,0x24,0x24,
     	0xA7,0xA4,0x64,0x24,0x04,0x04,0x1C,0x00,
     	0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x82,
     	0xFF,0x02,0x02,0x02,0x02,0x02,0x02,0x02}    // 字
    };

/***************************************
 *  タイマ0 Callback関数 (1秒周期割り込み)
 ***************************************/
void TMR0_Process(void){
    tFlag = 1;                  // フラグセット
}

/***************************************
 *  SDカード用汎用関数
 ***************************************/
//--- SDカードのマウント
FRESULT SD_Mount(void){
    uint8_t ct = 10;
    FRESULT res;
    do{
        res = f_mount(&drive,"0:",1);     
        EUSART_Write('.');
    }while((res != FR_OK) && ct--); // 10回まで試みる
    
    if(res != FR_OK){               // マウント失敗なら
        EU_Puts("** SD Not Mounted !!");
    }else{
        EU_Puts("SD Mount OK!");
        LED_SetHigh();
    }
    return res;	
}

//--- SDカードのクローズとアンマウント
void SD_All_Close(void){
    f_close(&file);             // ファイルクローズ
    f_mount(0, "0:", 0);        // アンマウント
    EU_Puts("closed & Un_Mounted"); 
    LED_SetLow();	
}

/***************************************
 *  コマンド処理
 ***************************************/
//--- SDカードテストコマンド (兼テンプレート)
void SD_cmd_T(void){
    EU_Puts("Start Command T");
    gCS_SetHigh();
    if(SD_Mount() == FR_OK){    // SDマウント
        __delay_ms(2000);
        f_mount(0, "0:", 0);    // アンマウント
        EU_Puts("Un_Mounted");
    }
    LED_SetLow();
}

//--- SDカードから読込コマンド
void SD_cmd_R(void){
    FRESULT res;
    if(F_ext != TXT){           // テキストファイルでないなら
        sprintf(Msg,"%s is not Text File!",FilNam);
        EU_Puts(Msg);        
        return;   
    }
    EU_Puts("Start Command R");
    if(SD_Mount() == FR_OK){
        res = f_open(&file, FilNam, FA_READ);  // ファイルopen
        if(res == FR_OK){
            sprintf(Msg,"Open %s",FilNam);
            EU_Puts(Msg);
            do{
                f_read(&file, Buffer, 64, (UINT *)Length);
                Buffer[Length[0]] = 0;
                EU_Puts(Buffer);
            }while(Length[0]!=0);
        }else{
            sprintf(Msg,"** Can't open %s !!",FilNam);
            EU_Puts(Msg);
        }
        SD_All_Close();         // ファイルクローズ&アンマウント
    }
}

//--- SDカードへデータ書込コマンド
void SD_cmd_W(void){
    FRESULT res;
    EU_Puts("Start Command W");
    if(SD_Mount() == FR_OK){
        res = f_open(&file, FilNam, FA_WRITE | FA_OPEN_APPEND);
        if(res == FR_OK){
            sprintf(Msg,"Open %s",FilNam);
            EU_Puts(Msg);
            sprintf(Msg, "%07d,", Counter);
            f_write(&file, Msg, 8, (UINT *)Length);   // SDへ書込
            EU_Puts(Msg);
        }else{
            sprintf(Msg,"** Can't open %s !!",FilNam);
            EU_Puts(Msg);
        }
        SD_All_Close();         // ファイルクローズ&アンマウント
    }
}

//--- ファイル名セットするコマンド
/*    *str:指定するファイル名
 *    (strが無い場合、現在ファイル名を表示    */
void SD_cmd_F(char *str){
    size_t i,n;
    char *p;
    n = strlen(str);
    if(n > 1){
        if(n > 12) n = 12;
        for(i = 0; i < n; i++)
            FilNam[i] = (char)toupper(str[i+1]);
        FilNam[n]=0;
    } 
    p = strchr(FilNam,'.');
    if     (strncmp(p+1,"TXT",3)==0) F_ext = TXT;
    else if(strncmp(p+1,"CSV",3)==0) F_ext = CSV;
    else if(strncmp(p+1,"BIN",3)==0) F_ext = BIN;
    else if(strncmp(p+1,"BMP",3)==0) F_ext = BMP;
    else                             F_ext = NON;
    sprintf(Msg,"NewFileName = %s: %d\n",FilNam,F_ext);
    EU_Puts(Msg);
}

//--- SDカードから読込・ダンプリスト表示
void SD_cmd_U(void){
    FRESULT res;
    uint8_t i, n;
    EU_Puts("Start Command D");
    if(SD_Mount() == FR_OK){
        res = f_open(&file, FilNam, FA_READ); // ファイルオープン
        if(res == FR_OK){
            sprintf(Msg,"Open %s",FilNam);
            EU_Puts(Msg);
            do{
                f_read(&file, Buffer, 192, (UINT *)Length);
                n = (uint8_t)Length[0];               
                for(i = 0; i < n; i++){
                    sprintf(Msg,"%02X,",Buffer[i]);
                    EU_Write(Msg);
                    if((i % 16)==15) EU_Write_CR();
                }
                SSPEN_ON();
                gOLED_Line( 0, 48,95,48,63,63,63);
                SSPEN_OFF();
            }while(Length[0]!=0);
            EU_Write_CR();
        }else{
            sprintf(Msg,"** Can't open %s !!",FilNam);
            EU_Puts(Msg);           
        }
        SD_All_Close();         // ファイルクローズ&アンマウント
    }
}

//--- SDカードからBMPファイル読込んで画像表示コマンド
void SD_cmd_V(void){
    FRESULT res;
    uint8_t i, n;
    if(F_ext != BMP){               // ファイルがBMPで無い?
        sprintf(Msg,"%s is not BMP File!",FilNam);
        EU_Puts(Msg);
        return;
    }
    EU_Puts("Start Command V");
    SSPEN_ON();                     //グラフィック表示準備
    gSetMode(COLOR64K2,0);          // 64k(16ビット)カラーに
    gRstArea();                     // 全画面を対象に
    SSPEN_OFF();
    if(SD_Mount() == FR_OK){
        res = f_open(&file, FilNam, FA_READ);  // ファイルopen
        if(res == FR_OK){
            sprintf(Msg,"Open %s",FilNam);
            EU_Puts(Msg);
          //---  SDからヘッダー部を読込む 
            f_read(&file, Buffer, 138, (UINT *)Length);
            n = (uint8_t)Length[0];
            sprintf(Msg,"W:%d - H:%d\n",Buffer[0x12],Buffer[0x16]);
            EU_Puts(Msg);
            for(i = 0; i < n; i++){
                sprintf(Msg,"%02X,",Buffer[i]);
                EU_Write(Msg);
                if((i % 16)==15) EU_Write_CR();
            }
            EU_Write_CR();
          //--- SDからデータを読み出し、表示
            do{
                f_read(&file, Buffer, 192, (UINT *)Length); 
                n = (uint8_t)Length[0];
                SSPEN_ON();         // OLED選択
                gCS_SetLow();       // Select gCS
                gDC_SetHigh();      // Select Data
                
                for(i = 0; i < n; i+=2){
                    SPI_EXCHG(Buffer[i+1]);
                    SPI_EXCHG(Buffer[i]);
                    sprintf(Msg,"%02X,%02X,",Buffer[i],Buffer[i+1]);
                    EU_Write(Msg);
                    if((i % 16)==14) EU_Write_CR();
                }
                gCS_SetHigh();  // DeSelect gCS
                SSPEN_OFF();
            }while(Length[0]!=0);
            EU_Write_CR();
        }else{
            sprintf(Msg,"** Can't open %s !!",FilNam);
            EU_Puts(Msg);           
        }
        SD_All_Close();         // ファイルクローズ&アンマウント
    }
    SSPEN_ON();                     //グラフィック表示準備
    gSetMode(COLOR256,0);           // アドレス増分を横に
    gRstArea();                     // 全画面を対象に
    SSPEN_OFF();
}

//--- 画面に文字を表示するコマンド
/*   *str:表示する文字列    */
void SD_cmd_P(char *str){
    uint8_t xpos;
    SSPEN_ON();
    gSetMode(COLOR256,0);       // 256(8ビット)カラーに
    if(strlen(str)==1){
        xpos = gOLED_chrX(  2,  2,  '0',  gRGB256(7,7,3),0);
        xpos = gOLED_chrX( 12,  2,  '1',  gRGB256(7,0,3),1);
        xpos = gOLED_chrX( 22,  2,  '2',  gRGB256(0,7,0),1);
        xpos = gOLED_chrX( 32,  2,  'A',  gRGB256(0,0,0),255);
        xpos = gOLED_chrX( 42,  2,  'H',  gRGB256(7,0,0),0);
        xpos = gOLED_chrX( 52,  2,  '?',  gRGB256(0,7,3),1);
        xpos = gOLED_strX( 10, 12, msg1,  gRGB256(7,0,3),3);
        xpos = gOLED_strX( 10, 24, msg1,  gRGB256(0,0,0),0);

        xpos = gOLED_HptnX( 72, 40, h[0], gRGB256(0,7,0),0);   
        xpos = gOLED_HptnX(xpos,40, h[1], gRGB256(0,7,0),1);
        xpos = gOLED_KptnX( 10, 40, k[0], gRGB256(7,7,3).0);
        xpos = gOLED_KptnX(xpos,40, k[1], gRGB256(7,0,3),1);  

    }else{
        xpos = gOLED_strX(20,54,str+1,gRGB256(0,7,3),0);
    }
    gSetMode(COLOR256,0);           // アドレス増分を横に
    gRstArea();                     // 全画面を対象に
    SSPEN_OFF();
}

//--- グラフィック表示テストコマンド
void QT_cmd_G(char *str){
    SSPEN_ON();	
    if(strlen(str) > 1){
        switch(str[1]){
            case '1': QT095B_Test1(); break;
            case '2': QT095B_Test2(); break;
            case '3': QT095B_Test3(); break;
        }
    }else{
        QT095B_Test1();
    }
    SSPEN_OFF();    
}

//--- グラフィック画面消去コマンド
void QT_cmd_C(void){
    SSPEN_ON();
    gOLED_Clr(0,0,95,63);
    SSPEN_OFF();
}

/***************************************
 *  メイン関数
 ***************************************/
void main(void){
    char   cmd;                         // 受信コマンド文字

    SYSTEM_Initialize();

    SSPEN_ON();
    SSD1331_Init();
    SSPEN_OFF();
 
  // タイマ0 Callback関数定義
    TMR0_SetInterruptHandler(TMR0_Process);
    
    EU_Puts("\n==== SD Test ====");

  // 割り込み許可
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();

  //======= メインループ =========
    while(1){
      // 1秒周期の処理
        if(tFlag == 1){                 // フラグオンの場合
             LED_Toggle();
            tFlag = 0;                  // フラグリセット
            if(tMode == 0){
                sprintf(Msg,"Counter = %05d",Counter++);
                EU_Puts(Msg);           // 送信
            }
        }
      // コマンド処理
        if(SFlg){                       // 受信ありの場合
            cmd = RBuf[0];  
            sprintf(Msg,"Input = %s CMD = %c\n",RBuf,cmd);
            EU_Puts(Msg);
            switch(cmd){
              case 'X': tMode ^= 1;     break; // カウンタON/OFF
              case 'C': QT_cmd_C();     break; // 画面消去
              case 'G': QT_cmd_G(RBuf); break; // グラフィック
              case 'T': SD_cmd_T();     break; // SDマウント
              case 'R': SD_cmd_R();     break; // SDから読出し
              case 'W': SD_cmd_W();     break; // SDに書込む
              case 'F': SD_cmd_F(RBuf); break; // ファイル名
              case 'U': SD_cmd_U();     break; // 16進数ダンプ
              case 'V': SD_cmd_V();     break; // 画像描画
              case 'P': SD_cmd_P(RBuf); break; // 文字表示
              default:  EU_Puts("???"); break; // 無効なコマンド
            }
            SFlg = 0;
        }
    }
}

/******  End of File ******/


【グラフィックOLEDライブラリ】 QT095B.c/h(zip)


/***********************************(QT095B.h)**********
 *	SPI有機ELカラーグラフィックヘッダーファイル
 ********************************************************/
#include "mcc_generated_files/mcc.h"
#include "myProject.h"
#include "Font_5x7.h"

#define  COLOR256	0x20
#define  COLOR64K2	0x62        // 0x42
#define  COLOR64K3  	0x82

//---  SSD1331 初期化
void SSD1331_Init(void);

//---  SPI コマンド出力 
void gOLED_Cmd(uint8_t b);

//---  SPI データ出力
void gOLED_Data(uint8_t b);

//----  RGBを1バイト256色に ( R = 0-7, G = 0-7, B = 0-3 )
uint8_t gRGB256(uint8_t r,uint8_t g, uint8_t b);

//----  RGBを2バイト64k色に ( R = 0-31, G = 0-63, B = 0-31 )
uint16_t gRGB64k(uint8_t r,uint8_t g, uint8_t b);

//---  色モード指定(アドレス増方向指定付き)
/*      dir: 0/水平方向、1/垂直方向 */
void gSetMode(uint8_t md, uint8_t dir);

//---  表示エリアの設定
/*      (x0,y0)-(x1,y1):エリア指定 */
void gSetArea(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1);

//---  表示エリアのリセット
void gRstArea(void);


/******* アクセラレーションコマンド **********
 *		(x0,y0)-(x1,y1):エリア指定
 *------------------------------------------------ */
//---  画面クリア
void gOLED_Clr(uint8_t x0,uint8_t y0,uint8_t x1,uint8_t y1);

//---  線描画(256色)
void gOLED_Line(uint8_t x0,uint8_t y0, uint8_t x1,uint8_t y1, 
                uint8_t r, uint8_t g ,uint8_t b);

//---  四角形描画(256色)
void gOLED_Rect(uint8_t x0,uint8_t y0, uint8_t x1,uint8_t y1, 
                uint8_t r, uint8_t g ,uint8_t b);

//---  画像コピー
void gOLED_Copy(uint8_t x0,uint8_t y0, uint8_t x1,uint8_t y1, 
                uint8_t dx, uint8_t dy);

//---  塗りつぶしのOn[1]/Off[0]
void gOLED_Fill(uint8_t fl);

/******* 文字・パターン描画 ******/
//---  1ドット描画(256色)
/*      (x,y)位置にcol色でドット描画 */
void gOLED_Pset256(uint8_t x, uint8_t y,uint8_t col);

//----  5x7ドットASCII文字を1文字表示(256色)
/*      (x,y)位置からASCII文字(dat)をcol色で描画
 *	rtn: 次表示x位置                            */
uint8_t gOLED_chrX(uint8_t x, uint8_t y, char dat, 
                   uint8_t col, uint8_t bcl);

//----  5x7ドットASCII文字列を表示(256色) 
/*      (x,y)位置からASCII文字列(*str)をcol色で描画
 **      trp:[0]背景透明、[1]背景黒
 *	rtn: 次表示x位置                             */
uint8_t gOLED_strX(uint8_t x, uint8_t y, char *str, 
                   uint8_t col,uint8_t bcl);

//----  8x16ドット文字を1文字表示(256色)
/*      (x,y):表示開始位置、 *hp:フォントデータアドレス、
 *    col:表示色、 bcl:[0]透明;[1]背景黒;[x]背景256色
 *	rtn: 次表示x位置                             */
uint8_t gOLED_HptnX(uint8_t x, uint8_t y, char *hp, 
                    uint8_t col, uint8_t bcl);

//----  全角文字(漢字、16x16)を1文字表示(256色)
/*      (x,y):表示開始位置、 *kp:フォントデータアドレス、
 *    col:表示色、 bcl:[0]透明;[1]背景黒;[x]背景256色
 *	rtn: 次表示x位置                            */
uint8_t gOLED_KptnX(uint8_t x, uint8_t y, char *kp, 
                    uint8_t col, uint8_t bcl);

//--- グラフィック表示テスト
void QT095B_Test1(void);

void QT095B_Test2(void);

void QT095B_Test3(void);

/****** end of file *******/

/***********************************(QT095B.c)**********
 *	SPI有機ELカラーグラフィックライブラリ(SSD1331)
 ********************************************************/
#include  "mcc_generated_files/mcc.h"
#include  "myProject.h"
#include  "QT095B.h"

#define  GDSP_SEL()     gCS_SetLow()
#define  GDSP_UNSEL()   gCS_SetHigh()
#define  GCMD_SEL()     gDC_SetLow()
#define  GDAT_SEL()     gDC_SetHigh()

//---  SSD1331 初期化
void SSD1331_Init(void){
  //-- OLEDのリセット
    RES_SetLow();       // Reset OLED (SSD1331))
    __delay_ms(50);     // 最終的にOLCDリセットは省略可
    RES_SetHigh();
    __delay_ms(500);
  //-- OLEDの初期化
    GDSP_SEL();         //  Select gCS
    GCMD_SEL();         //  Select Command
    SPI_EXCHG(0xAE);    //  Set Display Off
    SPI_EXCHG(0xA0);    //  Remap & Color Depth setting
      SPI_EXCHG(0x20);  // =20H [40],(0b00100000);
                        //   A[7:6] = 00; 256 color
                        //   A[5] = 1; Enable COM Sprit
                        //   A[4] = 0; Scan from 0-COMn
                        //   A[3] = 0; Disable Swaping
                        //   A[2] = 0; Norma Order (RGB)
                        //   A[1] = 0; RAM Colum Seg:95-0
                        //   A[0] = 0; Horizontal Address Incriment
    SPI_EXCHG(0xA1);    //  Set Display Start Line
      SPI_EXCHG(0);     // = 0 [00]
    SPI_EXCHG(0xA2);    //  Set Display Offset
      SPI_EXCHG(0);     // = 0 [00]
    SPI_EXCHG(0xA4);    //  Set Display Mode (Normal)
    SPI_EXCHG(0xA8);    //  Set Multiplex Ratio
      SPI_EXCHG(63);    // = 63 [63]
    SPI_EXCHG(0xAD);    //  Set Master Configration
      SPI_EXCHG(0x8E);  // =8E [8F],a[0]=0 Select external Vcc supply
    SPI_EXCHG(0xB0);    //  Power Save Mode
      SPI_EXCHG(0x1A);  // = 1AH [1A},Enable power save mode
    SPI_EXCHG(0xB1);    //  Phase 1 and 2 period adjustment
      SPI_EXCHG(0x74);  // = 74H [74]
    SPI_EXCHG(0xB3);    //  Display Clock DIV
      SPI_EXCHG(0xF0);  // = F0H [D0]
    SPI_EXCHG(0x8A);    //  Pre Charge A
      SPI_EXCHG(0x81);  // = 81H [81]
    SPI_EXCHG(0x8B);    //  Pre Charge B
      SPI_EXCHG(0x82);  // = 82H [82]
    SPI_EXCHG(0x8C);    //  Pre Charge C
      SPI_EXCHG(0x83);  // = 83H [83]
    SPI_EXCHG(0xBB);    //  Set Pre-charge level
      SPI_EXCHG(0x3A);  // = 3AH [3E]
    SPI_EXCHG(0xBE);    //  Set VcomH
      SPI_EXCHG(0x3E);  // = 3EH [3E]
    SPI_EXCHG(0x87);    //  Set Master Current Control
      SPI_EXCHG(0x06);  // = 06H [0F]
    SPI_EXCHG(0x15);    //  Set Column Address
      SPI_EXCHG(0);     // = 00 [00]
      SPI_EXCHG(95);    // = 95 [95]
    SPI_EXCHG(0x75);    //  Set Row Address
      SPI_EXCHG(0);     // = 00 [00]
      SPI_EXCHG(63);    // = 63 [63]
    SPI_EXCHG(0x81);    //  Set Contrast for Color A
      SPI_EXCHG(255);   // = 255 [80]
    SPI_EXCHG(0x82);    //  Set Contrast for Color B
      SPI_EXCHG(255);   // = 255 [80]
    SPI_EXCHG(0x83);    //  Set Contrast for Color C
      SPI_EXCHG(255);   // = 255 [80]
    SPI_EXCHG(0xAF);    //  Set Display On
    __delay_ms(110);    //  0xAFコマンド後最低100ms必要
    GDSP_UNSEL();       //  DeSelect gCS
}

//---  OLEDへのSPIコマンド出力 
void gOLED_Cmd(uint8_t b){
    GDSP_SEL();         // Select gCS
    GCMD_SEL();         // Select Command
    SPI_EXCHG(b);       // SPI.write(b)
    GDSP_UNSEL();       // DeSelect gCS
}

//---  OLEDへのSPIデータ出力
void gOLED_Data(uint8_t b){
    GDSP_SEL();         // Select gCS
    GDAT_SEL();         // Select Data
    SPI_EXCHG(b);       // SPI.write(b)
    GDSP_UNSEL();       // DeSelect gCS
}

//----  RGBを1バイト256色に   ( R = 0-7, G = 0-7, B = 0-3 )
uint8_t gRGB256(uint8_t r,uint8_t g, uint8_t b){
    return (uint8_t)((r << 5) | ((g & 7) << 2) | (b & 3));
}

//----  RGBを2バイト64k色に   ( R = 0-31, G = 0-63, B = 0-31 )
uint16_t gRGB64k(uint8_t r,uint8_t g, uint8_t b){
    return (uint16_t)((r << 11) | ((g & 63) << 5) | (b & 31));
}

//---  色モード指定(アドレス増方向指定付き)
void gSetMode(uint8_t md, uint8_t dir){
    dir &= 1;
    GDSP_SEL();         // Select gCs
    GCMD_SEL();         // Select Comand
    SPI_EXCHG(0xA0);
      SPI_EXCHG(md + dir);
    GDSP_UNSEL();       // DeSelect gCS
}

//----- アクティブエリアの設定
void gSetArea(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1){
    GDSP_SEL();         // Select gCs
    GCMD_SEL();         // Select Comand
    SPI_EXCHG(0x15);    // Set X-range
      SPI_EXCHG(x0);    // Start X
      SPI_EXCHG(x1);    // End X
    SPI_EXCHG(0x75);    // Set Y-range
      SPI_EXCHG(y0);    // Start Y
      SPI_EXCHG(y1);    // End Y
    GDSP_UNSEL();       // DeSelect gCS
}

//----- アクティブエリアのリセット
void gRstArea(void){
    gSetArea(0,0,95,63);
}


/*** アクセラレーションコマンド ********/
//---  画面クリア
void gOLED_Clr(uint8_t x0,uint8_t y0,uint8_t x1,uint8_t y1){
    GDSP_SEL();         // Select gCS
    GCMD_SEL();         // Select Comand
    SPI_EXCHG(0x25);    // Line Command
    SPI_EXCHG(x0);      // Start X
    SPI_EXCHG(y0);      // Start Y
    SPI_EXCHG(x1);      // End X
    SPI_EXCHG(y1);      // End Y
    GDSP_UNSEL();       // DeSelect gCS
    __delay_ms(1);
}

//---  線描画
void gOLED_Line(uint8_t x0,uint8_t y0, uint8_t x1,uint8_t y1, 
                uint8_t r, uint8_t g, uint8_t b){
    GDSP_SEL();         // Select gCs
    GCMD_SEL();         // Select Comand
    SPI_EXCHG(0x21);    // Line Command
    SPI_EXCHG(x0);      // Start X
    SPI_EXCHG(y0);      // Start Y
    SPI_EXCHG(x1);      // End X
    SPI_EXCHG(y1);      // End Y
    SPI_EXCHG(r);       // Line color Red
    SPI_EXCHG(g);       // Line color Green
    SPI_EXCHG(b);       // Line color Blue
    GDSP_UNSEL();       // DeSelect gCs
    __delay_ms(1);
}

//--- 四角形描画
void gOLED_Rect(uint8_t x0,uint8_t y0, uint8_t x1,uint8_t y1, 
                uint8_t r, uint8_t g ,uint8_t b){
    GDSP_SEL();         // Select gCs
    GCMD_SEL();         // Select Comand
    SPI_EXCHG(0x22);    // Rect Command
    SPI_EXCHG(x0);      // Start X
    SPI_EXCHG(y0);      // Star Y
    SPI_EXCHG(x1);      // End X
    SPI_EXCHG(y1);      // End Y
    SPI_EXCHG(r);       // Line color Red
    SPI_EXCHG(g);       // Line color Green
    SPI_EXCHG(b);       // Line color Blue
    SPI_EXCHG(r);       // Fill color Red
    SPI_EXCHG(g);       // Fill color Green
    SPI_EXCHG(b);       // Fill color Blue
    GDSP_UNSEL();       // DeSelect gCS
    __delay_ms(1);
}

//---  画像コピー
void gOLED_Copy(uint8_t x0,uint8_t y0, uint8_t x1,uint8_t y1, 
                uint8_t dx, uint8_t dy){
    GDSP_SEL();         // Select gCs
    GCMD_SEL();         // Select Comand
    SPI_EXCHG(0x23);    // Line Command
    SPI_EXCHG(x0);      // Start X
    SPI_EXCHG(y0);      // Start Y
    SPI_EXCHG(x1);      // End X
    SPI_EXCHG(y1);      // End Y
    SPI_EXCHG(dx);      // New Start X
    SPI_EXCHG(dy);      // New Start Y
    GDSP_UNSEL();       // DeSelect gCs
    __delay_ms(1);
}

//---  塗りつぶしのOn/Off
void gOLED_Fill(uint8_t fl){
    GDSP_SEL();         // Select gCs
    GCMD_SEL();         // Select Comand
    SPI_EXCHG(0x26);    // Fill Command
    SPI_EXCHG(fl);      // Start X
    GDSP_UNSEL();       // DeSelect gCs
    __delay_ms(1);
}


/******* 文字・パターン描画 ****************/
//---  ドット描画(256色)
void gPsetX(uint8_t x, uint8_t y,uint8_t col){
    gSetArea(x,y,x,y);   // 描画エリア指定
    gOLED_Data(col);
}

//---  1ドット描画(256色、エリア解除付)
void gPsetX_Rst(uint8_t x, uint8_t y,uint8_t col){
    gPsetX(x,y,col);
    gRstArea();
}

//----- 1バイトから8ドットを描画(256色、背景有)
void gPset8(uint8_t b, uint8_t col, uint8_t bcl){
    uint8_t i;
    uint8_t m = 1;
    if(bcl == 1) bcl = 0;
    for (i=0; i<8;i++){
        if(b & m)  gOLED_Data(col);
        else       gOLED_Data(bcl);
        m <<= 1;
    }
}

//----- 1バイトから8ドットを描画(256色、背景透明)
void gPset8T(uint8_t x, uint8_t y, uint8_t b, uint8_t col){
    uint8_t i;
    uint8_t m = 1;
    for (i=0; i<8;i++){
        if(b & m)   gPsetX(x,y+i,col);
        m <<= 1;
    }
}

//----  5x7ドットASCII文字を1文字表示(256色+α)
/*      ("Font_5x7.h"ファイルが必要です)
 *      (x,y):表示位置、dat:表示文字(ASCII文字コード)
 *    col:表示色、 bcl:[0]透明;[1]背景黒;[x]背景256色
 *--------------------------------------------------------*/
uint8_t gOLED_chrX(uint8_t x, uint8_t y, char dat, 
			uint8_t col, uint8_t bcl){
    char i,ptn;
    dat -= 0x20;                    // 文字アドレスを計算
    gSetMode(COLOR256,1);           // アドレス増分を縦に
    if(trp){
        gSetArea(x,y,x+5,y+7);      // 描画エリア指定
        for(i=0; i<5; i++) {
            ptn = Font[dat][i];
            if(ptn == 0xFF) break;  //幅狭文字なら抜ける
            gPset8(ptn,col,bcl);    // 8ドット描画
        }
        gPset8(0, col, bcl);        // 1列空ける
    }else{
        for(i=0; i<5; i++) {
            ptn = Font[dat][i];
            if(ptn == 0xFF) break;  //幅狭文字なら抜ける
            gPset8T(x+i,y,ptn,col); // 8ドット描画
        }
    }
    gSetMode(COLOR256,0);           // アドレス増分を横に
    gRstArea();                     // 書込エリア指定クリア
    return x+i+1;
}

//----  5x7ドットASCII文字列を表示(256色+α)
/*    (x,y):表示位置、*str:表示文字列(ASCII文字コード)
 *    col:表示色、 bcl:[0]透明;[1]背景黒;[x]背景256色
 *--------------------------------------------------------*/
uint8_t gOLED_strX(uint8_t x, uint8_t y, char *str, 
                   uint8_t col, uint8_t bcl){
    uint8_t posX;
    posX = x;
    while(*str){
        posX = gOLED_chrX(posX, y, *str++, col, bcl);
    }
    return posX;
}

/******  半角文字表示  (256色+α)****************/
/*    (x,y):表示位置、*hpr:表示半角文字アドレス
 *    col:表示色、 bcl:[0]透明;[1]背景黒;[x]背景256色
 *--------------------------------------------------------*/
//----  8x16ドット文字を1文字表示
uint8_t gOLED_HptnX(uint8_t x, uint8_t y, char *hp, 
                    uint8_t col, uint8_t bcl){
    char i, ptn;
    setMode(COLOR256,1);            // アドレス増分を縦に
    if(trp){
        setArea(x,y,x+7,y+7);       // 描画エリア指定
        for(i=0; i<8; i++) {
            ptn = *hp++;
            gPset8(ptn,col,bcl);    // 8ドット描画
        }
        setArea(x,y+8,x+7,y+15);    // 描画エリア指定
        for(i=0; i<8; i++) {
            ptn = *hp++;
            gPset8(ptn,col,bcl);    // 8ドット描画
        }
    }else{
        for(i=0; i<8; i++) {
            ptn = *hp++;
            gPset8T(x+i,y,col);     // 8ドット描画(透明付)
        }
        for(i=0; i<8; i++) {
            ptn = *hp++;
            gPset8T(x+i,y+8,col);   // 8ドット描画(透明付)
        }
    }
    setMode(COLOR256,0);            // アドレス増分を横に
    rstArea();                      // 書込エリア指定クリア
    return x+i;
}

/******  全角文字表示  (256色+α)****************/
/*    (x,y):表示位置、*kpr:表示文字アドレス
 *    col:表示色、 bcl:[0]透明;[1]背景黒;[x]背景256色
 *--------------------------------------------------------*/
//---- 16x16ドット文字を1文字表示(次xpos位置を返す)
uint8_t gOLED_KptnX(uint8_t x, uint8_t y, char *kp, 
                    uint8_t col, uint8_t bcl){
    char i, ptn;
    setMode(COLOR256,1);            // アドレス増分を縦に
    if(trp){
        setArea(x,y,x+15,y+7);      // 描画エリア指定
        for(i=0; i<16; i++) {
            ptn = *kp++;
            gPset8(ptn,col,bcl);    // 16ドット描画
        }
        setArea(x,y+8,x+15,y+15);   // 描画エリア指定
        for(i=0; i<16; i++) {
            ptn = *kp++;
            gPset8(ptn,col,bcl);    // 16ドット描画
        }
    }else{
        for(i=0; i<16; i++) {
            ptn = *kp++;
            gPset8T(x+i,y,col);     // 16ドット描画(透明付)
        }
        for(i=0; i<16; i++) {
            ptn = *kp++;
            gPset8T(x+i,y+8,col);   // 16ドット描画(透明付)
        }
    }
    setMode(COLOR256,1);            // アドレス増分を横に
    rstArea();                      // 書込エリア指定クリア
    return x+i;
}

/*******************************************************
 *  有機ELカラーグラフィック表示テスト (QT095B)
 ********************************************************/
//---  Test QT095 (1) (Test Color Pattern)
void QT095B_Test1(void){
    uint8_t i, j;
    uint8_t Dot1, Dot2, Dot3, Dot4;
    Dot1 = gRGB256(0,7,0);
    Dot2 = gRGB256(7,0,0);
    Dot3 = gRGB256(0,0,3);
    Dot4 = gRGB256(7,7,0);
    gOLED_Clr(0,0,95,63);
    gCS_SetLow();                       // Selct gCS
    gDC_SetHigh();                      // Selct data
    for(j=0; j<64; j++){
        for(i=0; i<96; i++){
            if(j<32){
                if(i<40) SPI_EXCHG(Dot1);  // green
                else     SPI_EXCHG(Dot4);  // Yellow
            }else{
                if(i<56) SPI_EXCHG(Dot2);  // red
                else     SPI_EXCHG(Dot3);  // blue
            }
        }
    }
    gCS_SetHigh();
}

//---  Test QT095 (2) (Test Color Map)
void QT095B_Test2(void){
    uint8_t i,j,r,g,b,col;
    gOLED_Clr(0,0,95,63);
    gCS_SetLow();                       // Selct gCS
    gDC_SetHigh();                      // Selct data
    for(g=0; g<8; g++){
        for(i=0; i<8; i++){
            for(b=0;b<4;b++){
                for(r=0;r<8;r++){
                    col=(uint8_t)((r<<5)+(g<<2)+b);
                    SPI_EXCHG(col);	
                    SPI_EXCHG(col);	
                    SPI_EXCHG(col);	
                }
            }     
        }
    }
    gCS_SetHigh();  
}

//--- Test QT095 (3) (Test Draw Command)
void QT095B_Test3(void){
    gOLED_Clr(0,0,95,63);
    gOLED_Line( 0, 0,95,63,63,63,63);
    gOLED_Line( 0,63,95, 0, 0, 0,63);
    gOLED_Fill(0);                      // 塗りつぶし無し
    gOLED_Rect(16,12,78,51,63, 0, 0);
    gOLED_Rect(38,26,57,38, 0,63, 0);
    gOLED_Fill(1);                      // 塗りつぶし有り
    gOLED_Rect( 5, 5,30,25,63,63, 0);
    gOLED_Rect(65, 5,90,25, 0,63,63);
    gOLED_Rect( 5,40,30,60, 0, 0,63);   
    gOLED_Rect(65,40,90,60,63, 0,63);  
}

/******* End of File ********/


※プログラムのリストをハイライト無しのスタイルで見る場合はここをクリック


※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。


ディスクの管理 カラー画像に文字表示