↑ 基板全景



超安価なTM1638制御の7セグLED&スイッチ多数基板

AMAZONで購入した超安価な中華LED基板です。
前回のTM1638LED基板もそうでしたが、製品の信頼性は低い様で注意が必要です。
接続コード付きで1セット550円位で2セット購入しました。
付属コード使用でそのままPICキットに接続できました。

と言う訳で、制御関数を作ってみる事にしました。
当初、同じTM1638を使用しているので、当局版TM1638XC8ライブラリをそのまま使用できるかと思い、デモプログラムを動作させてみました・・・
すると、動くには動いてはいるが表示がデタラメ (◎_◎;)
前回同様、基板回路図は無いので気を取り直して、兎に角データを送信してみる事にしました。
同じ制御ICを使用しているので、下位レベル関数はそのまま使えるはず。


参考文献
 TM1638マニュアル TITAN MICRO ELECTRONICS
 XC8用TM1638制御関数ライブラリ JA0QONホームページ


↑ PIC側との接続は5ピン

 今回の回路図はありません

 実際はPICキットの14ピンCPU基板にこのTM1638QYF基板を付属のコードで接続しただけ・・・


プログラムから見えるTM1638QFY基板の構造

紛らわしいので、この16スイッチ基板は「TM1638QFY基板」、
以前の8スイッチ基板を「TM1638LED基板」とし、
SEG線10までLEDを接続した基板を「TM1638FLED」(フルLED基板)、とします。(存在するかは不明 (^_^;) )
今回はTM1638FLED基板は登場しません。

なぜこんな事を書いたのかと言うと、TM1638マニュアルには、
GRID線が8本、SEG線が10本存在する様です。
最初に登場のTM1638LED基板は、
 SEG1線~SEG8線までが7セグLEDのセグメントに接続
  →DATA送信でビットデータに対応してセグメントに通電
 SEG9線が単LED、SEG10が未接続
 GRID線は7セグLEDのコモン線に接続、偶数アドレスで選択
  →アドレス送信で対応GRID線が通電
 SEG9~10は奇数アドレスで選択・通電
GRID線とSEG線を逆に使い、10桁の7セグLEDを制御する回路がマニュアルには提示されています。
つまり、10桁7セグLED、8桁10セグLED、或いは8桁7セグLED+16個までの単LEDと言う基板構成が考えられるからです。
そのTM1638FLED基板と思しき物はAMAZONには無い様でしたが。

この基板を眺めてもプリントパターンはよく解らず。
当たり前ですが、低レベル関数を使用し、コマンドを送る分にはTM1638LED基板と同じ。
セグメントデータを1つずつ送信すると、ちゃんとセグが発光する。
がしかし、以前の「アドレス指定+セグデータ送信」方法では表示結果がおかしい
セグメントデータを送信すると、7セグ8桁の同じセグメントが同時に発光する
う~~む、これはもしかして・・・
SEG線とGRID線が入れ替わっているのでは?
10桁7セグで無いのに何のためにプログラムし難い方法で8桁構成・・・
この方法のメリットのSEG9~10は使っていない・・・
もしかして深く考えずにハードを作っちゃった?
文句ばかり言っても始まらないので、配線に合わせて?
頭を90度傾け(アナログ人間・・・ (^_^;) )、
紅茶をすすりながら関数の変更を行う事にしました。 (-_-メ)
当局だったら絶対にこんな回路構成にはしないな、などとアマチュアのくせに文句を言っております・・・



↑ 今回の構成

PICキット、14ピンCPU基板
TM1638QYF基板付属のコードで、
 RC0→CLKピン
 RC1→DIOピン
 RC2→STBピン
と接続

TM1638QYFソフトウエア的考察

さてと、前述しましたように今までは7セグLEDのセグメントに「データ」、
同じくLEDコモン線に「アドレス」を送信する事でそれぞれアクティブとなってました。
これが逆となり、7セグLEDのコモン線に「データ」、
同じくセグメントに「アドレス」を送信する事でアクティブとなります。
これはソフトウエアから見ると、
「アドレス」のbit0は全LEDのSEGa、同じくbit1はSEGb・・・
同じくbit7はdp、
「データ」のbit0はLED8(ここでは最右側)をアクティブ
同じくbit8はLED1(ここでは最左側)をアクティブ


以上より今までの様な、すでにラッチアップ・表示されている状態で、他のLEDには干渉せず(表示を変えず)特定のLEDのみにアクセスして表示を変える、と言う事が出来なくなった・・・
よって、「LED_BUF」に各桁のセグメントデータを収納後、
何かデータ変更が発生したら、
そのデータをタテヨコ変換し、一気にTM1638に送信する方法を取りました。
これはDFR0090の様なHC595を使用したSPI制御でも、何か変更があったら全データを書き換えていたのと同じです。

