AKI-H8/3052で遊ぶ ~ キャラクタ液晶モジュール

秋月で売られているキャラクタ液晶をH8に繋いでいる人が多いようです.これに文字を出せるようにしましょう.

プログラム

配線がめんどいので,4ビットモードです.P3に接続してください.プログラムを見れば配線はすぐに分かると思います(^^;.


////////////////////////////////////////////////////////////////////////////
//               LCD

#define LCD_PORT P3
#define LCD_SIG_RS 0x10
#define LCD_SIG_E  0x20
#define LCD_CMD_CLEAR 0x01

volatile void lcd_wait(void)
{
    int t = 10000;
    while(t--);
}

// 8ビット出力
void lcd_out(unsigned char d)
{
    LCD_PORT.DR.BYTE = d | LCD_SIG_E; // output and enable E
    //lcd_wait(); // 無いと駄目?
    LCD_PORT.DR.BYTE = d & ~LCD_SIG_E; // output and disable E
    lcd_wait();
}

// LCD初期化
void lcd_init(void)
{
    // 3回 00000011を出力
    lcd_out(0x03);
    lcd_out(0x03);
    lcd_out(0x03);

    // ファンクションセット
    lcd_out(0x02); // 4ビットモードに
    lcd_out(0x2);
    lcd_out(0x8);

    // 00001100 表示オン/カーソルOFF/ブリンクOFF
    lcd_out(0x0);
    lcd_out(0xc);

    // 00000110 エントリーモードセット
    lcd_out(0x0);
    lcd_out(0x6);
}

// データ出力
void lcd_write(unsigned char d)
{
    lcd_out((d >> 4)&0x0f | LCD_SIG_RS);  // 上位4ビット
    lcd_wait();
    lcd_out(d&0x0f | LCD_SIG_RS);       // 下位4ビット
    lcd_wait();
}

// 表示クリア
void lcd_clear(void)
{
    LCD_PORT.DR.BYTE = 0;
    lcd_out(0);
    lcd_out(LCD_CMD_CLEAR);
    lcd_wait();
}


void lcd_setpos(int x,int y)
{
    y &= 0x1; // 2行のみ
    LCD_PORT.DR.BYTE = 0;
    lcd_out(0x08 | (y << 2) );
    lcd_out(x);
    lcd_wait();
}


static int lcd_line = 0;
static int lcd_clearflag = 0;

// char送信
void lcd_putchar(char c) {
    if (c=='\n') {
        lcd_line++;
        lcd_clearflag = 1;
    } else if (c=='\f') {
        lcd_clear();
        lcd_line = 0;
    } else {
        if (lcd_clearflag) {
            lcd_setpos(0,lcd_line);
            lcd_clearflag = 17;
            while (--lcd_clearflag) lcd_write(' ');
            lcd_setpos(0,lcd_line);
        }
        lcd_write((unsigned char)c);
    }
}

// 文字列出力
void lcd_puts(char *s) {
    while (*s) lcd_putchar(*s++);
}

使い方


int main()
{
    P3.DDR = 0xff;  // LCD
    lcd_wait(); // 待ってみる
    lcd_init();

    lcd_putchar('\f'); // clear

    lcd_puts("Stand by ready!\n");
    lcd_puts("Set up.");

    for(;;);
}

終わりに

実は,H8が無い環境でプログラムを微妙に修正してから載せているので,もしかしたら実機で動かないかも….

誰かが買ってきた「C言語による H8マイコン プログラミング入門」という本を教科書にしています.ここの説明も出来る限り本に合わせています.

ただ,この本のプログラムの癖は独特です(特に定数の使い方や関数名の付け方が…).説明はとても分かりやすいので,H8初心者には良いと思いますが,プログラミングの教科書には向いてないような気もします.

この文書の履歴

Copyright © 瓶詰堂 all rights reserved.