A library to manipulate 2D arrays, and output them to an LED Dot Matrix Display. The display must be wired up using a shift register combined with a nor latch.

Revision:
1:44819562ea31
Parent:
0:1deae5ffe9ed
--- a/LEDMatrix.h	Mon Feb 13 22:19:58 2012 +0000
+++ b/LEDMatrix.h	Mon Feb 13 23:20:30 2012 +0000
@@ -1,52 +1,47 @@
 #include "mbed.h"
-#include "Locations.h"
 #include "Matrix.h"
 
 template <int WIDTH, int HEIGHT> class LEDMatrix : public Matrix<bool> {
   private:
-    DigitalOut*  _rows;
-    DigitalOut* _colClk;
-    DigitalOut* _colReset;
+    //Array of row pins
+    DigitalOut* _rows;
+    
+    //Pointers to column control pins
+    DigitalOut* _nextCol;
+    DigitalOut* _firstCol;
     int _usPerColumn;
     
-    //Column control
-    void firstColumn() {
-        *_colReset = 1;
-        wait_us(10);
-        *_colReset = 0;
-    }
-    void nextColumn() {
-        *_colClk = 1;
-        wait_us(10);
-        *_colClk = 0;
-    }
-    void showColumn(int c) {
-        bool* col = column(WIDTH - 1 - c);
-        for(int i = 0; i < HEIGHT; i++) {
-            _rows[i] = col[HEIGHT - 1 - i];
-        }
-        delete [] col;
-    }
-    void hideColumn(int c) {
-        for(int i = 0; i < HEIGHT; i++) {
-            _rows[i] = false;
-        }
-    }
   public:
-    LEDMatrix(DigitalOut rows[HEIGHT], DigitalOut* colClk, DigitalOut* colReset, int usPerFrame) : 
-      Matrix<bool>(WIDTH, HEIGHT), _rows(rows), _colClk(colClk), _colReset(colReset) { 
+    LEDMatrix(DigitalOut rows[HEIGHT], DigitalOut* nextCol, DigitalOut* firstCol, int usPerFrame) : Matrix<bool>(WIDTH, HEIGHT), _rows(rows), _nextCol(nextCol), _firstCol(firstCol) { 
         clear();
-        firstColumn();
         _usPerColumn = usPerFrame / WIDTH;
     }
     
     void redraw() {
-        firstColumn();
-        for (int col = 0; col < WIDTH; col++) {
-            nextColumn();
-            showColumn(col);
+        //Pulse firstCol
+        *_firstCol = 1;
+        wait_us(10);
+        *_firstCol = 0;
+        
+        //Account for reverse column ordering
+        for (int col = WIDTH - 1; col >= 0; col--) {
+            //Pulse nextCol
+            *_nextCol = 1;
+            wait_us(10);
+            *_nextCol = 0;
+            
+            //Output a column of data to the row pins.
+            for(int row = 0; row < HEIGHT; row++) {
+                _rows[row] = (*this)(col, row);
+            }
+            
+            //Wait
             wait_us(_usPerColumn);
-            hideColumn(col);
+            
+            //Clear the column, ready for the next iteration
+            for(int i = 0; i < HEIGHT; i++) {
+                _rows[i] = false;
+            }
         }
     }
 };
\ No newline at end of file