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 { 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::clear() 00198 { 00199 All_Segments(0); 00200 } 00201 00202 void SLCD::All_Segments (int mode) 00203 { 00204 uint8_t lbTotalBytes = _CHARNUM * _LCDTYPE; 00205 uint8_t lbCounter=0; 00206 uint8_t *lbpLCDWF; 00207 00208 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00209 while (lbCounter < lbTotalBytes) 00210 { 00211 if (mode==1){lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[lbCounter++]]=_ALLON;} 00212 else {lbpLCDWF[WF_ORDERING_TABLE[lbCounter++]]=0;} 00213 } 00214 } 00215 00216 void SLCD::DP1 (int mode) 00217 { 00218 uint8_t *lbpLCDWF; 00219 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00220 if (mode==1){lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[1]]|=1;} 00221 else {lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[1]]&=~1;} 00222 } 00223 00224 void SLCD::DP2 (int mode) 00225 { 00226 uint8_t *lbpLCDWF; 00227 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00228 if (mode==1){lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[3]]|=1;} 00229 else {lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[3]]&=~1;} 00230 } 00231 00232 void SLCD::DP3 (int mode) 00233 { 00234 uint8_t *lbpLCDWF; 00235 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00236 if (mode==1){lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[5]]|=1;} 00237 else {lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[5]]&=~1;} 00238 } 00239 00240 void SLCD::Colon (int mode) 00241 { 00242 uint8_t *lbpLCDWF; 00243 lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; 00244 if (mode==1){lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[7]]|=1;} 00245 else {lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[7]]&=~1;} 00246 } 00247 00248
Generated on Wed Jul 13 2022 15:20:02 by
