当ブログをご覧いただき、ありがとうございます。
ご注意事項:
記載内容には、十分注意しておりますが、勘違い、記憶違い、理解不足、思い込み等が無いとは限りませんので、申し訳ありませんが、 記載内容の正確性は保障致しません(出来ません)。
従いまして、このブログの内容を参考にする事に起因して生じる、または 生じた、いかなる事態にも、当方は何の責任も取れませんので、 参考にされる場合は、自己責任にてお願い致します。
このブログのC言語に関する説明には、PICで電子工作するのに必要な事柄以外(私のレベルで)は出てきません、出てこないことの方が多いと思いますので、ご了承願います。

PICの、入力を使う、スイッチでの入力の2回目。

前回の続きです。

 

前回は、プッシュスイッチの入力で、LEDの点灯と消灯をコントロールするのに、アクティブローとアクティブハイがあるのを勉強したのですが、今回はその応用です。

 

前回の回路は、

入力、出量共、アクティブローの回路。

入力、出量共、アクティブハイの回路。

上の2回路では、入力と出力は、共に同じタイプの回路でしたが、状況によっては入力と出力は、別タイプの回路のほうが良い場合もあるとの事で、下のような回路があります。

入力がアクティブローの回路で、出力がアクティブハイの回路

入力がアクティブハイの回路で、出力がアクティブローの回路

上の回路のように、入力と出力は、別タイプの回路になっています、このような回路でプッシュスイッチを押したときに。LEDが点灯するようにするには、前回組んだプログラムを変更して対応します。

前回のプログラムは、

でした、このプログラムは、入力の状態をそのまま出力しているのを、永久に繰り返しています。

対応するには、入力がハイの時、出力がロー、または、入力がローの時、出力がハイになるようにすれば解決できそうです。

つまり、入力と出力が反対になるように、入力を否定して出力すればよいようです。

従って、上のプログラムの31行目の、INdeta=RA0 を INdeta=!RA0  の様に変更すれば良いと思います。

修正したのが上のプログラムです、早速実験いたしました、結果は、スイッチを押した時LEDが点灯しました、動画的には、前回と同じなので割愛します。

 

追補;

上の2つのプログラムですが、31行と32行の所は、下のプログラムの31行の様にRB0へRA0を直接入れて、28行をなくしても同じ動作です。

 

PICの、入力を使う、スイッチでの入力の1回目。

今回から、PICの入力を使う方法を勉強します。

 

今回は、プッシュスイッチの入力で、LEDの点灯と消灯をコントロールします。

スイッチによる、LED点灯回路、アクティブハイの回路。

 

上の回路図が、プッシュスイッチの入力で、LEDの点灯と消灯をコントロールする回路です。

回路の説明;右側のプッシュスイッチが押されていない時は、RA0がR2を通して接地されているので、RA0の端子電圧は0vで、スイッチを押すと、RA0がVccとつながって5vになります、デジタルで言うと、OFFが0でONが1になります。

従って、プッシュスイッチで、0または1のデータを入力することができます。

次は、RB0の端子に、抵抗R3を通してLEDのアノード側が接続されカソード側がGNDに落ちています。

このLEDは、RB0に0が出力されると、RB0の端子電圧は0vですから、LEDに電流は流れず消灯します、RB0に1が出力されると、RB0の端子電圧は5vですから、LEDに電流が流れ点灯します。

プログラム(下記プログラム);この回路を、スイッチがONの時に、LEDが点灯するように、プログラムを作ると、スイッチでLEDの点灯消灯をコントロールする事ができます。

 

上のプログラムが、その上の回路を制御するプログラムです。

プログラムの説明;

23~27行目;初期設定、TRISAが0x01になっているのは、RA0を入力に指定するため(使用しないビットは出力に指定する、不必要な入力を防止します)。

28行目;入力したデータを入れる変数の定義。

29行目;31~32行目を永久に繰り返す。

31行目;AポートRA0のスイッチの現在の、H(1)またはL(0)の状態を変数INdetaに取り込む。

32行目;INdetaの内容を、ポートBのRB0に出力する。

下の動画は、実験の様子です。

youtu.

さて、下の回路図では、スイッチとLEDのPICへの接続方法を変えてみました。

スイッチによる、LED点灯回路、アクティブローの回路。

 

回路の説明;右側のプッシュスイッチが押されていない時は、RA0がR2を通してVccに接続されているので、RA0の端子電圧は5vで、スイッチを押すと、RA0がGNDとつながって0vになります、デジタルで言うと、OFFが1でONが0になります。

次は、RB0の端子に、抵抗R3を通してLEDのカソード側が接続されアノード側がVccに接続されています。

このLEDは、RB0に0が出力されると、RB0の端子電圧は0vで、Vccは5vですからLEDに電流が流れ点灯します、RB0に1が出力されると、RB0の端子電圧は5vで、Vccも5vですから、LEDに電流が流ず消灯します。

プログラム(上記プログラム);この回路を、スイッチがONの時に、LEDが点灯するように、プログラムを作ると、スイッチでLEDの点灯消灯をコントロールする事ができます、プログラムも前回のプログラムで動作します。

 

上の2つの回路は、外見の動作は同じですが、内部動作は、データが1の時点灯と、データが0の時点灯と異なっています、この回路の動作を、データが1の時回路が動作す時、アクティブハイといい、データが0の時回路が動作す時、アクティブローといいます。

