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