7 Segment LED Displaydriver, I2C interface, SAA1064

Dependents:   812_hello

Revision:
0:48adc4a70511
Child:
1:79cb73f852da
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SAA1064.cpp	Sun Sep 08 22:23:52 2013 +0000
@@ -0,0 +1,165 @@
+/* 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);  
+  
+};