編集履歴一覧に戻る
Honey_Beeのアイコン画像

Honey_Bee が 2021年02月23日11時04分19秒 に編集

初版

タイトルの変更

+

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

タグの変更

+

PIC

+

LED

メイン画像の変更

メイン画像が設定されました

本文の変更

+

マイコン(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枚| # 回路図 ![ 回路図](https://camo.elchika.com/61341205c3ed215d281c71c56b4b4525a22f61b1/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f64346535623166382d333262612d346565352d383464622d6564356132373962376265302f65323838336163362d363734662d346635642d616135342d646432623962616330366633/) # ハードウェア ## 基板の切断とはんだ付け ![基板の切断とはんだ付け](https://camo.elchika.com/cd3b63def8fe44882c16cd68aef0f96f3b5ea4ee/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f64346535623166382d333262612d346565352d383464622d6564356132373962376265302f38326563383335342d326537312d343530322d383235312d313566343338346433306436/) ユニバーサル基板を10穴x6穴で切ります(残って見えるのは8穴x4穴になります)。 切ったユニバーサル基板にPICマイコン用の8ピンソケットと電線をはんだ付けします。 ![はんだ付けした基板](https://camo.elchika.com/1f8fc15257cfe5243265a31b1bd2cd1c9d53664d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f64346535623166382d333262612d346565352d383464622d6564356132373962376265302f30336662616231612d356236302d343238622d386137322d636637616434366535373639/) ## 仕上げ ![ 電池ケースを付けた基板](https://camo.elchika.com/dda13ce14db0565a980b5ba9c7d0820737b5c4f4/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f64346535623166382d333262612d346565352d383464622d6564356132373962376265302f32313934663565382d333064652d343039332d386332302d373464656463393035646137/) 絶縁と壊れにくくするためにゴムの両面テープ、接着剤を使って電池ケースとはんだ付けした基板をドットマトリクスモジュールの裏に付けます。 接着剤は(あるいは相当品)、両面テープ(あるいは相当品)を用います。 # ソフトウェア ## 開発環境 PICマイコンのプログラム開発環境は、Microchip MPLAB X IDEとMicrochip MPLAB® XC8 Compilerを用います。 ![ 開発環境](https://camo.elchika.com/983b6b3a8d7b5ba97dee557f6ddcc52f0b1c7dc5/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f64346535623166382d333262612d346565352d383464622d6564356132373962376265302f38613738383939392d623566332d346265342d393433332d646461643533323838303161/) > [Microchip MPLAB X IDE](https://www.microchip.com/en-us/development-tools-tools-and-software/mplab-x-ide) > [Microchip MPLAB® XC8 Compiler](https://www.microchip.com/en-us/development-tools-tools-and-software/mplab-xc-compilers#Downloads%20and%20Documentation%20) ## 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]ボタンをクリックします。 ## ソースコード ```c: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データシート](https://pdfserv.maximintegrated.com/jp/ds/1339J.pdf) > [Microchip Technology Inc(2013)PIC12F1822データシート](http://ww1.microchip.com/downloads/jp/devicedoc/41413c_jp.pdf)