Honey_Beeのアイコン画像

アニメーション表示するLEDキーホルダー

Honey_Bee 2021年02月23日に作成  (2021年02月23日に更新)

マイコン(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を用います。
 開発環境

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データシート

1
Honey_Bee さんが 2021/02/23 に 編集 をしました。 (メッセージ: 初版)
Honey_Bee さんが 2021/02/23 に 編集 をしました。
Honey_Bee さんが 2021/02/23 に 編集 をしました。
ログインしてコメントを投稿する