STM32でSC1602をI2C制御する

投稿者: | 2019/11/03

STM32でI2CをS/Wで制御する「S/W I2C」を紹介しました。今回はS/W I2Cを使って16×2行のSC1602互換 LEDディスプレイを制御する手順を紹介します。Arduino用ではありません。

SC1062は、8bitまたは4bitのデータ線と3本の制御線が必要です。最低でも7本のGPOを消費する事になります。GPIOが少ないマイコンでは結構厳しいですよね。そこで、I2C経由でGPIOを制御できるI2Cパラレル変換ICと組み合わせてSC1602をI2Cで制御できるようにしたものが販売されてます。中国のAliExpressだと200円台で買える安さです。
今回は、このSC1602+I2Cを制御する例を紹介します。

私が購入したSC1602互換ディスプレイのI2Cパラレル変換ICは、NXPのPCF8574Tが使われていました。スレーブアドレスが異なるPCF8574Aもあるようです。また、TIからも互換ICが販売されているようです。今回このICを制御するのに仕様書を確認していましたが、TIの仕様書はちょっと誤記があるように思います。NXPの仕様書を元にプログラムしました。 (TIとNXPとで仕様が異なるのかもしれませんが)

PCF8574の基板(下の写真)をテスターで導通確認したところ、各ポートの対応は以下の通りでした。
PCF8574

SC1602  PCF8574T
D7 P7
D6 P6
D5 P5
D4 P4
LED P3
E P2
RW P1
PS P0

SC1602のコントロールIC HD44780(互換)の制御線は、4bitモードの場合7本必要になります。SC1602は4bitモードで動作させないといけませんね。残りの1本はバックライトLED ON/OFF用です。まぁうまいこと8本に収まりましたね。
LEDは、HD44780ではなくトランジスタに直接つながっています。1でバックライトON, 0でバックライトOFFです。

PCF8574は、1バイトのレジスタを介してデータのR/Wを行います。制御は簡単です。
PCF8574のレジスタbit 0からbit 7が、P0からP8に対応しています。レジスタに書き込むとビットに対応したポートがON/OFFします。バイトデータ送信後のACKのタイミングで各ポートが変化します。また、PCF8574にバイトデータを連続して書き込むとACKタイミング毎にポートが変化する事になります。
つまり、短いWaitであれば、バイトデータを複数回送信する事によりポートをH/Lさせるタイミングを調整することができます。この例(前回のSW_I2C のshortWait設定,STM32F103 clock 72MHzだと) 1byte(スタート、ストップは含まず)で大体43〜45μsでした。(ちょっとクロックが速すぎるみたいですね。waitを調整した方が良いですね。とりあえず、実力的には動作しているようですが…)
ReturnHomeのコマンド以外は1byte送信する時間でwaitが間に合いそうですね。

先のSW_I2Cクラスを継承してSC1602_I2Cクラスを作る事にします。
使っていないもの、実装していないものもありますが、そこはご愛嬌。

メンバー関数は以下の通りです。

  • HD44780には、スクロールの機能も有るようですが、使わないので実装していません。
  • カスタムフォント(CG)のロードは、setCGFont(), setCustomFont()で行います。フォントデータを別ファイルにして、initialize()で初期化後にロードします。
  • setCursorPosition()で入力位置を設定した後、displayString()で文字を表示します。文字列はnull終端です。もし、カスタムフォントの0x00を表示する場合は、エイリアスの0x08を指定してください。
  • 一文字表示はputChar()でも可能です。
  • コマンド等、HD47780の処理に時間がかかる場合は、isBusy()がtrueの間waitするようにしてください。
    例では、initialize()の最後でclearDisplay()の後にbusyフラグをチェックしています。1ループ分ぐらいbusyになっているようです。(スペック1.52ms HD47780の仕様なので、互換ICでは若干異なるかもしれませんね)

custom fontの例です。「℃」を作ったつもりです。8バイトで1文字です。1バイトで1ラインです。8バイト目はカーソル用ですので、基本的にはブランク(all 0)です。
initialize()後に、setCustomFont()で一気にCGRamにロードします。ちゃんと8文字分作ってくださいね。

SC1602_I2Cクラスの使い方です。FreeRTOS(CMSIS-RTOS)のTaskにしています。
初期化完了後は、別のタスクからMailで送られた文字を受け取って表示しています。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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