PICマイコンで7セグLEDを表示するには、かなりのIOピンを必要とする。なんとかならないかと思っていたら、MAX7219搭載でシリアル通信で8桁のLEDを表示できる部品を見つけた。300円程度で購入できたので早速試してみた。
電源のほかには、3つのIOが必要で、I2CよりSPIに近いが、一方的に2バイト送り付けるだけなので、デジタルIOで送信する関数を使ったほうがよさそう。16F18325で試してみた。
/* * 13 RA0 DIN 送信データ * 12 RA1 CS 開始フラグ。Lowでデータ送信開始 * 11 RA2 CLK クロック供給 */ void max_write(unsigned char addr,unsigned char data){ int i; const unsigned char BitMask = 0b10000000; RA1 = 0;//CSをLowにして受信待機させる。 for(i=0;i<8;i++){ RA2 = 0;//クロックをLowに RA0 = (addr&BitMask)!=0; addr <<= 1; RA2=1; //クロックをHighに } for(i=0;i<8;i++){ RA2=0; RA0=(data&BitMask)!=0; data <<=1; RA2=1; } RA1=1; RA2=0; }
この関数にアドレスとデータをパラメーターにして呼び出すと表示するはずが、なかなか動かなくてかなり苦戦した。
単純なミスで、初期化をきっちりしていなかったのが原因。mainで以下のようにすると無事動作した。
unsigned char i,j; max_write(0x0C,0x01);//nomal oparation max_write(0x09,0x00);//No Decode max_write(0x0A,0x07);//LED輝度 max_write(0x0B,0x07);//ScanLimit for(i=1;i<9;i++){ max_write(i,0); }
特に1つ目と4つ目が肝心、ShutDownモードになっていると全く動かない。Display
Testをすると、ShutDownが解除されそうな記述を見たけれど、そんなことはなかった。
ScanLimitを8桁全部にしておかないと、いくらデータを送っても反映されない。
できてしまえば、あとは非常に楽。数字だけなら、Decodeモードを使ったほうがいい。