目次

ドット位置をバイト埋込み

 グラフィックLCDに2値画像を表示するため
 ドット情報を、フレームバッファを構成する
 バイトに埋込むことが必要になりました。



 1ラインが、どのくらいのバイト数になるのかを
 計算してみます。

 64ドッドx64ラインという構成なので
 1ラインは64/8=8バイト。

 8バイトの中に、どのドット位置にビットをセット
 するのかを、図を描いて考えます。



 12ドット目に、ビットをセットしたいときは
 8の剰余系で、商と余りを求めて、所属する
 バイトとビット位置を算出できるとなります。

 具体的に計算すると、以下。

  12 / 8 = 1
  12 % 8 = 4

 所属するバイトは、1バイト目。
 ビット位置はMSBから数えて4ビット目。



 1バイト中で、ビットをセットするとすれば
 次の変換計算が必要。

   1 << (7-4)

 8の剰余系で、商と余りを求めていけば
 セットするビットのデータは、次のように
 まとめられます。(2進数)

 8の剰余系で、商と余りを求められるので
 ドット位置をNとすると、次の計算式を
 用意できます。

  pQ = tbit / 8 ;
  pR = tbit % 8 ;
  pData = (1 << (7 - pR) ;

 指定のドット位置に1をセットするなら
 配列datでフレームバッファを構成として
 次のように計算できます。

  pQ = tbit / 8 ;
  pR = tbit % 8 ;
  pData = (1 << (7 - pR) ;
  dat[pQ] |= pData ;

 ラインごとに処理するなら、ライン番号を0からと
 して、変数lineを使い次のように表現できます。

  dat[8*line+pQ] |= pData ;

 ORでビットをセットするのは、他のドットに
 影響を与えないようにするため、

 64ドッドx64ライン構成で、10ドットの倍数の
 位置で、8ライトの縦線を入れるには、以下のように
 コードを書けばよいはず。

unsigned char dat[8*64];
int line,ii ;
int tbit ;
int pQ,pR,pData ;

for ( line = 0 ; line < 8 ; line++ ) {
  for ( ii = 0 ; ii < 64 ; ii++ ) {
    if ( (ii % 10) == 0 ) {
      tbit = ii ;
      pQ = tbit / 8 ;
      pR = tbit % 8 ;
      pData = (1 << (7 - pR)) ;
      dat[8*line+pQ] |= pData ;
    }
  }
}

 8の剰余系で、いろいろなパターンで
 縦線を入れてみると、次のようになり
 ます。





 これらは、CLIで動作確認できるように
 フレームバッファを配列で構成した後に
 1バイトを2進数で表示しています。


目次

inserted by FC2 system