自作printf完成

PICC-lite用の自作printfが一応完成したのでアップしておく。
LCD出力用なのでLcdPutc()やLcdPuts()などの補助関数は自前で用意してね。
PICC-liteのprintfよりも百数十ワードは節約できるんじゃないかな。
大したコードでもないので自由に使って、あとは自己責任でよろしく!
以下に使い方
 void LcdPrinf(const char *fmt, …); // 282w
メモリ節約のために使えるフォーマット指定子が限られている
%% %文字そのもの
%c 文字
%s 文字列
%d 10進数(0-9)整数
%x 16進数(0-f)整数
%b 2進数(0,1)整数
%o 8進数(0-7)整数
整数のみ%4dのように最低桁数を指定でき、
さらに%04dのようにすれば0パディングできる
 使用できるエスケープ文字
\n 改行(次の行の先頭へ移動。最下行のときは最上行先頭へ移動)
\r 復帰(行を変えずに行の先頭へ移動)
\f 改頁(画面をクリアして最上行の先頭へ移動)
以下に自作printfのソース
#ifdef USE_LCDPrintf
void LcdPutiEx(int i, byte base, byte minketa, char pad);
void LcdPrintf(const char* format, ...);
// 整数を指定した進数で表示する(範囲外の数を与えると化ける)
void LcdPutiEx(int i, byte base, byte minketa, char pad){
 char stk[18]=""; // 数字列スタック(下桁から積まれる)
 char *p;
 byte count=0;
 p=stk+1;
 if((i < 0)&&(base == 10)) {
  LcdData('-');
  i=-i;
 }
 do{
  *p="0123456789ABCDEF"[i % base];
  p++;
  i /= base;
  count++;
 }while(i);
 // 最低桁数まで指定文字で詰める
 for(; count < minketa; count++) {
  *p=pad;
  p++;
 }
 // スタックを出力
 p--;
 for(;*p;p--)
  LcdData(*p);
}
// 自作printf()
void LcdPrintf(const char* format, ...)
{
 va_list list;
 const char *p;
 char pad;
 byte base,keta,/*;static bit*/ flag; // bitにしてもメモリ効率良くならず
 
 va_start( list, format );
 
 for(p=format; *p; ++p){  // formatの先頭から末尾まで
  if( *p == '\f' ){  // 改ページ
   LcdCls();
   continue;
  }
  if( *p == '\n' ){  // 改行
   LcdGotoxy(0,LcdRow+1);
   continue;
  }
  if( *p == '\r' ){  // 復帰
   LcdGotoxy(0,LcdRow);
   continue;
  }
  if( *p != '%' ){  // フォーマット指定子に必ず付く % 以外なら、そのまま出力
   LcdData( *p );
   continue;
  }
  ++p;  // % だったら、その直後の文字に応じて出力
  base=0; keta=0; pad=' '; flag=1;
  while(flag){
   if(*p>'0' && *p<='9') // caseで列挙するよりメモリ効率がよい
    keta=(*p++)-'0';
   else switch( *p ){
    case '0': // if文で組むよりメモリ効率がよい
     pad='0';p++;
     break;
    case 'x':base=6;
    case 'd':base+=2;
    case 'o':base+=6;
    case 'b':base+=2;
     LcdPutiEx(va_arg(list, int) ,base, keta, pad );
     flag=0;
     break;
    case 'c':
     LcdPutc(va_arg(list, char));
     flag=0;
     break;
    case 's':
     LcdPuts(va_arg(list, char*));
     flag=0;
     break;
    default:
     LcdPutc(*p);
     flag=0;
     break;
   }
  }
 }
 va_end( list );
}
#endif
  1. トラックバックはまだありません。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。