7 Segment LED Displaydriver, I2C interface, SAA1064
Revision 0:48adc4a70511, committed 2013-09-08
- 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