I2CディスプレイモジュールSO1602に文字を表示させる

ATmega328PでTWI(I2C)を制御する

AVR155: Accessing an I2C LCD Display using the AVR® 2-wire Serial Interfaceより次のフローチャートを参考に

TWI(I2C)基本フロー

TWI(I2C)基本フロー
TWI(I2C)基本フロー

TWI(I2C)ドライバフロー

TWI(I2C)ドライバフロー
TWI(I2C)ドライバフロー

データーシートのフローチャートを元にして書いたコード

データーシートのフローチャートを元にして書いたコード

I2Cディスプレイモジュールドライバを作る

I2Cバス仕様

UM10204_JA-013

3.1.10 スレーブアドレスとR/Wビット
データ転送の形式を下図(図9)に示します。
スタートコンディション(S)の後、スレーブアドレスが送信されます。
このアドレスは7ビット長で、8ビット目にデータ転送の方向を示すビット(R/W)が続きます。
「0」は、送信(WRITE、書き込み)を、「1」はデータのリクエスト(READ、読み出し)を示します(図10)。
I2C バス仕様およびユーザーマニュアル

スタートプロセス後の最初のバイトがスレーブアドレスでディスプレイモジュールのスレーブアドレスは011110[SA0],SA0は今回GNDに接続しているので011 1100 = 0x3C, 8ビット目がR/Wフラグとなっているのでアドレス0x3Cならデーターとしては0x78を送り出します.

#define I2C_DISPLAY_ADDR (0x3C <<1)
ここで1ビット左シフトしている理由がそれです。

I2Cディスプレイモジュール仕様


SO1602AWYB-UC-WB-U-11
I2Cディスプレイモジュールデータフォーマット

ディスプレイモジュールにはスレーブアドレスの次にコントロールバイト,データーバイトの順にバスに送り出します.

コントロールバイト

Co D/C# 0 0 0 0 0 0
0 1 0 0 0 0 0 0 Data
0 0 0 0 0 0 0 0 Command
Co
Continuation bit
D/C#
Data(1) / Command(0) Selection bit

コントロールバイトは続くデーターバイトがデーターかコマンドかをディスプレイモジュールに指示しています.

コマンド送信

スレーブアドレス,0x00,データーバイトの順にバスに送り出します.

//
//i2cディスプレイにコマンド送信
//
void i2c_display_send_command( uint8_t command )
{
    if (IOread_from_oled_power_on()) {  //電源が入っていないと無限ループに陥るので
        i2c_display_send( I2C_DISPLAY_ADDR, 0x00, command );
    }
}

データー送信

スレーブアドレス,0x40,データーバイトの順にバスに送り出します.

//
//i2cディスプレイにデータ送信
//
void i2c_display_send_data( uint8_t data )
{
    if (IOread_from_oled_power_on()) {  //電源が入っていないと無限ループに陥るので
        i2c_display_send( I2C_DISPLAY_ADDR, 0x40, data );
    }
}

データーバイト

D a t a b y t e
x x x x x x x x

これはただの8bitデーターです

SO1602ディスプレイモジュールの使いかた

このモジュールはHD44780の使い方で使えるので,キャラクタLCDモジュールの使いかた – ELM by ChaNを参考に書きました

ディスプレイモジュールのコマンド表 SO1602データーシートより

SO1602AWYB-UC-WB-U_page_19
SO1602データーシートより
SO1602AWYB-UC-WB-U_page_20
SO1602データーシートより
SO1602AWYB-UC-WB-U_page_21
SO1602データーシートより

ディスプレイモジュールに外字を登録

レベルメーター表示の外字データーをPROGMEMに配置して

//
//外字登録
//
for (uint8_t code=0x00 ; code<register_characters_count ; code++) {
    //set cgram
    i2c_display_send_command (0x40 | (code<<3) | 0);    //char code 'code' and top line
    _delay_ms(1);
    //write data
    for (uint8_t n=0 ; n

このループで登録してます。

I2Cディスプレイコントローラ

I2Cディスプレイコントローラ回路

I2Cディスプレイコントローラソフトウェア

i2c_display.h
i2c_display.c
制御にはATMEGA328Pに内蔵されているI2C(TWI)機能を使います,I2C割り込みは難しそうなので今回は無し。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください