まだトマトの収穫があります。今年は初夏からトマトを買うことがなかった。
収穫期には食べきれなくて、よくできたのは近所にお配りした程でした。
もう最近の収穫は小さいけれど、味は濃厚。酒のつまみになるくらい。
そして今日、ついに観念して歯医者に行った。日曜から歯が痛くてしかたなかっ たのだ。昨日は歯医者の前まで行ったものの、引き返してきてしまった。
しばらく通院です。気が重い。

ロガー続き。秋葉原の液晶工房 でFSTN液晶モジュール (128×64,SPI)[AD-12864-SPI] を買ってきました。今は20%オフなので、 1000円。しかし液晶画面は小さい。表示領域で27mmx13mm程度しかない。これじゃ いくらなんでも小さ過ぎだろうとも思いつつ、これにしたのは、これがSPI接続 だから。LPC2388はSPIモジュールがあるし、それだととても配線が少なくてす むし、プログラムもとても楽。
/usr/X11R7/lib/X11/fonts/misc/18x18ja.pcf.gzを変換してこのLCDに合うよう に16x16のフォントを生成してみたのだけど(pcf2bdfを改造して生成)、これは 走行中読めないだろう...。
フォントも作った方がいいかな。どうせ0123456789'.だけあればいいし。

LSにはまったく人がいなくなっていた。
元キャラは楽しかった思い出がつまらない思い出でかき消されるのが嫌でキャ ラデリしてしまったけれど、はやまったかな。もう一度空を散歩したい。
もう最近の収穫は小さいけれど、味は濃厚。酒のつまみになるくらい。
そして今日、ついに観念して歯医者に行った。日曜から歯が痛くてしかたなかっ たのだ。昨日は歯医者の前まで行ったものの、引き返してきてしまった。
しばらく通院です。気が重い。

ロガー続き。秋葉原の液晶工房 でFSTN液晶モジュール (128×64,SPI)[AD-12864-SPI] を買ってきました。今は20%オフなので、 1000円。しかし液晶画面は小さい。表示領域で27mmx13mm程度しかない。これじゃ いくらなんでも小さ過ぎだろうとも思いつつ、これにしたのは、これがSPI接続 だから。LPC2388はSPIモジュールがあるし、それだととても配線が少なくてす むし、プログラムもとても楽。
/usr/X11R7/lib/X11/fonts/misc/18x18ja.pcf.gzを変換してこのLCDに合うよう に16x16のフォントを生成してみたのだけど(pcf2bdfを改造して生成)、これは 走行中読めないだろう...。
フォントも作った方がいいかな。どうせ0123456789'.だけあればいいし。

