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.
Diff: SAA1064.cpp
- Revision:
- 0:48adc4a70511
- Child:
- 1:79cb73f852da
diff -r 000000000000 -r 48adc4a70511 SAA1064.cpp
--- /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);
+
+};
SAA1064 4 Digit 7-Segment LED driver with I2C interface