
jiskan24から作ってみました。ラップタイムの部分は、ランタイムになんちゃっ てボールドにしてあります。一行目の反転表示が速度、横がラップ、ラップタ イムの下の棒グラフが30分までの経過時間の割合いを示しています。
LCDは通常のVRAM構成と違って、VRAMの一番最初に1B書き込むと、それは縦に8bit なので、フォントの変換とか面倒だ。
今回は使われていないイーサネット用のメモリ領域(0x7fe00000からの16KB)の 最初の1KBを仮想VRAMとしました。ここにイメージを作って、適時SPIで一気に LCDに転送です。イーサネットのメモリならDMA領域なので、SPIからSSPのSPIモー ドに変更すれば、DMA転送もできるだろうという目論見。
最近はCでも整合配列が使えるようになったのでちょっと楽になった。
イーサネットのメモリをVRAMにします。ページサイズで整合配列にしておきます。
uint8_t (*vram)[VRAM_PAGE_SIZE] = (uint8_t(*)[])ETHER_RAM_START;
フォントは24x24。1ページが8bitなので3ページを使います。
#define BITMAP_WIDTH 24
#define BITMAP_NPAGE 3
フォントはLCD用のフォーマットに変換しておきます。これは'0'
struct font
{
uint8_t bitmap[BITMAP_NPAGE][BITMAP_WIDTH];
} fonts[] = {
//[0xcb]----------------------------------------------------------------------
{{
{ 0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0xc0, //||......
0xf0, //||||....
0x38, //..|||...
0x0c, //....||..
0x04, //.....|..
0x02, //......|.
0x02, //......|.
0x02, //......|.
0x02, //......|.
0x04, //.....|..
0x0c, //....||..
0x38, //..|||...
0xf0, //||||....
0xc0, //||......
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
},
{ 0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0xff, //||||||||
0xff, //||||||||
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0xff, //||||||||
0xff, //||||||||
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
},
{ 0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x03, //......||
0x07, //.....|||
0x0c, //....||..
0x08, //....|...
0x10, //...|....
0x10, //...|....
0x10, //...|....
0x10, //...|....
0x08, //....|...
0x0c, //....||..
0x07, //.....|||
0x03, //......||
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
},
}},
...
仮想VRAMにはLCDに送るイメージそのものを。こうしたのは「'」や「.」を合成
したいため。このLCDモジュールはLCDへのデータの書き込みしかできないので
read-modify-writeができない。なので、こっちでやっておく。
// Write to V-RAM
void
lcd_vram_font (int font_index, int x, int y, bool inverse)
{
int j, k;
assert ((size_t)font_index < sizeof fonts / sizeof (fonts[0]));
struct font *font = fonts + font_index;
for (j = 0; j < BITMAP_NPAGE; j++)
{
uint8_t *p = vram[j + y] + x;
uint8_t *bits = font->bitmap[j];
for (k = 0; k < BITMAP_WIDTH; k++)
{
uint8_t b = *bits++;
*p++ |= inverse ? ~b : b;
}
}
}
頃合を見て一気に転送。いずれ、ここはDMAにしたい。
// Transfer internal V-RAM data to LCD
void
lcd_vram_transfer ()
{
int i, j;
for (i = 0; i < VRAM_NPAGE; i++)
{
lcd_set_page (i);
lcd_set_column (0);
uint8_t *bits = vram[i];
for (j = 0; j < VRAM_PAGE_SIZE; j++)
lcd_data_putc (bits[j]);
}
}

なんとなく接続したのをきっちりまとめないと。ここから車体に乗せるまでが 結構大変なんだよね。
GPSの書き込みフォーマットも考えておかないと。
