Modul tampilan 16x16 LED Dot Matrix Moduleini menggunakan 4 buah matriks LED 8x8 yang disusun membentuk matriks 16x16 titik (16 x 16 pixel), diarah-kendalikan menggunakan 2 keping demultiplexer IC74HC138D dan 2 keping IC shift register74HC595Dserta dilengkapi rangkaian resistor array kapasitor dan power transistor terpadu. Semua komponen menggunakan versi kemasan SMD untuk menghemat ruang dan membuat ukuran dari modul ini ringkas dan kompak.

Modul ini dapat dirangkai memanjang (cascadable) untuk membentuk tampilan 32x16px, 48x16px, 64x16px, dst. Ukuran tampilan untuk 16x16 px adalah 64 x 64 mm(menggunakan 4 buah 8x8 Lattice Screen 32x32 mm / 1.26").



Data teknis:
Kami menjual modul dan komponen elektronika ini dalam paket yang sudah dirangkai (assembled), dengan isi kitsebagai berikut:
Prinsip pengendalian modul ini menggunakan shift register 74HC595 untuk mengantrikan status saklar 16 buah LED pada baris aktif, dengan baris aktif dipilih menggunakan IC decoder 74HC138. Dengan gabungan teknik shift register dan demultiplexer ini hanya dibutuhkan 8 jalur I/O untuk mengendalikan keseluruhan 256 titik LED (16 x 16 piksel).

Ke-8 jalur I/O tersebut terbagi atas 3 bagian:
Dengan demikian, pseduo algorithm untuk mengarah-kendalikan modul ini sebagai berikut:

FOR row = 0 TO 15
PIN_A = row & 1
PIN_B = (row >> 1) & 1
PIN_C = (row >> 2) & 1
PIN_D = (row >> 3) & 1
FOR col = 0 to 15
PIN_DI = led_state[ row, col ]
PIN_CLK = HIGH
PIN_CLK = LOW
NEXT col
PIN_LATCH = HIGH
PIN_G = HIGH
PIN_LATCH = LOW
PIN_G = LOW
NEXT row
Berikut ini adalah contoh program untuk Arduino Uno (kode sudah dioptimisasi untuk kinerja maksimum):

/*
Cascadable 16x16 LED Dot Matrix Module
SKU: MDDM1616R http://p.vcc2gnd.com/16x16

Wiring (MDDM1616R Module v.s. Arduino Uno):
G = Pin 4 (bit#4 of PORTD)
LAT = Pin 5 (bit#5 of PORTD)
DI = Pin 6 (bit#6 of PORTD)
CLK = Pin 7 (bit#7 of PORTD)
A,B,C,D = Pin 8,9,10,11 (Low nibble of PORTB)

*/

volatile uint16_t VRAM[16];

prog_uint16_t logo[16] PROGMEM = {
0x03C0, // ......####......
0x0660, // .....##..##.....
0x03C0, // ......####......
0x0180, // .......##.......
0x3FFC, // ..############..
0x2004, // ..#..........#..
0xF81F, // #####......#####
0x701F, // .###.......#####
0x2000, // ..#.............
0xF81F, // #####......#####
0x2004, // ..#..........#..
0x3FFC, // ..############..
0x0180, // .......##.......
0x0FF0, // ....########....
0x0000, // ................
0x03C0 // ......####......
};
#define use_logo for(byte register logoLoop = 16; logoLoop--;)\
VRAM[ logoLoop ] = pgm_read_word_near(&logo[ logoLoop ])

prog_uint16_t bitMap[16] PROGMEM = {
0x9024, // #..#......#..#..
0xA028, // #.#.......#.#...
0xB2AC, // #.##..#.#.#.##..
0xA92A, // #.#.#..#..#.#.#.
0x92A4, // #..#..#.#.#..#..
0x0000, // ................
0x00E0, // ........###.....
0x0060, // .........##.....
0x00A0, // ........#.#.....
0x1900, // ...##..#........
0x1E60, // ...####..##.....
0x1F60, // ...#####.##.....
0xFFFF, // ################
0x1F60, // ...#####.##.....
0x1E60, // ...####..##.....
0x1800 // ...##...........
};
#define use_bitMap for(byte register bitMapLoop = 16; bitMapLoop--;)\
VRAM[ bitMapLoop ] = pgm_read_word_near(&bitMap[ bitMapLoop ])

void setup() {
DDRD |= 240; // Pin 4..7 as output
DDRB |= 15; // Pin 8..11 as output
use_logo;
}

//byte dRow = 0;
void refresh_MDDDM1616R() {
__asm__("cli\n\t");

for(byte register dRow = 0; dRow < 16; dRow++) {
PORTB = PINB & 240 | dRow;
word rData = VRAM[ dRow ];

byte register tmp;
byte register dVal = PIND & 15; // clear high nibble
for(byte register i = 0; i < 16; i++) {
tmp = dVal;
if((((byte)rData) & 1) == 0) tmp |= 64; // turn bit#6 HIGH
PORTD = tmp; // put tmp (containing data for DI)
PORTD = tmp | 128; // set CLK HIGH
rData >>= 1; // prepare next column
PORTD = tmp & 127; // turn CLK LOW
}
PORTD = dVal | 32; // Latch Data
delay(2); // delay 2 ms to dissipate ghost effect
PORTD = dVal | 16; // Enable row selection
PORTD = dVal; // Done for this row
}
//dRow++; // prepare for next row
__asm__("sei\n\t");
}

byte counter;

void loop() {
/*
:
do any processing here...
:
*/

counter++;
if(counter == 0) use_logo;
else if(counter == 128) use_bitMap;
// refresh display
refresh_MDDDM1616R();
}