![](https://blogimg.goo.ne.jp/user_image/4e/61/7ef9aca9486167a75424297af658df9a.jpg)
ZK-80というTK-80互換機のキットがあったので作ってみました。小型版のZK-80ポケットというものもあり、こちらはLEDの輝度やセーブロード機能あたりが若干改良されています。
LEDが本物と全然違うのが残念だったので、本物に近いSN713B(本物はSN713A)に改装してみました。
まず,ZK-80で試してみたのですが,ZK-80はI/Oを節約するためにかなりトリッキーなことをしており,アノードコモンとカソードコモンを混在させている上に,キーボード入力にも同じポートを使うということをしています.
SEG_A-HとDIG_0-7を論理値として取り出すことはできたのですが,キー入力時に乱れてしまい,うまく動かないのであきらめ,ZK-80ポケットを入手して試してみました.
ZK-80Pの方は素直な作りになっているので,MAX7219の出力をトランジスタアレイに食わせてカソードコモンをアノードコモン(コモン側がソースでセグメント側がシンク)に変換できました.
シンク側はTBD62083,ソース側はTBD62783を使い,ソース側の入力は7404で反転させました.
TBD62785(もしくは62786)という負論理の石が入手できれば7404は不要なのですが,秋月や千石で売ってなかったのでそのようにしました.
(【2020/6/12補足】データシートの入力電圧を見たら62786は使えないような気がしてきました。)
(【2020/6/19補足】秋月でTBD62785が買えるようになったようです。)
MAX7219の基板の上に、本来のLEDと置き換えられるように作ったので、4段重ねになっています。
![](https://blogimg.goo.ne.jp/user_image/5c/a3/3f6621a77b2747c0782067548d0a98bc.jpg)
本物(といっても実はMK-80という互換機)と比べるとこんな感じ。
![](https://blogimg.goo.ne.jp/user_image/6e/d7/17f02f065913ec28d6caf022d7d63bd8.jpg)
こちらの互換機は基板のパターンはTK-80と同じで、マニュアルもNECの純正品が付属という完コピ機です。小学生の頃にお年玉で買って組み立てたものなのですが、最近40年ぐらいぶりに電源を入れたところちゃんと動作してくれました。
![](https://blogimg.goo.ne.jp/user_image/31/d5/c390645542142798400f24d177d222a5.jpg)
写真だとわかりにくいですが、思ったより暗いので原因を調べたところ,各LEDのコモンの信号が1/8(8桁なので)のさらに1/6の幅しかアクティブになっていないようでした.(800Hz, パルス幅約26μs(DT比1/48))
ファームウェアのソースを見ると
【2020/1/11 追記】
ファームウェアをいじってみました。以下、やったことのまとめ。
PICの開発環境をインストール。最新版はMPLAB X v5.30らしい。
microchip.co.jpの開発環境のページがリンク切れでエラー。microchip.comから取ってくる。
コンパイラは MPLAB XC32/32++ Compiler v2.30
デバッガ/プログラマは MPLAB Snap
plib.hが無いと言われる。どうやらlegacy libraryという位置付けになっているらしく、
PIC32 Legacy Peripheral Libraries - Windows を取ってきてインストール。
デフォルトだと1.40のフォルダにインストールされるようなのでインストール先を選ぶときに2.30に変更。
最初これに気づかずにハマってました。
新規プロジェクトを作成してデバイスにPIC32MX170F256Bを選択。空のプロジェクトができるので、
Header FilesとSource Filesに"Add existing item"でコピー。
ソースは、picosoftのZK-80のページから取ってきたファームウェア
2018-05-13-_ver023.zip
にZK-80Pのページの
ファームウェア差分
を上書きしたものを使用。
legacy periferal libraryがらみのwarningがうるさいので
main.hで
#define _SUPPRESS_PLIB_WARNING として抑制。
Max7219.cのfor文の中で変数宣言しているところでエラーが出たので修正。
peripheral.hでnvm.hが無いと言われたのでちょっと乱暴だけどコメントアウト。
最新版の開発環境でペリフェラルの機能を使うためにはHarmonyなるフレームワークを使うのが正攻法らしいのだが、
いまいち使い方がわからなかったので暫定対処。
割り込みの初期化をinit_LED()の前に入れないとタイマー割り込みでリセットに飛ばされるので、
main.cの
INTEnableSystemSingleVectoredInt()
INTEnableSystemMultiVectoredInt()
をinit_LED()の前に移動。
led.cにあるinit_LED()の中のIEC0bits.T1IE=1;が原因っぽい。(これは変更せずそのまま)
これを見つけるのに苦労しました。
以上で正常に動くものがビルド出来たので、最後にMax7219.cのsetIntensity(2)を8に変更。
コモンのパルス幅がDT比1/8*1/2ぐらいになってかなり明るくなりました。
(周囲の明るさが前回と違うので、この写真だと違いがわからないですが。)
![](https://blogimg.goo.ne.jp/user_image/23/bf/79c78bbfa0d0d4c007d5d52e823a2d6d.jpg)
【2020/7/4追記】
基板を作りました。