Grzegorz Kaczmarek / Mbed 2 deprecated Max7221

Dependencies:   mbed

Fork of Max7221 by Dwayne Dilbeck

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Max7221.cpp Source File

Max7221.cpp

Go to the documentation of this file.
00001 /**
00002 * @file Max7221.cpp
00003 * @brief MAX7219/7221 driver class.
00004 * 
00005 * @author Grzegorz Kaczmarek
00006 * @comment Code inspired on earlier Dwayne S. Dilbeck's work
00007 * @date 20/11/2015
00008 */
00009 
00010 #include "mbed.h"
00011 #include "Max7221.h"
00012 
00013 // Static members initialization
00014 SPI *Max7221::mp_spi = NULL;
00015 DigitalOut *Max7221::mp_cs = NULL;
00016 unsigned int Max7221::m_counter = 0;
00017 
00018 Max7221::Max7221() {
00019     m_position = m_counter;
00020     m_counter++;
00021 }
00022 
00023 Max7221::Max7221(SPI *spi, DigitalOut *cs) {
00024     mp_spi = spi;
00025     mp_cs = cs;
00026     m_position = m_counter;
00027     m_counter++;
00028 }
00029 
00030 void Max7221::SetSpi(SPI *spi) {
00031     mp_spi = spi;
00032 }
00033 
00034 void Max7221::SetCs(DigitalOut *cs) {
00035     mp_cs = cs;
00036 }
00037     
00038     
00039 void Max7221::CsLow()
00040 {
00041     if(mp_cs != NULL) {
00042         *mp_cs = LOG_0;
00043     }
00044 }
00045 
00046 void Max7221::CsHigh()
00047 {
00048     if(mp_cs != NULL) {
00049         *mp_cs = LOG_1;
00050     }
00051 }
00052 
00053 void Max7221::WriteRaw(unsigned int reg, unsigned int data) {
00054     if(mp_spi != NULL) {
00055         mp_spi->write(reg);
00056         mp_spi->write(data);
00057     }
00058 }
00059 
00060 void Max7221::Write(unsigned int reg, unsigned int data) {
00061     unsigned int i;
00062     
00063     CsLow();
00064     if((m_counter > 1) && ((m_counter - 1) > m_position)) {
00065         i = m_counter - 1 - m_position;
00066         while(i--) {
00067             WriteRaw(max7221_reg_noop, 0x00);
00068         }        
00069     }
00070     WriteRaw(reg, data);
00071     if(m_position > 0) {
00072         i = m_position;
00073         while(i--) {
00074             WriteRaw(max7221_reg_noop, 0x00);
00075         }
00076     }
00077     CsHigh();
00078 }
00079 
00080 void Max7221::TestMode(bool mode) {
00081     if(mode) {
00082         Write(max7221_reg_displayTest, 0x01);
00083     } else {
00084         Write(max7221_reg_displayTest, 0x00);
00085     }
00086 }
00087 
00088 void Max7221::UseDigitsNo(unsigned int digits_no) {
00089     if((digits_no > 0) && (digits_no < 9)) {
00090         Write(max7221_reg_scanLimit, (digits_no - 1));
00091     }
00092 }
00093 
00094 void Max7221::DecodeMode(unsigned int mode) {
00095     Write(max7221_reg_decodeMode, mode);
00096 }
00097 
00098 void Max7221::WriteDigit(unsigned int digit_no, unsigned int value) {
00099     unsigned int digit_reg;
00100 
00101     if(digit_no < 8) {
00102         switch(digit_no) {
00103             case 0:
00104                 digit_reg = max7221_reg_digit0;
00105                 break;
00106             case 1:
00107                 digit_reg = max7221_reg_digit1;
00108                 break;
00109             case 2:
00110                 digit_reg = max7221_reg_digit2;
00111                 break;
00112             case 3:
00113                 digit_reg = max7221_reg_digit3;
00114                 break;
00115             case 4:
00116                 digit_reg = max7221_reg_digit4;
00117                 break;
00118             case 5:
00119                 digit_reg = max7221_reg_digit5;
00120                 break;
00121             case 6:
00122                 digit_reg = max7221_reg_digit6;
00123                 break;
00124             case 7:
00125                 digit_reg = max7221_reg_digit7;
00126                 break;
00127             default:
00128                 digit_reg = max7221_reg_noop;
00129                 break;
00130         }
00131         Write(digit_reg, value);
00132     }    
00133 }
00134 
00135 void Max7221::Intensity(unsigned int intensity) {
00136     if(intensity > 0x0F) {
00137         intensity = 0x0F;
00138     }
00139     Write(max7221_reg_intensity, intensity);
00140 }
00141 
00142 void Max7221::OperationMode(bool mode) {
00143     if(mode) {
00144         Write(max7221_reg_shutdown, 0x01);
00145     } else {
00146         Write(max7221_reg_shutdown, 0x00);
00147     }
00148 }
00149 
00150 void Max7221::Setup () {
00151     unsigned int i;
00152 
00153     TestMode(false);            // Disable display test
00154     UseDigitsNo(8);             // Use all 8 digits
00155     DecodeMode(0xFF);           // Turn on Code B font decode for all digits
00156     for(i=0;i<8;i++) {          // Clean all digits
00157         WriteDigit(i, 0x0F);
00158     }
00159     Intensity(0x01);            // Set lowest display intensity(0x00-0xFF)
00160     OperationMode(true);        // Enable operation mode
00161 }