Now you can use NC as InterruptIn
Fork of X_NUCLEO_6180XA1 by
Diff: Components/Display/Display_class.h
- Revision:
- 16:0d4776564733
- Parent:
- 7:2dc81120c917
- Child:
- 17:922c88827e4d
--- a/Components/Display/Display_class.h Tue Oct 20 16:44:28 2015 +0200 +++ b/Components/Display/Display_class.h Tue Oct 27 15:25:11 2015 +0100 @@ -40,30 +40,322 @@ /* Includes ------------------------------------------------------------------*/ #include "mbed.h" +#include "stmpe1600_class.h" +#include "DevI2C.h" +#ifdef __cplusplus +extern "C" { +#endif + +#define FAST_DISPLAY + +#define DP (1<<7) +#define NOT_7_NO_DP( ... ) (uint8_t) ~( __VA_ARGS__ + DP ) +#define S0 (1<<0) +#define S1 (1<<1) +#define S2 (1<<2) +#define S3 (1<<3) +#define S4 (1<<4) +#define S5 (1<<5) +#define S6 (1<<6) + +/* refer to http://www.twyman.org.uk/Fonts/ */ +static const uint8_t ascii_to_display_lut[256]={ + [' ']= 0, + ['-']= S6, + ['_']= S3, + ['=']= S3+S6, + ['~']= S0+S3+S6, /* 3 h bar */ + ['^']= S0, /* use as top bar */ + + ['?']= NOT_7_NO_DP(S5+S3+S2), + ['*']= NOT_7_NO_DP(), + ['[']= S0+S3+S4+S5, + [']']= S0+S3+S2+S1, + ['@']= S0+S3, + + ['0']= NOT_7_NO_DP(S6), + ['1']= S1+S2, + ['2']= S0+S1+S6+S4+S3, + ['3']= NOT_7_NO_DP(S4+S5), + ['4']= S5+S1+S6+S2, + ['5']= NOT_7_NO_DP(S1+S4), + ['6']= NOT_7_NO_DP(S1), + ['7']= S0+S1+S2, + ['8']= NOT_7_NO_DP(0), + ['9']= NOT_7_NO_DP(S4), + + ['a']= S2+ S3+ S4+ S6 , + ['b']= NOT_7_NO_DP(S0+S1), + ['c']= S6+S4+S3, + ['d']= NOT_7_NO_DP(S0+S5), + ['e']= NOT_7_NO_DP(S2), + ['f']= S6+S5+S4+S0, /* same as F */ + ['g']= NOT_7_NO_DP(S4), /* same as 9 */ + ['h']= S6+S5+S4+S2, + ['i']= S4, + ['j']= S1+S2+S3+S4, + ['k']= S6+S5+S4+S2, /* a h */ + ['l']= S3+S4, + ['m']= S0+S4+S2, /* same as */ + ['n']= S2+S4+S6, + ['o']= S6+S4+S3+S2, + ['p']= NOT_7_NO_DP(S3+S2), // same as P + ['q']= S0+S1+S2+S5+S6, + ['r']= S4+S6, + ['s']= NOT_7_NO_DP(S1+S4), + ['t']= NOT_7_NO_DP(S0+S1+S2), + ['u']= S4+S3+S2+S5+S1, // U + ['v']= S4+S3+S2, // is u but u use U + ['w']= S1+S3+S5, + ['x']= NOT_7_NO_DP(S0+S3), // similar to H + ['y']= NOT_7_NO_DP(S0+S4), + ['z']= S0+S1+S6+S4+S3, // same as 2 + + ['A']= NOT_7_NO_DP(S3), + ['B']= NOT_7_NO_DP(S0+S1), /* as b */ + ['C']= S0+S3+S4+S5, // same as [ + ['E']= NOT_7_NO_DP(S1+S2), + ['F']= S6+S5+S4+S0, + ['G']= NOT_7_NO_DP(S4), /* same as 9 */ + ['H']= NOT_7_NO_DP(S0+S3), + ['I']= S1+S2, + ['J']= S1+S2+S3+S4, + ['K']= NOT_7_NO_DP(S0+S3), /* same as H */ + ['L']= S3+S4+S5, + ['M']= S0+S4+S2, /* same as m*/ + ['N']= S2+S4+S6, /* same as n*/ + ['O']= NOT_7_NO_DP(S6), + ['P']= S0+S1+S2+S5+S6, // sames as 'q' + ['Q']= NOT_7_NO_DP(S3+S2), + ['R']= S4+S6, + ['S']= NOT_7_NO_DP(S1+S4), /* sasme as 5 */ + ['T']= NOT_7_NO_DP(S0+S1+S2), /* sasme as t */ + ['U']= NOT_7_NO_DP(S6+S0), + ['V']= S4+S3+S2, // is u but u use U + ['W']= S1+S3+S5, + ['X']= NOT_7_NO_DP(S0+S3), // similar to H + ['Y']= NOT_7_NO_DP(S0+S4), + ['Z']= S0+S1+S6+S4+S3, // same as 2 + + +}; + +#undef S0 +#undef S1 +#undef S2 +#undef S3 +#undef S4 +#undef S5 +#undef S6 +#undef DP + +#define DISPLAY_DELAY 1 // in mSec /* Classes -------------------------------------------------------------------*/ -/** Class representing GPIO expander - */ +/** Class representing Display + */ -/* -class Display : +class Display { public: - Display(DevI2C &i2c) : device_i2c(i2c); - +#ifndef FAST_DISPLAY + + Display(DevI2C &i2c, STMPE1600DigiOut &D1, STMPE1600DigiOut &D2, STMPE1600DigiOut &D3, STMPE1600DigiOut &D4, + STMPE1600DigiOut &D_A, STMPE1600DigiOut &D_B, STMPE1600DigiOut &D_C, STMPE1600DigiOut &D_D, + STMPE1600DigiOut &D_E, STMPE1600DigiOut &D_F, STMPE1600DigiOut &D_G) + : Display_D1(D1), Display_D2(D2), Display_D3(D3), Display_D4(D4), + Display_A(D_A), Display_B(D_B), Display_C(D_C), Display_D(D_D), + Display_E(D_E), Display_F(D_F), Display_G(D_G), dev_i2c(i2c) + { + pDisplay_DGT[0] = &Display_D1; + pDisplay_DGT[1] = &Display_D2; + pDisplay_DGT[2] = &Display_D3; + pDisplay_DGT[3] = &Display_D4; + pDisplay_SEG[0] = &Display_A; + pDisplay_SEG[1] = &Display_B; + pDisplay_SEG[2] = &Display_C; + pDisplay_SEG[3] = &Display_D; + pDisplay_SEG[4] = &Display_E; + pDisplay_SEG[5] = &Display_F; + pDisplay_SEG[6] = &Display_G; + + for (int i=0; i<4; i++) { *pDisplay_DGT[i]=1; } + for (int i=0; i<7; i++) { *pDisplay_SEG[i]=1; } + } +#else + Display(DevI2C &i2c) : dev_i2c(i2c) {} +#endif virtual ~Display() { //nella classe board ci sara' un puntatore ad un oggetto di tipo Display che verra' creato con una new - //qui devo fare il delete[] del new + //qui devo fare il delete[] del new } - - - private: - DevI2C &device_i2c; - + +#ifndef FAST_DISPLAY + void Digits_off (void) // all 4 digits off + { + Display_D1=1; + Display_D2=1; + Display_D3=1; + Display_D4=1; + } + + void Digits_on (void) // all 4 digits on + { + Display_D1=0; + Display_D2=0; + Display_D3=0; + Display_D4=0; + } + + void Digit_on (int digit) // digits on + { + *pDisplay_DGT[digit] = 0; + } + + void Digit_off (int digit) // digits on + { + *pDisplay_DGT[digit] = 1; + } + + void Segments_off () // all 7 segments off + { + Display_A=1; + Display_B=1; + Display_C=1; + Display_D=1; + Display_E=1; + Display_F=1; + Display_G=1; + } + + void Segment_off (int seg) // segment off + { + *pDisplay_SEG[seg] = 1; + } + + void Segment_on (int seg) // segment on + { + *pDisplay_SEG[seg] = 0; + } + + + void DisplayString (char str[4]) + { + int i; + const char *pc; + + for( i=0, pc=str; i<4 && *pc!=0 ; i++, pc++){ + _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*pc], i); + if( *(pc+1)== '.'){ + pc++; + } + wait_ms(DISPLAY_DELAY); + Digits_off(); + } + } + + + void _V2_Set7Segment( int Leds, int digit ){ + //Digits_off(); + Segments_off(); // 7 seg off */ + int mask=1; + for (int i=0; i<7; i++) { + if (Leds & mask) Segment_on(i); + mask = mask<<1; + } + Digit_on(digit); + } + + +#else + + void DisplayDigit (char *val, char dgt) + { + uint8_t data[2]; + uint16_t *pdata = (uint16_t*)data; + dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 + *pdata = *pdata | (uint16_t)0x0780; // all digits off + dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 + + _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*val], dgt); + } + + void DisplayString (char str[4], char strlen) + { + int i, dgt; + const char *pc; + uint8_t data[2]; + uint16_t *pdata = (uint16_t*)data; + + // dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 +// *pdata = *pdata | (uint16_t)0x0780; // all digits off +// dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 + + for(i=0, dgt=4-strlen, pc=str; i<strlen && *pc!=0; i++, pc++, dgt++){ + _V2_Set7Segment( ascii_to_display_lut[(uint8_t)*pc], dgt); + if( *(pc+1)== '.'){ + pc++; + } + wait_ms(DISPLAY_DELAY); + dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 + *pdata = *pdata | (uint16_t)0x0780; // all digits off + dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 + } + } + + + void _V2_Set7Segment( int Leds, int digit ){ + //Digits_off(); + + uint16_t dgt; + dgt = 1<<digit; + dgt = ((uint16_t)dgt)<<7; + dgt = ~dgt; + uint8_t data[2]; + uint16_t *pdata = (uint16_t*)data; + + + /* set the exppinname state to lvl */ + dev_i2c.i2c_read(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 + *pdata = *pdata | (uint16_t)0x007F; // 7 segments off + dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 + + int mask=1; + for (int i=0; i<7; i++) { + if (Leds & mask) *pdata = *pdata & ~(uint16_t)mask; + mask = mask<<1; + } + *pdata = *pdata & dgt; + dev_i2c.i2c_write(data, (uint8_t)STMPE1600_DEF_DEVICE_ADDRESS, (uint8_t)GPSR_0_7, 2); // GPSR_0_7 + } +#endif + + + private: + +#ifndef FAST_DISPLAY + STMPE1600DigiOut &Display_D1; + STMPE1600DigiOut &Display_D2; + STMPE1600DigiOut &Display_D3; + STMPE1600DigiOut &Display_D4; + STMPE1600DigiOut *pDisplay_DGT[4]; // the 4 display digits + + STMPE1600DigiOut &Display_A; + STMPE1600DigiOut &Display_B; + STMPE1600DigiOut &Display_C; + STMPE1600DigiOut &Display_D; + STMPE1600DigiOut &Display_E; + STMPE1600DigiOut &Display_F; + STMPE1600DigiOut &Display_G; + STMPE1600DigiOut *pDisplay_SEG[7]; // the 7 digit segmments +#endif + DevI2C &dev_i2c; }; -*/ +#ifdef __cplusplus +} +#endif #endif // __GPIO_EXPANDER_CLASS_H \ No newline at end of file