Proyecto digitales avanzados
Fork of BMP180 by
Diff: HT16K33.h
- Revision:
- 1:aa10a7465c76
- Parent:
- 0:06dc60296e6e
--- a/HT16K33.h Thu Jul 03 20:05:55 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,266 +0,0 @@ -#ifndef HT16K33_H -#define HT16K33_H - -#include "mbed.h" - -#define HT16K33_ADDRESS 0x70<<1 // shift to the left one for mbed -#define HT16K33_ON 0x21 // Commands -#define HT16K33_STANDBY 0x20 -#define HT16K33_DISPLAYON 0x81 -#define HT16K33_DISPLAYOFF 0x80 -#define HT16K33_BLINKON 0x85 // Blink is off (00), 2 Hz (01), 1 Hz (10), or 0.5 Hz (11) for bits (21) -#define HT16K33_BLINKOFF 0x81 -#define HT16K33_DIM 0xE0 | 0x08 // Set brihtness from 1/16 (0x00) to 16/16 (0xFF) - -// Arrangement for display 1 (4 digit bubble display) -// -// a = A0 -// _________ -// | | -// f = A2 | g = A4 | b = A1 -// |_________| -// | | -// e = A5 | | c = A6 -// |_________| -// d = A3 DP = A7 - - -static const char numberTable[] = -{ - 0x6F, // 0 = 0 - 0x42, // 1 = 1, etc - 0x3B, // 2 - 0x5B, // 3 - 0x56, // 4 - 0x5D, // 5 - 0x7D, // 6 - 0x43, // 7 - 0x7F, // 8 - 0x57, // 9 - 0x80, // decimal point - 0x00, // blank - 0x10, // minus sign -}; - -#define display1 1 -#define display2 2 -#define display3 3 -#define display4 4 - -class HT16K33 { - - protected: - - public: - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -//++ Useful Functions++ -//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -void writeInteger(uint8_t dsply, int data) -{ - char string[10] = ""; // define character array to hold the digits - itoa(data, string); // get ascii character string representation of the integer to be displayed - uint8_t length = strlen(string); // get the length of the string; number of digits in integer - uint8_t blanks = 4 - length; // how many blanks do we have? - - if (length > 4) return; // if length greater than 4 digits we can't display on a four-digit display! - - for (uint8_t digit = 0; digit < blanks; digit++) // scroll through each digit to determine what to write to the display - { - writeDigit(dsply, digit + 1, 11, 0); // clear digit wherever there are blanks - } - - for (uint8_t digit = 0; digit < 4; digit++) // scroll through each digit to determine what to write to the display - { - char ch = string[digit]; // get the ascii character of the next string segment - - if (ch == '-') { - writeDigit(dsply, digit + 1 + blanks, 12, 0); // check if negative sign needed - } - else { // character must be a digit - ch -= '0'; // convert it to an integer - writeDigit(dsply, digit + 1 + blanks, ch, 0); // write it to the display; right justify the integer - } - } -} - -void writeFloat(uint8_t dsply, float data, uint8_t dp) -{ - char string[10] = ""; // define character array to hold the digits - int datanew = 0; - - switch (dp) - { - case 0: - datanew = (int )(1.0f*data); - break; - - case 1: - datanew = (int )(10.0f*data); - break; - - case 2: - datanew = (int )(100.0f*data); - break; - - case 3: - datanew = (int )(1000.0f*data); - break; - } - - - itoa(datanew, string); // get ascii character string representation of the integer to be displayed - uint8_t length = strlen(string); // get the length of the string; number of digits in integer - uint8_t blanks = 4 - length; // how many blanks do we have? - - if (length > 4) return; // if length greater than 4 digits we can't display on a four-digit display! - -// scroll through each digit to determine what to write to the display -for (uint8_t digit = 0; digit < blanks; digit++) // first the blanks - { - if( (digit + 1) == (4 - dp) ) { // handle special case where blank coincides with decimal point - writeDigit(dsply, digit + 1, 0, 0x80); // add leading zero before decimal place - } - else { - writeDigit(dsply, digit + 1, 11, 0x00); // otherwise clear digit wherever there are blanks - } - } - - for (uint8_t digit = 0; digit < 4; digit++) // now the characters to determine what to write to the display - { - char ch = string[digit]; // get the ascii character of the next string segment - - if (ch == '-') { - if((digit + 1 + blanks) == (4 - dp) ) { - writeDigit(dsply, digit + 1 + blanks, 0, 0x80); // check if negative sign needed, add a decimal point - writeDigit(dsply, digit + 0 + blanks, 12, 0x00); // add a leading zero - } - else { - writeDigit(dsply, digit + 1 + blanks, 12, 0x00); // check if negative sign needed, no decimal point - } - } - else { // character must be a digit - ch -= '0'; // convert it to an integer - if((digit + 1 + blanks) == (4 - dp) ) { - writeDigit(dsply, digit + 1 + blanks, ch, 0x80); // write it to the display with decimal point; right justify the integer - } - else { - writeDigit(dsply, digit + 1 + blanks, ch, 0x00); // write it to the display; right justify the integer - } - } - } -} - - -void writeDigit(uint8_t dsply, uint8_t digit, uint8_t data, uint8_t dp) -{ -if(dsply == 1) { - digit = (digit - 1)*2 + 0; -} -if(dsply == 2) { - digit = (digit - 1)*2 + 8 ; -} -if(dsply == 3) { - digit = (digit - 1)*2 + 1; -} -if(dsply == 4) { - digit = (digit - 1)*2 + 9; -} -writeByte(HT16K33_ADDRESS, digit, numberTable[data] | dp); -} - - -void clearDsplay(int dsply) -{ - for(int i = 0; i < 8; i++) { - writeDigit(dsply, i, 11, 0); // Clear display, 11 is blank in the numberTable above - } -} - - -void initHT16K33() -{ - writeCommand(HT16K33_ADDRESS, HT16K33_ON); // Turn on system oscillator - writeCommand(HT16K33_ADDRESS, HT16K33_DISPLAYON); // Display on - writeCommand(HT16K33_ADDRESS, HT16K33_DIM); // Set brightness - -} - - -void blinkHT16K33(int time) -{ - writeCommand(HT16K33_ADDRESS, HT16K33_BLINKON); // Turn on blink - wait(time); - writeCommand(HT16K33_ADDRESS, HT16K33_BLINKOFF); // Turn on blink -} - - - /* itoa: convert n to characters in s */ - void itoa(int n, char s[]) - { - int i, sign; - - if ((sign = n) < 0) /* record sign */ - n = -n; /* make n positive */ - i = 0; - do { /* generate digits in reverse order */ - s[i++] = n % 10 + '0'; /* get next digit */ - } while ((n /= 10) > 0); /* delete it */ - if (sign < 0) - s[i++] = '-'; - s[i] = '\0'; - reverse(s); - } - - /* reverse: reverse string s in place */ - void reverse(char s[]) - { - int i, j; - char c; - - for (i = 0, j = strlen(s)-1; i<j; i++, j--) { - c = s[i]; - s[i] = s[j]; - s[j] = c; - } - } - - // Wire.h read and write protocols - void writeCommand(uint8_t address, uint8_t command) - { - char data_write[1]; - data_write[0] = command; - i2c.write(address, data_write, 1, 0); -} - - void writeByte(uint8_t address, uint8_t subAddress, uint8_t data) -{ - char data_write[2]; - data_write[0] = subAddress; - data_write[1] = data; - i2c.write(address, data_write, 2, 0); -} - - char readByte(uint8_t address, uint8_t subAddress) -{ - char data[1]; // `data` will store the register data - char data_write[1]; - data_write[0] = subAddress; - i2c.write(address, data_write, 1, 1); // no stop - i2c.read(address, data, 1, 0); - return data[0]; -} - - void readBytes(uint8_t address, uint8_t subAddress, uint8_t count, uint8_t * dest) -{ - char data[14]; - char data_write[1]; - data_write[0] = subAddress; - i2c.write(address, data_write, 1, 1); // no stop - i2c.read(address, data, count, 0); - for(int ii = 0; ii < count; ii++) { - dest[ii] = data[ii]; - } -} - }; -#endif \ No newline at end of file