7 Segment LED Displaydriver, I2C interface, SAA1064

Dependents:   812_hello

Files at this revision

API Documentation at this revision

Comitter:
wim
Date:
Sun Sep 08 22:23:52 2013 +0000
Child:
1:79cb73f852da
Commit message:
SAA1064 test and LPC812 test

Changed in this revision

SAA1064.cpp Show annotated file Show diff for this revision Revisions of this file
SAA1064.h Show annotated file Show diff for this revision Revisions of this file
--- /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);  
+  
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SAA1064.h	Sun Sep 08 22:23:52 2013 +0000
@@ -0,0 +1,103 @@
+/* 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
+*/
+#ifndef _SAA1064_H
+#define _SAA1064_H
+
+//Address Defines for SAA1064
+#define SAA1064_SA0 0x70
+#define SAA1064_SA1 0x72
+#define SAA1064_SA2 0x74
+#define SAA1064_SA3 0x76
+
+//Register Defines for SAA1064
+#define SAA1064_CTRL 0x00
+#define SAA1064_DIG1 0x01
+#define SAA1064_DIG2 0x02
+#define SAA1064_DIG3 0x03
+#define SAA1064_DIG4 0x04
+
+//Control Register Defines for SAA1064
+//Static display (2 digits) or Multiplexed (4 digits)
+#define SAA1064_MPX  0x01
+//Digits 1 and 2 On
+#define SAA1064_B0   0x02
+//Digits 3 and 4 On
+#define SAA1064_B1   0x04
+//Intensity of display
+#define SAA1064_INT0 0x00
+#define SAA1064_INT1 0x10
+#define SAA1064_INT2 0x20
+#define SAA1064_INT3 0x30
+#define SAA1064_INT4 0x40
+#define SAA1064_INT5 0x50
+#define SAA1064_INT6 0x60
+#define SAA1064_INT7 0x70
+
+//Default Mode: Multiplex On, All Digits On
+#define SAA1064_CTRL_DEF (SAA1064_MPX | SAA1064_B0 | SAA1064_B1)
+
+
+//Pin Defines for SAA1064
+#define D_L0                 0x01
+#define D_L1                 0x02
+#define D_L2                 0x04
+#define D_L3                 0x08
+#define D_L4                 0x10
+#define D_L5                 0x20
+#define D_L6                 0x40
+#define D_L7                 0x80
+
+//Defines for Segments
+const char SAA1064_SEGM[] = {0x3F,  //0
+                             0x06,  //1
+                             0x5B,  //2
+                             0x4F,  //3
+                             0x66,  //4
+                             0x6D,  //5
+                             0x7D,  //6
+                             0x07,  //7
+                             0x7F,  //8
+                             0x6F,  //9
+                             0x77,  //A
+                             0x7C,  //B
+                             0x39,  //C
+                             0x5E,  //D
+                             0x79,  //E
+                             0x71}; //F
+
+#define SAA1064_DP           0x80   //Decimal Point
+#define SAA1064_MINUS        0x40   //Minus Sign
+#define SAA1064_BLNK         0x00   //Blank Digit
+#define SAA1064_ALL          0xFF   //All Segments On
+               
+
+/** 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
+*/
+class SAA1064 {
+public:
+  SAA1064(I2C *i2c, char deviceAddress = SAA1064_SA0);
+  char read();
+  void write(char byte);
+    
+  void setIntensity(unsigned char intensity);
+
+  void write(unsigned char digit1, unsigned char digit2, unsigned char digit3, unsigned char digit4);        
+
+  void writeInt(int value, unsigned char dp_digit=0, bool leading=true);
+
+protected:
+  I2C *_i2c;
+  unsigned char _slaveAddress;    
+
+  void _init(); 
+};
+
+#endif
\ No newline at end of file