Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: MAXREFDES99_demo MAXREFDES99_RTC_Display nucleo_spi_max7219_led8x8 max7219 ... more
Revision 0:798fb343e022, committed 2016-01-12
- Comitter:
- j3
- Date:
- Tue Jan 12 23:40:36 2016 +0000
- Child:
- 1:90a7cf4e7d26
- Commit message:
- Initial commit, still need to add comments
Changed in this revision
| max7219.cpp | Show annotated file Show diff for this revision Revisions of this file |
| max7219.h | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/max7219.cpp Tue Jan 12 23:40:36 2016 +0000
@@ -0,0 +1,552 @@
+/******************************************************************//**
+* @file max7219.cpp
+*
+* @author Justin Jordan
+*
+* @version 0.0
+*
+* Started: 08JAN16
+*
+* Updated:
+*
+* @brief Source file for Max7219 class
+***********************************************************************
+* Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+**********************************************************************/
+
+
+#include "max7219.h"
+
+
+//*********************************************************************
+Max7219::Max7219(SPI *spi_bus, PinName cs): _p_spi(spi_bus)
+{
+ _num_devices = 1;
+
+ _p_cs = new DigitalOut(cs, 1);
+ _spi_owner = false;
+}
+
+
+//*********************************************************************
+Max7219::Max7219(PinName mosi, PinName miso, PinName sclk, PinName cs)
+{
+ _num_devices = 1;
+
+ _p_spi = new SPI(mosi, miso, sclk);
+ _p_cs = new DigitalOut(cs, 1);
+
+ _spi_owner = true;
+}
+
+
+//*********************************************************************
+Max7219::~Max7219()
+{
+ delete _p_cs;
+
+ if(_spi_owner)
+ {
+ delete _p_spi;
+ }
+}
+
+
+//*********************************************************************
+int32_t Max7219::set_num_devices(uint8_t num_devices)
+{
+ int32_t rtn_val = -1;
+
+ if(num_devices > 0)
+ {
+ _num_devices = num_devices;
+ rtn_val = _num_devices;
+ }
+
+ return(rtn_val);
+}
+
+
+//*********************************************************************
+void Max7219::set_display_test(void)
+{
+ uint8_t idx = 0;
+
+ _p_cs->write(0);
+ for(idx = 0; idx < _num_devices; idx++)
+ {
+ _p_spi->write(MAX7219_DISPLAY_TEST);
+ _p_spi->write(1);
+ }
+ _p_cs->write(1);
+}
+
+
+//*********************************************************************
+void Max7219::clear_display_test(void)
+{
+ uint8_t idx = 0;
+
+ _p_cs->write(0);
+ for(idx = 0; idx < _num_devices; idx++)
+ {
+ _p_spi->write(MAX7219_DISPLAY_TEST);
+ _p_spi->write(0);
+ }
+ _p_cs->write(1);
+}
+
+
+//*********************************************************************
+int32_t Max7219::init_device(max7219_configuration_t config, uint8_t device_number)
+{
+ int32_t rtn_val = -1;
+ uint8_t idx = 0;
+
+ if(config.device_number > _num_devices)
+ {
+ rtn_val = -1;
+ }
+ else if(config.device_number == 0)
+ {
+ //device numbering starts with index 1
+ rtn_val = -2;
+ }
+ else
+ {
+ //write DECODE_MODE register of device
+ _p_cs->write(0);
+ for(idx = _num_devices; idx > 0; idx--)
+ {
+ if(config.device_number == idx)
+ {
+ _p_spi->write(MAX7219_DECODE_MODE);
+ _p_spi->write(config.decode_mode);
+ }
+ else
+ {
+ _p_spi->write(MAX7219_NO_OP);
+ _p_spi->write(0);
+ }
+ }
+ _p_cs->write(1);
+
+ wait_us(1);
+
+ //write INTENSITY register of device
+ _p_cs->write(0);
+ for(idx = _num_devices; idx > 0; idx--)
+ {
+ if(config.device_number == idx)
+ {
+ _p_spi->write(MAX7219_INTENSITY);
+ _p_spi->write(config.intensity);
+ }
+ else
+ {
+ _p_spi->write(MAX7219_NO_OP);
+ _p_spi->write(0);
+ }
+ }
+ _p_cs->write(1);
+
+ wait_us(1);
+
+ //write SCAN_LIMT register of device
+ _p_cs->write(0);
+ for(idx = _num_devices; idx > 0; idx--)
+ {
+ if(config.device_number == idx)
+ {
+ _p_spi->write(MAX7219_SCAN_LIMIT);
+ _p_spi->write(config.scan_limit);
+ }
+ else
+ {
+ _p_spi->write(MAX7219_NO_OP);
+ _p_spi->write(0);
+ }
+ }
+ _p_cs->write(1);
+
+ wait_us(1);
+
+ rtn_val = 0;
+ }
+
+ return(rtn_val);
+}
+
+
+//*********************************************************************
+void Max7219::init_display(max7219_configuration_t config)
+{
+ uint8_t idx = 0;
+
+ //write DECODE_MODE register of all devices
+ _p_cs->write(0);
+ for(idx = 0; idx < _num_devices; idx++)
+ {
+ _p_spi->write(MAX7219_DECODE_MODE);
+ _p_spi->write(config.decode_mode);
+ }
+ _p_cs->write(1);
+
+ wait_us(1);
+
+ //write INTENSITY register of all devices
+ _p_cs->write(0);
+ for(idx = 0; idx < _num_devices; idx++)
+ {
+ _p_spi->write(MAX7219_INTENSITY);
+ _p_spi->write(config.intensity);
+ }
+ _p_cs->write(1);
+
+ wait_us(1);
+
+ //write SCAN_LIMT register of all devices
+ _p_cs->write(0);
+ for(idx = 0; idx < _num_devices; idx++)
+ {
+ _p_spi->write(MAX7219_SCAN_LIMIT);
+ _p_spi->write(config.scan_limit);
+ }
+ _p_cs->write(1);
+
+ wait_us(1);
+}
+
+
+//*********************************************************************
+int32_t Max7219::enable_device(uint8_t device_number)
+{
+ int32_t rtn_val = -1;
+ uint8_t idx = 0;
+
+ if(device_number > _num_devices)
+ {
+ rtn_val = -1;
+ }
+ else if(device_number == 0)
+ {
+ //device numbering starts with index 1
+ rtn_val = -2;
+ }
+ else
+ {
+ _p_cs->write(0);
+ for(idx = _num_devices; idx > 0; idx--)
+ {
+ if(device_number == idx)
+ {
+ _p_spi->write(MAX7219_SHUTDOWN);
+ _p_spi->write(1);
+ }
+ else
+ {
+ _p_spi->write(MAX7219_NO_OP);
+ _p_spi->write(0);
+ }
+ }
+ _p_cs->write(1);
+
+ rtn_val = 0;
+ }
+
+ return(rtn_val);
+}
+
+
+//*********************************************************************
+void Max7219::enable_display(void)
+{
+ uint8_t idx = 0;
+
+ _p_cs->write(0);
+ for(idx = 0; idx < _num_devices; idx++)
+ {
+ _p_spi->write(MAX7219_SHUTDOWN);
+ _p_spi->write(1);
+ }
+ _p_cs->write(1);
+}
+
+
+//*********************************************************************
+int32_t Max7219::disable_device(uint8_t device_number)
+{
+ int32_t rtn_val = -1;
+ uint8_t idx = 0;
+
+ if(device_number > _num_devices)
+ {
+ rtn_val = -1;
+ }
+ else if(device_number == 0)
+ {
+ //device numbering starts with index 1
+ rtn_val = -2;
+ }
+ else
+ {
+ _p_cs->write(0);
+ for(idx = _num_devices; idx > 0; idx--)
+ {
+ if(device_number == idx)
+ {
+ _p_spi->write(MAX7219_SHUTDOWN);
+ _p_spi->write(0);
+ }
+ else
+ {
+ _p_spi->write(MAX7219_NO_OP);
+ _p_spi->write(0);
+ }
+ }
+ _p_cs->write(1);
+
+ rtn_val = 0;
+ }
+
+ return(rtn_val);
+}
+
+
+//*********************************************************************
+void Max7219::disable_display(void)
+{
+ uint8_t idx = 0;
+
+ _p_cs->write(0);
+ for(idx = 0; idx < _num_devices; idx++)
+ {
+ _p_spi->write(MAX7219_SHUTDOWN);
+ _p_spi->write(0);
+ }
+ _p_cs->write(1);
+}
+
+
+
+//*********************************************************************
+int32_t Max7219::write_digit(uint8_t device_number, uint8_t digit, uint8_t data)
+{
+ int32_t rtn_val = -1;
+ uint8_t idx = 0;
+
+ if(digit > MAX7219_DIGIT_7)
+ {
+ rtn_val = -3;
+ }
+ else if(digit < MAX7219_DIGIT_0)
+ {
+ rtn_val = -4;
+ }
+ else
+ {
+ if(device_number > _num_devices)
+ {
+ rtn_val = -1;
+ }
+ else if(device_number == 0)
+ {
+ rtn_val = -2;
+ }
+ else
+ {
+ _p_cs->write(0);
+ for(idx = _num_devices; idx > 0; idx--)
+ {
+ if(idx == device_number)
+ {
+ _p_spi->write(digit);
+ _p_spi->write(data);
+ }
+ else
+ {
+ _p_spi->write(MAX7219_NO_OP);
+ _p_spi->write(0);
+ }
+ }
+ _p_cs->write(1);
+
+ rtn_val = 0;
+ }
+ }
+
+ return(rtn_val);
+}
+
+
+//*********************************************************************
+int32_t Max7219::clear_digit(uint8_t device_number, uint8_t digit)
+{
+ int32_t rtn_val = -1;
+ uint8_t idx = 0;
+
+ if(digit > MAX7219_DIGIT_7)
+ {
+ rtn_val = -3;
+ }
+ else if(digit < MAX7219_DIGIT_0)
+ {
+ rtn_val = -4;
+ }
+ else
+ {
+ if(device_number > _num_devices)
+ {
+ rtn_val = -1;
+ }
+ else if(device_number == 0)
+ {
+ rtn_val = -2;
+ }
+ else
+ {
+ _p_cs->write(0);
+ for(idx = _num_devices; idx > 0; idx--)
+ {
+ if(idx == device_number)
+ {
+ _p_spi->write(digit);
+ _p_spi->write(0);
+ }
+ else
+ {
+ _p_spi->write(MAX7219_NO_OP);
+ _p_spi->write(0);
+ }
+ }
+ _p_cs->write(1);
+
+ rtn_val = 0;
+ }
+ }
+
+ return(rtn_val);
+}
+
+
+//*********************************************************************
+int32_t Max7219::device_all_on(uint8_t device_number)
+{
+ int32_t rtn_val = -1;
+ uint8_t idx = 0;
+
+ if(device_number > _num_devices)
+ {
+ rtn_val = -1;
+ }
+ else if(device_number == 0)
+ {
+ rtn_val = -2;
+ }
+ else
+ {
+ rtn_val = 0;
+
+ //writes every digit of given device to 0xFF
+ for(idx = 0; idx < 8; idx++)
+ {
+ if(rtn_val == 0)
+ {
+ rtn_val = write_digit(device_number, (idx + 1), 0xFF);
+ }
+ }
+ }
+
+ return(rtn_val);
+}
+
+
+//*********************************************************************
+int32_t Max7219::device_all_off(uint8_t device_number)
+{
+ int32_t rtn_val = -1;
+ uint8_t idx = 0;
+
+ if(device_number > _num_devices)
+ {
+ rtn_val = -1;
+ }
+ else if(device_number == 0)
+ {
+ rtn_val = -2;
+ }
+ else
+ {
+ rtn_val = 0;
+
+ //writes every digit of given device to 0
+ for(idx = 0; idx < 8; idx++)
+ {
+ if(rtn_val == 0)
+ {
+ rtn_val = write_digit(device_number, (idx + 1), 0);
+ }
+ }
+ }
+
+ return(rtn_val);
+}
+
+
+void Max7219::display_all_on(void)
+{
+ uint8_t idx, idy;
+
+ //writes every digit of every device to 0xFF
+ for(idx = 0; idx < _num_devices; idx++)
+ {
+ for(idy = 0; idy < MAX7219_DIGIT_7; idy++)
+ {
+ write_digit((idx + 1), (idy + 1), 0xFF);
+ }
+ }
+}
+
+
+void Max7219::display_all_off(void)
+{
+ uint8_t idx, idy;
+
+ //writes every digit of every device to 0
+ for(idx = 0; idx < _num_devices; idx++)
+ {
+ for(idy = 0; idy < MAX7219_DIGIT_7; idy++)
+ {
+ write_digit((idx + 1), (idy + 1), 0);
+ }
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/max7219.h Tue Jan 12 23:40:36 2016 +0000
@@ -0,0 +1,372 @@
+/******************************************************************//**
+* @file max7219.h
+*
+* @author Justin Jordan
+*
+* @version 0.0
+*
+* Started: 08JAN16
+*
+* Updated:
+*
+* @brief Header file for Max7219 class
+***********************************************************************
+* Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*
+* Except as contained in this notice, the name of Maxim Integrated
+* Products, Inc. shall not be used except as stated in the Maxim Integrated
+* Products, Inc. Branding Policy.
+*
+* The mere transfer of this software does not imply any licenses
+* of trade secrets, proprietary technology, copyrights, patents,
+* trademarks, maskwork rights, or any other form of intellectual
+* property whatsoever. Maxim Integrated Products, Inc. retains all
+* ownership rights.
+**********************************************************************/
+
+
+#ifndef MAX7219_H
+#define MAX7219_H
+
+#include "mbed.h"
+
+
+typedef struct
+{
+ uint8_t device_number;
+ uint8_t decode_mode;
+ uint8_t intensity;
+ uint8_t scan_limit;
+}max7219_configuration_t;
+
+
+class Max7219
+{
+ public:
+
+ typedef enum
+ {
+ MAX7219_NO_OP = 0,
+ MAX7219_DIGIT_0,
+ MAX7219_DIGIT_1,
+ MAX7219_DIGIT_2,
+ MAX7219_DIGIT_3,
+ MAX7219_DIGIT_4,
+ MAX7219_DIGIT_5,
+ MAX7219_DIGIT_6,
+ MAX7219_DIGIT_7,
+ MAX7219_DECODE_MODE,
+ MAX7219_INTENSITY,
+ MAX7219_SCAN_LIMIT,
+ MAX7219_SHUTDOWN,
+ MAX7219_DISPLAY_TEST = 15
+ }max7219_register_e;
+
+
+ typedef enum
+ {
+ MAX7219_INTENSITY_0 = 0,
+ MAX7219_INTENSITY_1,
+ MAX7219_INTENSITY_2,
+ MAX7219_INTENSITY_3,
+ MAX7219_INTENSITY_4,
+ MAX7219_INTENSITY_5,
+ MAX7219_INTENSITY_6,
+ MAX7219_INTENSITY_7,
+ MAX7219_INTENSITY_8,
+ MAX7219_INTENSITY_9,
+ MAX7219_INTENSITY_A,
+ MAX7219_INTENSITY_B,
+ MAX7219_INTENSITY_C,
+ MAX7219_INTENSITY_D,
+ MAX7219_INTENSITY_E,
+ MAX7219_INTENSITY_F
+ }max7219_intensity_e;
+
+
+ typedef enum
+ {
+ MAX7219_SCAN_1 = 0,
+ MAX7219_SCAN_2,
+ MAX7219_SCAN_3,
+ MAX7219_SCAN_4,
+ MAX7219_SCAN_5,
+ MAX7219_SCAN_6,
+ MAX7219_SCAN_7,
+ MAX7219_SCAN_8
+ }max7219_scan_limit_e;
+
+
+ /**********************************************************//**
+ * @brief Constructor for Max7219 Class.
+ *
+ * @details Allows user to pass pointer to existing SPI bus
+ *
+ * On Entry:
+ * @param[in] spi_bus - pointer to existing SPI object
+ * @param[in] cs - pin to use for cs
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ Max7219(SPI *spi_bus, PinName cs);
+
+
+ /**********************************************************//**
+ * @brief Constructor for Max7219 Class.
+ *
+ * @details Allows user to specify SPI peripheral to use
+ *
+ * On Entry:
+ * @param[in] mosi - pin to use for mosi
+ * @param[in] miso - pin to use for miso
+ * @param[in] sclk - pin to use for sclk
+ * @param[in] cs - pin to use for cs
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ Max7219(PinName mosi, PinName miso, PinName sclk, PinName cs);
+
+
+ /**********************************************************//**
+ * @brief Default destructor for Max7219 Class.
+ *
+ * @details Destroys SPI object if owner
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ ~Max7219();
+
+
+ /**********************************************************//**
+ * @brief Sets the number of MAX7219 devices being used.
+ * Defaults to one
+ *
+ * @details
+ *
+ * On Entry:
+ * @param[in] num_devices - number of MAX7219 devices being
+ * used, max of 255
+ *
+ * On Exit:
+ * @return returns number of devices
+ **************************************************************/
+ int32_t set_num_devices(uint8_t num_devices);
+
+
+ /**********************************************************//**
+ * @brief Tests all devices being used
+ *
+ * @details Sets bit0 of DISPLAY_TEST regiser in all devices
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ void set_display_test(void);
+
+
+ /**********************************************************//**
+ * @brief Stops test
+ *
+ * @details Clear bit0 of DISPLAY_TEST regiser in all devices
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ void clear_display_test(void);
+
+
+ /**********************************************************//**
+ * @brief initializes specific device in display with given
+ * config data
+ *
+ * @details
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ int32_t init_device(max7219_configuration_t config, uint8_t device_number);
+
+
+ /**********************************************************//**
+ * @brief initializes all devices with given config data
+ *
+ * @details
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ void init_display(max7219_configuration_t config);
+
+
+ /**********************************************************//**
+ * @brief enables specific device in display
+ *
+ * @details
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ int32_t enable_device(uint8_t device_number);
+
+
+ /**********************************************************//**
+ * @brief enables all device in display
+ *
+ * @details
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ void enable_display(void);
+
+
+ /**********************************************************//**
+ * @brief disables specific device in display
+ *
+ * @details
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ int32_t disable_device(uint8_t device_number);
+
+
+ /**********************************************************//**
+ * @brief disables all devices in display
+ *
+ * @details
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ void disable_display(void);
+
+
+ /**********************************************************//**
+ * @brief writes digit of given device with given data, user
+ * must enter correct data for decode_mode chosen
+ *
+ * @details
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ int32_t write_digit(uint8_t device_number, uint8_t digit, uint8_t data);
+
+
+ /**********************************************************//**
+ * @brief clears digit of given device
+ *
+ * @details
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ int32_t clear_digit(uint8_t device_number, uint8_t digit);
+
+
+ /**********************************************************//**
+ * @brief turns on all segments/digits of given device
+ *
+ * @details
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ int32_t device_all_on(uint8_t device_number);
+
+
+ /**********************************************************//**
+ * @brief turns off all segments/digits of given device
+ *
+ * @details
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ int32_t device_all_off(uint8_t device_number);
+
+
+ /**********************************************************//**
+ * @brief turns on all segments/digits of display
+ *
+ * @details
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ void display_all_on(void);
+
+
+ /**********************************************************//**
+ * @brief turns off all segments/digits of display
+ *
+ * @details
+ *
+ * On Entry:
+ *
+ * On Exit:
+ * @return none
+ **************************************************************/
+ void display_all_off(void);
+
+
+ private:
+
+ SPI *_p_spi;
+ DigitalOut *_p_cs;
+ bool _spi_owner;
+
+ uint8_t _num_devices;
+
+};
+#endif /* MAX7219_H*/
\ No newline at end of file