SPIモジュールの設定は
void
spi_init ()
{
電源を入れて(デフォルトで電源は入っている)
mcu_peripheral_power (PCONP_PCSPI, TRUE);
モジュールのクロックを設定。
mcu_peripheral_clock (PCLK_SPI, CCLK8); //72/8=9MHz
ピンをSPIに設定。
mcu_pin_select (0, 15, 3); //SCK
mcu_pin_select (0, 16, 3); //SSEL SPIマスタで使うならこれはなくてもいい。
mcu_pin_select (0, 17, 3); //MISO データを受けとらないならこれもなくてもいい。
mcu_pin_select (0, 18, 3); //MOSI
SPIのクロックを設定します。
*S0SPCCR = 8; // 9/8 = 1.125MHz
// *S0SPCCR = 0xff; // 9/8 = 1.125MHz
マスターでMSBファーストです。
*S0SPCR = CR_MSTR; // Master. 8bit MSB
// *S0SPCR = CR_MSTR | CR_CPOL |CR_CPHA; // Master. 8bit MSB
// *S0SPCR = CR_MSTR | CR_LSBF; // Master. 8bit LSB
}
void
spi_fini ()
{
mcu_peripheral_power (PCONP_PCSPI, FALSE);
}
void
spi_putc(uint8_t c)
{
uint32_t r;
*S0SPDR = c;
送信の完了を待ちます。
while (!(*S0SPSR & SR_SPIF))
;
}
LCDモジュールはA0のHi/Lowでコマンドかデータかを区別するので、ここは
GPIOの1.30を接続しました。
#define LCD_COMMAND() GPIO_PIN_CLR (1, 30)
#define LCD_DATA() GPIO_PIN_SET (1, 30)
void
lcd_command_putc (int8_t c)
{
LCD_COMMAND ();
spi_putc (c);
// udelay(100);
}
void
lcd_data_putc (int8_t c)
{
LCD_DATA ();
spi_putc (c);
// udelay(100);
}
#define LCD_RESET_PORT 3
#define LCD_RESET_BIT 26
#define LCD_A0_PORT 1
#define LCD_A0_BIT 30
#define LCD_LED_PORT 1
#define LCD_LED_BIT 31
#define LCD_COMMAND() GPIO_PIN_CLR (1, 30)
#define LCD_DATA() GPIO_PIN_SET (1, 30)
struct pin_config pin_config[] =
{
ハードウェアリセットはなくてもいいかもしれないけれど、一応できるように
しておきました。
{ LCD_RESET_PORT, LCD_RESET_BIT, 0, PIN_PULLUP, GPIO_OUTPUT },//GPIO #RESET
これはコマンドとデータの区別
{ LCD_A0_PORT, LCD_A0_BIT, 0, PIN_PULLUP, GPIO_OUTPUT },//GPIO A0
これはバックライトのLED。
{ LCD_LED_PORT, LCD_LED_BIT, 0, PIN_PULLUP, GPIO_OUTPUT },//GPIO LED_A
};
ここまで継いでも、LPC2388はほとんどのピンに対してプルアップ、プルダウン
を設定できて、LEDを駆動できるので一切の外部回路不用。うれしい。
H8の場合、プルアップできるポート、LEDが駆動できるポートが限定されている
のでちょっと面倒だった。
void
lcd_display_init ()
{
size_t i;
struct pin_config *p = pin_config;
spi_init ();
for (i = 0; i < sizeof pin_config / sizeof (pin_config[0]); i++, p++)
{
mcu_pin_select (p->port, p->bit, p->func);
mcu_pin_mode (p->port, p->bit, p->mode);
if (p->dir != -1)
gpio_dir (p->port, p->bit, p->dir);
}
ハードウェアリセットします。
udelay (200);
GPIO_PIN_CLR (3, 26);
udelay (200);
GPIO_PIN_SET (3, 26);
バックライトLEDを点灯します。
GPIO_PIN_SET (1, 31);
udelay (200);
LCDモジュールをオンにして
lcd_command_putc (DISPLAY_ON);
全ての電源を入れます。
lcd_command_putc (POWER | POWER_BOOSTER | POWER_REGULATOR | POWER_FOLLOWER);
コントラストの調整。0でちょうどいい。サンプルコードの0x1fにしたりすると
まったく見えない。
lcd_command_putc (BRIGHTNESS);
lcd_command_putc (0 & BRIGHTNESS_MASK);
ここちょっと不明。サンプルのまま。
lcd_command_putc (REGULATOR | (7 & REGULATOR_MASK));
lcd_command_putc (LCD_BIAS_1_9);
これは液晶の上から下に0-63にします。デフォルトだと下から0-63。
lcd_command_putc (SCAN_DIR_REVERSE);
これは液晶の左から右に0-127にします。ADC_RESERVEにすれば反対。
lcd_command_putc (ADC_NORMAL);
V-RAMに関わらず全てのドットをONにするのをやめます。
lcd_command_putc (ALL_POINT_OFF);
これはビットの反転設定。
lcd_command_putc (DISPLAY_REVERSE);
液晶テストをオフにします。
lcd_command_putc (STATIC_INDICATOR_ON);
lcd_command_putc (INDICATOR_OFF);
V-RAMのスタート位置を設定します。
lcd_command_putc (START_LINE | (0 & START_LINE_MASK));
// lcd_command_putc (READMODIFYWRITE_SET);
}
列の設定
void
lcd_set_column (int i)
{
LCD_COMMAND ();
spi_putc (COLUMN_ADDR_HI | ((i >> 4) & 0xf));
spi_putc (COLUMN_ADDR_LO | (i & 0xf));
}
ページの設定(8行ごとに1ページ)
void
lcd_set_page (int i)
{
LCD_COMMAND ();
spi_putc (PAGE_ADDR | (i & PAGE_ADDR_MASK));
}
久々に狩りにでかけてきました。レベルシンクして、ジ・タでゴブペットを黒
5吟1でバーンパーティ。今はこういう戦略なのね。
LSにはまったく人がいなくなっていた。
元キャラは楽しかった思い出がつまらない思い出でかき消されるのが嫌でキャ ラデリしてしまったけれど、はやまったかな。もう一度空を散歩したい。
