Generic communication interface between the wireless board (mote) and the sensor board. Any kind of sensor board can be connected to the mote using this specification given it provides a SPI peripheral, one input pin with interrupt capability and one digital output. The sensor board must implement a special register set from which all required information can be retrieved. Protocol: http://is.gd/wuQorh Github: http://is.gd/ySj1L9
SLCD.cpp
00001 #include "SLCD.h" 00002 #include "LCDconfig.h" 00003 00004 00005 const uint8_t WF_ORDERING_TABLE[ ] = 00006 { 00007 CHAR1a, // LCD81 --- Pin:5 LCDnAddress=51 00008 CHAR1b, // LCD82 --- Pin:6 LCDnAddress=52 00009 CHAR2a, // LCD83 --- Pin:7 LCDnAddress=53 00010 CHAR2b, // LCD84 --- Pin:8 LCDnAddress=54 00011 CHAR3a, // LCD85 --- Pin:9 LCDnAddress=55 00012 CHAR3b, // LCD86 --- Pin:10 LCDnAddress=56 00013 CHAR4a, // LCD87 --- Pin:11 LCDnAddress=57 00014 CHAR4b, // LCD88 --- Pin:12 LCDnAddress=58 00015 CHARCOM0, // LCD77 --- Pin:1 LCDnAddress=4D 00016 CHARCOM1, // LCD78 --- Pin:2 LCDnAddress=4E 00017 CHARCOM2, // LCD79 --- Pin:3 LCDnAddress=4F 00018 CHARCOM3, // LCD80 --- Pin:4 LCDnAddress=50 00019 }; 00020 00021 const char ASCII_TO_WF_CODIFICATION_TABLE [ ] = 00022 { 00023 00024 /* 00025 segA 00026 ________ 00027 | | 00028 segF | | segB 00029 | | 00030 -segG-- 00031 | | 00032 segE | | segC 00033 |________| 00034 segD 00035 */ 00036 00037 ( SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 0, offset=0 00038 (!SEGD+!SEGE+!SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = 1, offset=4 00039 ( SEGD+ SEGE+!SEGF+ SEGG) , (!SEGC+ SEGB+ SEGA) ,//Char = 2, offset=8 00040 ( SEGD+!SEGE+!SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 3, offset=12 00041 (!SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = 4, offset=16 00042 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = 5, offset=20 00043 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = 6, offset=24 00044 (!SEGD+!SEGE+!SEGF+!SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 7, offset=28 00045 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 8, offset=32 00046 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 9, offset=36 00047 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = :, offset=40 00048 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = ;, offset=44 00049 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = <, offset=48 00050 ( SEGD+!SEGE+!SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = =, offset=52 00051 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = >, offset=56 00052 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = ?, offset=60 00053 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = @, offset=64 00054 (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = A, offset=68 00055 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = B, offset=72 00056 ( SEGD+ SEGE+ SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = C, offset=76 00057 ( SEGD+ SEGE+!SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = D, offset=80 00058 ( SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = E, offset=84 00059 (!SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = F, offset=88 00060 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = G, offset=92 00061 (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = H, offset=96 00062 (!SEGD+!SEGE+!SEGF+!SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = I, offset=100 00063 ( SEGD+ SEGE+!SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = J, offset=104 00064 (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = K, offset=108 00065 ( SEGD+ SEGE+ SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = L, offset=112 00066 (!SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = M, offset=116 00067 (!SEGD+ SEGE+!SEGF+ SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = N, offset=120 00068 ( SEGD+ SEGE+!SEGF+ SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = O, offset=124 00069 (!SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+ SEGB+ SEGA) ,//Char = P, offset=128 00070 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = Q, offset=132 00071 (!SEGD+ SEGE+!SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = R, offset=136 00072 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = S, offset=140 00073 ( SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = T, offset=144 00074 ( SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = U, offset=148 00075 ( SEGD+ SEGE+!SEGF+!SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = V, offset=152 00076 ( SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = W, offset=156 00077 (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = X, offset=160 00078 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = Y, offset=164 00079 ( SEGD+!SEGE+!SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = Z, offset=168 00080 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = [, offset=172 00081 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = \, offset=176 00082 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = ], offset=180 00083 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = ^, offset=184 00084 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = _, offset=188 00085 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = `, offset=192 00086 }; 00087 00088 SLCD::SLCD() { 00089 init(); 00090 CharPosition = 0; 00091 } 00092 00093 void SLCD::init(){ 00094 SIM->SCGC5 |= SIM_SCGC5_SLCD_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK; 00095 00096 // configure pins for LCD operation 00097 PORTC->PCR[20] = 0x00000000; //VLL2 00098 PORTC->PCR[21] = 0x00000000; //VLL1 00099 PORTC->PCR[22] = 0x00000000; //VCAP2 00100 PORTC->PCR[23] = 0x00000000; //VCAP1 00101 // Enable IRCLK 00102 MCG->C1 = MCG_C1_IRCLKEN_MASK | MCG_C1_IREFSTEN_MASK; 00103 MCG->C2 &= ~MCG_C2_IRCS_MASK ; //0 32KHZ internal reference clock; 1= 4MHz irc 00104 LCD->GCR = 0x0; 00105 LCD->AR = 0x0; 00106 // LCD configurartion 00107 LCD->GCR = ( LCD_GCR_RVEN_MASK*_LCDRVEN 00108 | LCD_GCR_RVTRIM(_LCDRVTRIM) //0-15 00109 | LCD_GCR_CPSEL_MASK*_LCDCPSEL 00110 | LCD_GCR_LADJ(_LCDLOADADJUST) //0-3 00111 | LCD_GCR_VSUPPLY_MASK*_LCDSUPPLY //0-1 00112 |!LCD_GCR_FDCIEN_MASK 00113 | LCD_GCR_ALTDIV(_LCDALTDIV) //0-3 00114 |!LCD_GCR_LCDDOZE_MASK 00115 |!LCD_GCR_LCDSTP_MASK 00116 |!LCD_GCR_LCDEN_MASK //WILL BE ENABLE ON SUBSEQUENT STEP 00117 | LCD_GCR_SOURCE_MASK*_LCDCLKSOURCE 00118 | LCD_GCR_ALTSOURCE_MASK*_LCDALRCLKSOURCE 00119 | LCD_GCR_LCLK(_LCDLCK) //0-7 00120 | LCD_GCR_DUTY(_LCDDUTY) //0-7 00121 ); 00122 uint8_t i; 00123 uint32_t *p_pen; 00124 uint8_t pen_offset; // 0 or 1 00125 uint8_t pen_bit; // 0 to 31 00126 LCD->PEN[0] = 0x0; 00127 LCD->PEN[1] = 0x0; 00128 LCD->BPEN[0] = 0x0; 00129 LCD->BPEN[1] = 0x0; 00130 p_pen = (uint32_t *)&LCD->PEN[0]; 00131 for (i=0;i<_LCDUSEDPINS;i++) 00132 { 00133 pen_offset = WF_ORDERING_TABLE[i]/32; 00134 pen_bit = WF_ORDERING_TABLE[i]%32; 00135 p_pen[pen_offset] |= 1 << pen_bit; 00136 if (i>= _LCDFRONTPLANES) // Pin is a backplane 00137 { 00138 p_pen[pen_offset+2] |= 1 << pen_bit; // Enable BPEN 00139 LCD->WF8B[(uint8_t)WF_ORDERING_TABLE[i]] = 1 << (i - _LCDFRONTPLANES); // fill with 0x01, 0x02, etc 00140 } 00141 } 00142 LCD->GCR |= LCD_GCR_LCDEN_MASK; 00143 } 00144 00145 int SLCD::_putc(int c) { 00146 Write_Char(c); 00147 return 0; 00148 } 00149 00150 void SLCD::Write_Char (char lbValue) { 00151 uint8_t char_val; 00152 uint8_t temp; 00153 uint8_t *lbpLCDWF; 00154 uint8_t lbCounter; 00155 uint16_t arrayOffset; 00156 uint8_t position; 00157 00158 if (CharPosition >= _CHARNUM) 00159 CharPosition = 0; 00160 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00161 /* only ascii character if value not writeable write as @ */ 00162 if (lbValue>='a' && lbValue<='z') { 00163 lbValue -= 32; // UpperCase 00164 } 00165 if (lbValue<ASCCI_TABLE_START || lbValue >ASCCI_TABLE_END) { 00166 lbValue = BLANK_CHARACTER; // default value as space 00167 } 00168 lbValue -=ASCCI_TABLE_START; // Remove the offset to search in the ascci table 00169 arrayOffset = (lbValue * _CHAR_SIZE); // Compensate matrix offset 00170 // ensure bLCD position is in valid limit 00171 lbCounter = 0; //number of writings to complete one char 00172 while (lbCounter<_CHAR_SIZE) { 00173 position = (CharPosition) *_LCDTYPE + lbCounter; 00174 temp=0; 00175 if (lbCounter==1) { 00176 temp = lbpLCDWF[WF_ORDERING_TABLE[position]] & 0x01;//bit 0 has the special symbol information 00177 } 00178 char_val = ASCII_TO_WF_CODIFICATION_TABLE[arrayOffset + lbCounter]; 00179 lbpLCDWF[WF_ORDERING_TABLE[position]] = char_val | temp; 00180 // if (char_val==0) lbCounter = _CHAR_SIZE; //end of this character 00181 lbCounter++; 00182 } 00183 CharPosition++; 00184 } 00185 00186 void SLCD::Home (void) 00187 { 00188 CharPosition = 0; 00189 } 00190 00191 void SLCD::Contrast (uint8_t lbContrast) 00192 { 00193 lbContrast &= 0x0F; //Forced to the only values accepted 00194 LCD->GCR |= LCD_GCR_RVTRIM(lbContrast); 00195 } 00196 00197 void SLCD::All_Segments (int mode) 00198 { 00199 uint8_t lbTotalBytes = _CHARNUM * _LCDTYPE; 00200 uint8_t lbCounter=0; 00201 uint8_t *lbpLCDWF; 00202 00203 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00204 while (lbCounter < lbTotalBytes) 00205 { 00206 if (mode==1){lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[lbCounter++]]=_ALLON;} 00207 else {lbpLCDWF[WF_ORDERING_TABLE[lbCounter++]]=0;} 00208 } 00209 } 00210 00211 void SLCD::DP1 (int mode) 00212 { 00213 uint8_t *lbpLCDWF; 00214 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00215 if (mode==1){lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[1]]|=1;} 00216 else {lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[1]]&=~1;} 00217 } 00218 00219 void SLCD::DP2 (int mode) 00220 { 00221 uint8_t *lbpLCDWF; 00222 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00223 if (mode==1){lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[3]]|=1;} 00224 else {lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[3]]&=~1;} 00225 } 00226 00227 void SLCD::DP3 (int mode) 00228 { 00229 uint8_t *lbpLCDWF; 00230 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00231 if (mode==1){lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[5]]|=1;} 00232 else {lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[5]]&=~1;} 00233 } 00234 00235 void SLCD::Colon (int mode) 00236 { 00237 uint8_t *lbpLCDWF; 00238 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00239 if (mode==1){lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[7]]|=1;} 00240 else {lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[7]]&=~1;} 00241 } 00242 00243
Generated on Tue Jul 12 2022 21:04:14 by 1.7.2