「青色ドットマトリクスLED 5×7ドット MOA20UB019GJ で遊ぶ 3.文字を表示させてみる」の続き
前回までの表示方法が完成していれば、よくある「流れる表示」もすぐにできる。
せっかくドット・マトリックスで表示するのだから「流れる表示」は必須の表示方法だ。
どうも、スマホのカメラで撮ると肉眼で見たときより見にくく感じるが、実際はもっとくっきりきれい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
// PIC18LF46J50 Configuration Bit Settings // 'C' source line config statements #include <xc.h> // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. // CONFIG1L #pragma config WDTEN = OFF // Watchdog Timer (Disabled - Controlled by SWDTEN bit) #pragma config PLLDIV = 1 // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly)) #pragma config STVREN = OFF // Stack Overflow/Underflow Reset (Disabled) #pragma config XINST = OFF // Extended Instruction Set (Disabled) // CONFIG1H #pragma config CPUDIV = OSC1 // CPU System Clock Postscaler (No CPU system clock divide) #pragma config CP0 = OFF // Code Protect (Program memory is not code-protected) // CONFIG2L #pragma config OSC = INTOSC // Oscillator (INTOSC) #pragma config T1DIG = OFF // T1OSCEN Enforcement (Secondary Oscillator clock source may not be selected) #pragma config LPT1OSC = OFF // Low-Power Timer1 Oscillator (High-power operation) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor (Disabled) #pragma config IESO = OFF // Internal External Oscillator Switch Over Mode (Disabled) // CONFIG2H #pragma config WDTPS = 32768 // Watchdog Postscaler (1:32768) // CONFIG3L #pragma config DSWDTOSC = INTOSCREF// DSWDT Clock Select (DSWDT uses INTRC) #pragma config RTCOSC = INTOSCREF// RTCC Clock Select (RTCC uses INTRC) #pragma config DSBOREN = OFF // Deep Sleep BOR (Disabled) #pragma config DSWDTEN = OFF // Deep Sleep Watchdog Timer (Disabled) #pragma config DSWDTPS = G2 // Deep Sleep Watchdog Postscaler (1:2,147,483,648 (25.7 days)) // CONFIG3H #pragma config IOL1WAY = ON // IOLOCK One-Way Set Enable bit (The IOLOCK bit (PPSCON<0>) can be set once) #pragma config MSSP7B_EN = MSK7 // MSSP address masking (7 Bit address masking mode) // CONFIG4L #pragma config WPFP = PAGE_63 // Write/Erase Protect Page Start/End Location (Write Protect Program Flash Page 63) #pragma config WPEND = PAGE_WPFP// Write/Erase Protect Region Select (valid when WPDIS = 0) (Page WPFP<5:0> through Configuration Words erase/write protected) #pragma config WPCFG = OFF // Write/Erase Protect Configuration Region (Configuration Words page not erase/write-protected) // CONFIG4H #pragma config WPDIS = OFF // Write Protect Disable bit (WPFP<5:0>/WPEND region ignored) #define _XTAL_FREQ 8000000 const unsigned char sahara[] = { 0xB9, 0xB6, 0xB6, 0xB6, 0xCE, 0xFF,// S 0xDF, 0xAB, 0xAB, 0xAB, 0x87, 0xFF,// a 0x80, 0xF7, 0xFB, 0xFB, 0x87, 0xFF,// h 0xDF, 0xAB, 0xAB, 0xAB, 0x87, 0xFF,// a 0x83, 0xF7, 0xFB, 0xFB, 0xF7, 0xFF,// r 0xDF, 0xAB, 0xAB, 0xAB, 0x87, 0xFF,// a }; void delay(unsigned char cnt){ unsigned char i; for(i=0; i<cnt; i++){ __delay_ms(10); } } void main(void){ OSCCONbits.SCS = 0b11;//System Clock is Postscaled internal clock (INTRC/INTOSC derived) OSCCONbits.IRCF = 0b111;//8MHz TRISB = 0;//PORTB is Output TRISD = 0;//PORTD is Output ANCON0 = 0b1111111;//PORTB is Digital Port unsigned char i, j, k; while(1){ for(i=0; i<36; i++){ for(k=0; k<10; k++){ for(j=0; j<5; j++){ PORTB = 0b00000001 << j; PORTD = sahara[(i+j) % 36]; __delay_ms(5); } } } } } |
一工夫したところをあえて書けば、キャラクタどうしがくっついてしまうので余分な隙間を1本挟んだことくらい。
「Sahara」の表示を流すので、本来は5列 x 6文字 = 30列だが、36列となっている。
あとは機械的にどうにでもできると踏んで、MOA20UB019GJを2個でもやってみた。
残念ながらブレッドボードでは横に並べられないが、下のを右に、上のを左に配置すれば、流れるはずだ。
そこで、スマホで撮影したものを編集・合成してみた。
さらに、MOA20UB019GJを3つ連結したものもやってみた。
プログラム的には目新しいことも無いが、なにせブレッドボードの配線がひっちゃかめっちゃかに。