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.
Dependencies: ST_INTERFACES X_NUCLEO_COMMON
Dependents: Display_53L0A1_IntSatelites Display_53L0A1_InterruptMode
Fork of X_NUCLEO_53L0A1 by
Display_class.h
00001 /** 00002 ****************************************************************************** 00003 * @file Display.h 00004 * @author AST / EST 00005 * @version V0.0.1 00006 * @date 14-April-2015 00007 * @brief Header file for display 00008 ****************************************************************************** 00009 * @attention 00010 * 00011 * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> 00012 * 00013 * Redistribution and use in source and binary forms, with or without modification, 00014 * are permitted provided that the following conditions are met: 00015 * 1. Redistributions of source code must retain the above copyright notice, 00016 * this list of conditions and the following disclaimer. 00017 * 2. Redistributions in binary form must reproduce the above copyright notice, 00018 * this list of conditions and the following disclaimer in the documentation 00019 * and/or other materials provided with the distribution. 00020 * 3. Neither the name of STMicroelectronics nor the names of its contributors 00021 * may be used to endorse or promote products derived from this software 00022 * without specific prior written permission. 00023 * 00024 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00025 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00026 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00027 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 00028 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00029 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 00030 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00031 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00032 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00033 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00034 * 00035 ****************************************************************************** 00036 */ 00037 00038 #ifndef __DISPLAY_H 00039 #define __DISPLAY_H 00040 00041 /* Includes ------------------------------------------------------------------*/ 00042 #include "mbed.h" 00043 #include "stmpe1600_class.h" 00044 #include "DevI2C.h" 00045 00046 #ifdef __cplusplus 00047 extern "C" { 00048 #endif 00049 00050 /** 00051 * GPIO monitor pin state register 00052 * 16 bit register LSB at lowest offset (little endian) 00053 */ 00054 #define GPMR 0x10 00055 /** 00056 * STMPE1600 GPIO set pin state register 00057 * 16 bit register LSB at lowest offset (little endian) 00058 */ 00059 #define GPSR 0x12 00060 /** 00061 * STMPE1600 GPIO set pin direction register 00062 * 16 bit register LSB at lowest offset 00063 */ 00064 #define GPDR 0x14 00065 00066 00067 /** 00068 * cache the full set of expanded GPIO values to avoid i2c reading 00069 */ 00070 static union CurIOVal_u { 00071 uint8_t bytes [4]; /*!< 4 bytes array i/o view */ 00072 uint32_t u32 ; /*!< single dword i/o view */ 00073 } 00074 /** cache the extended IO values */ 00075 CurIOVal; 00076 00077 /** 00078 * lookup table for digit to bit position 00079 */ 00080 static int DisplayBitPos[4]={0, 7, 16, 16+7}; 00081 00082 /** 00083 * @defgroup XNUCLEO53L0A1_7Segment 7 segment display 00084 * 00085 * macro use for human readable segment building 00086 * @code 00087 * --s0-- 00088 * s s 00089 * 5 1 00090 * --s6-- 00091 * s s 00092 * 4 2 00093 * --s3-- . s7 (dp) 00094 * @endcode 00095 * 00096 * @{ 00097 */ 00098 /** decimal point bit mapping* */ 00099 #define DP (1<<7) 00100 00101 /** sgement s0 bit mapping*/ 00102 #define S0 (1<<3) 00103 /** sgement s1 bit mapping*/ 00104 #define S1 (1<<5) 00105 /** sgement s2 bit mapping*/ 00106 #define S2 (1<<6) 00107 /** sgement s3 bit mapping*/ 00108 #define S3 (1<<4) 00109 /** sgement s4 bit mapping*/ 00110 #define S4 (1<<0) 00111 /** sgement s5 bit mapping*/ 00112 #define S5 (1<<1) 00113 /** sgement s6 bit mapping*/ 00114 #define S6 (1<<2) 00115 00116 /** 00117 * build a character by defining the non lighted segment (not one and no DP) 00118 * 00119 * @param ... literal sum and or combine of any macro to define any segment #S0 .. #S6 00120 * 00121 * example '9' is all segment on but S4 00122 * @code 00123 * ['9']= NOT_7_NO_DP(S4), 00124 * @endcode 00125 */ 00126 #define NOT_7_NO_DP( ... ) (uint8_t) ~( __VA_ARGS__ + DP ) 00127 00128 /** 00129 * Ascii to 7 segment lookup table 00130 * 00131 * Most common character are supported and follow http://www.twyman.org.uk/Fonts/ 00132 * few extra special \@ ^~ ... etc are present for specific demo purpose 00133 */ 00134 #ifndef __cpluplus 00135 /* refer to http://www.twyman.org.uk/Fonts/ */ 00136 static const uint8_t ascii_to_display_lut[256]={ 00137 0,0,0,0,0,0,0,0, 00138 0,0,0,0,0,0,0,0, 00139 0,0,0,0,0,0,0,0, 00140 0,0,0,0,0,0,0,0, 00141 [32]= 0, 00142 0,0,0,0,0,0,0,0, 00143 0, 00144 [42]= NOT_7_NO_DP(), 00145 0,0, 00146 [45]= S6, 00147 0,0, 00148 [48]= NOT_7_NO_DP(S6), 00149 [49]= S1+S2, 00150 [50]= S0+S1+S6+S4+S3, 00151 [51]= NOT_7_NO_DP(S4+S5), 00152 [52]= S5+S1+S6+S2, 00153 [53]= NOT_7_NO_DP(S1+S4), 00154 [54]= NOT_7_NO_DP(S1), 00155 [55]= S0+S1+S2, 00156 [56]= NOT_7_NO_DP(0), 00157 [57]= NOT_7_NO_DP(S4), 00158 0,0,0, 00159 [61]= S3+S6, 00160 0, 00161 [63]= NOT_7_NO_DP(S5+S3+S2), 00162 [64]= S0+S3, 00163 [65]= NOT_7_NO_DP(S3), 00164 [66]= NOT_7_NO_DP(S0+S1), /* as b */ 00165 [67]= S0+S3+S4+S5, // same as [ 00166 [68]= S0+S3+S4+S5, // same as [ DUMMY 00167 [69]= NOT_7_NO_DP(S1+S2), 00168 [70]= S6+S5+S4+S0, 00169 [71]= NOT_7_NO_DP(S4), /* same as 9 */ 00170 [72]= NOT_7_NO_DP(S0+S3), 00171 [73]= S1+S2, 00172 [74]= S1+S2+S3+S4, 00173 [75]= NOT_7_NO_DP(S0+S3), /* same as H */ 00174 [76]= S3+S4+S5, 00175 [77]= S0+S4+S2, /* same as m*/ 00176 [78]= S2+S4+S6, /* same as n*/ 00177 [79]= NOT_7_NO_DP(S6), 00178 [80]= S0+S1+S2+S5+S6, // sames as 'q' 00179 [81]= NOT_7_NO_DP(S3+S2), 00180 [82]= S4+S6, 00181 [83]= NOT_7_NO_DP(S1+S4), /* sasme as 5 */ 00182 [84]= NOT_7_NO_DP(S0+S1+S2), /* sasme as t */ 00183 [85]= NOT_7_NO_DP(S6+S0), 00184 [86]= S4+S3+S2, // is u but u use U 00185 [87]= S1+S3+S5, 00186 [88]= NOT_7_NO_DP(S0+S3), // similar to H 00187 [89]= NOT_7_NO_DP(S0+S4), 00188 [90]= S0+S1+S6+S4+S3, // same as 2 00189 [91]= S0+S3+S4+S5, 00190 0, 00191 [93]= S0+S3+S2+S1, 00192 [94]= S0, /* use as top bar */ 00193 [95]= S3, 00194 0, 00195 [97]= S2+ S3+ S4+ S6 , 00196 [98]= NOT_7_NO_DP(S0+S1), 00197 [99]= S6+S4+S3, 00198 [100]= NOT_7_NO_DP(S0+S5), 00199 [101]= NOT_7_NO_DP(S2), 00200 [102]= S6+S5+S4+S0, /* same as F */ 00201 [103]= NOT_7_NO_DP(S4), /* same as 9 */ 00202 [104]= S6+S5+S4+S2, 00203 [105]= S4, 00204 [106]= S1+S2+S3+S4, 00205 [107]= S6+S5+S4+S2, /* a h */ 00206 [108]= S3+S4, 00207 [109]= S0+S4+S2, /* same as */ 00208 [110]= S2+S4+S6, 00209 [111]= S6+S4+S3+S2, 00210 [112]= NOT_7_NO_DP(S3+S2), // same as P 00211 [113]= S0+S1+S2+S5+S6, 00212 [114]= S4+S6, 00213 [115]= NOT_7_NO_DP(S1+S4), 00214 [116]= NOT_7_NO_DP(S0+S1+S2), 00215 [117]= S4+S3+S2+S5+S1, // U 00216 [118]= S4+S3+S2, // is u but u use U 00217 [119]= S1+S3+S5, 00218 [120]= NOT_7_NO_DP(S0+S3), // similar to H 00219 [121]= NOT_7_NO_DP(S0+S4), 00220 [122]= S0+S1+S6+S4+S3, // same as 2 00221 0,0,0, 00222 [126]= S0+S3+S6 /* 3 h bar */ 00223 }; 00224 #else 00225 /* refer to http://www.twyman.org.uk/Fonts/ */ 00226 static const uint8_t ascii_to_display_lut[256]={ 00227 [' ']= 0, 00228 ['-']= S6, 00229 ['_']= S3, 00230 ['=']= S3+S6, 00231 ['~']= S0+S3+S6, /* 3 h bar */ 00232 ['^']= S0, /* use as top bar */ 00233 00234 ['?']= NOT_7_NO_DP(S5+S3+S2), 00235 ['*']= NOT_7_NO_DP(), 00236 ['[']= S0+S3+S4+S5, 00237 [']']= S0+S3+S2+S1, 00238 ['@']= S0+S3, 00239 00240 ['0']= NOT_7_NO_DP(S6), 00241 ['1']= S1+S2, 00242 ['2']= S0+S1+S6+S4+S3, 00243 ['3']= NOT_7_NO_DP(S4+S5), 00244 ['4']= S5+S1+S6+S2, 00245 ['5']= NOT_7_NO_DP(S1+S4), 00246 ['6']= NOT_7_NO_DP(S1), 00247 ['7']= S0+S1+S2, 00248 ['8']= NOT_7_NO_DP(0), 00249 ['9']= NOT_7_NO_DP(S4), 00250 00251 ['a']= S2+ S3+ S4+ S6 , 00252 ['b']= NOT_7_NO_DP(S0+S1), 00253 ['c']= S6+S4+S3, 00254 ['d']= NOT_7_NO_DP(S0+S5), 00255 ['e']= NOT_7_NO_DP(S2), 00256 ['f']= S6+S5+S4+S0, /* same as F */ 00257 ['g']= NOT_7_NO_DP(S4), /* same as 9 */ 00258 ['h']= S6+S5+S4+S2, 00259 ['i']= S4, 00260 ['j']= S1+S2+S3+S4, 00261 ['k']= S6+S5+S4+S2, /* a h */ 00262 ['l']= S3+S4, 00263 ['m']= S0+S4+S2, /* same as */ 00264 ['n']= S2+S4+S6, 00265 ['o']= S6+S4+S3+S2, 00266 ['p']= NOT_7_NO_DP(S3+S2), // same as P 00267 ['q']= S0+S1+S2+S5+S6, 00268 ['r']= S4+S6, 00269 ['s']= NOT_7_NO_DP(S1+S4), 00270 ['t']= NOT_7_NO_DP(S0+S1+S2), 00271 ['u']= S4+S3+S2+S5+S1, // U 00272 ['v']= S4+S3+S2, // is u but u use U 00273 ['w']= S1+S3+S5, 00274 ['x']= NOT_7_NO_DP(S0+S3), // similar to H 00275 ['y']= NOT_7_NO_DP(S0+S4), 00276 ['z']= S0+S1+S6+S4+S3, // same as 2 00277 00278 ['A']= NOT_7_NO_DP(S3), 00279 ['B']= NOT_7_NO_DP(S0+S1), /* as b */ 00280 ['C']= S0+S3+S4+S5, // same as [ 00281 ['E']= NOT_7_NO_DP(S1+S2), 00282 ['F']= S6+S5+S4+S0, 00283 ['G']= NOT_7_NO_DP(S4), /* same as 9 */ 00284 ['H']= NOT_7_NO_DP(S0+S3), 00285 ['I']= S1+S2, 00286 ['J']= S1+S2+S3+S4, 00287 ['K']= NOT_7_NO_DP(S0+S3), /* same as H */ 00288 ['L']= S3+S4+S5, 00289 ['M']= S0+S4+S2, /* same as m*/ 00290 ['N']= S2+S4+S6, /* same as n*/ 00291 ['O']= NOT_7_NO_DP(S6), 00292 ['P']= S0+S1+S2+S5+S6, // sames as 'q' 00293 ['Q']= NOT_7_NO_DP(S3+S2), 00294 ['R']= S4+S6, 00295 ['S']= NOT_7_NO_DP(S1+S4), /* sasme as 5 */ 00296 ['T']= NOT_7_NO_DP(S0+S1+S2), /* sasme as t */ 00297 ['U']= NOT_7_NO_DP(S6+S0), 00298 ['V']= S4+S3+S2, // is u but u use U 00299 ['W']= S1+S3+S5, 00300 ['X']= NOT_7_NO_DP(S0+S3), // similar to H 00301 ['Y']= NOT_7_NO_DP(S0+S4), 00302 ['Z']= S0+S1+S6+S4+S3 // same as 2 00303 }; 00304 #endif 00305 00306 00307 #undef S0 00308 #undef S1 00309 #undef S2 00310 #undef S3 00311 #undef S4 00312 #undef S5 00313 #undef S6 00314 #undef DP 00315 00316 /** @} */ 00317 00318 //#define DISPLAY_DELAY 1 // in mSec 00319 00320 /* Classes -------------------------------------------------------------------*/ 00321 /** Class representing Display 00322 */ 00323 00324 class Display 00325 { 00326 private: 00327 STMPE1600 &stmpe1600_exp0; 00328 STMPE1600 &stmpe1600_exp1; 00329 public: 00330 /** Constructor 00331 * @param[in] &stmpe_1600 device handler to be used for display control 00332 */ 00333 Display (STMPE1600 &stmpe_1600_exp0, STMPE1600 &stmpe_1600_exp1) : stmpe1600_exp0(stmpe_1600_exp0), stmpe1600_exp1(stmpe_1600_exp1) { 00334 uint16_t ExpanderData; 00335 00336 // detect the extenders 00337 stmpe1600_exp0.read16bitReg(0x00, &ExpanderData); 00338 // if (ExpanderData != 0x1600) {/* log - failed to find expander exp0 */ } 00339 stmpe1600_exp1.read16bitReg(0x00, &ExpanderData); 00340 // if (ExpanderData != 0x1600) {/* log - failed to find expander exp1 */ } 00341 00342 // configure all necessary GPIO pins as outputs 00343 ExpanderData = 0xFFFF; 00344 stmpe1600_exp0.write16bitReg(GPDR, &ExpanderData); 00345 ExpanderData = 0xBFFF; // leave bit 14 as an input, for the pushbutton, PB1. 00346 stmpe1600_exp1.write16bitReg(GPDR, &ExpanderData); 00347 00348 // shut down all segment and all device 00349 ExpanderData = 0x7F + (0x7F << 7); 00350 stmpe1600_exp0.write16bitReg(GPSR, &ExpanderData); 00351 stmpe1600_exp1.write16bitReg(GPSR, &ExpanderData); 00352 } 00353 00354 /*** Interface Methods ***/ 00355 /** 00356 * @brief Print the string on display 00357 * @param[in] String to be printed 00358 * @param[in] String lenght [min 1, max 4] 00359 * @return void 00360 */ 00361 void DisplayString (const char *str) 00362 { 00363 uint16_t ExpanderData; 00364 uint32_t Segments; 00365 int BitPos; 00366 int i; 00367 00368 for( i=0; i<4 && str[i]!=0; i++){ 00369 Segments = (uint32_t)ascii_to_display_lut[(uint8_t)str[i]]; 00370 Segments =(~Segments)&0x7F; 00371 BitPos=DisplayBitPos[i]; 00372 CurIOVal.u32 &=~(0x7F<<BitPos); 00373 CurIOVal.u32 |= Segments<<BitPos; 00374 } 00375 /* clear unused digit */ 00376 for( ; i<4;i++){ 00377 BitPos=DisplayBitPos[i]; 00378 CurIOVal.u32 |=0x7F<<BitPos; 00379 } 00380 00381 // stmpe1600_exp0.write16bitReg(GPSR, (uint16_t *)&CurIOVal.bytes[0]); 00382 // stmpe1600_exp1.write16bitReg(GPSR, (uint16_t *)&CurIOVal.bytes[2]); 00383 00384 // ordered low-byte/high-byte! 00385 CurIOVal.bytes [1] |= 0xC0; // ensure highest bits are high, as these are xshutdown pins for left & right sensors! 00386 ExpanderData = (CurIOVal.bytes [1] << 8) + CurIOVal.bytes [0]; 00387 stmpe1600_exp0.write16bitReg(GPSR, &ExpanderData); 00388 CurIOVal.bytes [3] |= 0x80; // ensure highest bit is high, as this is xshutdown pin on central sensor! 00389 ExpanderData = (CurIOVal.bytes [3] << 8) + CurIOVal.bytes [2]; 00390 stmpe1600_exp1.write16bitReg(GPSR, &ExpanderData); 00391 00392 } 00393 00394 void ClearDisplay(void) 00395 { 00396 uint16_t ExpanderData; 00397 00398 ExpanderData = 0x7F + (0x7F << 7); 00399 stmpe1600_exp0.write16bitReg(GPSR, &ExpanderData); 00400 stmpe1600_exp1.write16bitReg(GPSR, &ExpanderData); 00401 } 00402 00403 }; 00404 00405 #ifdef __cplusplus 00406 } 00407 #endif 00408 #endif // __DISPLAY_H 00409
Generated on Tue Jul 12 2022 21:41:59 by