従って、スイッチをPICに接続するのに、アクティブハイの回路とアクティブローの回路があり、LEDをPICに接続するのにも、アクティブハイの回路とアクティブローの回路があるということです。

LCDキャラクタディスプレイモジュールを使う、リードデータfromラム命令

今回も、LCD表示器、SD1602VBWB-XAの制御命令(コマンド)を説明します。

今回は、リードデータfromラム命令です。

命令コード;RS=1、R/W=1、DB7-0=********

       *;データが出力される。

 セットCGRAMアドレス命令の後に、本命令を使うときは、CGRAM用データが、セットDDRAMアドレス命令の後に、本命令を使うときは、DDRAMデータ(キャラクターコード)が出力される。

命令実行時間;43μS

LCD表示器表示器は、文字の出力装置であり、一般的には、この命令は使わないものと思われる。

 

今回で、LCD表示器の命令の説明は終了しました。

今までは、PICの出力をプログラムで制御するだけでしたが、次回からは、PICに信号を入力する方法を勉強します。

 

 

LCDキャラクタディスプレイモジュールを使う、ライトデータtoラム命令

今回も、LCD表示器、SD1602VBWB-XAの制御命令(コマンド)を説明します。

今回は、ライトデータtoラム命令です。

命令コード;RS=1、R/W=0、DB7-0=********

       *;データ値を入れる、入れることのできる値は、0x00~0xFF

 セットCGRAMアドレス命令の後に、本命令を使うときは、CGRAM用データを、セットDDRAMアドレス命令の後に、本命令を使うときは、DDRAMデータ(キャラクターコード)を入れる。

命令実行時間;43μS

LCDキャラクタディスプレイモジュールを使う、リードビジーフラグ&アドレス命令

今回も、LCD表示器、SD1602VBWB-XAの制御命令(コマンド)を説明します。

今回は、リードビジーフラグ&アドレス命令です。

命令コード;RS=0、R/W=1、DB7-0=BF  *******

       BF;ビジーフラグ、0=コマンド受付可、 1=内部処理中、コマンドを受付不可。

       *;アドレスを示す値が出力される。

命令実行時間;0μS

BF;ビジーフラグは、コマンドを受け付けると、内部で処理が終わるまで1が出力され、処理が終わりコマンドを受け付けられるようになると0が出力される。

プログラムでは、BF=0の時、LCD表示器にコマンドを送ってから、BFを監視しBF=1がBF=0になるのを待って、次のコマンドを送るようにプログラムする。

今回のLCD表示器を駆動するPICのプログラムは、これを使用せず、コマンドを送ったら、命令実行時間の一番長いコマンドより長いディレイ時間を待ってから、次のコマンドを送るようにプログラムした。

(下のプログラムの __delay_ms(5);の部分)

 

LCDキャラクタディスプレイモジュールを使う、セットDDRAMアドレス命令

今回も、LCD表示器、SD1602VBWB-XAの制御命令(コマンド)を説明します。

今回は、セットDDRAMアドレス命令です。

命令コード;RS=0、R/W=0、DB7-0=1*******

       *;アドレスを示す値を入れる、入れることのできる値は、0x80~0xFFであるが、

        (*に入れる値は、0x00~0x7Fだが、8ビット目が1であるから加算してこのようになる)

          LCD表示器、SD1602VBWB-XAのDDRAMは、0x80(00)~0x8F(0F)と0xC0(40)~0xCF(4F)の32か所である。

命令実行時間;39μS

この命令は、文字表示コードを、DDRAMに書き込む時に、書き込むアドレスを指定する。

 

LCDキャラクタディスプレイモジュールを使う、セットCGRAMアドレス命令

今回も、LCD表示器、SD1602VBWB-XAの制御命令(コマンド)を説明します。

今回は、セットCGRAMアドレス命令です。

命令コード;RS=0、R/W=0、DB7-0=01******

       *;アドレスを示す値を入れる、入れることのできる値は、0x40~0x7F(*に入れる値は、0x00~0x3Fだが、

        7ビット目が1であるから加算してこのようになる)である。

命令実行時間;39μS

この命令は、ユーザー文字表示データを、CGRAMに書き込む時に、書き込むアドレスを指定する。

 

CGRAMアドレス下位3ビット位置図

CGRAM用データの作り方の図

 

CGRAM用データの、ライトRAMデータ命令のデータは、8ビットであるので、上位3ビットは、必ず000にしてから送る。

例;上から2番目のラインのCGRAM用データは、000 10001で、0x11を送る。

キャラクターパターン表

セットCGRAMアドレスは、次にように指定します。
アドレスの有効ビット数は、6ビットで、上位3ビットでキャラクターコードのCGRAM位置により000(CGRAM(1))~111(CGRAM(8))となり(上図キャラクターパターン表参照)、下位3ビットは、キャラクタパターンのラインの位置をにより000(一番上のライン)~111(一番下のライン)(CGRAMアドレス下位3ビット位置図)となります、

例;CGRAMアドレスは、CGRAM(3)の上から5番目は、上位3ビットが010、下位3ビットが、100となり、セットCGRAMアドレス命令で送るアドレスは,0x14(コマンドとしては0x54)になります。

なお、1文字分のデータを送る時は、CGRAMアドレス上位3ビットでCGRAMの位置を指示し、下位3ビットは000を指定して、セットCGRAMアドレス命令を送り、続けて、8個のCGRAMデータを上のラインの分から送ればよい(エントリーモード命令0x06が先に実行されていること)。