2020-2021 Sunseeker Telemetry and Lighting System
lcd_c.c
Go to the documentation of this file.
1 //*****************************************************************************
2 //
3 // lcd_c.c - Driver for the lcd_c Module.
4 //
5 //*****************************************************************************
6 
7 //*****************************************************************************
8 //
11 //
12 //*****************************************************************************
13 
14 #include "inc/hw_memmap.h"
15 
16 #ifdef __MSP430_HAS_LCD_C__
17 #include "lcd_c.h"
18 
19 #include <assert.h>
20 
21 //*****************************************************************************
22 //
23 // Initialization parameter instance
24 //
25 //*****************************************************************************
26 const LCD_C_initParam LCD_C_INIT_PARAM = {
27  LCD_C_CLOCKSOURCE_ACLK,
28  LCD_C_CLOCKDIVIDER_1,
29  LCD_C_CLOCKPRESCALAR_1,
30  LCD_C_STATIC,
31  LCD_C_STANDARD_WAVEFORMS,
32  LCD_C_SEGMENTS_DISABLED
33 };
34 
35 static void setLCDFunction(uint16_t baseAddress, uint8_t index, uint16_t value)
36 {
37  switch(index) {
38  case 0:
39  HWREG16(baseAddress + OFS_LCDCPCTL0) |= value;
40  break;
41  case 1:
42  HWREG16(baseAddress + OFS_LCDCPCTL1) |= value;
43  break;
44  case 2:
45  HWREG16(baseAddress + OFS_LCDCPCTL2) |= value;
46  break;
47  case 3:
48 #ifdef LCDS48
49  HWREG16(baseAddress + OFS_LCDCPCTL3) |= value;
50 #endif //LCDS48
51  break;
52  default: break;
53  }
54 }
55 
56 void LCD_C_init(uint16_t baseAddress, LCD_C_initParam *initParams)
57 {
58  HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
59  HWREG16(baseAddress + OFS_LCDCCTL0) &= ~(LCDMX0 | LCDMX1 | LCDMX2 | LCDSSEL
60  | LCDLP | LCDSON | LCDDIV_31);
61 
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;
68 }
69 
70 void LCD_C_on(uint16_t baseAddress)
71 {
72  HWREG16(baseAddress + OFS_LCDCCTL0) |= LCDON;
73 }
74 
75 void LCD_C_off(uint16_t baseAddress)
76 {
77  HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
78 }
79 
80 void LCD_C_clearInterrupt(uint16_t baseAddress, uint16_t mask)
81 {
82  HWREG8(baseAddress + OFS_LCDCCTL1_L) &= ~(mask>>8);
83 }
84 
85 uint16_t LCD_C_getInterruptStatus(uint16_t baseAddress, uint16_t mask)
86 {
87  return (HWREG8(baseAddress + OFS_LCDCCTL1_L) & (mask>>8));
88 }
89 
90 void LCD_C_enableInterrupt(uint16_t baseAddress, uint16_t mask)
91 {
92  HWREG16(baseAddress + OFS_LCDCCTL1) |= mask;
93 }
94 
95 void LCD_C_disableInterrupt (uint16_t baseAddress, uint16_t mask)
96 {
97  HWREG16(baseAddress + OFS_LCDCCTL1) &= ~mask;
98 }
99 
100  void LCD_C_clearMemory(uint16_t baseAddress)
101  {
102  HWREG16(baseAddress + OFS_LCDCMEMCTL) |= LCDCLRM;
103  }
104 
105 void LCD_C_clearBlinkingMemory(uint16_t baseAddress)
106 {
107  HWREG16(baseAddress + OFS_LCDCMEMCTL) |= LCDCLRBM;
108 }
109 
110 void LCD_C_selectDisplayMemory(uint16_t baseAddress, uint16_t displayMemory)
111 {
112  HWREG16(baseAddress + OFS_LCDCMEMCTL) &= ~LCDDISP;
113  HWREG16(baseAddress + OFS_LCDCMEMCTL) |= displayMemory;
114 }
115 
116 void LCD_C_setBlinkingControl (uint16_t baseAddress,
117  uint8_t clockDivider,
118  uint8_t clockPrescalar,
119  uint8_t mode)
120 {
121  HWREG16(baseAddress + OFS_LCDCBLKCTL) &= ~(LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2 |
122  LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKPRE2 |
123  LCDBLKMOD0 | LCDBLKMOD1
124  );
125  HWREG16(baseAddress + OFS_LCDCBLKCTL) |= clockDivider | clockPrescalar | mode;
126 }
127 
128 void LCD_C_enableChargePump(uint16_t baseAddress)
129 {
130  HWREG16(baseAddress + OFS_LCDCVCTL) |= LCDCPEN;
131 }
132 
133 void LCD_C_disableChargePump(uint16_t baseAddress)
134 {
135  HWREG16(baseAddress + OFS_LCDCVCTL) &= ~LCDCPEN;
136 }
137 
138 void LCD_C_selectBias(uint16_t baseAddress, uint16_t bias)
139 {
140  HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
141  HWREG16(baseAddress + OFS_LCDCVCTL) &= ~LCD2B;
142 
143  HWREG16(baseAddress + OFS_LCDCVCTL) |= bias;
144 }
145 
146 void LCD_C_selectChargePumpReference(uint16_t baseAddress, uint16_t reference)
147 {
148  HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
149  HWREG16(baseAddress + OFS_LCDCVCTL) &= ~VLCDREF_3;
150 
151  HWREG16(baseAddress + OFS_LCDCVCTL) |= reference;
152 }
153 
154 void LCD_C_setVLCDSource(uint16_t baseAddress, uint16_t vlcdSource,
155  uint16_t v2v3v4Source,
156  uint16_t v5Source)
157 {
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;
163 
164  HWREG16(baseAddress + OFS_LCDCVCTL) |= vlcdSource;
165  HWREG16(baseAddress + OFS_LCDCVCTL) |= v2v3v4Source;
166  HWREG16(baseAddress + OFS_LCDCVCTL) |= v5Source;
167 }
168 
169 void LCD_C_setVLCDVoltage(uint16_t baseAddress, uint16_t voltage)
170 {
171  HWREG16(baseAddress + OFS_LCDCVCTL) &= ~VLCD_15;
172 
173  HWREG16(baseAddress + OFS_LCDCVCTL) |= voltage;
174 }
175 
176 void LCD_C_setPinAsLCDFunction(uint16_t baseAddress, uint8_t pin)
177 {
178  HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
179 
180  uint8_t idx = pin>>4;
181  uint16_t val = 1<<(pin & 0xF);
182 
183  setLCDFunction(baseAddress, idx, val);
184 }
185 
186 void LCD_C_setPinAsPortFunction (uint16_t baseAddress, uint8_t pin)
187 {
188  HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
189 
190  uint8_t idx = pin >> 4;
191  uint16_t val = 1 << (pin & 0xF);
192 
193  switch(idx) {
194  case 0:
195  HWREG16(baseAddress + OFS_LCDCPCTL0) &= ~val;
196  break;
197  case 1:
198  HWREG16(baseAddress + OFS_LCDCPCTL1) &= ~val;
199  break;
200  case 2:
201  HWREG16(baseAddress + OFS_LCDCPCTL2) &= ~val;
202  break;
203  case 3:
204 #ifdef LCDS48
205  HWREG16(baseAddress + OFS_LCDCPCTL3) &= ~val;
206 #endif //LCDS48
207  break;
208  default: break;
209  }
210 }
211 
212 void LCD_C_setPinAsLCDFunctionEx(uint16_t baseAddress, uint8_t startPin,
213  uint8_t endPin)
214 {
215  uint8_t startIdx = startPin>>4;
216  uint8_t endIdx = endPin>>4;
217  uint8_t startPos = startPin & 0xF;
218  uint8_t endPos = endPin & 0xF;
219  uint16_t val = 0;
220  uint8_t i = 0;
221 
222  HWREG16(baseAddress + OFS_LCDCCTL0) &= ~LCDON;
223 
224  if (startIdx == endIdx) {
225  val = (0xFFFF>>(15-endPos)) & (0xFFFF<<startPos);
226 
227  setLCDFunction(baseAddress, startIdx, val);
228 
229  }
230  else {
231  val = 0xFFFF>>(15-endPos);
232  setLCDFunction(baseAddress, endIdx, val);
233 
234  for (i=endIdx-1; i>startIdx; i--)
235  setLCDFunction(baseAddress, i, 0xFFFF);
236 
237  val = 0xFFFF<<startPos;
238  setLCDFunction(baseAddress, startIdx, val);
239  }
240 }
241 
242 void LCD_C_setMemory(uint16_t baseAddress, uint8_t pin, uint8_t value)
243 {
244  uint8_t muxRate = HWREG16(baseAddress + OFS_LCDCCTL0)
245  & (LCDMX2 | LCDMX1 | LCDMX0);
246 
247  // static, 2-mux, 3-mux, 4-mux
248  if (muxRate <= (LCDMX1 | LCDMX0)) {
249  if (pin & 1) {
250  HWREG8(baseAddress + OFS_LCDM1 + pin/2) &= 0x0F;
251  HWREG8(baseAddress + OFS_LCDM1 + pin/2) |= (value & 0xF) << 4;
252  }
253  else {
254  HWREG8(baseAddress + OFS_LCDM1 + pin/2) &= 0xF0;
255  HWREG8(baseAddress + OFS_LCDM1 + pin/2) |= (value & 0xF);
256  }
257  }
258  else {
259  //5-mux, 6-mux, 7-mux, 8-mux
260  HWREG8(baseAddress + OFS_LCDM1 + pin) = value;
261  }
262 }
263 
264 uint8_t LCD_C_getMemory(uint16_t baseAddress, uint8_t pin)
265 {
266  uint8_t muxRate = HWREG16(baseAddress + OFS_LCDCCTL0)
267  & (LCDMX2 | LCDMX1 | LCDMX0);
268 
269  // static, 2-mux, 3-mux, 4-mux
270  if(muxRate <= (LCDMX1 | LCDMX0))
271  {
272  if(pin & 1)
273  {
274  return (HWREG8(baseAddress + OFS_LCDM1 + pin / 2) >> 4);
275  }
276  else
277  {
278  return (HWREG8(baseAddress + OFS_LCDM1 + pin / 2) & 0xF);
279  }
280  }
281  else
282  {
283  //5-mux, 6-mux, 7-mux, 8-mux
284  return HWREG8(baseAddress + OFS_LCDM1 + pin);
285  }
286 }
287 
288 void LCD_C_setMemoryWithoutOverwrite(uint16_t baseAddress, uint8_t pin, uint8_t value)
289 {
290  uint8_t muxRate = HWREG16(baseAddress + OFS_LCDCCTL0)
291  & (LCDMX2 | LCDMX1 | LCDMX0);
292 
293  value |= LCD_C_getMemory(baseAddress, pin);
294 
295  // static, 2-mux, 3-mux, 4-mux
296  if(muxRate <= (LCDMX1 | LCDMX0))
297  {
298  if(pin & 1)
299  {
300  HWREG8(baseAddress + OFS_LCDM1 + pin / 2) &= 0x0F;
301  HWREG8(baseAddress + OFS_LCDM1 + pin / 2) |= (value & 0xF) << 4;
302  }
303  else
304  {
305  HWREG8(baseAddress + OFS_LCDM1 + pin / 2) &= 0xF0;
306  HWREG8(baseAddress + OFS_LCDM1 + pin / 2) |= (value & 0xF);
307  }
308  }
309  else
310  {
311  //5-mux, 6-mux, 7-mux, 8-mux
312  HWREG8(baseAddress + OFS_LCDM1 + pin) = value;
313  }
314 }
315 
316 void LCD_C_setBlinkingMemory(uint16_t baseAddress, uint8_t pin, uint8_t value)
317 {
318  uint8_t muxRate = HWREG16(baseAddress + OFS_LCDCCTL0)
319  & (LCDMX2 | LCDMX1 | LCDMX0);
320 
321  // static, 2-mux, 3-mux, 4-mux
322  if (muxRate <= (LCDMX1 | LCDMX0)) {
323  if (pin & 1) {
324  HWREG8(baseAddress + OFS_LCDBM1 + pin/2) &= 0x0F;
325  HWREG8(baseAddress + OFS_LCDBM1 + pin/2) |= (value & 0xF) << 4;
326  }
327  else {
328  HWREG8(baseAddress + OFS_LCDBM1 + pin/2) &= 0xF0;
329  HWREG8(baseAddress + OFS_LCDBM1 + pin/2) |= (value & 0xF);
330  }
331  }
332  else {
333  //5-mux, 6-mux, 7-mux, 8-mux
334  HWREG8(baseAddress + OFS_LCDBM1 + pin) = value;
335  }
336 
337 }
338 
339 uint8_t LCD_C_getBlinkingMemory(uint16_t baseAddress, uint8_t pin)
340 {
341  uint8_t muxRate = HWREG16(baseAddress + OFS_LCDCCTL0)
342  & (LCDMX2 | LCDMX1 | LCDMX0);
343 
344  // static, 2-mux, 3-mux, 4-mux
345  if(muxRate <= (LCDMX1 | LCDMX0))
346  {
347  if(pin & 1)
348  {
349  return (HWREG8(baseAddress + OFS_LCDBM1 + pin / 2) >> 4);
350  }
351  else
352  {
353  return (HWREG8(baseAddress + OFS_LCDBM1 + pin / 2) & 0xF);
354  }
355  }
356  else
357  {
358  //5-mux, 6-mux, 7-mux, 8-mux
359  return HWREG8(baseAddress + OFS_LCDBM1 + pin);
360  }
361 }
362 
363 void LCD_C_setBlinkingMemoryWithoutOverwrite(uint16_t baseAddress, uint8_t pin, uint8_t value)
364 {
365  uint8_t muxRate = HWREG16(baseAddress + OFS_LCDCCTL0)
366  & (LCDMX2 | LCDMX1 | LCDMX0);
367 
368  value |= LCD_C_getBlinkingMemory(baseAddress, pin);
369 
370  // static, 2-mux, 3-mux, 4-mux
371  if(muxRate <= (LCDMX1 | LCDMX0))
372  {
373  if(pin & 1)
374  {
375  HWREG8(baseAddress + OFS_LCDBM1 + pin / 2) &= 0x0F;
376  HWREG8(baseAddress + OFS_LCDBM1 + pin / 2) |= (value & 0xF) << 4;
377  }
378  else
379  {
380  HWREG8(baseAddress + OFS_LCDBM1 + pin / 2) &= 0xF0;
381  HWREG8(baseAddress + OFS_LCDBM1 + pin / 2) |= (value & 0xF);
382  }
383  }
384  else
385  {
386  //5-mux, 6-mux, 7-mux, 8-mux
387  HWREG8(baseAddress + OFS_LCDBM1 + pin) = value;
388  }
389 }
390 
391 void LCD_C_configChargePump(uint16_t baseAddress, uint16_t syncToClock,
392  uint16_t functionControl)
393 {
394  HWREG16(baseAddress + OFS_LCDCCPCTL) &= ~(LCDCPCLKSYNC);
395  HWREG16(baseAddress + OFS_LCDCCPCTL) &= ~(LCDCPDIS7 | LCDCPDIS6 | LCDCPDIS5
396  | LCDCPDIS4 | LCDCPDIS3 | LCDCPDIS2 | LCDCPDIS1 | LCDCPDIS0);
397 
398  HWREG16(baseAddress + OFS_LCDCCPCTL) |= syncToClock | functionControl;
399 }
400 
401 
402 #endif
403 //*****************************************************************************
404 //
407 //
408 //*****************************************************************************
#define HWREG8(x)
Definition: hw_memmap.h:41
#define HWREG16(x)
Definition: hw_memmap.h:39