/*******************(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 ******/
|