7 Segment LED Displaydriver, I2C interface, SAA1064

Dependents:   812_hello

SAA1064.cpp

Committer:
wim
Date:
2013-09-08
Revision:
0:48adc4a70511
Child:
1:79cb73f852da

File content as of revision 0:48adc4a70511:

/* SAA1064 - I2C LED Driver used in multiplex mode (4x 7 Segments and Decimal Point)
 * Copyright (c) 2013 Wim Huiskamp
 *
 * Released under the MIT License: http://mbed.org/license/mit
 *
 * version 0.2 Initial Release
*/
#include "mbed.h"
#include "SAA1064.h"

/** Create an SAA1064 object connected to the specified I2C object and using the specified deviceAddress
 *
 * @param I2C &i2c the I2C port to connect to 
 * @param char deviceAddress the address of the SAA1064
*/
SAA1064::SAA1064(I2C *i2c, char deviceAddress) : _i2c(i2c) {

   _slaveAddress = deviceAddress;
   _init(); 
};

char SAA1064::read() {
  char tmp = 0;
  
  return tmp;
};

void SAA1064::write(char byte) {
};



void SAA1064::setIntensity(unsigned char intensity) {
  char data[6];
  
  intensity = (intensity & 0x07) << 4;        // Valid Range between 0-7
                                              //  0 = 0 mA/segment, 1 = 3 mA/segment etc 
  data[0] = SAA1064_CTRL;                     // Select Control Reg
  data[1] = SAA1064_CTRL_DEF | intensity;     // Init Control Reg

  // write data to the display
  _i2c->write(_slaveAddress, data, 2);  

};



void SAA1064::write(unsigned char digit1, unsigned char digit2, unsigned char digit3, unsigned char digit4) {
  char data[6];
  
  data[0] = SAA1064_DIG1;                     // Select Digit1 Reg
  data[1] = digit1;                           // Digit 1
  data[2] = digit2;                           // Digit 2 
  data[3] = digit3;                           // Digit 3 
  data[4] = digit4;                           // Digit 4

  // write data to the display
  _i2c->write(_slaveAddress, data, 5);   

};

void SAA1064::writeInt(int value, unsigned char dp_digit, bool leading) {
  unsigned char digit_value;
  char data[6];  

  data[0] = SAA1064_DIG1;                     // Select Digit1 Reg
  
  // limit to valid range
  if (value >= 9999) value = 9999;
  if (value <= -999) value = -999;  

  if (value >= 0) {
    // value 0...9999
    digit_value = value/1000; // compute thousands
    value = value % 1000;     // compute remainder
    if ((digit_value==0)&& leading)
      data[1] = SAA1064_BLNK;               // suppress leading zero    
    else {
      data[1] = SAA1064_SEGM[digit_value];
      leading = false;                      // dont suppress zero's  
    }  
    if (dp_digit==1) {data[1] |= SAA1064_DP;} // Set decimal point

    
    digit_value = value/100;  // compute hundreds
    value = value % 100;      // compute remainder
    if ((digit_value==0) && leading)
      data[2] = SAA1064_BLNK;               // suppress leading zero    
    else {
      data[2] = SAA1064_SEGM[digit_value];
      leading = false;                      // dont suppress zero's  
    }  
    if (dp_digit==2) {data[2] |= SAA1064_DP;} // Set decimal point
    
    digit_value = value/10;   // compute tens
    value = value % 10;       // compute remainder
    if ((digit_value==0) && leading)
      data[3] = SAA1064_BLNK;               // suppress leading zero    
    else {
      data[3] = SAA1064_SEGM[digit_value];
      //leading = false;                      // dont suppress zero's  
    }  
    if (dp_digit==3) {data[3] |= SAA1064_DP;} // Set decimal point
    
    //digit_value = value;      // compute units
    data[4] = SAA1064_SEGM[value];          // never suppress units zero  
    if (dp_digit==4) {data[4] |= SAA1064_DP;} // Set decimal point    
    
  }
  else {
    // value -999...-1  
    value = -value;
    data[1] = SAA1064_MINUS;               // Sign 
    if (dp_digit==1) {data[1] |= SAA1064_DP;} // Set decimal point
          
    digit_value = value/100;  // compute hundreds
    value = value % 100;      // compute remainder
    if ((digit_value==0) && leading)
      data[2] = SAA1064_BLNK;               // suppress leading zero    
    else {
      data[2] = SAA1064_SEGM[digit_value];
      leading = false;                      // dont suppress zero's  
    }  
    if (dp_digit==2) {data[2] |= SAA1064_DP;} // Set decimal point
        
    digit_value = value/10;   // compute tens
    value = value % 10;       // compute remainder
    if ((digit_value==0) && leading)
      data[3] = SAA1064_BLNK;               // suppress leading zero    
    else {
      data[3] = SAA1064_SEGM[digit_value];
      //leading = false;                      // dont suppress zero's  
    }  
    if (dp_digit==3) {data[3] |= SAA1064_DP;} // Set decimal point
    
    //digit_value = value;      // compute units
    data[4] = SAA1064_SEGM[value];          // never suppress units zero         
    if (dp_digit==4) {data[4] |= SAA1064_DP;} // Set decimal point    
  } 

  // write data to the display
  _i2c->write(_slaveAddress, data, 5);   
     
};


void SAA1064::_init() { 
  char data[6];
  
  data[0] = SAA1064_CTRL;                     // Select Control Reg
  data[1] = SAA1064_CTRL_DEF | SAA1064_INT3;  // Init Control Reg
  data[2] = SAA1064_BLNK;                     // Digit 1: All Segments Off
  data[3] = SAA1064_BLNK;                     // Digit 2: All Segments Off 
  data[4] = SAA1064_BLNK;                     // Digit 3: All Segments Off      
  data[5] = SAA1064_BLNK;                     // Digit 4: All Segments Off   

//  data[2] = SAA1064_ALL;                      // Digit 1: All Segments On 
//  data[3] = SAA1064_ALL;                      // Digit 2: All Segments On 
//  data[4] = SAA1064_ALL;                      // Digit 3: All Segments On 
//  data[5] = SAA1064_ALL;                      // Digit 4: All Segments On     

  // write data to the display
  _i2c->write(_slaveAddress, data, 6);  
  
};