Test program for the microbit LED matrix

Dependencies:   mbed

main.cpp

Committer:
f3d
Date:
2020-09-14
Revision:
0:a1f9bf062855

File content as of revision 0:a1f9bf062855:

#include "mbed.h"
/* 
 * All the LEDs on the micro:bit are part of the LED Matrix,
 * In order to get simple blinking behaviour, we set column 0
 * to be permanently at ground. If you want to use the LEDs as
 * a screen, there is a display driver in the micro:bit 'DAL',
 */
// Columns are active low
// Rows are active high 
// Initialize all LED matrix connections in an inactive state
DigitalOut col1(P0_4,1);
DigitalOut col2(P0_5,1);
DigitalOut col3(P0_6,1);
DigitalOut col4(P0_7,1);
DigitalOut col5(P0_8,1);
DigitalOut col6(P0_9,1);
DigitalOut col7(P0_10,1);
DigitalOut col8(P0_11,1);
DigitalOut col9(P0_12,1);
DigitalOut row1(P0_13,0);
DigitalOut row2(P0_14,0);
DigitalOut row3(P0_15,0);



Ticker DisplayThreadObject;
typedef struct  {
    DigitalOut & row;
    DigitalOut & col;
    int state;  
} LEDStruct;
LEDStruct FrameBuffer[5][5] = { {{row1,col1,0}, {row2,col4,0}, {row1,col2,0}, {row2,col5,0}, {row1,col3,0}},
                                {{row3,col4,0}, {row3,col5,0}, {row3,col6,0}, {row3,col7,0}, {row3,col8,0}}, 
                                {{row2,col2,0}, {row1,col9,0}, {row2,col3,0}, {row3,col9,0}, {row2,col1,0}}, 
                                {{row1,col8,0}, {row1,col7,0}, {row1,col6,0}, {row1,col5,0}, {row1,col4,0}}, 
                                {{row3,col3,0}, {row2,col7,0}, {row3,col1,0}, {row2,col6,0}, {row3,col2,0}} 
                            };


void DisplayThreadTask(void)
{
    static int row=0;
    static int col=0;

    // Turn off all LEDs from previous state
    for (int row=0;row<5;row++)
    {
        for (int col=0;col<5;col++)
        {
            FrameBuffer[row][col].row=0;            
            FrameBuffer[row][col].col=1;
        }
    }
    
    if (FrameBuffer[row][col].state==1)
    {
        // Turn LED on
        FrameBuffer[row][col].row = 1;
        FrameBuffer[row][col].col = 0;
    }
    else
    {
        // Turn LED off
        FrameBuffer[row][col].row = 0;
        FrameBuffer[row][col].col = 1;
    }
    
    col++;
    if (col > 4)
    {
        col = 0;
        row ++ ;
        if (row > 4)
            row = 0;
    }
    
}
int main() {
    
    DisplayThreadObject.attach(DisplayThreadTask,0.001); // update the display once LED per millisecond

    FrameBuffer[0][0].state = 1;
    FrameBuffer[0][1].state = 1;
    FrameBuffer[0][2].state = 1;
    FrameBuffer[0][3].state = 1;
    FrameBuffer[0][4].state = 1;
    
    FrameBuffer[2][2].state = 1;
    
    FrameBuffer[4][0].state = 1;
    FrameBuffer[4][1].state = 1;
    FrameBuffer[4][2].state = 1;
    FrameBuffer[4][3].state = 1;
    FrameBuffer[4][4].state = 1;
    

    while(1) {
        
    }
}