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 14:00:10 2013 +0000
Revision:
12:4e85b39e922b
Parent:
9:988d937735e0
bugfix. add ledunit param.

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