Akizuki 32x16 dot LED Matrix unit (K-03735) control library.
秋月電子の32×16ドットLEDマトリクス表示装置(K-03735)を制御するライブラリです。
バッファの内容をそのままLEDマトリクス装置に送ります。
LEDマトリクス表示装置は最大4台まで接続できるので、接続台数を必ず指定してください。(この台数でバッファのサイズを計算しています。)
行間表示は1msのdelayを入れています。パラメタで変更可能です。
このライブラリの呼び出し元は基本的にwhile()でループしてください。
初めてのライブラリなのでメンバ関数もドキュメントとかまだ最低限です。
おかしなところはぜひコメントをください。
表示例は以下ページをご覧ください。
akiledmatrix.cpp@5:c055674c4a0b, 2013-06-09 (annotated)
- Committer:
- kanpapa
- Date:
- Sun Jun 09 05:24:11 2013 +0000
- Revision:
- 5:c055674c4a0b
- Parent:
- 4:920c540c6a61
- Child:
- 6:141717976896
add scroll function
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kanpapa | 5:c055674c4a0b | 1 | #include "mbed.h" |
kanpapa | 0:bf351a2fa565 | 2 | #include "akiledmatrix.h" |
kanpapa | 0:bf351a2fa565 | 3 | |
kanpapa | 0:bf351a2fa565 | 4 | AkiLedMatrix::AkiLedMatrix(PinName sin1, |
kanpapa | 0:bf351a2fa565 | 5 | PinName sin2, |
kanpapa | 0:bf351a2fa565 | 6 | PinName sin3, |
kanpapa | 0:bf351a2fa565 | 7 | PinName clock, |
kanpapa | 0:bf351a2fa565 | 8 | PinName latch, |
kanpapa | 1:2705be49d5e2 | 9 | PinName strobe, |
kanpapa | 5:c055674c4a0b | 10 | const int ledunit, |
kanpapa | 5:c055674c4a0b | 11 | const int delay, |
kanpapa | 5:c055674c4a0b | 12 | const int shift_count_init) : |
kanpapa | 0:bf351a2fa565 | 13 | _sin1(sin1), |
kanpapa | 0:bf351a2fa565 | 14 | _sin2(sin2), |
kanpapa | 0:bf351a2fa565 | 15 | _sin3(sin3), |
kanpapa | 0:bf351a2fa565 | 16 | _clock(clock), |
kanpapa | 0:bf351a2fa565 | 17 | _latch(latch), |
kanpapa | 1:2705be49d5e2 | 18 | _strobe(strobe), |
kanpapa | 5:c055674c4a0b | 19 | _ledunit(ledunit), |
kanpapa | 5:c055674c4a0b | 20 | _delay(delay), |
kanpapa | 5:c055674c4a0b | 21 | _shift_count_init(shift_count_init) { |
kanpapa | 0:bf351a2fa565 | 22 | // initrize |
kanpapa | 0:bf351a2fa565 | 23 | _sin1 = 0; |
kanpapa | 0:bf351a2fa565 | 24 | _sin2 = 0; |
kanpapa | 0:bf351a2fa565 | 25 | _sin3 = 0; |
kanpapa | 0:bf351a2fa565 | 26 | _clock = 0; |
kanpapa | 0:bf351a2fa565 | 27 | _latch = 1; |
kanpapa | 0:bf351a2fa565 | 28 | _strobe = 0; // LED ON |
kanpapa | 5:c055674c4a0b | 29 | shift_count = shift_count_init; |
kanpapa | 5:c055674c4a0b | 30 | } |
kanpapa | 5:c055674c4a0b | 31 | |
kanpapa | 5:c055674c4a0b | 32 | // |
kanpapa | 5:c055674c4a0b | 33 | // bit shift array[buf_xsize] |
kanpapa | 5:c055674c4a0b | 34 | // |
kanpapa | 5:c055674c4a0b | 35 | void AkiLedMatrix::bitshift(unsigned char *array, int xsize){ |
kanpapa | 5:c055674c4a0b | 36 | int top_bit = 0, work_bit = 0; |
kanpapa | 5:c055674c4a0b | 37 | for (int y = 0; y < (16 * xsize); y = y + xsize){ |
kanpapa | 5:c055674c4a0b | 38 | for (int x = 0; x < xsize; x++){ |
kanpapa | 5:c055674c4a0b | 39 | if ((array[x + y] & 0x80) != 0){ |
kanpapa | 5:c055674c4a0b | 40 | if (x == 0){ |
kanpapa | 5:c055674c4a0b | 41 | top_bit = 1; |
kanpapa | 5:c055674c4a0b | 42 | } else { |
kanpapa | 5:c055674c4a0b | 43 | work_bit = 1; |
kanpapa | 5:c055674c4a0b | 44 | } |
kanpapa | 5:c055674c4a0b | 45 | } else { |
kanpapa | 5:c055674c4a0b | 46 | if (x == 0){ |
kanpapa | 5:c055674c4a0b | 47 | top_bit = 0; |
kanpapa | 5:c055674c4a0b | 48 | } else { |
kanpapa | 5:c055674c4a0b | 49 | work_bit = 0; |
kanpapa | 5:c055674c4a0b | 50 | } |
kanpapa | 5:c055674c4a0b | 51 | } |
kanpapa | 5:c055674c4a0b | 52 | // Right shift |
kanpapa | 5:c055674c4a0b | 53 | array[x + y] = array[x + y] << 1; |
kanpapa | 5:c055674c4a0b | 54 | |
kanpapa | 5:c055674c4a0b | 55 | if (x != 0){ |
kanpapa | 5:c055674c4a0b | 56 | array[x + y - 1 ] = array[x + y - 1 ] | work_bit; |
kanpapa | 5:c055674c4a0b | 57 | } |
kanpapa | 5:c055674c4a0b | 58 | } |
kanpapa | 5:c055674c4a0b | 59 | // set lower bit (last byte) |
kanpapa | 5:c055674c4a0b | 60 | array[y + xsize - 1] = array[y + xsize - 1] | top_bit; |
kanpapa | 5:c055674c4a0b | 61 | } |
kanpapa | 0:bf351a2fa565 | 62 | } |
kanpapa | 5:c055674c4a0b | 63 | |
kanpapa | 5:c055674c4a0b | 64 | void AkiLedMatrix::display(unsigned char *buffer) { |
kanpapa | 5:c055674c4a0b | 65 | DigitalOut myled4(LED4); |
kanpapa | 5:c055674c4a0b | 66 | |
kanpapa | 0:bf351a2fa565 | 67 | int bufp = 0; // buffer pointer |
kanpapa | 0:bf351a2fa565 | 68 | |
kanpapa | 5:c055674c4a0b | 69 | for (int y = 0; y < 16; y++){ |
kanpapa | 4:920c540c6a61 | 70 | for (int ledno = (_ledunit - 1); ledno >= 0; ledno--){ |
kanpapa | 2:ddef08e13c8e | 71 | uint16_t led1_data = buffer[ledno * 4 + bufp + 0] * 256 + buffer[ledno * 4 + bufp + 1]; |
kanpapa | 2:ddef08e13c8e | 72 | uint16_t led2_data = buffer[ledno * 4 + bufp + 2] * 256 + buffer[ledno * 4 + bufp + 3]; |
kanpapa | 5:c055674c4a0b | 73 | |
kanpapa | 2:ddef08e13c8e | 74 | for (int x = 0; x < 16; x++){ |
kanpapa | 2:ddef08e13c8e | 75 | if (x == y){ |
kanpapa | 2:ddef08e13c8e | 76 | _sin1 = 1; |
kanpapa | 2:ddef08e13c8e | 77 | } else { |
kanpapa | 2:ddef08e13c8e | 78 | _sin1 = 0; |
kanpapa | 2:ddef08e13c8e | 79 | } |
kanpapa | 0:bf351a2fa565 | 80 | |
kanpapa | 2:ddef08e13c8e | 81 | // LED1 |
kanpapa | 2:ddef08e13c8e | 82 | _sin2 = led1_data & 0x01; |
kanpapa | 2:ddef08e13c8e | 83 | led1_data = led1_data >> 1; |
kanpapa | 0:bf351a2fa565 | 84 | |
kanpapa | 2:ddef08e13c8e | 85 | // LED2 |
kanpapa | 2:ddef08e13c8e | 86 | _sin3 = led2_data & 0x01; |
kanpapa | 2:ddef08e13c8e | 87 | led2_data = led2_data >> 1; |
kanpapa | 5:c055674c4a0b | 88 | |
kanpapa | 2:ddef08e13c8e | 89 | wait_us(2); // tSETUP min:1.2us |
kanpapa | 0:bf351a2fa565 | 90 | |
kanpapa | 2:ddef08e13c8e | 91 | // set clock |
kanpapa | 2:ddef08e13c8e | 92 | _clock = 1; |
kanpapa | 2:ddef08e13c8e | 93 | wait_us(1); // twCLK min:1.0us |
kanpapa | 2:ddef08e13c8e | 94 | _clock = 0; |
kanpapa | 2:ddef08e13c8e | 95 | } |
kanpapa | 1:2705be49d5e2 | 96 | } |
kanpapa | 5:c055674c4a0b | 97 | |
kanpapa | 1:2705be49d5e2 | 98 | // set latch |
kanpapa | 1:2705be49d5e2 | 99 | _latch = 0; |
kanpapa | 1:2705be49d5e2 | 100 | wait_us(2); // twLAT min:2.0us |
kanpapa | 1:2705be49d5e2 | 101 | _latch = 1; |
kanpapa | 0:bf351a2fa565 | 102 | |
kanpapa | 5:c055674c4a0b | 103 | wait_us(_delay); |
kanpapa | 0:bf351a2fa565 | 104 | |
kanpapa | 4:920c540c6a61 | 105 | bufp = bufp + (_ledunit * 4); |
kanpapa | 5:c055674c4a0b | 106 | |
kanpapa | 5:c055674c4a0b | 107 | // shift check |
kanpapa | 5:c055674c4a0b | 108 | if (shift_count-- == 0){ |
kanpapa | 5:c055674c4a0b | 109 | bitshift(buffer, 8); |
kanpapa | 5:c055674c4a0b | 110 | shift_count = _shift_count_init; |
kanpapa | 5:c055674c4a0b | 111 | |
kanpapa | 5:c055674c4a0b | 112 | // blink LED4 |
kanpapa | 5:c055674c4a0b | 113 | if (myled4 == 1) { |
kanpapa | 5:c055674c4a0b | 114 | myled4 = 0; |
kanpapa | 5:c055674c4a0b | 115 | } else { |
kanpapa | 5:c055674c4a0b | 116 | myled4 = 1; |
kanpapa | 5:c055674c4a0b | 117 | } |
kanpapa | 0:bf351a2fa565 | 118 | } |
kanpapa | 0:bf351a2fa565 | 119 | } |
kanpapa | 0:bf351a2fa565 | 120 | } |
kanpapa | 5:c055674c4a0b | 121 | |
kanpapa | 5:c055674c4a0b | 122 | int AkiLedMatrix::getLedunit(){ |
kanpapa | 5:c055674c4a0b | 123 | return _ledunit; |
kanpapa | 5:c055674c4a0b | 124 | } |