PICキット標準の8桁7セグLEDに昇格

秋月電子に販売されているDFROBOT社の7セグ LED です。
今までAitendoのMAX2709使用8桁7セグモジュールをPICキットBASICでご紹介していました。
安価で制御も簡単で消費電力も少なくて、一見良かった・・・
しかし、このAitendoのモジュールは年中売り切れ状態・・・
安定供給されていないので、PICキットで使用するのは諦めました。
DFR0090はちょっと高価で消費電力が大きいすが、HC565と7セグLEDの自作では、綺麗にかつ小さく仕上げる事は、ちょっと不可能です。
そもそも配線が多過ぎで、製作には勇気が必要です (-_-;)
このDFR0090の概要は過去記事をご参照ください。
ここではXC8用関数としてまとめてみたいと思います。

秋月電子では1桁の同様のモジュールが販売されています。
8桁分揃えると結構高価になってしまうのが、ちょっと残念です。
多個数購入割引でもあれば良いのですけどね。
これについては、機会があれば購入してレポートしたいと思います。

↑ DFR0090背面ビュー

 DFR0090背面入力ピンレイアウト
 左右同じコネクタがあるので注意!




↑ 今回実験の回路図

 実際はPICKITの14ピンCPU基板にDFR0090を接続しただけ・・・
製作したのは最初の画像にある接続コードのみでした。
DFR0090への接続は3線SPIで接続・制御

左記のピンレイアウトを参照して下さい。
SPIバス接続となっていますが、今回はPICのMSSPモジュールは使用しません。
デジタルI/Oでデータ出力し、PIC側では受信しません。
よって、PICのデジタルI/Oを3ポート使用します。

(1)モジュール側  機能
  CLOCKピン   読込クロック(↑でDATAピンのビットデータを取込)
  DATAピン    データビット本体
  LATCH     データラッチ(↑で取込データをセグメントポートQxへ出力)


(2)シリアルデータの流れ
  データビット=1 Qx=1 セグメント発光OFF
  データビット=0 Qx=0 セグメント発光ON
  ビットデータは最左側桁QAから順に入り、QHへデータがシフトしていく。
  よって、8回データ取り込みで全セグメント分設定となる。
  また、QHからシフトしたデータは次の右隣桁のQAへシフトする。
  よって、データは最上位桁(左側)から順に最下位桁へシフトしていく。
  8X8=64回のデータシフトで全桁のデータが高速で設定されます。

(3)セグメント配置

      a       QA=a  QE=e
    f    b     QB=b  QF=f
      g       QC=c  QG=g
    e    c    QD=d  QH=Dp
      d       Dp

DFR0090 XC8制御関数群 Ver1x

ヘッダーファイル

 DFR0090v1a.h


関数群ファイル

 DFR0090v1a.c


デモ・プログラム

 XC8_16F1705_DFR90_DEMO01.c


XC8用制御ライブラリVer1.0a 概要

 今回はprintf()で使用する事を目的として作ってみました。
アッセンブラ版制御ルーチンとは設計概念がまったく違います。
内様は、7セグLEDの少ない表現力で8桁LCDの様に振る舞わせる、
LCDシミュレータもどきの構造となっています。
現在の所、カーソル、ESCシーケンス等は対応できてないです。
表現不可能な文字も再現できません。
数字と一部の英文字のみの表示となっています。
不対応文字やコードは無視します。

デフォルト設定
 DATA =RA0
 LATCH=RA1
 CLOCK=RA2
 ※ポート変更はヘッダーファイルのマクロ設定を変更

DFR0090制御関数群

1) DFR90_WRTD(unsigned char)
   文字コードを指定変数の位置に表示します
   指定変数は「DSP_ADR」で、0-7を指定します
   連続送信しても表示位置は関数側が自動インクリメントします
   printf()等で使用する低レベル関数はこれを指定します
   その際は事前に「DSP_ADR」は0を指定しておきます
   引数:8bitの文字コード
   戻値:無

2) DFR90_PUTC(unsigned char1,unsigned char2)
   指定の表示位置に1文字を表示します
   引数1:文字コード1バイト
   引数2:表示位置アドレス(0-7)
   戻値:無

3) DFR90_PUTL(unsigned char1配列,unsigned char2)
   指定の表示位置から文字列を表示します(最大8文字)
   引数1:文字列格納配列アドレス
   引数2:表示開始位置アドレス(0-7)
   戻値:無

4) DFR90_PUTL1(unsigned char配列)
   LED1行目の最左側から文字列を表示(最大8文字)
   引数:文字列格納配列アドレス
   戻値:無

5) DFR90_CLR(void)
   LEDの表示をクリア
   引数:無
   戻値:無

6) 広域変数 DSP_ADR(8bit unsigned char)
   ディスプレイの表示開始位置アドレス(0-7)を格納する広域変数
   今の所、DFR90_WRTD()関数で事前設定します。

(注意点)
ドット’.’は1桁分で単独表示では無く、直前桁のドットを発光させます。
つまり、’7’、’.’、’8’、’.’と4バイト分連続書き込みすると、
「7.」と「8.」の2桁分が表示されます。
ドット’.’の書き込みではDSP_ADRは自動インクリメントされません。
ただし、先頭位置では除きます

