Akizuki 32x16 dot LED Matrix unit (K-03735) control library.

秋月電子の32×16ドットLEDマトリクス表示装置(K-03735)を制御するライブラリです。
バッファの内容をそのままLEDマトリクス装置に送ります。
LEDマトリクス表示装置は最大4台まで接続できるので、接続台数を必ず指定してください。(この台数でバッファのサイズを計算しています。)
行間表示は1msのdelayを入れています。パラメタで変更可能です。
このライブラリの呼び出し元は基本的にwhile()でループしてください。
初めてのライブラリなのでメンバ関数もドキュメントとかまだ最低限です。
おかしなところはぜひコメントをください。

表示例は以下ページをご覧ください。

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?

UserRevisionLine numberNew 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 }