Max7219 7seg LED library

Dependents:   Max7219_7segled_example Max7219_7LED_example

https://lh3.googleusercontent.com/-0vXfHJLi27Q/V-Y5ZtR0DwI/AAAAAAAAeY8/RazTbDF_u1o6rOeBhdWTyNvmOGqz_601wCKgB/s1024/IMG_0852.JPG

- example: https://developer.mbed.org/users/hotchpotch/code/Max7219_7segled_example/

Max7219.hpp

Committer:
hotchpotch
Date:
2016-09-24
Revision:
1:367abb8e4cfc
Parent:
0:980df3fd4973

File content as of revision 1:367abb8e4cfc:

/*
 * Licence: Apache2 Licence
 * Author: Yuichi Tateno 
 *
 * base code from https://lowreal.net/2016/03/18/1 <Author: cho45>
 */

#ifndef _MAX_7129_HPP
#define _MAX_7129_HPP

#include <mbed.h>

class MAX7219 {
  SPI spi;
    DigitalOut cs;

public:
    typedef enum {
        NOOP = 0b0000,
        DIGIT0 = 1,
        DIGIT1 = 2,
        DIGIT2 = 3,
        DIGIT3 = 4,
        DIGIT4 = 5,
        DIGIT5 = 6,
        DIGIT6 = 7,
        DIGIT7 = 8,
        DECODE_MODE = 0b1001,
        INTENSITY = 0b1010,
        SCAN_LIMIT = 0b1011,
        SHUTDOWN = 0b1100,
        DISPLAY_TEST = 0b1111,
    } ADDRESS;

    typedef enum {
        SHUTDOWN_MODE_SHUTDOWN = 0b0,
        SHUTDOWN_MODE_NORMAL = 0b1,
    } SHUTDOWN_MODE;

    typedef enum {
        NO_DECODE_FOR_DIGITS_7_0 = 0b00000000,
        CODE_B_DECODE_FOR_DIGIT_0_NO_DECODE_FOR_DIGITS_7_1 = 0b00000001,
        CODE_B_DECODE_FOR_DIGIT_3_0_NO_DECODE_FOR_DIGITS_7_4 = 0b00001111,
        CODE_B_DECODE_FOR_DIGIT_7_0 = 0b11111111,
    } DECODE_MODE_TYPE;

    MAX7219(SPI _spi, PinName _cs_pin) :
        spi(_spi), cs(_cs_pin, 0)
    {
    }

    void write(uint8_t address, uint8_t data) {
    cs = 0;
    spi.write(address);
    spi.write(data);
    cs = 1;
    }

    void begin() {
        setDecodeMode(CODE_B_DECODE_FOR_DIGIT_7_0);
        setScanLimit(7);
        setShutdown(false);

        setIntensity(8);

        for (uint8_t i = 0; i < 8; i++) {
            write(i + 1, 1);
        }
    }

    void setDecodeMode(DECODE_MODE_TYPE mode) {
        write(DECODE_MODE, mode);
    }

    void setScanLimit(uint8_t limit) {
        write(SCAN_LIMIT, limit);
    }

    void setIntensity(uint8_t intensity) {
        write(INTENSITY, intensity);
    }

    void setShutdown(bool shutdown) {
        write(SHUTDOWN, shutdown ? SHUTDOWN_MODE_SHUTDOWN : SHUTDOWN_MODE_NORMAL);
    }

    void print(const char* buf) {
        size_t len = strlen(buf);
        uint8_t digit = 0, dp = 0;
        for (size_t i = 0; i < len && digit < 8; i++) {
            const char c = buf[len - i - 1];
            if (c == '.') {
                dp = 1<<7;
                continue;
            } 

            uint8_t b;
            if (c == '-') {
                b = 0b1010;
            } else
            if (c == ' ') {
                b = 0b1111;
            } else
            if ('0' <= c && c <= '9') {
                b = static_cast<uint8_t>(c - '0');
            } else {
                continue;
            }

            write(digit + 1, b | dp);
            dp = 0;
            digit++;
        }

        for (; digit < 8; digit++) {
            write(digit + 1, 0b1111);
        }
    }
};


#endif // _MAX_7129_HPP