考えがまとまったので、新規作成する低レベル関数の機能が決まりました。
とりあえず、タテヨコ変換関数を作成、一気送信する関数を作成しました。
これを前出の「TM1638v1」に適応して見る事にした。
これなら上位関数はあんまり変更しないで済みます。

結果的に、「TM1638と言うインターフェイス」を使用した「別物基板」と言えそうです。



TM1638QYF基板 
XC8制御関数群 Ver1

ヘッダーファイル

 TM1638QYFv1.h


関数群ファイル

 TM1638QYFv1.c




XC8用TM1638QYF制御ライブラリVer1 概要

今回は当局版TM1638V1をこのTM1638QYF基板の構成に合わせて小変更しました。
当初はTM1638ver2としてどちらも対応しようかとも思ってたのですが、マイコンとのインターフェイスは全く同じですがTM1638周囲の配線が違うのは大きな差だと感じて、今回は止めました。


デフォルトI/Oポート
 CLK=RC0
 DIO=RC1
 STB=RC2

ヘッダーファイル デフォルトの定義

#define CLK LATCbits.LATC0 クロックポート指定
#define DIO LATCbits.LATC1 データポート指定
#define STB LATCbits.LATC2 ストローブポート指定
#define DRP PORTCbits.RC1  DIO 読み込みポート指定
#define TRD TRISCbits.TRISC1 DIOポートのI/O設定

 ※ポート変更はヘッダーファイルの上記マクロ設定を変更
  DIO線がPICKIT3ライタ等と接続状態の場合、
  書き込みは大丈夫ですが、読み込み動作が不安定になります
  ライタを抜くと正常動作します。
  ポートをRA0-RA2等にに割り振る時はご注意ください

TM1638制御関数群

(1)通常モードでの使用関数

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

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

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

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

5) TM1638_CLR(void)
   7セグLEDの表示をクリア、関数使用バッファの初期化
   アドレスはホーム位置
   引数:無
   戻値:無

6) 広域変数 DSP_ADR(8bit unsigned char)
   ディスプレイの表示開始位置アドレス(0-7)を格納する広域変数
   最左側が0、最右側が7となります。

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

(その他)
 使用方法については左記デモ・プログラムをご参照下さい。


(2)printf関数を使用しないメモリ節約モード

通常モード関数と同時使用すると表示がおかしくなります
printf関数を使用しない分メモリ消費が少なくて済みます。
BCD関数が含まれています。
無線周波数を表示する事を目的にしています。

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

節約モード関数群

1) SET_SBUF(unsigned long 引数1,unsigned char 引数2)
   32bitBCDからフラグビットを添加し専用広域変数に展開します
   引数1:32bit符号無し整数(32bitBCD)
   引数2:8bitフラグバイト(詳細はソースファイルのコメントにて)
   戻値:専用広域配列 LED_BUF[8] に収納

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

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


4) TM1638_CLR7SEG(void)
   7セグLEDすべてをクリアします
   引数:無
   戻値:無

5) TM1638_SET7SEG(unsigned char1,unsigned char2)
   見かけ上「TM1638v1」の同名関数と同じ機能です。
   指定LEDにデータ送信しますが、単LEDは存在しないので指定不可
   指定してもエラー等は出ません。
   実際は「LED_BUF」の指定領域のデータを書き換えます。
   その後、「LED_BUF」の全データをTM1638QYFに転送します。
   「LED_BUF」のクリアはしません。
   引数1:LEDの指定番号1バイト(注)
   引数2:送信するデータ1バイト(0H~FFH)
   戻値:無
    注)LEDの指定番号
     00:7セグLED1(最左側)
     01:7セグLED2
     02:7セグLED3
     03:7セグLED4
     04:7セグLED5
     05:7セグLED6
     06:7セグLED7
     07:7セグLED8(最右側)

6) CLR_LEDBUF(void)
   広域配列変数「LED_BUF」をクリアします。
   TM1638QYFにデータ転送しませんので表示に反映しません。
   表示に反映させるには、この関数を呼出後、
   XFER_TM1638QYF関数を呼び出して下さい

(3)両モード共通で使用する関数

1) TM1638_INIT(void)
   イニシャライズを行う。
   7セグLEDおよび単LEDの表示をクリア
   ディスプレイコントロール設定も最大光度で行います。
   一度実行すれば後は実行する必要はありません。
   引数:無
   戻値:無

2) unsigned long TM1638_RCV(void)
   TM1638のマトリックスデータを読み込みます。
   TM1638LED、TM1638QYFどちらでも動作します。
   と言うか、全く同じ関数です。
   引数:無
   戻値:32bitの読み込みデータ
      bit31-24:BYTE4
      bit23-16:BYTE3
      bit15-8 :BYTE2
      bit7-0  :BYTE1

