/* 12 Arduino digital out pins; 6 rows and 6 columns. */ int row1 = 2; // matrix pin 22, via transistor int row2 = 3; // matrix pin 19, via transistor int row5 = 4; // matrix pin 3, via transistor int row6 = 5; // matrix pin 6, via transistor int col1 = 6; // matrix pin 24 int col5 = 7; // matrix pin 1 int col2 = 8; // matrix pin 21 int col6 = 9; // matrix pin 4 int col3 = 10; // matrix pin 18 int col4 = 11; // matrix pin 15 int row3 = 12; // matrix pin 16, via transistor int row4 = 13; // matrix pin 13, via transistor int rows[] = {row1, row2, row3, row4, row5, row6}; int cols[] = {col1, col2, col3, col4, col5, col6}; int row_count = 6; int col_count = 6; int msec = 3; int low_high[] = {LOW, HIGH}; int onscreen[] = {0, 0, 0, 0, 0, 0}; int offscreen[] = {0, 0, 0, 0, 0, 0}; int frame_marker = 111; int read_row = -1; void setup() { for(int r = 0; r < row_count; r += 1) { pinMode(rows[r], OUTPUT); } for(int c = 0; c < col_count; c += 1) { pinMode(cols[c], OUTPUT); } Serial.begin(9600); } void read_byte(int byte) { if(read_row >= 0 && read_row < row_count) { /* Serial.print("writing to offscreen "); Serial.print(read_row); Serial.print("\n"); */ offscreen[read_row] = byte; read_row += 1; if(read_row == row_count) { /* Serial.print("Copying buffer...\n"); */ for(int i = 0; i < row_count; i += 1) { /* Serial.print("onscreen["); Serial.print(i); Serial.print("] = "); Serial.print(offscreen[i], BIN); Serial.print(" ... "); */ onscreen[i] = offscreen[i]; /* Serial.print(onscreen[i], BIN); Serial.print("\n"); */ } read_row = -1; } } else if(read_row == -1 && byte == frame_marker) { /* Serial.print("Preparing buffer\n"); */ read_row = 0; } } void draw_row(int row_num) { for(int r = 0; r < row_count; r += 1) { if(r == row_num) { digitalWrite(rows[r], HIGH); } else { digitalWrite(rows[r], LOW); } } for(int c = 0; c < col_count; c += 1) { //digitalWrite(cols[c], low_high[(onscreen[row_num] & (0x01 << c)) >> c]); digitalWrite(cols[c], low_high[((onscreen[row_num] << c) & 0x80) >> 7]); } } void loop() { // clear every row for(int r = 0; r < row_count; r += 1) { digitalWrite(rows[r], LOW); } // read in serial data, if any is available while(Serial.available() > 0) { read_byte(Serial.read()); /* for(int i = 0; i < row_count; i += 1) { Serial.println(onscreen[i], BIN); } */ } // scan over every row and draw it for(int r = 0; r < row_count; r += 1) { draw_row(r); delay(msec); } }