2023.08.27本記事はプロモーションが含まれています。こんにちは、ENGかぴです。PIC16F1827のDOとdelay()関数を使用することで16文字×2のLCDに文字を表示することができます。LCDを制御する最小のピン構成でデータを書き込んで文字を表示する方法をまとめました。I2C通信を使用してLCDに文字を表示する方法は下記記事にまとめています。PICマイコン(PIC16F1827)のI2C通信を実装するLCDはQAPASS1602(スターターキットに付属)を使用しています。PIC16F1827で動作確認したことについてリンクをまとめています。関連リンクLCDの使い方LCDの通信方式はバス方式とI2Cなどの通信方式がありますが今回使用するLCDはバス方式とします。制御用のDOとデータを構成するDOを組み合わせることで通信を行いLCDに文字を表示します。LCDの配線例とインストラクションレジスタ(以下IRとする)の初期化の方法とデータレジスタ(以下DRとする)に書き込む方法を説明します。「書けるが先で、理解が後」を体験しよう!PIC16F1827とLCDの配線PIC16F1827とLCDモジュールの配線例PIC16F1827とLCDの配線例を示しています。最小の組み合わせでは制御線2本とデータ用の4本を接続することでLCD表示ができます。配線の組み合わせは以下の通りです。D7LCDの配線の組み合わせデータ8ビットの方が高速な応答ができますが、PIC16F1827では使用できるピン数が少ないため配線の本数が最小となる6本で回路を構成します。V0は可変抵抗で分圧して入力することでコントラストを変更できますが、表示を見やすくするためGND接続しています。DACを使ってLCDモジュールのV0に電圧を印加することでコントラストを調整する方法もあります。LED照明することで全体が明るくなり文字が見やすいためLED照明を点灯しています。一部のLCDモジュールはVDDとVSSが逆になっていることがあるので注意が必要です。PIC16F1827のピン配置は以下の通りです。PIC16F1827のピン設定(MCC)MCLR以外はすべてGPIOをDOにしています。IRの初期化LCDを任意の条件で使用するためにIRに初期設定、画面クリア、表示アドレスの設定などのコードを書き込む必要があります。ST7066Uのデータシートを引用して説明します。Displayは画面に0x20(スペースコード)を書き込んで画面表示をクリアしDDRAMのアドレスをクリアします。カーソルが一段目の左端になります。EntryModeSetはカーソル移動モードとシフトモードを設定します。I/D=1を指定するとインクリメントになりI/D=0ではデクリメントになります。S=1を指定するとディスプレイシフトを有効になりS=0で無効になります。ON/OFFはD=1を指定するとディスプレイがONになりD=0を指定するとOFFします。C=1を指定するとカーソルの表示がONになりC=0を指定するとOFFします。B=1を指定するとカーソルの位置がブリンク状態になりB=0を指定するとブリンクが無しになります。FunctionSetはインターフェースビット長(4ビットまたは8ビット)の選択や表示ラインのフォントサイズを設定します。DL=1を指定すると8ビット、DL=0を指定すると4ビットになります。N=1を指定すると2ライン(2段表示)、N=0を指定すると1ライン(1段表示)になります。F=1を指定するとフォントサイズが5×10dot、F=0を指定すると5×8dotになります。SetDDRAMaddressはDDRAMのアドレスを指定します。文字を表示するためのカーソル位置を指定します。Displayで代用することもできますが、2段目の左端のアドレスを使用する場合は0x40を指定します。DATAはDDRAMまたはCGRAMにデータを書き込みます。アスキーコードに対応している文字を表示する場合はDDRAMに書き込みを行います。書き込む場合はDRを選択するためRS信号をHIGHにしてから行います。本記事では赤文字の設定を有効にしています。sequence)各信号のタイミング波形をデータシートを引用して説明します。赤で記入している分は説明のため追加したものです。IRレジスタの書き込みはRSをLow、R/WをLowにしてから行います。R/Wはデータをリードしない場合は常にLowとなります。4ビットのインターフェースでは8ビットのデータをIR7~IR4の4ビットとIR3~IR0の4ビットに分けてデータを確定させます。データの確定はEの状態変化で先にIR7~IR4のデータをセットした状態でEのHighからLowへの状態変化によって最初の4ビットが確定します。次にIR4~IR0のデータをセットした状態でEのHighからLowへの状態変化によって次の4ビットが確定します。write間に十分なウェイトを置く必要があります。flagを確認しないためコマンド2回分に少しマージンを加えて80usのウェイトを置くようにしています。Displayの場合は2000usのウェイトにしています。checkを行う場合は場合はR/Wビットも制御する必要があるためピン数が1本多くなってしまいます。ST7066U)データを確定させるための波形についての詳細をデータシートを引用して説明します。データの確定はEがHighからLowになる状態変化で行われるためEをLowにするまでにデータをセットする必要があります。Characteristicsを確認する必要がありますが、PIC16F1827のクロックを16MHz(動作クロックは4MHz)の場合は1命令当たり250nsなので波形の立上りや立下りについての条件はほとんど満たしています。PIC16F1827で制御する場合に注意が必要な信号のみ赤で記入しています。Tpwを140ns(Vcc=2.7Vで450ns以上)にする必要があるのでウェイトを置く必要があります。Eのパルスも最低でも1.2us以上が必要なためウェイトが必要です。}IRの書き込みの実装例を示しています。LcdFuncSet0()関数は4ビットのデータを2回書き込む自作の関数です。引数に書き込むIRの値を指定します。IRに書き込みを行うためRSをLowにします。次にIR7から4ビットのデータをセットするために引数のIR値に対して各ビットが立っているかを確認します。IR7は0x80、IR6は0x40、IR5は0x20、IR4は0x10と引数の論理積を計算し1以上であればビットが立っているため対象のDOをHighにします。論理積の結果が0であればDOをLowにします。IR7~IR4までのデータを確定するためにEをHighにして1usウェイトを置き、EをLowにして1usのウェイトを置きます。続けてIR3から4ビットのデータをセットするためにIR7~IR4と同様に論理積を計算します。IR3は0x08、IR2は0x04、IR1は0x02、IR0は0x01と引数の論理積を計算し1以上であればビットが立っているため対象のDOをHighにします。論理積の結果が0であれば対象のDOをLowにします。IR3~IR0までのデータを確定するためにEをHighにして1usウェイトを置き、EをLowにして1usのウェイトを置きます。DRを操作する場合は最初のRSをHighにする以外は同じ処理になります。手順1FunctionSetに0x28をセットインターフェースビット長を4ビット、表示ラインを2ライン、フォントサイズを5×8dotにするためDL=0、N=1、F=0を指定する。ON/OFFに0x0CをセットDisplayをON、ブリンクとカーソルは文字を16文字フルに使うため不要なのでD=1、C=0、B=0を指定する。Displayに0x01をセット初期化中に未確定のデータが表示されないように画面をクリアする。手順4EntryModeSetに0x06をセットカーソル移動モードをインクリメント、ディスプレイシフトを使用しないため、I/D=1、S=0を指定する。手順1でFunctionSetをIRに書き込みますが、データのセットがうまくいかないことを考慮して複数回書き込みを行うことが推奨されています。本記事では2回書き込んでいますが、おまじないみたいなものなので1度だけのセットでも問題ありません。手順2はディスプレイをONします。ブリンクとカーソルの表示は16文字をフルに使うと表示部より右側に移動するためカーソルの表示とブリンクの状態が確認できないため不要とします。DisplayでDDRAMにスペースコードが書き込まれるため表示部がクリアされます。クリアしない場合は不定のデータが表示されることがあります。手順4はカーソルの表示を使用しませんが、I/Dについてはインクリメントを書き込んでいます。}LcdMsgSet()関数はLCD表示を自作の関数です。HomeをIRに書き込みます。Displayで画面をクリアして文字を更新するようにしています。Displayは画面をクリアする処理が入るため画面が少しちらついて見えることがあります。Homeが良い場合があります。1LINEから16文字を書き込んでいきますがEの受付待ちのウェイトを入れる必要があるため1文字ごとに80usのウェイトを置いています。Display)2LINEを書き込む前にカーソルを2LINEのTOPに移動する必要があります。2LINEのTOPのアドレスは0x40なのでIRのSetDDRAMaddressの0x80と論理和を計算した0x84を指定してカーソルを移動します。2LINEの文字は1LINEと同様な処理で行います。スポンサーリンクMCCの設定PIC16F1827の設定はMCCを使っています。MCCの使い方については下記記事にまとめています。clock、TMR0の設定を行っています。Moduleの設定を行います。IDEを起動しMCCのアイコンをクリックしてMCCを有効にします。Moduleの設定(MCC)内部クロックを使用するためINTOSCを選択しています。PIC16F1827はシステムクロック4パルスで動作クロックになるため16MHz(動作クロックは4MHz)を選択すると1命令当たり250nsの処理になります。Clock以外は特に変更していません。Resources内のPeripherals欄のTimerを選択しTMR0をクリックして追加します。Clock内でクロックに関する設定を行います。Sourceは内部クロックを使用しているためFOSC(FOSC/4)を指定します。Sourceに対してTMR0のカウントアップする分周比を指定します。PeriodはTMR0がオーバーフローするタイミングを設定します。Rateを0x01を指定しているため1ms毎にコールバック関数が呼び出されます。上記例ではmainTimer()が1ms毎にコールされます。MCCが生成した関数の使用例IO_RA0_SetHigh();//DOをHIGHIO_RA0_SetLow();//DOをLOWIO_RA0_SetHigh()関数はRA0のDO出力をHighにします。IO_RA0_SetLow()関数はRA0のDO出力をLowにします。他のポートのDOの場合はRA0の部分が対象のポート名になります。Files内のpin_manager.h内で#defineで定義されています。//EをH本記事ではデータを書き込む際の信号名を分かりやすくするため#defineでMCC関数をマクロ化して使用しています。入れると最初にパターン1を表示します。2秒毎にパターンを切り替えていきパターン5まで表示したらパターン1に戻る動作を繰り返し行います。パターン1からパターン5までがLCDモジュールの設定条件である2LINEで表示されておりうまく動作していることが確認できました。以下のソースコードはコンパイルして動作確認をしております。コメントなど細かな部分で間違っていたりやライブラリの更新などにより動作しなくなったりする可能性があります。参考としてお使いいただければと思います。IDEにMCCのプラグインをインストールしていることが前提となります。MCCをインストールする方法は下記記事を参考にしてください。IDEのプラグインであるMCCを使用して動作確認したことについてまとめています。最後まで、読んでいただきありがとうございました。組み込みエンジニア【オペアンプ】ピークホールドはピーク検出とサンプルホールドの応用ピークホールド回路はピーク検出回路とサンプルホールド回路を組み合わせることで構成できます。正弦波のピークを保持しながら出力できるためAC電圧からDC電圧への変換などに使用されまが、サンプルや放電するタイミングを生成する仕組みが必要です。組み込みエンジニアESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方ESP32-WROOM-32EはArduino環境でソフト開発ができるため標準のライブラリで各種センサーの動作確認ができます。ソフト開発に対して苦手意識があり敷居が高く感じていた方でも簡単に動作確認ができるためお勧めのモジュールです。Arduinoは初心者のためのスターターキットです。サウンドセンサーなど複数のセンサーが実装されておりArduinoライブラリの使い方やC言語(C++)の学習ができます。組み込みエンジニアESP32-WROOM-32Eで履歴データをダウンロードするWebサーバーを実装することでクライアントからに対してダウンロード要求のレスポンスを返すことができます。SDカードに保管した温湿度センサーの履歴をブラウザー上に表示したダウンロードリンクを使って履歴データを取得する方法をまとめています。XIAO31ESP32-WROOM-32E37TWELITE(トワイライト)26PIC16F182731PIC12F67522ノウハウ(体験談)36趣味と生活29その他6タグオペアンププロフィールENGかぴ当ブログの運営者のENGカピです。組み込みエンジニアとして10年以上の経験を活かしてセンサーモジュール等の動作確認したことをまとめています。広告、アフィリエイト収益で当ブログを運営させていただいております。defined.")}))})()タイトルとURLをコピーしました。