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

Dependencies:   mbed-src

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SLCD.cpp Source File

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