KBrat-SSD645-HW-8_1_SLCD
Fork of SLCD by
SLCD.cpp
- Committer:
- Sissors
- Date:
- 2014-01-26
- Revision:
- 2:6a5095c98da1
- Parent:
- 1:1579bcd31410
File content as of revision 2:6a5095c98da1:
#include "SLCD.h" #include "LCDconfig.h" const uint8_t WF_ORDERING_TABLE[ ] = { CHAR1a, // LCD81 --- Pin:5 LCDnAddress=51 CHAR1b, // LCD82 --- Pin:6 LCDnAddress=52 CHAR2a, // LCD83 --- Pin:7 LCDnAddress=53 CHAR2b, // LCD84 --- Pin:8 LCDnAddress=54 CHAR3a, // LCD85 --- Pin:9 LCDnAddress=55 CHAR3b, // LCD86 --- Pin:10 LCDnAddress=56 CHAR4a, // LCD87 --- Pin:11 LCDnAddress=57 CHAR4b, // LCD88 --- Pin:12 LCDnAddress=58 CHARCOM0, // LCD77 --- Pin:1 LCDnAddress=4D CHARCOM1, // LCD78 --- Pin:2 LCDnAddress=4E CHARCOM2, // LCD79 --- Pin:3 LCDnAddress=4F CHARCOM3, // LCD80 --- Pin:4 LCDnAddress=50 }; const char ASCII_TO_WF_CODIFICATION_TABLE [ ] = { /* segA ________ | | segF | | segB | | -segG-- | | segE | | segC |________| segD */ ( SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 0, offset=0 (!SEGD+!SEGE+!SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = 1, offset=4 ( SEGD+ SEGE+!SEGF+ SEGG) , (!SEGC+ SEGB+ SEGA) ,//Char = 2, offset=8 ( SEGD+!SEGE+!SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 3, offset=12 (!SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = 4, offset=16 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = 5, offset=20 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = 6, offset=24 (!SEGD+!SEGE+!SEGF+!SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 7, offset=28 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 8, offset=32 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 9, offset=36 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = :, offset=40 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = ;, offset=44 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = <, offset=48 ( SEGD+!SEGE+!SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = =, offset=52 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = >, offset=56 (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = ?, offset=60 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = @, offset=64 (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = A, offset=68 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = B, offset=72 ( SEGD+ SEGE+ SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = C, offset=76 ( SEGD+ SEGE+!SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = D, offset=80 ( SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = E, offset=84 (!SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = F, offset=88 ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = G, offset=92 (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = H, offset=96 (!SEGD+!SEGE+!SEGF+!SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = I, offset=100 ( SEGD+ SEGE+!SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = J, offset=104 (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = K, offset=108 ( SEGD+ SEGE+ SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = L, offset=112 (!SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = M, offset=116 (!SEGD+ SEGE+!SEGF+ SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = N, offset=120 ( SEGD+ SEGE+!SEGF+ SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = O, offset=124 (!SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+ SEGB+ SEGA) ,//Char = P, offset=128 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = Q, offset=132 (!SEGD+ SEGE+!SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = R, offset=136 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = S, offset=140 ( SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = T, offset=144 ( SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = U, offset=148 ( SEGD+ SEGE+!SEGF+!SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = V, offset=152 ( SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = W, offset=156 (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = X, offset=160 ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = Y, offset=164 ( SEGD+!SEGE+!SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = Z, offset=168 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = [, offset=172 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = \, offset=176 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = ], offset=180 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = ^, offset=184 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = _, offset=188 ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = `, offset=192 }; SLCD::SLCD() { init(); bLCD_CharPosition = 0; } int SLCD::_putc(int c) { LCD_Write_Char(c); return 0; } void SLCD::init(){ SIM->SCGC5 |= SIM_SCGC5_SLCD_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK; // configure pins for LCD operation PORTC->PCR[20] = 0x00000000; //VLL2 PORTC->PCR[21] = 0x00000000; //VLL1 PORTC->PCR[22] = 0x00000000; //VCAP2 PORTC->PCR[23] = 0x00000000; //VCAP1 // Enable IRCLK MCG->C1 = MCG_C1_IRCLKEN_MASK | MCG_C1_IREFSTEN_MASK; MCG->C2 &= ~MCG_C2_IRCS_MASK ; //0 32KHZ internal reference clock; 1= 4MHz irc LCD->GCR = 0x0; LCD->AR = 0x0; // LCD configurartion according to */ LCD->GCR = ( LCD_GCR_RVEN_MASK*_LCDRVEN | LCD_GCR_RVTRIM(_LCDRVTRIM) //0-15 | LCD_GCR_CPSEL_MASK*_LCDCPSEL | LCD_GCR_LADJ(_LCDLOADADJUST) //0-3 | LCD_GCR_VSUPPLY_MASK*_LCDSUPPLY //0-1 |!LCD_GCR_FDCIEN_MASK | LCD_GCR_ALTDIV(_LCDALTDIV) //0-3 |!LCD_GCR_LCDDOZE_MASK |!LCD_GCR_LCDSTP_MASK |!LCD_GCR_LCDEN_MASK //WILL BE ENABLE ON SUBSEQUENT STEP | LCD_GCR_SOURCE_MASK*_LCDCLKSOURCE | LCD_GCR_ALTSOURCE_MASK*_LCDALRCLKSOURCE | LCD_GCR_LCLK(_LCDLCK) //0-7 | LCD_GCR_DUTY(_LCDDUTY) //0-7 ); EnablePins(); // Enable LCD pins and Configure BackPlanes LCD->GCR |= LCD_GCR_LCDEN_MASK; } void SLCD::EnablePins (void) { uint8_t i; uint32_t *p_pen; uint8_t pen_offset; // 0 or 1 uint8_t pen_bit; // 0 to 31 LCD->PEN[0] = 0x0; LCD->PEN[1] = 0x0; LCD->BPEN[0] = 0x0; LCD->BPEN[1] = 0x0; p_pen = (uint32_t *)&LCD->PEN[0]; for (i=0;i<_LCDUSEDPINS;i++) { pen_offset = WF_ORDERING_TABLE[i]/32; pen_bit = WF_ORDERING_TABLE[i]%32; p_pen[pen_offset] |= 1 << pen_bit; if (i>= _LCDFRONTPLANES) // Pin is a backplane { p_pen[pen_offset+2] |= 1 << pen_bit; // Enable BPEN LCD->WF8B[(uint8_t)WF_ORDERING_TABLE[i]] = 1 << (i - _LCDFRONTPLANES); // fill with 0x01, 0x02, etc } } } void SLCD::LCD_Write_Char (char lbValue) { uint8_t char_val; uint8_t temp; uint8_t *lbpLCDWF; uint8_t lbCounter; uint16_t arrayOffset; uint8_t position; if (bLCD_CharPosition >= _CHARNUM) bLCD_CharPosition = 0; lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; /* only ascii character if value not writeable write as @ */ if (lbValue>='a' && lbValue<='z') { lbValue -= 32; // UpperCase } if (lbValue<ASCCI_TABLE_START || lbValue >ASCCI_TABLE_END) { lbValue = BLANK_CHARACTER; // default value as space } lbValue -=ASCCI_TABLE_START; // Remove the offset to search in the ascci table arrayOffset = (lbValue * _CHAR_SIZE); // Compensate matrix offset // ensure bLCD position is in valid limit lbCounter = 0; //number of writings to complete one char while (lbCounter<_CHAR_SIZE) { position = (bLCD_CharPosition) *_LCDTYPE + lbCounter; temp=0; if (lbCounter==1) { temp = lbpLCDWF[WF_ORDERING_TABLE[position]] & 0x01;//bit 0 has the special symbol information } char_val = ASCII_TO_WF_CODIFICATION_TABLE[arrayOffset + lbCounter]; lbpLCDWF[WF_ORDERING_TABLE[position]] = char_val | temp; // if (char_val==0) lbCounter = _CHAR_SIZE; //end of this character lbCounter++; } bLCD_CharPosition++; } /* Fill Backplanes with normal mask for 0x01, 0x02, according to BP_ORDERING_TABLE;*/ void SLCD::SetBackplanes(void) { uint8_t i; for (i=0;i<_LCDBACKPLANES;i++) { LCD->WF8B[(uint8_t)WF_ORDERING_TABLE[i+_LCDFRONTPLANES]] = 0x01<<i; } } void SLCD::LCD_Home (void) { bLCD_CharPosition = 0; } void SLCD::LCD_Contrast (uint8_t lbContrast) { lbContrast &= 0x0F; //Forced to the only values accepted LCD->GCR |= LCD_GCR_RVTRIM(lbContrast); } void SLCD::LCD_All_Segments_ON (void) { uint8_t lbTotalBytes = _CHARNUM * _LCDTYPE; uint8_t lbCounter=0; uint8_t *lbpLCDWF; lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; while (lbCounter < lbTotalBytes) { lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[lbCounter++]]=_ALLON; } } void SLCD::LCD_All_Segments_OFF (void) { uint8_t lbTotalBytes = _CHARNUM * _LCDTYPE; uint8_t lbCounter=0; uint8_t *lbpLCDWF; lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; while (lbCounter < lbTotalBytes) { lbpLCDWF[WF_ORDERING_TABLE[lbCounter++]]=0; } } void SLCD::DP1_ON (void) { uint8_t *lbpLCDWF; lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[1]]|=1; } void SLCD::DP1_OFF (void) { uint8_t *lbpLCDWF; lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[1]]&=~1; } void SLCD::DP2_ON (void) { uint8_t *lbpLCDWF; lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[3]]|=1; } void SLCD::DP2_OFF (void) { uint8_t *lbpLCDWF; lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[3]]&=~1; } void SLCD::DP3_ON (void) { uint8_t *lbpLCDWF; lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[5]]|=1; } void SLCD::DP3_OFF (void) { uint8_t *lbpLCDWF; lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[5]]&=~1; } void SLCD::COLON_ON (void) { uint8_t *lbpLCDWF; lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[7]]|=1; } void SLCD::COLON_OFF (void) { uint8_t *lbpLCDWF; lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[7]]&=~1; }