-nil-
Fork of SLCD by
SLCD.cpp@13:30f772d89c50, 2014-10-02 (annotated)
- Committer:
- salemtang
- Date:
- Thu Oct 02 13:14:49 2014 +0000
- Revision:
- 13:30f772d89c50
- Parent:
- 12:2470cab680b7
20141002_2215 modified
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
salemtang | 12:2470cab680b7 | 1 | /** |
salemtang | 12:2470cab680b7 | 2 | * @file SLCD.cpp |
salemtang | 12:2470cab680b7 | 3 | * @brief Abstract |
salemtang | 12:2470cab680b7 | 4 | * @copyright (c) |
salemtang | 12:2470cab680b7 | 5 | */ |
salemtang | 12:2470cab680b7 | 6 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 7 | // note |
salemtang | 12:2470cab680b7 | 8 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 9 | |
salemtang | 12:2470cab680b7 | 10 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 11 | // include files |
salemtang | 12:2470cab680b7 | 12 | // ----------------------------------------------------------------------------- |
Sissors | 0:d04758e76d5b | 13 | #include "SLCD.h" |
star297 | 1:1579bcd31410 | 14 | #include "LCDconfig.h" |
Sissors | 0:d04758e76d5b | 15 | |
salemtang | 12:2470cab680b7 | 16 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 17 | // general define |
salemtang | 12:2470cab680b7 | 18 | // ----------------------------------------------------------------------------- |
Sissors | 0:d04758e76d5b | 19 | |
salemtang | 12:2470cab680b7 | 20 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 21 | // struct define |
salemtang | 12:2470cab680b7 | 22 | // ----------------------------------------------------------------------------- |
Tomo2k | 6:f4773221794b | 23 | const uint8_t WF_ORDERING_TABLE[ ] = { |
Tomo2k | 6:f4773221794b | 24 | CHAR1a, // LCD81 --- Pin:5 LCDnAddress=51 |
Tomo2k | 6:f4773221794b | 25 | CHAR1b, // LCD82 --- Pin:6 LCDnAddress=52 |
Tomo2k | 6:f4773221794b | 26 | CHAR2a, // LCD83 --- Pin:7 LCDnAddress=53 |
Tomo2k | 6:f4773221794b | 27 | CHAR2b, // LCD84 --- Pin:8 LCDnAddress=54 |
Tomo2k | 6:f4773221794b | 28 | CHAR3a, // LCD85 --- Pin:9 LCDnAddress=55 |
Tomo2k | 6:f4773221794b | 29 | CHAR3b, // LCD86 --- Pin:10 LCDnAddress=56 |
Tomo2k | 6:f4773221794b | 30 | CHAR4a, // LCD87 --- Pin:11 LCDnAddress=57 |
Tomo2k | 6:f4773221794b | 31 | CHAR4b, // LCD88 --- Pin:12 LCDnAddress=58 |
Tomo2k | 6:f4773221794b | 32 | CHARCOM0, // LCD77 --- Pin:1 LCDnAddress=4D |
Tomo2k | 6:f4773221794b | 33 | CHARCOM1, // LCD78 --- Pin:2 LCDnAddress=4E |
Tomo2k | 6:f4773221794b | 34 | CHARCOM2, // LCD79 --- Pin:3 LCDnAddress=4F |
Tomo2k | 6:f4773221794b | 35 | CHARCOM3, // LCD80 --- Pin:4 LCDnAddress=50 |
Sissors | 0:d04758e76d5b | 36 | }; |
Sissors | 0:d04758e76d5b | 37 | |
Tomo2k | 6:f4773221794b | 38 | const char ASCII_TO_WF_CODIFICATION_TABLE [ ] = { |
Tomo2k | 6:f4773221794b | 39 | |
Tomo2k | 6:f4773221794b | 40 | /* |
Tomo2k | 6:f4773221794b | 41 | segA |
Tomo2k | 6:f4773221794b | 42 | ________ |
Tomo2k | 6:f4773221794b | 43 | | | |
Tomo2k | 6:f4773221794b | 44 | segF | | segB |
Tomo2k | 6:f4773221794b | 45 | | | |
Tomo2k | 6:f4773221794b | 46 | -segG-- |
Tomo2k | 6:f4773221794b | 47 | | | |
Tomo2k | 6:f4773221794b | 48 | segE | | segC |
Tomo2k | 6:f4773221794b | 49 | |________| |
Tomo2k | 6:f4773221794b | 50 | segD |
Tomo2k | 6:f4773221794b | 51 | */ |
Tomo2k | 6:f4773221794b | 52 | |
Tomo2k | 6:f4773221794b | 53 | ( SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 0, offset=0 |
Tomo2k | 6:f4773221794b | 54 | (!SEGD+!SEGE+!SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = 1, offset=4 |
Tomo2k | 6:f4773221794b | 55 | ( SEGD+ SEGE+!SEGF+ SEGG) , (!SEGC+ SEGB+ SEGA) ,//Char = 2, offset=8 |
Tomo2k | 6:f4773221794b | 56 | ( SEGD+!SEGE+!SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 3, offset=12 |
Tomo2k | 6:f4773221794b | 57 | (!SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = 4, offset=16 |
Tomo2k | 6:f4773221794b | 58 | ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = 5, offset=20 |
Tomo2k | 6:f4773221794b | 59 | ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = 6, offset=24 |
Tomo2k | 6:f4773221794b | 60 | (!SEGD+!SEGE+!SEGF+!SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 7, offset=28 |
Tomo2k | 6:f4773221794b | 61 | ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 8, offset=32 |
Tomo2k | 6:f4773221794b | 62 | ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = 9, offset=36 |
Tomo2k | 6:f4773221794b | 63 | (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = :, offset=40 |
Tomo2k | 6:f4773221794b | 64 | (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = ;, offset=44 |
Tomo2k | 6:f4773221794b | 65 | (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = <, offset=48 |
Tomo2k | 6:f4773221794b | 66 | ( SEGD+!SEGE+!SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = =, offset=52 |
Tomo2k | 6:f4773221794b | 67 | (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = >, offset=56 |
Tomo2k | 6:f4773221794b | 68 | (!SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = ?, offset=60 |
Tomo2k | 6:f4773221794b | 69 | ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = @, offset=64 |
Tomo2k | 6:f4773221794b | 70 | (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = A, offset=68 |
Tomo2k | 6:f4773221794b | 71 | ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = B, offset=72 |
Tomo2k | 6:f4773221794b | 72 | ( SEGD+ SEGE+ SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = C, offset=76 |
Tomo2k | 6:f4773221794b | 73 | ( SEGD+ SEGE+!SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = D, offset=80 |
Tomo2k | 6:f4773221794b | 74 | ( SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = E, offset=84 |
Tomo2k | 6:f4773221794b | 75 | (!SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = F, offset=88 |
Tomo2k | 6:f4773221794b | 76 | ( SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = G, offset=92 |
Tomo2k | 6:f4773221794b | 77 | (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = H, offset=96 |
Tomo2k | 6:f4773221794b | 78 | (!SEGD+!SEGE+!SEGF+!SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = I, offset=100 |
Tomo2k | 6:f4773221794b | 79 | ( SEGD+ SEGE+!SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = J, offset=104 |
Tomo2k | 6:f4773221794b | 80 | (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = K, offset=108 |
Tomo2k | 6:f4773221794b | 81 | ( SEGD+ SEGE+ SEGF+!SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = L, offset=112 |
Tomo2k | 6:f4773221794b | 82 | (!SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = M, offset=116 |
Tomo2k | 6:f4773221794b | 83 | (!SEGD+ SEGE+!SEGF+ SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = N, offset=120 |
Tomo2k | 6:f4773221794b | 84 | ( SEGD+ SEGE+!SEGF+ SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = O, offset=124 |
Tomo2k | 6:f4773221794b | 85 | (!SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+ SEGB+ SEGA) ,//Char = P, offset=128 |
Tomo2k | 6:f4773221794b | 86 | ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+ SEGA) ,//Char = Q, offset=132 |
Tomo2k | 6:f4773221794b | 87 | (!SEGD+ SEGE+!SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = R, offset=136 |
Tomo2k | 6:f4773221794b | 88 | ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+!SEGB+ SEGA) ,//Char = S, offset=140 |
Tomo2k | 6:f4773221794b | 89 | ( SEGD+ SEGE+ SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = T, offset=144 |
Tomo2k | 6:f4773221794b | 90 | ( SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = U, offset=148 |
Tomo2k | 6:f4773221794b | 91 | ( SEGD+ SEGE+!SEGF+!SEGG) , ( SEGC+!SEGB+!SEGA) ,//Char = V, offset=152 |
Tomo2k | 6:f4773221794b | 92 | ( SEGD+ SEGE+ SEGF+!SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = W, offset=156 |
Tomo2k | 6:f4773221794b | 93 | (!SEGD+ SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = X, offset=160 |
Tomo2k | 6:f4773221794b | 94 | ( SEGD+!SEGE+ SEGF+ SEGG) , ( SEGC+ SEGB+!SEGA) ,//Char = Y, offset=164 |
Tomo2k | 6:f4773221794b | 95 | ( SEGD+!SEGE+!SEGF+ SEGG) , (!SEGC+!SEGB+!SEGA) ,//Char = Z, offset=168 |
Tomo2k | 6:f4773221794b | 96 | ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = [, offset=172 |
Tomo2k | 6:f4773221794b | 97 | ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = \, offset=176 |
Tomo2k | 6:f4773221794b | 98 | ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = ], offset=180 |
Tomo2k | 6:f4773221794b | 99 | ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = ^, offset=184 |
Tomo2k | 6:f4773221794b | 100 | ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = _, offset=188 |
Tomo2k | 6:f4773221794b | 101 | ( SEGD+!SEGE+!SEGF+!SEGG) , (!SEGC+!SEGB+ SEGA) ,//Char = `, offset=192 |
Sissors | 0:d04758e76d5b | 102 | }; |
Sissors | 0:d04758e76d5b | 103 | |
salemtang | 12:2470cab680b7 | 104 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 105 | // external function |
salemtang | 12:2470cab680b7 | 106 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 107 | |
salemtang | 12:2470cab680b7 | 108 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 109 | // function prototype |
salemtang | 12:2470cab680b7 | 110 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 111 | |
salemtang | 12:2470cab680b7 | 112 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 113 | // external variable |
salemtang | 12:2470cab680b7 | 114 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 115 | |
salemtang | 12:2470cab680b7 | 116 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 117 | // global variable |
salemtang | 12:2470cab680b7 | 118 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 119 | |
salemtang | 12:2470cab680b7 | 120 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 121 | // function |
salemtang | 12:2470cab680b7 | 122 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 123 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 124 | //! @brief SLCD Main Function |
salemtang | 12:2470cab680b7 | 125 | //! @param [in] nil |
salemtang | 12:2470cab680b7 | 126 | //! @retval nil |
salemtang | 12:2470cab680b7 | 127 | // ----------------------------------------------------------------------------- |
Tomo2k | 6:f4773221794b | 128 | SLCD::SLCD() |
Tomo2k | 6:f4773221794b | 129 | { |
Sissors | 0:d04758e76d5b | 130 | init(); |
Tomo2k | 6:f4773221794b | 131 | CharPosition = 0; |
star297 | 1:1579bcd31410 | 132 | } |
Sissors | 0:d04758e76d5b | 133 | |
salemtang | 12:2470cab680b7 | 134 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 135 | //! @brief Initialize Setting |
salemtang | 12:2470cab680b7 | 136 | //! @param [in] nil |
salemtang | 12:2470cab680b7 | 137 | //! @retval nil |
salemtang | 12:2470cab680b7 | 138 | // ----------------------------------------------------------------------------- |
Tomo2k | 6:f4773221794b | 139 | void SLCD::init() |
Tomo2k | 6:f4773221794b | 140 | { |
Sissors | 0:d04758e76d5b | 141 | SIM->SCGC5 |= SIM_SCGC5_SLCD_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK; |
Tomo2k | 6:f4773221794b | 142 | |
Tomo2k | 6:f4773221794b | 143 | // configure pins for LCD operation |
Tomo2k | 6:f4773221794b | 144 | PORTC->PCR[20] = 0x00000000; //VLL2 |
Tomo2k | 6:f4773221794b | 145 | PORTC->PCR[21] = 0x00000000; //VLL1 |
Tomo2k | 6:f4773221794b | 146 | PORTC->PCR[22] = 0x00000000; //VCAP2 |
Tomo2k | 6:f4773221794b | 147 | PORTC->PCR[23] = 0x00000000; //VCAP1 |
Tomo2k | 6:f4773221794b | 148 | // Enable IRCLK |
Tomo2k | 6:f4773221794b | 149 | MCG->C1 |= MCG_C1_IRCLKEN_MASK | MCG_C1_IREFSTEN_MASK; |
Tomo2k | 6:f4773221794b | 150 | MCG->C2 |= MCG_C2_IRCS_MASK ; //0 32KHZ internal reference clock; 1= 4MHz irc |
Sissors | 4:ec7b3c9b2aeb | 151 | |
Tomo2k | 6:f4773221794b | 152 | //Check if the Fast reference has its divide by 2 enabled (default): |
Tomo2k | 6:f4773221794b | 153 | if ((MCG->SC & MCG_SC_FCRDIV_MASK) != 1<<1) |
Tomo2k | 6:f4773221794b | 154 | error("Invalid clock configuration for SLCD\n"); |
Tomo2k | 6:f4773221794b | 155 | LCD->GCR = 0x0; |
Tomo2k | 6:f4773221794b | 156 | LCD->AR = 0x0; |
Tomo2k | 6:f4773221794b | 157 | |
Tomo2k | 6:f4773221794b | 158 | // LCD configurartion |
Tomo2k | 6:f4773221794b | 159 | LCD->GCR = ( LCD_GCR_RVEN_MASK*_LCDRVEN |
star297 | 1:1579bcd31410 | 160 | | LCD_GCR_RVTRIM(_LCDRVTRIM) //0-15 |
Tomo2k | 6:f4773221794b | 161 | | LCD_GCR_CPSEL_MASK*_LCDCPSEL |
star297 | 1:1579bcd31410 | 162 | | LCD_GCR_LADJ(_LCDLOADADJUST) //0-3 |
star297 | 1:1579bcd31410 | 163 | | LCD_GCR_VSUPPLY_MASK*_LCDSUPPLY //0-1 |
Sissors | 0:d04758e76d5b | 164 | |!LCD_GCR_FDCIEN_MASK |
Sissors | 4:ec7b3c9b2aeb | 165 | | LCD_GCR_ALTDIV(1) //divide by something |
Tomo2k | 6:f4773221794b | 166 | |!LCD_GCR_LCDDOZE_MASK |
Sissors | 0:d04758e76d5b | 167 | |!LCD_GCR_LCDSTP_MASK |
star297 | 1:1579bcd31410 | 168 | |!LCD_GCR_LCDEN_MASK //WILL BE ENABLE ON SUBSEQUENT STEP |
Sissors | 4:ec7b3c9b2aeb | 169 | | LCD_GCR_SOURCE_MASK*1 |
Tomo2k | 6:f4773221794b | 170 | | LCD_GCR_ALTSOURCE_MASK*0 |
Sissors | 4:ec7b3c9b2aeb | 171 | | LCD_GCR_LCLK(0) //0-7 |
Sissors | 0:d04758e76d5b | 172 | | LCD_GCR_DUTY(_LCDDUTY) //0-7 |
Tomo2k | 6:f4773221794b | 173 | ); |
Tomo2k | 6:f4773221794b | 174 | uint8_t i; |
Tomo2k | 6:f4773221794b | 175 | uint32_t *p_pen; |
Tomo2k | 6:f4773221794b | 176 | uint8_t pen_offset; // 0 or 1 |
Tomo2k | 6:f4773221794b | 177 | uint8_t pen_bit; // 0 to 31 |
Tomo2k | 6:f4773221794b | 178 | LCD->PEN[0] = 0x0; |
Tomo2k | 6:f4773221794b | 179 | LCD->PEN[1] = 0x0; |
Tomo2k | 6:f4773221794b | 180 | LCD->BPEN[0] = 0x0; |
Tomo2k | 6:f4773221794b | 181 | LCD->BPEN[1] = 0x0; |
Tomo2k | 6:f4773221794b | 182 | p_pen = (uint32_t *)&LCD->PEN[0]; |
Tomo2k | 6:f4773221794b | 183 | for (i=0; i<_LCDUSEDPINS; i++) { |
Tomo2k | 6:f4773221794b | 184 | pen_offset = WF_ORDERING_TABLE[i]/32; |
Tomo2k | 6:f4773221794b | 185 | pen_bit = WF_ORDERING_TABLE[i]%32; |
Tomo2k | 6:f4773221794b | 186 | p_pen[pen_offset] |= 1 << pen_bit; |
Tomo2k | 6:f4773221794b | 187 | if (i>= _LCDFRONTPLANES) { // Pin is a backplane |
Tomo2k | 6:f4773221794b | 188 | p_pen[pen_offset+2] |= 1 << pen_bit; // Enable BPEN |
Tomo2k | 6:f4773221794b | 189 | LCD->WF8B[(uint8_t)WF_ORDERING_TABLE[i]] = 1 << (i - _LCDFRONTPLANES); // fill with 0x01, 0x02, etc |
Tomo2k | 6:f4773221794b | 190 | } |
Tomo2k | 6:f4773221794b | 191 | } |
Tomo2k | 6:f4773221794b | 192 | LCD->GCR |= LCD_GCR_LCDEN_MASK; |
star297 | 3:f70873bc6121 | 193 | } |
Sissors | 0:d04758e76d5b | 194 | |
salemtang | 12:2470cab680b7 | 195 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 196 | //! @brief Put Characters |
salemtang | 12:2470cab680b7 | 197 | //! @param [in] c integer |
salemtang | 12:2470cab680b7 | 198 | //! @retval int |
salemtang | 12:2470cab680b7 | 199 | // ----------------------------------------------------------------------------- |
Tomo2k | 6:f4773221794b | 200 | int SLCD::_putc(int c) |
Tomo2k | 6:f4773221794b | 201 | { |
star297 | 3:f70873bc6121 | 202 | Write_Char(c); |
star297 | 3:f70873bc6121 | 203 | return 0; |
star297 | 3:f70873bc6121 | 204 | } |
Sissors | 0:d04758e76d5b | 205 | |
salemtang | 12:2470cab680b7 | 206 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 207 | //! @brief Write Characters |
salemtang | 12:2470cab680b7 | 208 | //! @param [in] lbValue characters |
salemtang | 12:2470cab680b7 | 209 | //! @retval nil |
salemtang | 12:2470cab680b7 | 210 | // ----------------------------------------------------------------------------- |
Tomo2k | 6:f4773221794b | 211 | void SLCD::Write_Char (char lbValue) |
Tomo2k | 6:f4773221794b | 212 | { |
Tomo2k | 7:0e084b33d730 | 213 | if (CharPosition >= _CHARNUM) |
Tomo2k | 7:0e084b33d730 | 214 | CharPosition = 0; |
Tomo2k | 7:0e084b33d730 | 215 | |
Tomo2k | 7:0e084b33d730 | 216 | if (lbValue == '.') { |
Tomo2k | 7:0e084b33d730 | 217 | // Use built-in dot |
Tomo2k | 7:0e084b33d730 | 218 | DP(CharPosition-1, true); |
Tomo2k | 7:0e084b33d730 | 219 | return; |
Tomo2k | 7:0e084b33d730 | 220 | } |
Tomo2k | 7:0e084b33d730 | 221 | |
Tomo2k | 6:f4773221794b | 222 | uint8_t char_val; |
Tomo2k | 6:f4773221794b | 223 | uint8_t temp; |
Tomo2k | 6:f4773221794b | 224 | uint8_t *lbpLCDWF; |
Tomo2k | 6:f4773221794b | 225 | uint8_t lbCounter; |
Tomo2k | 6:f4773221794b | 226 | uint16_t arrayOffset; |
Tomo2k | 6:f4773221794b | 227 | uint8_t position; |
Tomo2k | 6:f4773221794b | 228 | |
Tomo2k | 6:f4773221794b | 229 | lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; |
Tomo2k | 6:f4773221794b | 230 | /* only ascii character if value not writeable write as @ */ |
Tomo2k | 6:f4773221794b | 231 | if (lbValue>='a' && lbValue<='z') { |
Tomo2k | 6:f4773221794b | 232 | lbValue -= 32; // UpperCase |
Tomo2k | 6:f4773221794b | 233 | } |
Tomo2k | 6:f4773221794b | 234 | if (lbValue<ASCCI_TABLE_START || lbValue >ASCCI_TABLE_END) { |
Tomo2k | 6:f4773221794b | 235 | lbValue = BLANK_CHARACTER; // default value as space |
Tomo2k | 6:f4773221794b | 236 | } |
Tomo2k | 6:f4773221794b | 237 | lbValue -=ASCCI_TABLE_START; // Remove the offset to search in the ascci table |
Tomo2k | 6:f4773221794b | 238 | arrayOffset = (lbValue * _CHAR_SIZE); // Compensate matrix offset |
Tomo2k | 6:f4773221794b | 239 | // ensure bLCD position is in valid limit |
Tomo2k | 6:f4773221794b | 240 | lbCounter = 0; //number of writings to complete one char |
Tomo2k | 6:f4773221794b | 241 | while (lbCounter<_CHAR_SIZE) { |
Tomo2k | 6:f4773221794b | 242 | position = (CharPosition) *_LCDTYPE + lbCounter; |
Tomo2k | 6:f4773221794b | 243 | temp=0; |
Tomo2k | 6:f4773221794b | 244 | if (lbCounter==1) { |
Tomo2k | 6:f4773221794b | 245 | temp = lbpLCDWF[WF_ORDERING_TABLE[position]] & 0x01;//bit 0 has the special symbol information |
Tomo2k | 6:f4773221794b | 246 | } |
Tomo2k | 6:f4773221794b | 247 | char_val = ASCII_TO_WF_CODIFICATION_TABLE[arrayOffset + lbCounter]; |
Tomo2k | 6:f4773221794b | 248 | lbpLCDWF[WF_ORDERING_TABLE[position]] = char_val | temp; |
Tomo2k | 6:f4773221794b | 249 | // if (char_val==0) lbCounter = _CHAR_SIZE; //end of this character |
Tomo2k | 6:f4773221794b | 250 | lbCounter++; |
Tomo2k | 6:f4773221794b | 251 | } |
Tomo2k | 6:f4773221794b | 252 | CharPosition++; |
Sissors | 0:d04758e76d5b | 253 | } |
Sissors | 0:d04758e76d5b | 254 | |
salemtang | 12:2470cab680b7 | 255 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 256 | //! @brief Set Home Position |
salemtang | 12:2470cab680b7 | 257 | //! @param [in] nil |
salemtang | 12:2470cab680b7 | 258 | //! @retval nil |
salemtang | 12:2470cab680b7 | 259 | // ----------------------------------------------------------------------------- |
Tomo2k | 10:ef2b3b7f1b01 | 260 | void SLCD::Home() |
Tomo2k | 6:f4773221794b | 261 | { |
Tomo2k | 6:f4773221794b | 262 | CharPosition = 0; |
Tomo2k | 6:f4773221794b | 263 | } |
star297 | 1:1579bcd31410 | 264 | |
salemtang | 12:2470cab680b7 | 265 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 266 | //! @brief Set Contrast |
salemtang | 12:2470cab680b7 | 267 | //! @param [in] lbContrast contrast |
salemtang | 12:2470cab680b7 | 268 | //! @retval nil |
salemtang | 12:2470cab680b7 | 269 | // ----------------------------------------------------------------------------- |
star297 | 3:f70873bc6121 | 270 | void SLCD::Contrast (uint8_t lbContrast) |
Tomo2k | 6:f4773221794b | 271 | { |
Tomo2k | 6:f4773221794b | 272 | lbContrast &= 0x0F; //Forced to the only values accepted |
Tomo2k | 6:f4773221794b | 273 | LCD->GCR |= LCD_GCR_RVTRIM(lbContrast); |
star297 | 1:1579bcd31410 | 274 | } |
Tomo2k | 6:f4773221794b | 275 | |
salemtang | 12:2470cab680b7 | 276 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 277 | //! @brief Clear Segments |
salemtang | 12:2470cab680b7 | 278 | //! @param [in] nil |
salemtang | 12:2470cab680b7 | 279 | //! @retval nil |
salemtang | 12:2470cab680b7 | 280 | // ----------------------------------------------------------------------------- |
Tomo2k | 7:0e084b33d730 | 281 | void SLCD::clear() |
Tomo2k | 7:0e084b33d730 | 282 | { |
Tomo2k | 7:0e084b33d730 | 283 | All_Segments(0); |
Tomo2k | 7:0e084b33d730 | 284 | } |
Tomo2k | 7:0e084b33d730 | 285 | |
salemtang | 12:2470cab680b7 | 286 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 287 | //! @brief Set Segments |
salemtang | 12:2470cab680b7 | 288 | //! @param [in] mode mode |
salemtang | 12:2470cab680b7 | 289 | //! @retval nil |
salemtang | 12:2470cab680b7 | 290 | // ----------------------------------------------------------------------------- |
star297 | 3:f70873bc6121 | 291 | void SLCD::All_Segments (int mode) |
star297 | 1:1579bcd31410 | 292 | { |
Tomo2k | 6:f4773221794b | 293 | uint8_t lbTotalBytes = _CHARNUM * _LCDTYPE; |
Tomo2k | 6:f4773221794b | 294 | uint8_t lbCounter=0; |
Tomo2k | 6:f4773221794b | 295 | uint8_t *lbpLCDWF; |
Tomo2k | 6:f4773221794b | 296 | |
Tomo2k | 6:f4773221794b | 297 | lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; |
Tomo2k | 6:f4773221794b | 298 | while (lbCounter < lbTotalBytes) { |
Tomo2k | 6:f4773221794b | 299 | if (mode==1) { |
Tomo2k | 6:f4773221794b | 300 | lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[lbCounter++]]=_ALLON; |
Tomo2k | 6:f4773221794b | 301 | } else { |
Tomo2k | 6:f4773221794b | 302 | lbpLCDWF[WF_ORDERING_TABLE[lbCounter++]]=0; |
Tomo2k | 6:f4773221794b | 303 | } |
Tomo2k | 6:f4773221794b | 304 | } |
star297 | 1:1579bcd31410 | 305 | } |
star297 | 1:1579bcd31410 | 306 | |
salemtang | 12:2470cab680b7 | 307 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 308 | //! @brief Set DP |
salemtang | 12:2470cab680b7 | 309 | //! @param [in] pos position |
salemtang | 12:2470cab680b7 | 310 | //! @param [in] on on |
salemtang | 12:2470cab680b7 | 311 | //! @retval nil |
salemtang | 12:2470cab680b7 | 312 | // ----------------------------------------------------------------------------- |
Tomo2k | 7:0e084b33d730 | 313 | void SLCD::DP(int pos, bool on) |
star297 | 1:1579bcd31410 | 314 | { |
Tomo2k | 6:f4773221794b | 315 | uint8_t *lbpLCDWF; |
Tomo2k | 7:0e084b33d730 | 316 | int tableLoc; |
Tomo2k | 7:0e084b33d730 | 317 | switch (pos) { |
Tomo2k | 7:0e084b33d730 | 318 | case 0: |
Tomo2k | 7:0e084b33d730 | 319 | tableLoc = 1; |
Tomo2k | 7:0e084b33d730 | 320 | break; |
Tomo2k | 7:0e084b33d730 | 321 | case 1: |
Tomo2k | 7:0e084b33d730 | 322 | tableLoc = 3; |
Tomo2k | 7:0e084b33d730 | 323 | break; |
Tomo2k | 7:0e084b33d730 | 324 | case 2: |
Tomo2k | 7:0e084b33d730 | 325 | tableLoc = 5; |
Tomo2k | 7:0e084b33d730 | 326 | break; |
Tomo2k | 7:0e084b33d730 | 327 | default: |
Tomo2k | 7:0e084b33d730 | 328 | return; // Bad position |
Tomo2k | 7:0e084b33d730 | 329 | } |
Tomo2k | 6:f4773221794b | 330 | lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; |
Tomo2k | 7:0e084b33d730 | 331 | if (on) { |
Tomo2k | 7:0e084b33d730 | 332 | lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[tableLoc]]|=1; |
Tomo2k | 6:f4773221794b | 333 | } else { |
Tomo2k | 7:0e084b33d730 | 334 | lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[tableLoc]]&=~1; |
Tomo2k | 6:f4773221794b | 335 | } |
star297 | 1:1579bcd31410 | 336 | } |
Tomo2k | 6:f4773221794b | 337 | |
salemtang | 12:2470cab680b7 | 338 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 339 | //! @brief Set DP1 |
salemtang | 12:2470cab680b7 | 340 | //! @param [in] mode mode |
salemtang | 12:2470cab680b7 | 341 | //! @retval nil |
salemtang | 12:2470cab680b7 | 342 | // ----------------------------------------------------------------------------- |
Tomo2k | 7:0e084b33d730 | 343 | void SLCD::DP1 (int mode) |
Tomo2k | 7:0e084b33d730 | 344 | { |
Tomo2k | 7:0e084b33d730 | 345 | DP(0, mode==1); |
Tomo2k | 7:0e084b33d730 | 346 | } |
Tomo2k | 7:0e084b33d730 | 347 | |
salemtang | 12:2470cab680b7 | 348 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 349 | //! @brief Set DP2 |
salemtang | 12:2470cab680b7 | 350 | //! @param [in] mode mode |
salemtang | 12:2470cab680b7 | 351 | //! @retval nil |
salemtang | 12:2470cab680b7 | 352 | // ----------------------------------------------------------------------------- |
star297 | 3:f70873bc6121 | 353 | void SLCD::DP2 (int mode) |
star297 | 1:1579bcd31410 | 354 | { |
Tomo2k | 7:0e084b33d730 | 355 | DP(1, mode==1); |
Tomo2k | 6:f4773221794b | 356 | } |
star297 | 1:1579bcd31410 | 357 | |
salemtang | 12:2470cab680b7 | 358 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 359 | //! @brief Set DP3 |
salemtang | 12:2470cab680b7 | 360 | //! @param [in] mode mode |
salemtang | 12:2470cab680b7 | 361 | //! @retval nil |
salemtang | 12:2470cab680b7 | 362 | // ----------------------------------------------------------------------------- |
star297 | 3:f70873bc6121 | 363 | void SLCD::DP3 (int mode) |
star297 | 1:1579bcd31410 | 364 | { |
Tomo2k | 7:0e084b33d730 | 365 | DP(2, mode==1); |
star297 | 1:1579bcd31410 | 366 | } |
Tomo2k | 6:f4773221794b | 367 | |
salemtang | 12:2470cab680b7 | 368 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 369 | //! @brief Set Colon |
salemtang | 12:2470cab680b7 | 370 | //! @param [in] on on |
salemtang | 12:2470cab680b7 | 371 | //! @retval nil |
salemtang | 12:2470cab680b7 | 372 | // ----------------------------------------------------------------------------- |
Tomo2k | 10:ef2b3b7f1b01 | 373 | void SLCD::Colon (bool on) |
star297 | 1:1579bcd31410 | 374 | { |
Tomo2k | 6:f4773221794b | 375 | uint8_t *lbpLCDWF; |
Tomo2k | 6:f4773221794b | 376 | lbpLCDWF = (uint8_t *)&LCD->WF8B[0]; |
Tomo2k | 10:ef2b3b7f1b01 | 377 | if (on) { |
Tomo2k | 6:f4773221794b | 378 | lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[7]]|=1; |
Tomo2k | 6:f4773221794b | 379 | } else { |
Tomo2k | 6:f4773221794b | 380 | lbpLCDWF[(uint8_t)WF_ORDERING_TABLE[7]]&=~1; |
Tomo2k | 6:f4773221794b | 381 | } |
star297 | 1:1579bcd31410 | 382 | } |
Tomo2k | 6:f4773221794b | 383 | |
salemtang | 12:2470cab680b7 | 384 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 385 | //! @brief Set Blink |
salemtang | 12:2470cab680b7 | 386 | //! @param [in] blink blink |
salemtang | 12:2470cab680b7 | 387 | //! @retval nil |
salemtang | 12:2470cab680b7 | 388 | // ----------------------------------------------------------------------------- |
Tomo2k | 6:f4773221794b | 389 | void SLCD::blink(int blink) |
Tomo2k | 6:f4773221794b | 390 | { |
Sissors | 4:ec7b3c9b2aeb | 391 | if (( blink > 7) || (blink < 0)) |
Sissors | 4:ec7b3c9b2aeb | 392 | LCD->AR &= ~LCD_AR_BLINK_MASK; |
Sissors | 4:ec7b3c9b2aeb | 393 | else |
Sissors | 4:ec7b3c9b2aeb | 394 | LCD->AR |= LCD_AR_BLINK_MASK | blink; |
Sissors | 4:ec7b3c9b2aeb | 395 | } |
Tomo2k | 6:f4773221794b | 396 | |
salemtang | 12:2470cab680b7 | 397 | // ----------------------------------------------------------------------------- |
salemtang | 12:2470cab680b7 | 398 | //! @brief Deep Sleep Enable |
salemtang | 12:2470cab680b7 | 399 | //! @param [in] enable enable |
salemtang | 12:2470cab680b7 | 400 | //! @retval nil |
salemtang | 12:2470cab680b7 | 401 | // ----------------------------------------------------------------------------- |
Tomo2k | 6:f4773221794b | 402 | void SLCD::deepsleepEnable(bool enable) |
Tomo2k | 6:f4773221794b | 403 | { |
Sissors | 4:ec7b3c9b2aeb | 404 | MCG->C1 &= ~MCG_C1_IREFSTEN_MASK; |
Sissors | 4:ec7b3c9b2aeb | 405 | MCG->C1 |= enable << MCG_C1_IREFSTEN_SHIFT; |
Sissors | 4:ec7b3c9b2aeb | 406 | LCD->GCR &= ~LCD_GCR_LCDSTP_MASK; |
Sissors | 4:ec7b3c9b2aeb | 407 | LCD->GCR |= (!enable) << LCD_GCR_LCDSTP_SHIFT; |
Sissors | 4:ec7b3c9b2aeb | 408 | } |