Manuel Caballero / MAX7219
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MAX7219.h Source File

MAX7219.h

00001 /**
00002  * @brief       MAX7219.h
00003  * @details     Serially Interfaced, 8-Digit LED Display Drivers.
00004  *              Header file.
00005  *
00006  *
00007  * @return      NA
00008  *
00009  * @author      Manuel Caballero
00010  * @date        9/October/2017
00011  * @version     9/October/2017    The ORIGIN
00012  * @pre         NaN.
00013  * @warning     NaN
00014  * @pre         This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
00015  */
00016 #ifndef MAX7219_H
00017 #define MAX7219_H
00018 
00019 #include "mbed.h"
00020 /**
00021     Example:
00022 
00023 #include "mbed.h"
00024 #include "MAX7219.h"
00025 
00026 
00027 MAX7219  myMAX7219      ( p11, p12, p13, p14, 1000000 );                        // MOSI: P11 | MISO: P12 | SCLK: P13 | CS: P14 | FREQ: 1MHz
00028 
00029 Ticker newReading;
00030 DigitalOut myled1        ( LED1 );
00031 
00032 
00033 MAX7219::MAX7219_status_t       mySPI_status;
00034 
00035 bool     changeDP_status     =   false;
00036 
00037 
00038 // Change the state of the DP
00039 void readDATA ( void )
00040 {
00041     myled1    =  1;
00042 
00043     if ( changeDP_status == true ) {
00044     // DP OFF
00045         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_0, MAX7219::CHARACTER_0, MAX7219::DP_DISABLED );
00046         wait_us ( 10 );
00047         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_1, MAX7219::CHARACTER_1, MAX7219::DP_DISABLED );
00048         wait_us ( 10 );
00049         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_2, MAX7219::CHARACTER_2, MAX7219::DP_DISABLED );
00050         wait_us ( 10 );
00051         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_3, MAX7219::CHARACTER_3, MAX7219::DP_DISABLED );
00052         wait_us ( 10 );
00053         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_4, MAX7219::CHARACTER_4, MAX7219::DP_DISABLED );
00054         wait_us ( 10 );
00055         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_5, MAX7219::CHARACTER_5, MAX7219::DP_DISABLED );
00056         wait_us ( 10 );
00057         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_6, MAX7219::CHARACTER_6, MAX7219::DP_DISABLED );
00058         wait_us ( 10 );
00059         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_7, MAX7219::CHARACTER_7, MAX7219::DP_DISABLED );
00060 
00061         changeDP_status =    false;
00062     } else {
00063     // DP ON
00064         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_0, MAX7219::CHARACTER_0, MAX7219::DP_ENABLED );
00065         wait_us ( 10 );
00066         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_1, MAX7219::CHARACTER_1, MAX7219::DP_ENABLED );
00067         wait_us ( 10 );
00068         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_2, MAX7219::CHARACTER_2, MAX7219::DP_ENABLED );
00069         wait_us ( 10 );
00070         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_3, MAX7219::CHARACTER_3, MAX7219::DP_ENABLED );
00071         wait_us ( 10 );
00072         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_4, MAX7219::CHARACTER_4, MAX7219::DP_ENABLED );
00073         wait_us ( 10 );
00074         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_5, MAX7219::CHARACTER_5, MAX7219::DP_ENABLED );
00075         wait_us ( 10 );
00076         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_6, MAX7219::CHARACTER_6, MAX7219::DP_ENABLED );
00077         wait_us ( 10 );
00078         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( MAX7219::SET_DIGIT_7, MAX7219::CHARACTER_7, MAX7219::DP_ENABLED );
00079 
00080         changeDP_status =    true;
00081     }
00082 
00083     myled1    =  0;
00084 }
00085 
00086 
00087 int main()
00088 {
00089     uint32_t    i               =   0;
00090 
00091 
00092     // BCD code ON
00093     mySPI_status    =    myMAX7219.MAX7219_DecodeMode  ( MAX7219::DECODE_DIGITS_7_0 );
00094     wait_us ( 10 );
00095 
00096     // 7 digits available
00097     mySPI_status    =    myMAX7219.MAX7219_SetScanLimit( MAX7219::DISPLAY_DIGIT_0_1_2_3_4_5_6_7 );
00098     wait_us ( 10 );
00099 
00100     // Configure the intensity
00101     mySPI_status    =    myMAX7219.MAX7219_SetIntensity( MAX7219::DUTY_CICLE_9_32 );
00102     wait_us ( 10 );
00103 
00104     // Clear all the digits
00105     for ( i = MAX7219::SET_DIGIT_0; i <= MAX7219::SET_DIGIT_7; i++ ) {
00106         mySPI_status    =    myMAX7219.MAX7219_SetDigit ( ( MAX7219::MAX7219_digit_t )i, MAX7219::CHARACTER_BLANK, MAX7219::DP_DISABLED );
00107         wait_us ( 10 );
00108     }
00109 
00110 
00111     // Test Mode Enabled: All displays ON
00112     mySPI_status    =    myMAX7219.MAX7219_DisplayTest ( MAX7219::DISPLAY_TEST_MODE );
00113     wait_ms ( 2500 );
00114 
00115     // Test Mode Disabled
00116     mySPI_status    =    myMAX7219.MAX7219_DisplayTest ( MAX7219::DISPLAY_NORMAL_OPERATION );
00117     wait_us ( 10 );
00118 
00119     // Device in normal operation mode
00120     mySPI_status    =    myMAX7219.MAX7219_Mode        ( MAX7219::NORMAL_OPERATION );
00121 
00122 
00123     newReading.attach( &readDATA, 1 );                                        // the address of the function to be attached ( readDATA ) and the interval ( 1s )
00124 
00125 
00126     // Let the callbacks take care of everything
00127     while(1) {
00128         sleep();
00129     }
00130 }
00131 
00132 */
00133 
00134 
00135 /*!
00136  Library for the MAX7219 Serially Interfaced, 8-Digit LED Display Drivers.
00137 */
00138 class MAX7219
00139 {
00140 public:
00141     /* General Call Commands */
00142     /**
00143       * @brief   REGISTER ADDRESS MAP
00144       */
00145     typedef enum {
00146         NO_OP            =   0x00,           /*!<  No operation.              */
00147         DIGIT_0          =   0x01,           /*!<  Digit 0.                   */
00148         DIGIT_1          =   0x02,           /*!<  Digit 1.                   */
00149         DIGIT_2          =   0x03,           /*!<  Digit 2.                   */
00150         DIGIT_3          =   0x04,           /*!<  Digit 3.                   */
00151         DIGIT_4          =   0x05,           /*!<  Digit 4.                   */
00152         DIGIT_5          =   0x06,           /*!<  Digit 5.                   */
00153         DIGIT_6          =   0x07,           /*!<  Digit 6.                   */
00154         DIGIT_7          =   0x08,           /*!<  Digit 7.                   */
00155         DECODE_MODE      =   0x09,           /*!<  Decode Mode.               */
00156         INTENSITY        =   0x0A,           /*!<  Intensity.                 */
00157         SCAN_LIMIT       =   0x0B,           /*!<  Scan Limit.                */
00158         SHUTDOWN         =   0x0C,           /*!<  Shutdown.                  */
00159         DISPLAY_TEST     =   0x0F            /*!<  Display test.              */
00160     } MAX7219_register_address_map_t;
00161 
00162 
00163 
00164     /* Shutdown Register Data */
00165     /**
00166       * @brief   Shutdown Register Format
00167       */
00168     typedef enum {
00169         SHUTDOWN_MODE        =   0x00,        /*!<  Device in shutdown mode    */
00170         NORMAL_OPERATION     =   0x01         /*!<  Device in normal mode      */
00171     } MAX7219_shutdown_reg_t;
00172 
00173 
00174     /* Display-Test Register Data */
00175     /**
00176       * @brief   Display-Test Register Format
00177       */
00178     typedef enum {
00179         DISPLAY_TEST_MODE            =   0x01,        /*!<  All the LEDs are ON         */
00180         DISPLAY_NORMAL_OPERATION     =   0x00         /*!<  Normal operation            */
00181     } MAX7219_display_test_reg_t;
00182 
00183 
00184 
00185     /* Decode-Mode Register Data */
00186     /**
00187       * @brief   Decode-Mode Register
00188       */
00189     typedef enum {
00190         NO_DECODE            =   0x00,        /*!<  No decode for digits 7-0                                 */
00191         DECODE_DIGIT_0       =   0x01,        /*!<  Code B decode for digit 0. No decode for digits 7-1      */
00192         DECODE_DIGITS_3_0    =   0x0F,        /*!<  Code B decode for digits 3-0. No decode for digits 7-4   */
00193         DECODE_DIGITS_7_0    =   0xFF         /*!<  Code B decode for digits 7-0                             */
00194     } MAX7219_decode_mode_reg_t;
00195 
00196 
00197 
00198     /* Code B Font Register Data */
00199     /**
00200       * @brief   Code B Font
00201       */
00202     typedef enum {
00203         CHARACTER_0          =   0x00,        /*!<  0                                                        */
00204         CHARACTER_1          =   0x01,        /*!<  1                                                        */
00205         CHARACTER_2          =   0x02,        /*!<  2                                                        */
00206         CHARACTER_3          =   0x03,        /*!<  3                                                        */
00207         CHARACTER_4          =   0x04,        /*!<  4                                                        */
00208         CHARACTER_5          =   0x05,        /*!<  5                                                        */
00209         CHARACTER_6          =   0x06,        /*!<  6                                                        */
00210         CHARACTER_7          =   0x07,        /*!<  7                                                        */
00211         CHARACTER_8          =   0x08,        /*!<  8                                                        */
00212         CHARACTER_9          =   0x09,        /*!<  9                                                        */
00213         CHARACTER_HYPHEN     =   0x0A,        /*!<  -                                                        */
00214         CHARACTER_E          =   0x0B,        /*!<  E                                                        */
00215         CHARACTER_H          =   0x0C,        /*!<  H                                                        */
00216         CHARACTER_L          =   0x0D,        /*!<  L                                                        */
00217         CHARACTER_P          =   0x0E,        /*!<  P                                                        */
00218         CHARACTER_BLANK      =   0x0F         /*!<  Blank                                                    */
00219     } MAX7219_code_b_font_reg_t;
00220 
00221 
00222 
00223     typedef enum {
00224         DP_ENABLED           =   0x01,         /*!<  DP ON                                                    */
00225         DP_DISABLED          =   0x00          /*!<  DP OFF                                                   */
00226     } MAX7219_code_b_dp_t ;
00227 
00228 
00229 
00230     /* Intensity Register Format Data */
00231     /**
00232       * @brief   Intensity Register Format
00233       */
00234     typedef enum {
00235         DUTY_CICLE_1_32      =   0x00,        /*!<  Duty cycle 1/32 ( min )      */
00236         DUTY_CICLE_3_32      =   0x01,        /*!<  Duty cycle 3/32              */
00237         DUTY_CICLE_5_32      =   0x02,        /*!<  Duty cycle 5/32              */
00238         DUTY_CICLE_7_32      =   0x03,        /*!<  Duty cycle 7/32              */
00239         DUTY_CICLE_9_32      =   0x04,        /*!<  Duty cycle 9/32              */
00240         DUTY_CICLE_11_32     =   0x05,        /*!<  Duty cycle 11/32             */
00241         DUTY_CICLE_13_32     =   0x06,        /*!<  Duty cycle 13/32             */
00242         DUTY_CICLE_15_32     =   0x07,        /*!<  Duty cycle 15/32             */
00243         DUTY_CICLE_17_32     =   0x08,        /*!<  Duty cycle 17/32             */
00244         DUTY_CICLE_19_32     =   0x09,        /*!<  Duty cycle 19/32             */
00245         DUTY_CICLE_21_32     =   0x0A,        /*!<  Duty cycle 21/32             */
00246         DUTY_CICLE_23_32     =   0x0B,        /*!<  Duty cycle 23/32             */
00247         DUTY_CICLE_25_32     =   0x0C,        /*!<  Duty cycle 25/32             */
00248         DUTY_CICLE_27_32     =   0x0D,        /*!<  Duty cycle 27/32             */
00249         DUTY_CICLE_29_32     =   0x0E,        /*!<  Duty cycle 29/32             */
00250         DUTY_CICLE_31_32     =   0x0F         /*!<  Duty cycle 31/32 ( max )     */
00251     } MAX7219_intensity_reg_t;
00252 
00253 
00254     /* Scan-Limit Register Format Data */
00255     /**
00256       * @brief   Scan-Limit Register Format
00257       */
00258     typedef enum {
00259         DISPLAY_DIGIT_0                  =   0x00,        /*!<  Display digit 0 only             */
00260         DISPLAY_DIGIT_0_1                =   0x01,        /*!<  Display digits 0 & 1             */
00261         DISPLAY_DIGIT_0_1_2              =   0x02,        /*!<  Display digits 0 1 2             */
00262         DISPLAY_DIGIT_0_1_2_3            =   0x03,        /*!<  Display digits 0 1 2 3           */
00263         DISPLAY_DIGIT_0_1_2_3_4          =   0x04,        /*!<  Display digits 0 1 2 3 4         */
00264         DISPLAY_DIGIT_0_1_2_3_4_5        =   0x05,        /*!<  Display digits 0 1 2 3 4 5       */
00265         DISPLAY_DIGIT_0_1_2_3_4_5_6      =   0x06,        /*!<  Display digits 0 1 2 3 4 5 6     */
00266         DISPLAY_DIGIT_0_1_2_3_4_5_6_7    =   0x07         /*!<  Display digits 0 1 2 3 4 5 6 7   */
00267     } MAX7219_scan_limit_reg_t;
00268 
00269 
00270 
00271     /**
00272       * @brief   Select digits
00273       */
00274     typedef enum {
00275         SET_DIGIT_0      =   0x00,        /*!<  Digit 0 selected   */
00276         SET_DIGIT_1      =   0x01,        /*!<  Digit 1 selected   */
00277         SET_DIGIT_2      =   0x02,        /*!<  Digit 2 selected   */
00278         SET_DIGIT_3      =   0x03,        /*!<  Digit 3 selected   */
00279         SET_DIGIT_4      =   0x04,        /*!<  Digit 4 selected   */
00280         SET_DIGIT_5      =   0x05,        /*!<  Digit 5 selected   */
00281         SET_DIGIT_6      =   0x06,        /*!<  Digit 6 selected   */
00282         SET_DIGIT_7      =   0x07         /*!<  Digit 7 selected   */
00283     } MAX7219_digit_t;
00284 
00285 
00286 
00287 #ifndef MAX7219_VECTOR_STRUCT_H
00288 #define MAX7219_VECTOR_STRUCT_H
00289     /* No-Decode Mode Data Bits */
00290     typedef struct {
00291         uint8_t mySEG;                  /*!<  D7: DP | D6: A | D5: B | D4: C | D3: D | D2: E | D1: F | D0: G   */
00292     } MAX7219_no_decode_b_t;
00293 #endif
00294 
00295 
00296 
00297     /**
00298       * @brief   INTERNAL CONSTANTS
00299       */
00300     typedef enum {
00301         MAX7219_SUCCESS     =       0,
00302         MAX7219_FAILURE     =       1,
00303         SPI_SUCCESS         =       1
00304     } MAX7219_status_t;
00305 
00306 
00307 
00308 
00309     /** Create an MAX7219 object connected to the specified SPI pins.
00310       *
00311       * @param mosi     SPI Master Output Slave Input
00312       * @param miso     SPI Master Input Slave Output
00313       * @param sclk     SPI clock
00314       * @param cs       SPI Chip Select
00315       * @param freq     SPI frequency in Hz.
00316       */
00317     MAX7219 ( PinName mosi, PinName miso, PinName sclk, PinName cs, uint32_t freq );
00318 
00319     /** Delete MAX7219 object.
00320      */
00321     ~MAX7219();
00322 
00323     /** It puts the device in shutdown/normal operation mode.
00324      */
00325     MAX7219_status_t  MAX7219_Mode              ( MAX7219_shutdown_reg_t myMAX7219mode                   );
00326 
00327     /** It enables all the display or leaves the device in normal operation.
00328      */
00329     MAX7219_status_t  MAX7219_DisplayTest       ( MAX7219_display_test_reg_t myMAX7219DisplayTestMode    );
00330 
00331     /** It selects the decode mode.
00332      */
00333     MAX7219_status_t  MAX7219_DecodeMode        ( MAX7219_decode_mode_reg_t myMAX7219DecodeMode          );
00334 
00335     /** It sets the intensity.
00336      */
00337     MAX7219_status_t  MAX7219_SetIntensity      ( MAX7219_intensity_reg_t myMAX7219Intensity             );
00338 
00339     /** It sets the scan limit.
00340      */
00341     MAX7219_status_t  MAX7219_SetScanLimit      ( MAX7219_scan_limit_reg_t myMAX7219ScanLimit            );
00342 
00343     /** It sets a new value on the chosen digit.
00344      */
00345     MAX7219_status_t  MAX7219_SetDigit          ( MAX7219_digit_t myMAX7219Digit, MAX7219_code_b_font_reg_t myCharacter, MAX7219_code_b_dp_t  myDP_status );
00346 
00347 private:
00348     SPI         _spi;
00349     DigitalOut  _cs;
00350 };
00351 
00352 #endif