16 #ifdef __MSP430_HAS_LCD_C__
26 const LCD_C_initParam LCD_C_INIT_PARAM = {
27 LCD_C_CLOCKSOURCE_ACLK,
29 LCD_C_CLOCKPRESCALAR_1,
31 LCD_C_STANDARD_WAVEFORMS,
32 LCD_C_SEGMENTS_DISABLED
35 static void setLCDFunction(uint16_t baseAddress, uint8_t index, uint16_t value)
39 HWREG16(baseAddress + OFS_LCDCPCTL0) |= value;
42 HWREG16(baseAddress + OFS_LCDCPCTL1) |= value;
45 HWREG16(baseAddress + OFS_LCDCPCTL2) |= value;
49 HWREG16(baseAddress + OFS_LCDCPCTL3) |= value;
56 void LCD_C_init(uint16_t baseAddress, LCD_C_initParam *initParams)
58 HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
59 HWREG16(baseAddress + OFS_LCDCCTL0) &= ~(LCDMX0 | LCDMX1 | LCDMX2 | LCDSSEL
60 | LCDLP | LCDSON | LCDDIV_31);
62 HWREG16(baseAddress + OFS_LCDCCTL0) |= initParams->muxRate;
63 HWREG16(baseAddress + OFS_LCDCCTL0) |= initParams->clockSource;
64 HWREG16(baseAddress + OFS_LCDCCTL0) |= initParams->waveforms;
65 HWREG16(baseAddress + OFS_LCDCCTL0) |= initParams->segments;
66 HWREG16(baseAddress + OFS_LCDCCTL0) |= initParams->clockDivider;
67 HWREG16(baseAddress + OFS_LCDCCTL0) |= initParams->clockPrescalar;
70 void LCD_C_on(uint16_t baseAddress)
72 HWREG16(baseAddress + OFS_LCDCCTL0) |= LCDON;
75 void LCD_C_off(uint16_t baseAddress)
77 HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
80 void LCD_C_clearInterrupt(uint16_t baseAddress, uint16_t mask)
82 HWREG8(baseAddress + OFS_LCDCCTL1_L) &= ~(mask>>8);
85 uint16_t LCD_C_getInterruptStatus(uint16_t baseAddress, uint16_t mask)
87 return (
HWREG8(baseAddress + OFS_LCDCCTL1_L) & (mask>>8));
90 void LCD_C_enableInterrupt(uint16_t baseAddress, uint16_t mask)
92 HWREG16(baseAddress + OFS_LCDCCTL1) |= mask;
95 void LCD_C_disableInterrupt (uint16_t baseAddress, uint16_t mask)
97 HWREG16(baseAddress + OFS_LCDCCTL1) &= ~mask;
100 void LCD_C_clearMemory(uint16_t baseAddress)
102 HWREG16(baseAddress + OFS_LCDCMEMCTL) |= LCDCLRM;
105 void LCD_C_clearBlinkingMemory(uint16_t baseAddress)
107 HWREG16(baseAddress + OFS_LCDCMEMCTL) |= LCDCLRBM;
110 void LCD_C_selectDisplayMemory(uint16_t baseAddress, uint16_t displayMemory)
112 HWREG16(baseAddress + OFS_LCDCMEMCTL) &= ~LCDDISP;
113 HWREG16(baseAddress + OFS_LCDCMEMCTL) |= displayMemory;
116 void LCD_C_setBlinkingControl (uint16_t baseAddress,
117 uint8_t clockDivider,
118 uint8_t clockPrescalar,
121 HWREG16(baseAddress + OFS_LCDCBLKCTL) &= ~(LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 |
122 LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKPRE2 |
123 LCDBLKMOD0 | LCDBLKMOD1
125 HWREG16(baseAddress + OFS_LCDCBLKCTL) |= clockDivider | clockPrescalar | mode;
128 void LCD_C_enableChargePump(uint16_t baseAddress)
130 HWREG16(baseAddress + OFS_LCDCVCTL) |= LCDCPEN;
133 void LCD_C_disableChargePump(uint16_t baseAddress)
135 HWREG16(baseAddress + OFS_LCDCVCTL) &= ~LCDCPEN;
138 void LCD_C_selectBias(uint16_t baseAddress, uint16_t bias)
140 HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
141 HWREG16(baseAddress + OFS_LCDCVCTL) &= ~LCD2B;
143 HWREG16(baseAddress + OFS_LCDCVCTL) |= bias;
146 void LCD_C_selectChargePumpReference(uint16_t baseAddress, uint16_t reference)
148 HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
149 HWREG16(baseAddress + OFS_LCDCVCTL) &= ~VLCDREF_3;
151 HWREG16(baseAddress + OFS_LCDCVCTL) |= reference;
154 void LCD_C_setVLCDSource(uint16_t baseAddress, uint16_t vlcdSource,
155 uint16_t v2v3v4Source,
158 HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
159 HWREG16(baseAddress + OFS_LCDCVCTL) &= ~VLCDEXT;
160 HWREG16(baseAddress + OFS_LCDCVCTL) &= ~LCDREXT;
161 HWREG16(baseAddress + OFS_LCDCVCTL) &= ~LCDEXTBIAS;
162 HWREG16(baseAddress + OFS_LCDCVCTL) &= ~R03EXT;
164 HWREG16(baseAddress + OFS_LCDCVCTL) |= vlcdSource;
165 HWREG16(baseAddress + OFS_LCDCVCTL) |= v2v3v4Source;
166 HWREG16(baseAddress + OFS_LCDCVCTL) |= v5Source;
169 void LCD_C_setVLCDVoltage(uint16_t baseAddress, uint16_t voltage)
171 HWREG16(baseAddress + OFS_LCDCVCTL) &= ~VLCD_15;
173 HWREG16(baseAddress + OFS_LCDCVCTL) |= voltage;
176 void LCD_C_setPinAsLCDFunction(uint16_t baseAddress, uint8_t pin)
178 HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
180 uint8_t idx = pin>>4;
181 uint16_t val = 1<<(pin & 0xF);
183 setLCDFunction(baseAddress, idx, val);
186 void LCD_C_setPinAsPortFunction (uint16_t baseAddress, uint8_t pin)
188 HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
190 uint8_t idx = pin >> 4;
191 uint16_t val = 1 << (pin & 0xF);
195 HWREG16(baseAddress + OFS_LCDCPCTL0) &= ~val;
198 HWREG16(baseAddress + OFS_LCDCPCTL1) &= ~val;
201 HWREG16(baseAddress + OFS_LCDCPCTL2) &= ~val;
205 HWREG16(baseAddress + OFS_LCDCPCTL3) &= ~val;
212 void LCD_C_setPinAsLCDFunctionEx(uint16_t baseAddress, uint8_t startPin,
215 uint8_t startIdx = startPin>>4;
216 uint8_t endIdx = endPin>>4;
217 uint8_t startPos = startPin & 0xF;
218 uint8_t endPos = endPin & 0xF;
222 HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
224 if (startIdx == endIdx) {
225 val = (0xFFFF>>(15-endPos)) & (0xFFFF<<startPos);
227 setLCDFunction(baseAddress, startIdx, val);
231 val = 0xFFFF>>(15-endPos);
232 setLCDFunction(baseAddress, endIdx, val);
234 for (
i=endIdx-1;
i>startIdx;
i--)
235 setLCDFunction(baseAddress,
i, 0xFFFF);
237 val = 0xFFFF<<startPos;
238 setLCDFunction(baseAddress, startIdx, val);
242 void LCD_C_setMemory(uint16_t baseAddress, uint8_t pin, uint8_t value)
244 uint8_t muxRate =
HWREG16(baseAddress + OFS_LCDCCTL0)
245 & (LCDMX2 | LCDMX1 | LCDMX0);
248 if (muxRate <= (LCDMX1 | LCDMX0)) {
250 HWREG8(baseAddress + OFS_LCDM1 + pin/2) &= 0x0F;
251 HWREG8(baseAddress + OFS_LCDM1 + pin/2) |= (value & 0xF) << 4;
254 HWREG8(baseAddress + OFS_LCDM1 + pin/2) &= 0xF0;
255 HWREG8(baseAddress + OFS_LCDM1 + pin/2) |= (value & 0xF);
260 HWREG8(baseAddress + OFS_LCDM1 + pin) = value;
264 uint8_t LCD_C_getMemory(uint16_t baseAddress, uint8_t pin)
266 uint8_t muxRate =
HWREG16(baseAddress + OFS_LCDCCTL0)
267 & (LCDMX2 | LCDMX1 | LCDMX0);
270 if(muxRate <= (LCDMX1 | LCDMX0))
274 return (
HWREG8(baseAddress + OFS_LCDM1 + pin / 2) >> 4);
278 return (
HWREG8(baseAddress + OFS_LCDM1 + pin / 2) & 0xF);
284 return HWREG8(baseAddress + OFS_LCDM1 + pin);
288 void LCD_C_setMemoryWithoutOverwrite(uint16_t baseAddress, uint8_t pin, uint8_t value)
290 uint8_t muxRate =
HWREG16(baseAddress + OFS_LCDCCTL0)
291 & (LCDMX2 | LCDMX1 | LCDMX0);
293 value |= LCD_C_getMemory(baseAddress, pin);
296 if(muxRate <= (LCDMX1 | LCDMX0))
300 HWREG8(baseAddress + OFS_LCDM1 + pin / 2) &= 0x0F;
301 HWREG8(baseAddress + OFS_LCDM1 + pin / 2) |= (value & 0xF) << 4;
305 HWREG8(baseAddress + OFS_LCDM1 + pin / 2) &= 0xF0;
306 HWREG8(baseAddress + OFS_LCDM1 + pin / 2) |= (value & 0xF);
312 HWREG8(baseAddress + OFS_LCDM1 + pin) = value;
316 void LCD_C_setBlinkingMemory(uint16_t baseAddress, uint8_t pin, uint8_t value)
318 uint8_t muxRate =
HWREG16(baseAddress + OFS_LCDCCTL0)
319 & (LCDMX2 | LCDMX1 | LCDMX0);
322 if (muxRate <= (LCDMX1 | LCDMX0)) {
324 HWREG8(baseAddress + OFS_LCDBM1 + pin/2) &= 0x0F;
325 HWREG8(baseAddress + OFS_LCDBM1 + pin/2) |= (value & 0xF) << 4;
328 HWREG8(baseAddress + OFS_LCDBM1 + pin/2) &= 0xF0;
329 HWREG8(baseAddress + OFS_LCDBM1 + pin/2) |= (value & 0xF);
334 HWREG8(baseAddress + OFS_LCDBM1 + pin) = value;
339 uint8_t LCD_C_getBlinkingMemory(uint16_t baseAddress, uint8_t pin)
341 uint8_t muxRate =
HWREG16(baseAddress + OFS_LCDCCTL0)
342 & (LCDMX2 | LCDMX1 | LCDMX0);
345 if(muxRate <= (LCDMX1 | LCDMX0))
349 return (
HWREG8(baseAddress + OFS_LCDBM1 + pin / 2) >> 4);
353 return (
HWREG8(baseAddress + OFS_LCDBM1 + pin / 2) & 0xF);
359 return HWREG8(baseAddress + OFS_LCDBM1 + pin);
363 void LCD_C_setBlinkingMemoryWithoutOverwrite(uint16_t baseAddress, uint8_t pin, uint8_t value)
365 uint8_t muxRate =
HWREG16(baseAddress + OFS_LCDCCTL0)
366 & (LCDMX2 | LCDMX1 | LCDMX0);
368 value |= LCD_C_getBlinkingMemory(baseAddress, pin);
371 if(muxRate <= (LCDMX1 | LCDMX0))
375 HWREG8(baseAddress + OFS_LCDBM1 + pin / 2) &= 0x0F;
376 HWREG8(baseAddress + OFS_LCDBM1 + pin / 2) |= (value & 0xF) << 4;
380 HWREG8(baseAddress + OFS_LCDBM1 + pin / 2) &= 0xF0;
381 HWREG8(baseAddress + OFS_LCDBM1 + pin / 2) |= (value & 0xF);
387 HWREG8(baseAddress + OFS_LCDBM1 + pin) = value;
391 void LCD_C_configChargePump(uint16_t baseAddress, uint16_t syncToClock,
392 uint16_t functionControl)
394 HWREG16(baseAddress + OFS_LCDCCPCTL) &= ~(LCDCPCLKSYNC);
395 HWREG16(baseAddress + OFS_LCDCCPCTL) &= ~(LCDCPDIS7 | LCDCPDIS6 | LCDCPDIS5
396 | LCDCPDIS4 | LCDCPDIS3 | LCDCPDIS2 | LCDCPDIS1 | LCDCPDIS0);
398 HWREG16(baseAddress + OFS_LCDCCPCTL) |= syncToClock | functionControl;