3) unsigned int TM1638_KEY(void)
   TM1638QYF基板のキーパッドのデータを読み込みます
   TM1638LED基板用の同名関数との互換性はありません。
   理由はそもそもスイッチの数が違い、戻値のビット数が違います。
   さらにスイッチマトリックスへのスイッチの配置位置がダブっていません。
   スイッチ番号は同じでも、反映ビット位置が違うと言う事になります。
   そのため、それぞれ動作はしますが、結果が出ない事があります。
   引数:無
   戻値:16bitのスイッチ状態データ
      bit15:S16 1=ON、0=OFF
      bit14:S15 1=ON、0=OFF
      bit13:S14 1=ON、0=OFF
      bit12:S13 1=ON、0=OFF
      bit11:S12 1=ON、0=OFF
      bit10:S11 1=ON、0=OFF
      bit 9:S10 1=ON、0=OFF
      bit 8:S 9 1=ON、0=OFF
      bit 7:S 8 1=ON、0=OFF
      bit 6:S 7 1=ON、0=OFF
      bit 5:S 6 1=ON、0=OFF
      bit 4:S 5 1=ON、0=OFF
      bit 3:S 4 1=ON、0=OFF
      bit 2:S 3 1=ON、0=OFF
      bit 1:S 2 1=ON、0=OFF
      bit 0:S 1 1=ON、0=OFF

4) XFER_TM1638QYF(void)
   今回新設した関数で、あちこちの関数から呼ばれています。
   広域変数「LED_BUF」の各桁セグメントデータをタテヨコ変換、
   TM1638QYF基板に全データを一気に送信します。
   引数:無
   戻値:無



(4)TM1638低レベル関数
   TM1638LED、TM1638QYF、どちらでも動作します。

1) SEND_COM(unsigned char)
   TM1638へコマンドを送信します。
   引数:8bitのコマンド
   戻値:無

2) SEND_DATA(unsigned char1,unsigned char2)
   TM1638へデータを送信します
   引数1:データを送信するアドレス1バイト(C0H~CFH)
   引数2:送信するデータ1バイト(0H~FFH)
   戻値:無

3) SEND_BYTE(unsigned char)
   1バイトのデータをLSBから送信します。
   STB線の制御は行いません
   引数:送信する8bitデータ
   戻値:無

4) unsigned char RCV_BYTE(void)
   8ビット分をLSBから受信処理する
   STB線は制御しない
   DIO線のTRIS制御はしない
   引数:無
   戻値:受信した8bitデータ




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




↑ printf関数使用

TM1638KEY関数戻し値の
16bit、16進数値を表示
SW6とSW16を同時にONしてます




↑ 受信関数使用のデモ

SW13とSW16を同時ONにしてます

タクトスイッチをONさせるには結構力が必要で、使い勝手は悪いです。



デモプログラム1
 printf関数使用

  XC8_16F1705_TM1638QYF_DEMO1.c


 printf関数使用しない

  XC8_16F1705_TM1638QYF_RCV_DEMO01.c






XC8用TM1638QYF制御ライブラリのデモンストレーション

PICキット、14ピンCPU基板の、PIC16F1705を使用。
この基板にTM1638QYF基板を接続して動作させています。
上位関数を使用したデモプログラムはTM1638LED基板のデモがそのまま動作すると思います。
ここでは互換性の無い関数を主に使用しています。

(1)printf()使用でのデモ

  基板上のスイッチを押すと、その16進16ビットデータを7セグに表示。
  ただし、当局入手の基板と同じスイッチ配線に限ります。


(2)printf()を使用しないデモ
  TM1638LED基板の時と同じ受信関数を使用したデモプログラムです。
  TM1638LED用の同名関数を使用した同機能のプログラムですが、
  表示関数については同名でもTM1638QYF専用です。
  TM1638QYF基板のマトリックスデータを表示します。

   7セグ1・2:BYTE4のデータ16進表示
   7セグ3・4:BYTE3のデータ16進表示
   7セグ5・6:BYTE2のデータ16進表示
   7セグ7・8:BYTE1のデータ16進表示

これにより、お使いのTM1638QFY基板上のスイッチが、
受信した4バイトのどのビットに反映しているかが解ります
当局の基板では、前出のTM1638LED基板のスイッチと本基板のスイッチでは、使用ビットが重複していない事が解りました。
同時接続も出来ないのに、その理由は不明です・・・
7セグ表示がおかしい場合、7セグへの配線が関数の仕様と合っていない場合が考えられます。
その場合はTM1638LED基板用の同名表示関数を使用します。
マトリクスデータ受信関数は同じです。


感想
やはりAmazonで中国からの注文品は初期不良率が大きいです。
今回は基板を2枚購入しましたが、I/Oピンは曲がっているは、1つはセグメント発光の不具合があり、残りの1枚はLED制御はOKだが、タクトスイッチが接触不良義気・・・
まともな物が無かった・・・
どうせ遊びだから良いけど (-_-メ)

2021年9月20日 JA0QON
現在、追記はありません

追記 年 月 日

戻る  実験・製作の記録TOPへ戻る