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モードを使ったほうがいい。