DFR0090 XC8制御ライブラリ
PICキット標準の8桁7セグLEDに昇格
秋月電子に販売されているDFROBOT社の7セグ LED です。
今までAitendoのMAX2709使用8桁7セグモジュールをPICキットBASICでご紹介していました。
安価で制御も簡単で消費電力も少なくて、一見良かった・・・
しかし、このAitendoのモジュールは年中売り切れ状態・・・
安定供給されていないので、PICキットで使用するのは諦めました。
DFR0090はちょっと高価で消費電力が大きいすが、HC565と7セグLEDの自作では、綺麗にかつ小さく仕上げる事は、ちょっと不可能です。
そもそも配線が多過ぎで、製作には勇気が必要です (-_-;)
このDFR0090の概要は過去記事をご参照ください。
ここではXC8用関数としてまとめてみたいと思います。
秋月電子では1桁の同様のモジュールが販売されています。
8桁分揃えると結構高価になってしまうのが、ちょっと残念です。
多個数購入割引でもあれば良いのですけどね。
これについては、機会があれば購入してレポートしたいと思います。
秋月電子に販売されている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
左記のピンレイアウトを参照して下さい。
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
ヘッダーファイル
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は自動インクリメントされません。
ただし、先頭位置では除きます
(その他)
使用方法については左記デモ・プログラムをご参照下さい。
追加や修正・バグ等ありましたらこのページにて追記したいと思います
今回は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
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
無線周波数表示用の関数群を追加しました。
バッファを共用しているため、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
追記 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
と、なりました
左記の関数を入れ替えてご使用ください
メイン関数内のインクルード ヘッダー名の変更も必要です
公開して早々ですが、使用するデフォルトポートを変更しました
そのまま本文およびプログラムをも変更しています。
追記 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
と、なりました
左記の関数を入れ替えてご使用ください
メイン関数内のインクルード ヘッダー名の変更も必要です