📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の13版が非表示)
41行目: 41行目:
*: 多くのSC1604 / SC2004モジュールは、バックライト機能を備えている。
*: 多くのSC1604 / SC2004モジュールは、バックライト機能を備えている。
*: バックライトの制御は、別の信号線や専用のコマンドを使用して行う。
*: バックライトの制御は、別の信号線や専用のコマンドを使用して行う。
<br><br>
== SC1602 / SC2004の文字コード ==
HD44780コントローラを搭載したLCDモジュールは、以下に示す文字コードセットをサポートしている。<br>
また、内蔵キャラクタジェネレータ (CGROM) の他にも、CGRAMによりユーザが任意のパターンを定義することができる。<br>
<br>
* 基本ラテン文字 (英数字および一般的な記号)
*: ASCIIコードの0x20〜0x7F (スペース、アルファベット、数字、一般的な記号)
* 日本語カタカナ
*: ASCII拡張セットの0xA0〜0xDF (半角カタカナ)
* ユーザ定義文字
*: 8つのカスタムキャラクタ (CGRAM) を作成可能
*: アドレスは0x00〜0x07
<br>
[[ファイル:HD44780 1.png|フレームなし|中央]]
<br><br>
<br><br>


98行目: 113行目:
  {
  {
     P1DIR |= RS_PIN | E_PIN | DB4_PIN | DB5_PIN | DB6_PIN | DB7_PIN;
     P1DIR |= RS_PIN | E_PIN | DB4_PIN | DB5_PIN | DB6_PIN | DB7_PIN;
    // LCDの電圧が立ち上がるまで40[mS]以上待機する必要がある
    __delay_cycles(40000);
    // 特定の命令を実行する前にBF(Busy Flag)をチェックしてはいけない
    // HDDまたはLCD制御の分野では、BFはデバイスが現在の命令を処理中かどうかを示すフラグ
    // BFが1の場合は命令処理中、0の場合は命令処理完了を表す
    // これは、"ある命令を送信する前にBFをチェックしてはいけない"ということを示唆している
    lcd_cmd(0x30);
DELAY_US(4100);
lcd_cmd(0x30);
DELAY_US(100);
lcd_cmd(0x30);
   
   
     // LCDの初期化
     // LCDの初期化
155行目: 185行目:


== SC2004 / I2C通信 ==
== SC2004 / I2C通信 ==
==== ATmega328とI2C ====
==== MSP430G2553とI2C ====
MSP430G2553において、I2Cのシリアルクロック線(SCL)とシリアルデータ線(SDA)で一般的によく使用されるピンは、以下の通りである。<br>
MSP430G2553において、I2Cのシリアルクロック線(SCL)とシリアルデータ線(SDA)で一般的によく使用されるピンは、以下の通りである。<br>
原則として、以下に示すピンをI2C通信に使用することが推奨される。<br>
原則として、以下に示すピンをI2C通信に使用することが推奨される。<br>
186行目: 216行目:
<u>多くのモジュールには、プルアップ抵抗が内蔵されているが、必要に応じて外部にプルアップ抵抗を追加する必要がある。</u><br>
<u>多くのモジュールには、プルアップ抵抗が内蔵されているが、必要に応じて外部にプルアップ抵抗を追加する必要がある。</u><br>
<br>
<br>
==== MSP430G2553の設定 ====
==== MSP430G2553の設定 ====
以下の設定を適切に行うことにより、MSP430G2553でI2C通信を正常に動作させることができる。<br>
以下の設定を適切に行うことにより、MSP430G2553でI2C通信を正常に動作させることができる。<br>
396行目: 427行目:
<br><br>
<br><br>


== ST7735 ==
==== ハードウェア接続 ====
* ST7735のVCC、GND
*: MSP430G2553のVCC、GNDピンに接続する。
*: <br>
* ST7735のSCL、SDA
*: MSP430G2553のSPIピン (UCB0SCL、UCB0SDA)に接続する。
*: <br>
*: SPI (UCB0) のピン配置
*:* UCB0SIMO (SDA) : P1.7 (14番ピン)
*:* UCB0SCLK (SCL) : P1.5 (12番ピン)
*: <br>
* ST7735のRESET、D/C、CS (チップセレクト)
*: MSP430G2553の任意のGPIOピンに接続可能であるが、一般的に以下に示すような接続を推奨する。
*:* RESET : P2.0 (8番ピン)
*:* D/C (データ/コマンド) : P2.1 (9番ピン)
*:* CS (チップセレクト) : P2.2 (10番ピン)
*: <br>
*: P2.0〜P2.2は連続したピンであるため、配線が整理しやすい。
*: P2.xポートのピンはデジタル入出力専用であるため、アナログ機能との競合が無い。
*: <br>
*: P1.0〜P1.4の中から選択することも可能であるが、P1.6はクリスタル用に予約されている可能性があるため、避けることを推奨する。
<br>
==== SPIの設定 ====
まず、SPIモジュール (USCI_B0) を初期化して、マスターモードで動作するように設定する。<br>
次に、SPIのクロック速度、データ順序、クロックポラリティ等を設定する。<br>
<br>
==== GPIOの設定 ====
RESET、D/C、CSに接続したGPIOピンを出力モードに設定する。<br>
<br>
==== ST7735の初期化 ====
RESETピンをLowにした後にHighにすることにより、ST7735をリセットすることができる。<br>
<br>
必要な初期化コマンドをSPIを通じて送信する。<br>
これには、スリープモードの解除、カラーモードの設定、画面の向きの設定等が含まれる。<br>
<br>
==== 描画関数の実装 ====
ピクセルの描画、線の描画、長方形の塗りつぶし、文字の描画等の基本的な描画関数を実装する。<br>
<br>
描画関数内では、必要なコマンドとデータをSPIを通じてST7735に送信する。<br>
<br>
==== その他 ====
特定のコマンドや操作の後には、ディスプレイが応答するまでに一定の時間が必要な場合がある。<br>
例えば、スリープモードからの復帰 (<code>SLPOUT</code>コマンド) や ディスプレイのON / OFF (<code>DISPON</code> / <code>DISPOFF</code>コマンド) の後には、数十[mS]から数百[mS]の待機が推奨されている。<br>
<br>
これは、ディスプレイ内部の回路が安定するまでに時間が掛かるためである。<br>
必要な待機時間は、ディスプレイのデータシートに記載されていることがある。<br>
<br>
一方、反転表示の有効 / 無効を設定するコマンドの場合、ディスプレイがコマンドを処理するのに掛かる時間は非常に短いため、明示的な待機時間を入れる必要はない。<br>
しかし、もし、ディスプレイの応答が遅い場合や表示の乱れが見られる場合には、短い待機時間 (数[uS]〜数[mS]) を入れることを検討すること。<br>
<br>
==== コントローラの判別 ====
TFT LCDコントローラの判別方法を以下に示す。<br>
* ST7735
*: 解像度は128x160が標準的
* ILI9225
*: 解像度は176x220が標準的
* ILI9341
*: 解像度は240x320が標準的
<br>
例えば、PCB上に1.8 TFTという表記がある場合は、ST7735コントローラが最も一般的に使用される。<br>
また、ST7735コントローラはSPIインターフェースを使用する代表的なコントローラであるため、PCB上にCS、MOSI、MISO、SCKというSPIピンの表記がある可能性が高い。<br>
<br>
その他、確認する箇所を以下に示す。<br>
* 基板上の表記 (解像度、型番)
* ピン配置やインターフェースの種類
* 物理的なサイズと解像度の組み合わせ
<br>
==== サンプルコード ====
以下の例では、描画関数を呼び出して、必要な画像やテキストをLCDに表示している。<br>
<br>
# まず、ST7735の初期化関数 (ST7735_Init関数)
#: GPIOの設定、リセットシーケンス、初期化コマンドの送信を行う。
# 描画領域を設定する関数 (ST7735_SetAddrWindow)
#: 描画する領域の開始と終了の列と行のアドレスを設定する。
# 矩形を塗りつぶす関数 (ST7735_FillRect)
#: 指定された座標、サイズ、色で矩形を塗りつぶす。
# メインプログラム
#: クロックとSPIの初期化、ST7735の初期化、描画関数の呼び出しを行う。
<br>
<syntaxhighlight lang="c">
#include <msp430.h>
// GPIOピンの定義
#define LCD_DC_PORT    P1OUT
#define LCD_DC_PIN      BIT0
#define LCD_CS_PORT    P1OUT
#define LCD_CS_PIN      BIT1
#define LCD_RESET_PORT  P1OUT
#define LCD_RESET_PIN  BIT2
// ST7735のコマンド定義
#define ST7735_SLPOUT  0x11  // スリープモードを解除するコマンド
#define ST7735_COLMOD  0x3A  // カラーモードを設定するコマンド
#define ST7735_MADCTL  0x36  // 画面の向きを設定するコマンド
#define ST7735_DISPON  0x29  // ディスプレイをオンにするコマンド
#define ST7735_CASET    0x2A  // 列アドレスを設定するコマンド
#define ST7735_RASET    0x2B  // 行アドレスを設定するコマンド
#define ST7735_RAMWR    0x2C  // メモリ書き込みコマンド
#define ST7735_INVON    0x21  // 反転表示を有効にするコマンド
#define ST7735_INVOFF  0x20  // 反転表示を無効にするコマンド (デフォルトでは反転表示はOFF)
                              // 反転表示を有効にする場合 : ST7735_WriteCommand(ST7735_INVON);
                              // 反転表示を無効にする場合 : ST7735_WriteCommand(ST7735_INVOFF);
// カラー定義
// 16ビットRGB565カラーフォーマット (赤:5ビット, 緑:6ビット, 青:5ビットで表現)
#define ST7735_BLUE    0x001F
#define ST7735_RED      0xF800
// ST7735の初期化関数
void ST7735_Init()
{
    // GPIOの設定
    GPIO_setAsOutputPin(LCD_RESET_PORT, LCD_RESET_PIN);
    GPIO_setAsOutputPin(LCD_DC_PORT, LCD_DC_PIN);
    GPIO_setAsOutputPin(LCD_CS_PORT, LCD_CS_PIN);
    // リセットシーケンス
    GPIO_ResetOutputPin(LCD_RESET_PORT, LCD_RESET_PIN);
    __delay_cycles(100000);  // 100[mS]待機
    GPIO_SetOutputPin(LCD_RESET_PORT, LCD_RESET_PIN);
    __delay_cycles(100000);  // 100[mS]待機
    // 初期化コマンドの送信
    ST7735_WriteCommand(ST7735_SLPOUT);  // スリープモードを解除
    __delay_cycles(500000);              // 500[mS]待機
    ST7735_WriteCommand(ST7735_COLMOD);  // カラーモードを設定
    ST7735_WriteData(0x05);              // 16ビットカラーモード
    ST7735_WriteCommand(ST7735_MADCTL);  // 画面の向きを設定
    ST7735_WriteData(0x00);              // 通常の向き
    ST7735_WriteCommand(ST7735_DISPON);  // ディスプレイをオンにする
}
// 描画領域を設定する関数
void ST7735_SetAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1)
{
    ST7735_WriteCommand(ST7735_CASET);  // 列アドレス設定コマンド
    ST7735_WriteData(x0 >> 8);          // 開始列の上位8ビット
    ST7735_WriteData(x0 & 0xFF);        // 開始列の下位8ビット
    ST7735_WriteData(x1 >> 8);          // 終了列の上位8ビット
    ST7735_WriteData(x1 & 0xFF);        // 終了列の下位8ビット
    ST7735_WriteCommand(ST7735_RASET);  // 行アドレス設定コマンド
    ST7735_WriteData(y0 >> 8);          // 開始行の上位8ビット
    ST7735_WriteData(y0 & 0xFF);        // 開始行の下位8ビット
    ST7735_WriteData(y1 >> 8);          // 終了行の上位8ビット
    ST7735_WriteData(y1 & 0xFF);        // 終了行の下位8ビット
    ST7735_WriteCommand(ST7735_RAMWR);  // メモリ書き込みコマンド
}
// SPIを通じてコマンドを送信する関数
void ST7735_WriteCommand(uint8_t cmd)
{
    GPIO_ResetOutputPin(LCD_DC_PORT, LCD_DC_PIN);  // D/Cピンを0(コマンドモード)にする
    GPIO_ResetOutputPin(LCD_CS_PORT, LCD_CS_PIN);  // CSピンを0(選択状態)にする
    USCI_B_SPI_transmitData(USCI_B0_BASE, cmd);    // SPIを通じてコマンドを送信
    GPIO_SetOutputPin(LCD_CS_PORT, LCD_CS_PIN);    // CSピンを1(非選択状態)にする
}
// SPIを通じてデータを送信する関数
void ST7735_WriteData(uint8_t data)
{
    GPIO_SetOutputPin(LCD_DC_PORT, LCD_DC_PIN);    // D/Cピンを1(データモード)にする
    GPIO_ResetOutputPin(LCD_CS_PORT, LCD_CS_PIN);  // CSピンを0(選択状態)にする
    USCI_B_SPI_transmitData(USCI_B0_BASE, data);  // SPIを通じてデータを送信
    GPIO_SetOutputPin(LCD_CS_PORT, LCD_CS_PIN);    // CSピンを1(非選択状態)にする
}
// ピクセルを描画する関数
void ST7735_DrawPixel(uint16_t x, uint16_t y, uint16_t color)
{
    ST7735_SetAddrWindow(x, y, x, y);  // 描画領域を設定
    ST7735_WriteData(color >> 8);      // 上位8ビットのカラーデータを送信
    ST7735_WriteData(color & 0xFF);    // 下位8ビットのカラーデータを送信
}
// 矩形を塗りつぶす関数
void ST7735_FillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color)
{
    ST7735_SetAddrWindow(x, y, x + w - 1, y + h - 1);  // 描画領域を設定
    uint32_t pixels = w * h;
    while (pixels--) {
        ST7735_WriteData(color >> 8);    // 上位8ビットのカラーデータを送信
        ST7735_WriteData(color & 0xFF);  // 下位8ビットのカラーデータを送信
    }
}
int main(void)
{
    // クロックとSPIの初期化
    WDTCTL = WDTPW | WDTHOLD;  // ウォッチドッグタイマを停止
    BCSCTL1 = CALBC1_1MHZ;    // DCOを1[MHz]に設定
    DCOCTL = CALDCO_1MHZ;
    BCSCTL2 &= ~(DIVS_3);      // SMCLK分周器をクリア
    // SPIの設定 (UCB0を使用)
    UCB0CTL1 |= UCSWRST;                                    // ソフトウェアリセットを有効化
    UCB0CTL0 = UCCKPH | UCMSB | UCMST | UCMODE_0 | UCSYNC;  // SPIモード0、マスターモード
    UCB0CTL1 = UCSSEL_2 | UCSWRST;                          // SMCLKを選択、ソフトウェアリセットを維持
    UCB0BR0 = 1;                                            // SPIクロックを1[MHz]に設定
    UCB0BR1 = 0;
    P1SEL |= BIT5 | BIT6 | BIT7;                            // P1.5, P1.6, P1.7をSPIピンに設定
    P1SEL2 |= BIT5 | BIT6 | BIT7;
    UCB0CTL1 &= ~UCSWRST;                                  // ソフトウェアリセットを解除
    // ST7735の初期化
    ST7735_Init();
    // 矩形を描画
    ST7735_FillRect(0, 0, 128, 160, ST7735_BLUE);          // 背景を青で塗りつぶす
    ST7735_FillRect(10, 10, 108, 140, ST7735_RED);          // 赤い矩形を描画
    while (1) {
        // ...略
    }
}
</syntaxhighlight>
<br>
実際の設計では、より複雑な描画や画像の表示、ユーザインタラクションの処理等が必要になる場合がある。<br>
また、ST7735の詳細なデータシートを参照して、必要な初期化シーケンスやコマンドを適切に実装することが重要である。<br>
<br><br>
== ST7789 ==
==== サンプルコード ====
ST7789搭載のLCDを制御する場合、基本的な手順はST7735と同様であるが、いくつかの違いがある。<br>
<br>
また、ST7789は、SPI通信のほかにDC (データ/コマンド) ピンを使用するが、一部のデバイスではSPI通信の9ビット目を使用してデータとコマンドを区別する場合もある。<br>
その場合は、SPIの設定と通信関数を適宜変更する必要がある。<br>
<br>
以下の例では、上記のサンプルコードをST7789向けに修正している。<br>
* コマンドの変更
*: ST7789では、一部の制御コマンドがST7735と異なる場合がある。
*: ST7789の具体的な初期化シーケンスやコマンドについては、デバイスのデータシートを参照して適切に実装する必要がある。
<syntaxhighlight lang="c">
// ST7789向け制御コマンド
#define ST7789_SLPOUT  0x11  // スリープモードを解除するコマンド
#define ST7789_COLMOD  0x3A  // カラーモードを設定するコマンド
#define ST7789_MADCTL  0x36  // 画面の向きを設定するコマンド
#define ST7789_DISPON  0x29  // ディスプレイをオンにするコマンド
#define ST7789_CASET    0x2A  // 列アドレスを設定するコマンド
#define ST7789_RASET    0x2B  // 行アドレスを設定するコマンド
#define ST7789_RAMWR    0x2C  // メモリ書き込みコマンド
#define ST7789_INVON    0x21  // 反転表示を有効にするコマンド
#define ST7789_INVOFF  0x20  // 反転表示を無効にするコマンド
</syntaxhighlight>
<br>
* 初期化コマンドの変更
<syntaxhighlight lang="c">
void ST7789_Init()
{
    // ...略 (リセットシーケンス等は同じ)
    // 初期化コマンドの送信
    ST7789_WriteCommand(ST7789_SLPOUT);  // スリープモードを解除
    __delay_cycles(500000);              // 500[mS]待機
    ST7789_WriteCommand(ST7789_COLMOD);  // カラーモードを設定
    ST7789_WriteData(0x55);              // 16ビットカラーモード
    ST7789_WriteCommand(ST7789_MADCTL);  // 画面の向きを設定
    ST7789_WriteData(0x00);              // 通常の向き
    ST7789_WriteCommand(ST7789_INVON);  // 反転表示を有効化
    ST7789_WriteCommand(ST7789_DISPON);  // ディスプレイをONにする
}
</syntaxhighlight>
<br>
* 解像度の変更
*: ST7789は、一般的に240x320ピクセルの解像度を持つため、描画関数で使用する座標の範囲を適切に調整する必要がある。
<syntaxhighlight lang="c">
// 背景を青で塗りつぶし、中央に赤い矩形を描画
ST7789_FillRect(0,  0, 240, 320, ST7789_BLUE);
ST7789_FillRect(60, 80, 120, 160, ST7789_RED);
</syntaxhighlight>
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:MSP430]]
[[カテゴリ:MSP430]]