マイコン(PIC12F1822)でLEDドライバ(MAX7219)を制御し、8x8 LED matrixにアニメーションを表示させます。
材料
品名 | 型番 | 個数 |
---|---|---|
ドットマトリックスモジュール | (KKHMF)MAX7219 ドットマトリックスモジュールDIYキット | 1個 |
マイコン | (Microchip)PIC12F1822 | 1個 |
8ピンICソケット(平ピン) | 2227-08-03 | 1個 |
電池ケース(CR2032x2個用) | CH01-2032-ASTH150MM | 1個 |
リチウム電池 | CR2032 | 2個 |
プラスフック | (大一鋼業)PH-5 | 1個 |
ユニバーサル基板 | (Sanhayato)ICB293 | 1枚 |
回路図
ハードウェア
基板の切断とはんだ付け
ユニバーサル基板を10穴x6穴で切ります(残って見えるのは8穴x4穴になります)。
切ったユニバーサル基板にPICマイコン用の8ピンソケットと電線をはんだ付けします。
仕上げ
絶縁と壊れにくくするためにゴムの両面テープ、接着剤を使って電池ケースとはんだ付けした基板をドットマトリクスモジュールの裏に付けます。
接着剤はボンド ウルトラ多用途S・U クリヤー(あるいは相当品)、両面テープは(寺岡製作所)No.7811(あるいは相当品)を用います。
ソフトウェア
開発環境
PICマイコンのプログラム開発環境は、Microchip MPLAB X IDEとMicrochip MPLAB® XC8 Compilerを用います。
PICマイコンへのプログラム書き込み
PICマイコンへプログラムを書き込むために、PICKit3を用います。
ただし、書き込みの電源をPICkitから供給するために書き込み前にMicrochip MPLAB X IDEで次の設定をしておく必要があります。
PICKit3をPCに接続して、Microchip MPLAB X IDEのメニュー File -> Project Propertiesをクリックし、表示されるダイアログ左側のCategories:から「Conf:」の「PICkit3」をクリックします。「Option categories」から「Power」を選び、「Power target circuit from PICkit3」の右横にチェックを付け、さらに「Voltage level」は「5V」に設定し、[OK]ボタンをクリックします。
ソースコード
main.c
// PIC12F1822でMAX7219を制御し、8x8 LED matrixにアニメーション表示をさせるプログラム
// CONFIG1
#pragma config FOSC = INTOSC
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
// CONFIG2
#pragma config WRT = OFF
#pragma config PLLEN = OFF
#pragma config STVREN = ON
#pragma config BORV = LO
#pragma config LVP = OFF
#include <stdio.h>
#include <stdlib.h>
#include <pic.h>
#include <xc.h>
#define _XTAL_FREQ 8000000 // 8MHz
#define DIN_Pin PORTAbits.RA0
#define CS_Pin PORTAbits.RA1
#define CLK_Pin PORTAbits.RA2
#define CS1NUM 5 // for Chase x3
unsigned const short Chase1[8*CS1NUM]={
0x00,0x42,0x00,0x00,0x00,0x00,0x42,0x00, // round1
0x20,0x00,0x01,0x00,0x00,0x80,0x00,0x04, // round2
0x10,0x00,0x00,0x01,0x80,0x00,0x00,0x08, // round3
0x08,0x00,0x00,0x80,0x01,0x00,0x00,0x10, // round4
0x04,0x00,0x80,0x00,0x00,0x01,0x00,0x20, // round5
};
#define CS2NUM 10 // for Chase x1
unsigned const short Chase2[8*CS2NUM]={
0x3c,0x42,0xa1,0x85,0x85,0xa1,0x42,0x3c, // smile1
0x3c,0x42,0xa1,0x85,0x85,0xa1,0x42,0x3c, // smile1
0x3c,0x42,0xa1,0x8d,0x8d,0xa1,0x42,0x3c, // smile2
0x3c,0x42,0xa1,0x85,0x85,0xa1,0x42,0x3c, // smile1
0x3c,0x42,0xa1,0x8d,0x8d,0xa1,0x42,0x3c, // smile2
0x3c,0x42,0xa1,0x85,0x85,0xa1,0x42,0x3c, // smile1
0x3c,0x42,0xa9,0x85,0x85,0xa9,0x42,0x3c, // smile3
0x3c,0x42,0xa9,0x85,0x85,0xa9,0x42,0x3c, // smile3
0x3c,0x42,0xa9,0x85,0x85,0xa9,0x42,0x3c, // smile3
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // blank
};
#define MsgNUM 9 // Message
unsigned const short Message[8*MsgNUM]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //
0xaa,0x4a,0x6c,0xbe,0x6c,0x4a,0xaa,0x00, // 楽
0x00,0xfc,0x02,0x02,0x02,0x04,0x08,0x00, // し
0x7c,0x02,0x04,0x00,0x00,0x40,0x38,0x00, // い
0x42,0x42,0x42,0x7e,0x42,0x42,0x42,0x00, // エ
0x02,0x04,0x78,0x00,0xfe,0x02,0x0c,0x00, // ル
0x10,0x52,0x52,0x7c,0x90,0x90,0x10,0x00, // チ
0x42,0x44,0xf8,0x40,0x42,0x42,0x7c,0x00, // カ
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //
};
void SPI_Write_Byte(unsigned short num)
{
unsigned short t, Mask, Flag;
CLK_Pin = 0;
__delay_us(2);
Mask = 128;
for (t=0; t<8; t++)
{
Flag = num & Mask;
if(Flag == 0)
DIN_Pin = 0;
else
DIN_Pin = 1;
CLK_Pin = 1;
__delay_us(2);
CLK_Pin = 0;
__delay_us(2);
Mask = Mask >> 1;
}
}
void MAX7219_INIT() {
CS_Pin = 0;
SPI_Write_Byte(0x09);
SPI_Write_Byte(0x00);
CS_Pin = 1;
__delay_ms(100);
CS_Pin = 0;
SPI_Write_Byte(0x0A);
SPI_Write_Byte(0x01);
CS_Pin = 1;
__delay_ms(100);
CS_Pin = 0;
SPI_Write_Byte(0x0B);
SPI_Write_Byte(0x07);
CS_Pin = 1;
__delay_ms(100);
CS_Pin = 0;
SPI_Write_Byte(0x0C);
SPI_Write_Byte(0x01);
CS_Pin = 1;
__delay_ms(100);
CS_Pin = 0;
SPI_Write_Byte(0x0F);
SPI_Write_Byte(0x00);
CS_Pin = 1;
__delay_ms(100);
}
void Write_Byte(unsigned short myColumn, unsigned short myValue)
{
CS_Pin = 0; // select max7219.
SPI_Write_Byte(myColumn);
SPI_Write_Byte(myValue);
CS_Pin = 1;
}
void Clear_Matrix(void)
{
unsigned short x;
for(x=1;x<9;x++)
Write_Byte(x,0x00);
}
void Write_Chase()
{
unsigned short Column, Start_Byte;
unsigned int i,j;
for(j=0;j<3;j++)
{
for(i=0;i<CS1NUM;i++)
{
Clear_Matrix();
Start_Byte = i * 8;
for(Column=8;Column>=1;Column--)
Write_Byte(Column, Chase1[Start_Byte++]);
__delay_ms(150);
}
}
for(i=0;i<CS2NUM;i++)
{
Clear_Matrix();
Start_Byte = i * 8;
for(Column=8;Column>=1;Column--)
Write_Byte(Column, Chase2[Start_Byte++]);
__delay_ms(150);
}
}
void Write_Char(char myChar)
{
unsigned short Column, Start_Byte, i;
for (i=0;i<8;i++)
{
Clear_Matrix();
Start_Byte = (myChar) * 8 + i;
for(Column=8;Column>=1;Column--)
Write_Byte(Column, Message[Start_Byte++]);
if(i==0)
__delay_ms(200);
else
__delay_ms(100);
}
}
void main()
{
char x;
OSCCON = 0b01110000 ; // 内部クロック8MHz
ANSELA = 0b00000000 ; // すべてデジタルI/Oに割当てる
TRISA = 0b00000000 ; // 全て出力ピンとする
PORTA = 0b00000100 ; // ピン状態(Lowに)初期化
CS_Pin = 1;
CLK_Pin = 0;
MAX7219_INIT();
do{
Write_Chase();
for(x=0;x<MsgNUM-1;x++)
Write_Char(x);
}while(1);
}
※ Microchip MPLAB X IDE v5.40、Microchip MPLAB® XC8 Compiler v2.30で動作確認しています。
参考資料
Maxim Integrated Products(2003)MAX7219データシート
Microchip Technology Inc(2013)PIC12F1822データシート
-
Honey_Bee
さんが
2021/02/23
に
編集
をしました。
(メッセージ: 初版)
-
Honey_Bee
さんが
2021/02/23
に
編集
をしました。
-
Honey_Bee
さんが
2021/02/23
に
編集
をしました。
ログインしてコメントを投稿する