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.
SLCD.cpp
00001 #include "SLCD.h" 00002 #include "LCDconfig.h" 00003 00004 00005 const uint8_t WF_ORDERING_TABLE[ ] = { 00006 CHAR1a, // LCD81 --- Pin:5 LCDnAddress=51 00007 CHAR1b, // LCD82 --- Pin:6 LCDnAddress=52 00008 CHAR2a, // LCD83 --- Pin:7 LCDnAddress=53 00009 CHAR2b, // LCD84 --- Pin:8 LCDnAddress=54 00010 CHAR3a, // LCD85 --- Pin:9 LCDnAddress=55 00011 CHAR3b, // LCD86 --- Pin:10 LCDnAddress=56 00012 CHAR4a, // LCD87 --- Pin:11 LCDnAddress=57 00013 CHAR4b, // LCD88 --- Pin:12 LCDnAddress=58 00014 CHARCOM0, // LCD77 --- Pin:1 LCDnAddress=4D 00015 CHARCOM1, // LCD78 --- Pin:2 LCDnAddress=4E 00016 CHARCOM2, // LCD79 --- Pin:3 LCDnAddress=4F 00017 CHARCOM3, // LCD80 --- Pin:4 LCDnAddress=50 00018 }; 00019 00020 const char ASCII_TO_WF_CODIFICATION_TABLE [ ] = { 00021 00022 /* 00023 segA 00024 ________ 00025 | | 00026 segF | | segB 00027 | | 00028 -segG-- 00029 | | 00030 segE | | segC 00031 |________| 00032 segD 00033 */ 00034 00035 ( SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 0, offset=0 00036 (!SEGD+!SEGE+!SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = 1, offset=4 00037 ( SEGD+ SEGE+!SEGF+ SEGG) , (!SEGC+ SEGB+ SEGA) ,//Char = 2, offset=8 00038 ( SEGD+!SEGE+!SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 3, offset=12 00039 (!SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = 4, offset=16 00040 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = 5, offset=20 00041 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = 6, offset=24 00042 (!SEGD+!SEGE+!SEGF+!SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 7, offset=28 00043 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 8, offset=32 00044 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 9, offset=36 00045 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = :, offset=40 00046 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = ;, offset=44 00047 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = <, offset=48 00048 ( SEGD+!SEGE+!SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = =, offset=52 00049 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = >, offset=56 00050 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = ?, offset=60 00051 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = @, offset=64 00052 (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = A, offset=68 00053 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = B, offset=72 00054 ( SEGD+ SEGE+ SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = C, offset=76 00055 ( SEGD+ SEGE+!SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = D, offset=80 00056 ( SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = E, offset=84 00057 (!SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = F, offset=88 00058 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = G, offset=92 00059 (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = H, offset=96 00060 (!SEGD+!SEGE+!SEGF+!SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = I, offset=100 00061 ( SEGD+ SEGE+!SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = J, offset=104 00062 (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = K, offset=108 00063 ( SEGD+ SEGE+ SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = L, offset=112 00064 (!SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = M, offset=116 00065 (!SEGD+ SEGE+!SEGF+ SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = N, offset=120 00066 ( SEGD+ SEGE+!SEGF+ SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = O, offset=124 00067 (!SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+ SEGB+ SEGA) ,//Char = P, offset=128 00068 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = Q, offset=132 00069 (!SEGD+ SEGE+!SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = R, offset=136 00070 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = S, offset=140 00071 ( SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = T, offset=144 00072 ( SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = U, offset=148 00073 ( SEGD+ SEGE+!SEGF+!SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = V, offset=152 00074 ( SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = W, offset=156 00075 (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = X, offset=160 00076 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = Y, offset=164 00077 ( SEGD+!SEGE+!SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = Z, offset=168 00078 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = [, offset=172 00079 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = \, offset=176 00080 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = ], offset=180 00081 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = ^, offset=184 00082 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = _, offset=188 00083 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = `, offset=192 00084 }; 00085 00086 SLCD::SLCD() 00087 { 00088 init(); 00089 CharPosition = 0; 00090 } 00091 00092 void SLCD::init() 00093 { 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 00105 //Check if the Fast reference has its divide by 2 enabled (default): 00106 if ((MCG->SC & MCG_SC_FCRDIV_MASK) != 1<<1) 00107 error("Invalid clock configuration for SLCD\n"); 00108 LCD->GCR = 0x0; 00109 LCD->AR = 0x0; 00110 00111 // LCD configurartion 00112 LCD->GCR = ( LCD_GCR_RVEN_MASK*_LCDRVEN 00113 | LCD_GCR_RVTRIM(_LCDRVTRIM) //0-15 00114 | LCD_GCR_CPSEL_MASK*_LCDCPSEL 00115 | LCD_GCR_LADJ(_LCDLOADADJUST) //0-3 00116 | LCD_GCR_VSUPPLY_MASK*_LCDSUPPLY //0-1 00117 |!LCD_GCR_FDCIEN_MASK 00118 | LCD_GCR_ALTDIV(1) //divide by something 00119 |!LCD_GCR_LCDDOZE_MASK 00120 |!LCD_GCR_LCDSTP_MASK 00121 |!LCD_GCR_LCDEN_MASK //WILL BE ENABLE ON SUBSEQUENT STEP 00122 | LCD_GCR_SOURCE_MASK*1 00123 | LCD_GCR_ALTSOURCE_MASK*0 00124 | LCD_GCR_LCLK(0) //0-7 00125 | LCD_GCR_DUTY(_LCDDUTY) //0-7 00126 ); 00127 uint8_t i; 00128 uint32_t *p_pen; 00129 uint8_t pen_offset; // 0 or 1 00130 uint8_t pen_bit; // 0 to 31 00131 LCD->PEN[0] = 0x0; 00132 LCD->PEN[1] = 0x0; 00133 LCD->BPEN[0] = 0x0; 00134 LCD->BPEN[1] = 0x0; 00135 p_pen = (uint32_t *)&LCD->PEN[0]; 00136 for (i=0; i<_LCDUSEDPINS; i++) { 00137 pen_offset = WF_ORDERING_TABLE[i]/32; 00138 pen_bit = WF_ORDERING_TABLE[i]%32; 00139 p_pen[pen_offset] |= 1 << pen_bit; 00140 if (i>= _LCDFRONTPLANES) { // Pin is a backplane 00141 p_pen[pen_offset+2] |= 1 << pen_bit; // Enable BPEN 00142 LCD->WF8B[(uint8_t)WF_ORDERING_TABLE[i]] = 1 << (i - _LCDFRONTPLANES); // fill with 0x01, 0x02, etc 00143 } 00144 } 00145 LCD->GCR |= LCD_GCR_LCDEN_MASK; 00146 } 00147 00148 int SLCD::_putc(int c) 00149 { 00150 Write_Char(c); 00151 return 0; 00152 } 00153 00154 void SLCD::Write_Char (char lbValue) 00155 { 00156 if (CharPosition >= _CHARNUM) 00157 CharPosition = 0; 00158 00159 if (lbValue == '.') { 00160 // Use built-in dot 00161 DP(CharPosition-1, true); 00162 return; 00163 } 00164 00165 uint8_t char_val; 00166 uint8_t temp; 00167 uint8_t *lbpLCDWF; 00168 uint8_t lbCounter; 00169 uint16_t arrayOffset; 00170 uint8_t position; 00171 00172 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00173 /* only ascii character if value not writeable write as @ */ 00174 if (lbValue>='a' && lbValue<='z') { 00175 lbValue -= 32; // UpperCase 00176 } 00177 if (lbValue<ASCCI_TABLE_START || lbValue >ASCCI_TABLE_END) { 00178 lbValue = BLANK_CHARACTER; // default value as space 00179 } 00180 lbValue -=ASCCI_TABLE_START; // Remove the offset to search in the ascci table 00181 arrayOffset = (lbValue * _CHAR_SIZE); // Compensate matrix offset 00182 // ensure bLCD position is in valid limit 00183 lbCounter = 0; //number of writings to complete one char 00184 while (lbCounter<_CHAR_SIZE) { 00185 position = (CharPosition) *_LCDTYPE + lbCounter; 00186 temp=0; 00187 if (lbCounter==1) { 00188 temp = lbpLCDWF[WF_ORDERING_TABLE[position]] & 0x01;//bit 0 has the special symbol information 00189 } 00190 char_val = ASCII_TO_WF_CODIFICATION_TABLE[arrayOffset + lbCounter]; 00191 lbpLCDWF[WF_ORDERING_TABLE[position]] = char_val | temp; 00192 // if (char_val==0) lbCounter = _CHAR_SIZE; //end of this character 00193 lbCounter++; 00194 } 00195 CharPosition++; 00196 } 00197 00198 void SLCD::Home() 00199 { 00200 CharPosition = 0; 00201 } 00202 00203 void SLCD::Contrast (uint8_t lbContrast) 00204 { 00205 lbContrast &= 0x0F; //Forced to the only values accepted 00206 LCD->GCR |= LCD_GCR_RVTRIM(lbContrast); 00207 } 00208 00209 void SLCD::clear() 00210 { 00211 All_Segments(0); 00212 } 00213 00214 void SLCD::All_Segments (int mode) 00215 { 00216 uint8_t lbTotalBytes = _CHARNUM * _LCDTYPE; 00217 uint8_t lbCounter=0; 00218 uint8_t *lbpLCDWF; 00219 00220 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00221 while (lbCounter < lbTotalBytes) { 00222 if (mode==1) { 00223 lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[lbCounter++]]=_ALLON; 00224 } else { 00225 lbpLCDWF[WF_ORDERING_TABLE[lbCounter++]]=0; 00226 } 00227 } 00228 } 00229 00230 void SLCD::DP(int pos, bool on) 00231 { 00232 uint8_t *lbpLCDWF; 00233 int tableLoc; 00234 switch (pos) { 00235 case 0: 00236 tableLoc = 1; 00237 break; 00238 case 1: 00239 tableLoc = 3; 00240 break; 00241 case 2: 00242 tableLoc = 5; 00243 break; 00244 default: 00245 return; // Bad position 00246 } 00247 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00248 if (on) { 00249 lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[tableLoc]]|=1; 00250 } else { 00251 lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[tableLoc]]&=~1; 00252 } 00253 } 00254 00255 void SLCD::DP1 (int mode) 00256 { 00257 DP(0, mode==1); 00258 } 00259 00260 void SLCD::DP2 (int mode) 00261 { 00262 DP(1, mode==1); 00263 } 00264 00265 void SLCD::DP3 (int mode) 00266 { 00267 DP(2, mode==1); 00268 } 00269 00270 void SLCD::Colon (bool on) 00271 { 00272 uint8_t *lbpLCDWF; 00273 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00274 if (on) { 00275 lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[7]]|=1; 00276 } else { 00277 lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[7]]&=~1; 00278 } 00279 } 00280 00281 void SLCD::blink(int blink) 00282 { 00283 if (( blink > 7) || (blink < 0)) 00284 LCD->AR &= ~LCD_AR_BLINK_MASK; 00285 else 00286 LCD->AR |= LCD_AR_BLINK_MASK | blink; 00287 } 00288 00289 void SLCD::deepsleepEnable(bool enable) 00290 { 00291 MCG->C1 &= ~MCG_C1_IREFSTEN_MASK; 00292 MCG->C1 |= enable << MCG_C1_IREFSTEN_SHIFT; 00293 LCD->GCR &= ~LCD_GCR_LCDSTP_MASK; 00294 LCD->GCR |= (!enable) << LCD_GCR_LCDSTP_SHIFT; 00295 }
Generated on Fri Jul 15 2022 12:15:37 by
1.7.2