2020-2021 Sunseeker Telemetry and Lighting System
lcd_b.c
Go to the documentation of this file.
1 //*****************************************************************************
2 //
3 // lcd_b.c - Driver for the lcd_b Module.
4 //
5 //*****************************************************************************
6 
7 //*****************************************************************************
8 //
11 //
12 //*****************************************************************************
13 
14 #include "inc/hw_memmap.h"
15 
16 #ifdef __MSP430_HAS_LCD_B__
17 #include "lcd_b.h"
18 
19 #include <assert.h>
20 
21 //*****************************************************************************
22 //
23 // Initialization parameter instance
24 //
25 //*****************************************************************************
26 const LCD_B_initParam LCD_B_INIT_PARAM = {
27  LCD_B_CLOCKSOURCE_ACLK,
28  LCD_B_CLOCKDIVIDER_1,
29  LCD_B_CLOCKPRESCALAR_1,
30  LCD_B_STATIC,
31  LCD_B_SEGMENTS_DISABLED
32 };
33 
34 static void setLCDFunction(uint16_t baseAddress, uint8_t index, uint16_t value)
35 {
36  switch (index){
37  case 0:
38  HWREG16(baseAddress + OFS_LCDBPCTL0) |= value;
39  break;
40  case 1:
41  HWREG16(baseAddress + OFS_LCDBPCTL1) |= value;
42  break;
43  case 2:
44  HWREG16(baseAddress + OFS_LCDBPCTL2) |= value;
45  break;
46  case 3:
47  HWREG16(baseAddress + OFS_LCDBPCTL3) |= value;
48  break;
49  default:break;
50  }
51 }
52 
53 void LCD_B_init(uint16_t baseAddress, LCD_B_initParam *initParams)
54 {
55  HWREG16(baseAddress + OFS_LCDBCTL0) &= ~LCDON;
56  HWREG16(baseAddress + OFS_LCDBCTL0) &= ~(LCDMX0 | LCDMX1 | LCDSSEL | LCDSON
57  | LCDDIV_31);
58 
59  HWREG16(baseAddress + OFS_LCDBCTL0) |= initParams->muxRate;
60  HWREG16(baseAddress + OFS_LCDBCTL0) |= initParams->clockSource;
61  HWREG16(baseAddress + OFS_LCDBCTL0) |= initParams->segments;
62  HWREG16(baseAddress + OFS_LCDBCTL0) |= initParams->clockDivider;
63  HWREG16(baseAddress + OFS_LCDBCTL0) |= initParams->clockPrescalar;
64 }
65 
66 void LCD_B_on(uint16_t baseAddress)
67 {
68  HWREG16(baseAddress + OFS_LCDBCTL0) |= LCDON;
69 }
70 
71 void LCD_B_off(uint16_t baseAddress)
72 {
73  HWREG16(baseAddress + OFS_LCDBCTL0) &= ~LCDON;
74 }
75 
76 void LCD_B_clearInterrupt(uint16_t baseAddress, uint16_t mask)
77 {
78  HWREG8(baseAddress + OFS_LCDBCTL1_L) &= ~(mask>>8);
79 }
80 
81 uint16_t LCD_B_getInterruptStatus(uint16_t baseAddress, uint16_t mask)
82 {
83  return (HWREG8(baseAddress + OFS_LCDBCTL1_L) & (mask>>8));
84 }
85 
86 void LCD_B_enableInterrupt (uint16_t baseAddress, uint16_t mask)
87 {
88  HWREG16(baseAddress + OFS_LCDBCTL1) |= mask;
89 }
90 
91 void LCD_B_disableInterrupt (uint16_t baseAddress, uint16_t mask)
92 {
93  HWREG16(baseAddress + OFS_LCDBCTL1) &= ~mask;
94 }
95 
96 void LCD_B_clearAllMemory(uint16_t baseAddress)
97 {
98  HWREG16(baseAddress + OFS_LCDBMEMCTL) |= LCDCLRM;
99 }
100 
101 void LCD_B_clearAllBlinkingMemory(uint16_t baseAddress)
102 {
103  HWREG16(baseAddress + OFS_LCDBMEMCTL) |= LCDCLRBM;
104 }
105 
106 void LCD_B_selectDisplayMemory(uint16_t baseAddress, uint16_t displayMemory)
107 {
108  HWREG16(baseAddress + OFS_LCDBMEMCTL) &= ~LCDDISP;
109  HWREG16(baseAddress + OFS_LCDBMEMCTL) |= displayMemory;
110 }
111 
112 void LCD_B_setBlinkingControl (uint16_t baseAddress,
113  uint8_t clockDivider,
114  uint8_t clockPrescalar,
115  uint8_t mode)
116 {
117  HWREG16(baseAddress + OFS_LCDBBLKCTL) &= ~(LCDBLKDIV0 | LCDBLKDIV1 | LCDBLKDIV2
118  | LCDBLKPRE0 | LCDBLKPRE1 | LCDBLKPRE2 | LCDBLKMOD0 | LCDBLKMOD1);
119 
120  HWREG16(baseAddress + OFS_LCDBBLKCTL) |= clockDivider | clockPrescalar | mode;
121 }
122 
123 void LCD_B_enableChargePump(uint16_t baseAddress)
124 {
125  HWREG16(baseAddress + OFS_LCDBCTL0) &= ~LCDON;
126  HWREG16(baseAddress + OFS_LCDBVCTL) |= LCDCPEN;
127 }
128 
129 void LCD_B_disableChargePump(uint16_t baseAddress)
130 {
131  HWREG16(baseAddress + OFS_LCDBCTL0) &= ~LCDON;
132  HWREG16(baseAddress + OFS_LCDBVCTL) &= ~LCDCPEN;
133 }
134 
135 void LCD_B_selectBias(uint16_t baseAddress, uint16_t bias)
136 {
137  HWREG16(baseAddress + OFS_LCDBCTL0) &= ~LCDON;
138  HWREG16(baseAddress + OFS_LCDBVCTL) &= ~LCD2B;
139 
140  HWREG16(baseAddress + OFS_LCDBVCTL) |= bias;
141 }
142 
143 void LCD_B_selectChargePumpReference(uint16_t baseAddress, uint16_t reference)
144 {
145  HWREG16(baseAddress + OFS_LCDBCTL0) &= ~LCDON;
146  HWREG16(baseAddress + OFS_LCDBVCTL) &= ~VLCDREF_3;
147 
148  HWREG16(baseAddress + OFS_LCDBVCTL) |= reference;
149 }
150 
151 void LCD_B_setVLCDSource(uint16_t baseAddress,
152  uint16_t vlcdSource,
153  uint16_t v2v3v4Source,
154  uint16_t v5Source)
155 {
156  HWREG16(baseAddress + OFS_LCDBCTL0) &= ~LCDON;
157  HWREG16(baseAddress + OFS_LCDBVCTL) &= ~VLCDEXT;
158  HWREG16(baseAddress + OFS_LCDBVCTL) &= ~LCDREXT;
159  HWREG16(baseAddress + OFS_LCDBVCTL) &= ~LCDEXTBIAS;
160  HWREG16(baseAddress + OFS_LCDBVCTL) &= ~R03EXT;
161 
162  HWREG16(baseAddress + OFS_LCDBVCTL) |= vlcdSource;
163  HWREG16(baseAddress + OFS_LCDBVCTL) |= v2v3v4Source;
164  HWREG16(baseAddress + OFS_LCDBVCTL) |= v5Source;
165 }
166 
167 void LCD_B_setVLCDVoltage(uint16_t baseAddress,
168  uint16_t voltage)
169 {
170  HWREG16(baseAddress + OFS_LCDBCTL0) &= ~LCDON;
171  HWREG16(baseAddress + OFS_LCDBVCTL) &= ~VLCD_15;
172 
173  HWREG16(baseAddress + OFS_LCDBVCTL) |= voltage;
174 }
175 
176 void LCD_B_setPinAsLCDFunction (uint16_t baseAddress, uint8_t pin)
177 {
178  HWREG16(baseAddress + OFS_LCDBCTL0) &= ~LCDON;
179 
180  uint8_t idx = pin>>4;
181  uint16_t val = 1<<(pin & 0xF);
182 
183  setLCDFunction(baseAddress, idx, val);
184 
185 }
186 
187 void LCD_B_setPinAsPortFunction (uint16_t baseAddress, uint8_t pin)
188 {
189  HWREG16(baseAddress + OFS_LCDBCTL0) &= ~LCDON;
190 
191  uint8_t idx = pin>>4;
192  uint16_t val = 1<<(pin & 0xF);
193 
194  switch (idx){
195  case 0:
196  HWREG16(baseAddress + OFS_LCDBPCTL0) &= ~val;
197  break;
198  case 1:
199  HWREG16(baseAddress + OFS_LCDBPCTL1) &= ~val;
200  break;
201  case 2:
202  HWREG16(baseAddress + OFS_LCDBPCTL2) &= ~val;
203  break;
204  case 3:
205  HWREG16(baseAddress + OFS_LCDBPCTL3) &= ~val;
206  break;
207  default:break;
208  }
209 
210 }
211 
212 void LCD_B_setPinAsLCDFunctionEx(uint16_t baseAddress,
213  uint8_t startPin,
214  uint8_t endPin)
215 {
216  uint8_t startIdx = startPin>>4;
217  uint8_t endIdx = endPin>>4;
218  uint8_t startPos = startPin & 0xF;
219  uint8_t endPos = endPin & 0xF;
220  uint16_t val = 0;
221  uint8_t i = 0;
222 
223  HWREG16(baseAddress + OFS_LCDBCTL0) &= ~LCDON;
224 
225  if (startIdx == endIdx) {
226  val = (0xFFFF>>(15-endPos)) & (0xFFFF<<startPos);
227 
228  setLCDFunction(baseAddress, startIdx, val);
229 
230  }
231  else {
232  val = 0xFFFF>>(15-endPos);
233  setLCDFunction(baseAddress, endIdx, val);
234 
235  for (i=endIdx-1; i>startIdx; i--) {
236  setLCDFunction(baseAddress, i, 0xFFFF);
237  }
238 
239  val = 0xFFFF<<startPos;
240  setLCDFunction(baseAddress, startIdx, val);
241  }
242 }
243 
244 void LCD_B_setMemory(uint16_t baseAddress, uint8_t memory, uint8_t mask)
245 {
246  HWREG8(baseAddress + OFS_LCDM1 + memory) = mask;
247 }
248 
249 void LCD_B_updateMemory(uint16_t baseAddress, uint8_t memory, uint8_t mask)
250 {
251  HWREG8(baseAddress + OFS_LCDM1 + memory) |= mask;
252 }
253 
254 void LCD_B_toggleMemory(uint16_t baseAddress, uint8_t memory, uint8_t mask)
255 {
256  HWREG8(baseAddress + OFS_LCDM1 + memory) ^= mask;
257 }
258 
259 void LCD_B_clearMemory(uint16_t baseAddress, uint8_t memory, uint8_t mask)
260 {
261  HWREG8(baseAddress + OFS_LCDM1 + memory) &= ~mask;
262 }
263 
264 void LCD_B_setBlinkingMemory(uint16_t baseAddress, uint8_t memory, uint8_t mask)
265 {
266  HWREG8(baseAddress + OFS_LCDBM1 + memory) = mask;
267 }
268 
269 void LCD_B_updateBlinkingMemory(uint16_t baseAddress, uint8_t memory, uint8_t mask)
270 {
271  HWREG8(baseAddress + OFS_LCDBM1 + memory) |= mask;
272 }
273 
274 void LCD_B_toggleBlinkingMemory(uint16_t baseAddress, uint8_t memory, uint8_t mask)
275 {
276  HWREG8(baseAddress + OFS_LCDBM1 + memory) ^= mask;
277 }
278 
279 void LCD_B_clearBlinkingMemory(uint16_t baseAddress, uint8_t memory, uint8_t mask)
280 {
281  HWREG8(baseAddress + OFS_LCDBM1 + memory) &= ~mask;
282 }
283 
284 void LCD_B_configureChargePump(uint16_t baseAddress, uint16_t autoDisabled)
285 {
286  HWREG16(baseAddress + OFS_LCDBCPCTL) &= ~(LCDCPDIS7 | LCDCPDIS6 | LCDCPDIS5
287  | LCDCPDIS4 | LCDCPDIS3 | LCDCPDIS2 | LCDCPDIS1 | LCDCPDIS0);
288 
289  HWREG16(baseAddress + OFS_LCDBCPCTL) |= autoDisabled;
290 }
291 
292 #endif
293 //*****************************************************************************
294 //
297 //
298 //*****************************************************************************
#define HWREG8(x)
Definition: hw_memmap.h:41
#define HWREG16(x)
Definition: hw_memmap.h:39