(その他)
 使用方法については左記デモ・プログラムをご参照下さい。
追加や修正・バグ等ありましたらこのページにて追記したいと思います
DFR0090 XC8制御関数群
 Ver2x

注意
最新の関数は「追記」の項目を参照

ヘッダーファイル

 DFR0090v2.h


関数群ファイル

 DFR0090v2.c


デモ・プログラム

 XC8_16F1705_DFR90_DEMO02.c



ヘッダーファイル

 DFR0090v2a.h

関数群ファイル

 DFR0090v2a.c

デモ・プログラム

 XC8_16F1705_DFR90.DEMO02a.c

XC8用制御ライブラリVer2.0 概要

 無線周波数表示用の関数群を追加しました。
バッファを共用しているため、Ver1のprintf()で使用する関数群と共存しません。
アッセンブラ版制御ルーチンと、ほぼ同じ使い勝手となっています。
同時使用すると表示がおかしくなりますが、暴走等はしないと思います・・・多分 (^_^;)
printf関数を使用しない分メモリ消費が少なくて済みます。
DFR0090制御と直接は関係無いですが、BCD関数が含まれています。

(1)基本的な使用方法
 ①32bit符号無し整数(16進バイナリ数値)を用意
 ↓
 ②BCD関数(32bit16進数値を32bitBCDに変換)
 ↓
 ③SET_SBUF関数 (LED_BUF[ ]にデータ生成)
 ↓
 ④XFER_LED1関数(DFR0090にセグメントデータ転送)

(2)デフォルト設定
   DATA =RA0
   LATCH=RA1
   CLOCK=RA2
   ※ポート変更はヘッダーファイルのマクロ設定を変更

(3)DFR0090追加制御関数群(Ver2a)

 1) SET_SBUF(unsigned long int 引数1、
             unsigned char FLG))
   32bitBCDからフラグビットを添加し専用広域変数に展開します
   引数1:32bit符号無し整数(32bitBCD)
   引数2:8bitフラグバイト(注1)
   戻値:専用広域配列 LED_BUF[8] に収納

 2) XFER_LED1(void)
   LED_BUFのデータからセグメントデータを生成、
   DFR0090に送信・表示します
   引数:広域変数 LED_BUF[ ]
   戻値:無

 3) unsigned long int BCD24
    (unsigned long int 引数)
   32bit16進バイナリ数値を40bitBCDに変換します
   引数:32bit16進バイナリ数値(0H~FFFFFFFFH)
   戻値:変換した40bitBCDの上位8bitを切り捨て、
   32bitBCDで返す


(その他)
 使用方法については左記デモ・プログラムをご参照下さい。
追加や修正・バグ等ありましたらこのページにて追記したいと思います


注1)
 「FLG」フラグバイト(入力制御用フラグ)の詳細

表示桁数(6,4,2桁表示は下桁が表示されないので注意)
 FLG=xxxxx001 2桁表示指令(下6桁が表示されない)
 FLG=xxxxx011 4桁表示指令(下4桁が表示されない)
 FLG=xxxxx101 6桁表示指令(下2桁が表示されない)
 FLG=xxxxx111 8桁表示指令(99.999.999HZまで全表示)

ゼロブランキング
 FLG=xxxx0xxx しない
 FLG=xxxx1xxx する

ドット表示指令
 FLG=x000xxxx しない
 FLG=x001xxxx 2,5桁のドット発光
 FLG=x010xxxx 3,6桁のドット発光
 FLG=x100xxxx 4,7桁のドット発光

 FLG=0xxxxxxx 予約
 FLG=1xxxxxxx 予約

注2)LED_BUF配列 フォーマット

 bit0-3 表示する数値データ
 bit4   拡張文字
 bit5   予約
 bit6   ブランキング 0=OFF 1=ON
 bit7   ドット表示 0=OFF 1=ON


DFR0090 XC8制御関数群
 Ver2x

ヘッダーファイル

 DFR0090v2b.h


関数群ファイル

 DFR0090v2b.c

追記 2018年03月20日
 公開して早々ですが、使用するデフォルトポートを変更しました
 そのまま本文およびプログラムをも変更しています。

追記 2018年04月14日
 バグでは無いのですが小変更でVerが変わりました。
 イニシャライズが不要になり、本文及びデモプログラムも変更しています。

追記 2018年04月15日
 関数をバージョンアップしました
  DFR0090v2.h
  DFR0090v2.c
 と、なりました。

追記 2018年04月21日
 関数およびデモプログラムを小変更しました・・・
  DFR0090v2a.h
  DFR0090v2a.c
 と、なりました。
 本文も変更しています

追記 2019年12月12日
 16進数値を扱うと表示されない数字があり修正しました <m(__)m>
  DFR0090v2b.h
  DFR0090v2b.c
と、なりました
左記の関数を入れ替えてご使用ください
メイン関数内のインクルード ヘッダー名の変更も必要です
戻る  実験・製作の記録TOPへ戻る