1 /**
2 ******************************************************************************
3 * @file lib_lcd.c
4 * @author Application Team
5 * @version V1.1.0
6 * @date 2019-10-28
7 * @brief LCD library.
8 ******************************************************************************
9 * @attention
10 *
11 ******************************************************************************
12 */
13 #include "lib_lcd.h"
14 #include "lib_LoadNVR.h"
15
16 //registers default reset values
17 #define LCD_CTRL_RSTValue 0
18 #define LCD_CTRL2_RSTValue 0
19 #define LCD_SEGCTRL0_RSTValue 0
20 #define LCD_SEGCTRL1_RSTValue 0
21 #define LCD_SEGCTRL2_RSTValue 0
22
23 /* COMx IO */
24 const LCD_COMIO lcd_comio[] =
25 {
26 {&GPIOD->OEN, GPIO_Pin_0},
27 {&GPIOD->OEN, GPIO_Pin_1},
28 {&GPIOD->OEN, GPIO_Pin_2},
29 {&GPIOD->OEN, GPIO_Pin_3},
30 {&GPIOD->OEN, GPIO_Pin_4},
31 {&GPIOD->OEN, GPIO_Pin_5},
32 {&GPIOD->OEN, GPIO_Pin_6},
33 {&GPIOD->OEN, GPIO_Pin_7},
34 };
35
36 /**
37 * @brief Initializes LCD.
38 * @param InitStruct: LCD configuration.
39 Type:
40 LCD_TYPE_4COM
41 LCD_TYPE_6COM
42 LCD_TYPE_8COM
43 Drv:
44 LCD_DRV_300
45 LCD_DRV_600
46 LCD_DRV_150
47 LCD_DRV_200
48 FRQ:
49 LCD_FRQ_64H
50 LCD_FRQ_128H
51 LCD_FRQ_256H
52 LCD_FRQ_512H
53 SWPR: Frame buffer switch period(0.5 sec * (SWPR + 1)).
54 FBMODE:
55 LCD_FBMODE_BUFA
56 LCD_FBMODE_BUFAB
57 LCD_FBMODE_BUFABLANK
58 BKFILL:
59 LCD_BKFILL_1
60 LCD_BKFILL_0
61 * @retval None
62 */
LCD_Init(LCD_InitType * InitStruct)63 void LCD_Init(LCD_InitType *InitStruct)
64 {
65 uint32_t tmp_reg1, tmp_reg2;
66
67 /* Check parameters */
68 assert_parameters(IS_LCD_TYPE(InitStruct->Type));
69 assert_parameters(IS_LCD_DRV(InitStruct->Drv));
70 assert_parameters(IS_LCD_FRQ(InitStruct->FRQ));
71 assert_parameters(IS_LCD_SWPR(InitStruct->SWPR));
72 assert_parameters(IS_LCD_FBMODE(InitStruct->FBMODE));
73 assert_parameters(IS_LCD_BKFILL(InitStruct->BKFILL));
74
75 tmp_reg1 = LCD->CTRL;
76 tmp_reg2 = LCD->CTRL2;
77 tmp_reg1 &= ~(LCD_CTRL_TYPE\
78 |LCD_CTRL_DRV\
79 |LCD_CTRL_FRQ);
80 tmp_reg1 |= (InitStruct->Type\
81 |InitStruct->Drv\
82 |InitStruct->FRQ);
83 tmp_reg2 &= ~(LCD_CTRL2_SWPR\
84 |LCD_CTRL2_FBMODE\
85 |LCD_CTRL2_BKFILL);
86 tmp_reg2 |= ((InitStruct->SWPR << 8)\
87 |InitStruct->FBMODE\
88 |InitStruct->BKFILL);
89 LCD->CTRL = tmp_reg1;
90 LCD->CTRL2 = tmp_reg2;
91 }
92
93 /**
94 * @brief Fills each LCD_InitStruct member with its default value.
95 * @param LCD_InitStruct: pointer to an LCD_InitType structure which will be initialized.
96 * @retval None
97 */
LCD_StructInit(LCD_InitType * LCD_InitStruct)98 void LCD_StructInit(LCD_InitType *LCD_InitStruct)
99 {
100 /*--------------- Reset LCD init structure parameters values ---------------*/
101 /* Initialize the BKFILL member */
102 LCD_InitStruct->BKFILL = LCD_BKFILL_0;
103 /* Initialize the Drv member */
104 LCD_InitStruct->Drv = LCD_DRV_300;
105 /* Initialize the FBMODE member */
106 LCD_InitStruct->FBMODE = LCD_FBMODE_BUFA;
107 /* Initialize the FRQ member */
108 LCD_InitStruct->FRQ = LCD_FRQ_64H;
109 /* Initialize the SWPR member */
110 LCD_InitStruct->SWPR = 0;
111 /* Initialize the Type member */
112 LCD_InitStruct->Type = LCD_TYPE_4COM;
113 }
114
115 /**
116 * @brief Initializes the LCD registers to their default reset values.
117 * @param None
118 * @retval None
119 */
LCD_DeInit(void)120 void LCD_DeInit(void)
121 {
122 LCD->CTRL &= ~LCD_CTRL_EN;
123
124 LCD->CTRL = LCD_CTRL_RSTValue;
125 LCD->CTRL2 = LCD_CTRL2_RSTValue;
126 LCD->SEGCTRL0 = LCD_SEGCTRL0_RSTValue;
127 LCD->SEGCTRL1 = LCD_SEGCTRL1_RSTValue;
128 LCD->SEGCTRL2 = LCD_SEGCTRL2_RSTValue;
129 }
130
131 /**
132 * @brief Enables or disables LCD controller.
133 * @param IOInitType: LCD SEG and COM configuration.
134 SegCtrl0:
135 SegCtrl1:
136 0~0xFFFFFFFF
137 SegCtrl2:
138 0~0xFFFF
139 COMMode:
140 LCD_TYPE_4COM
141 LCD_TYPE_6COM
142 LCD_TYPE_8COM
143 NewState:
144 ENABLE
145 DISABLE
146 * @retval None
147 */
LCD_Cmd(LCD_IOInitType * IOInitType,uint32_t NewState)148 void LCD_Cmd(LCD_IOInitType *IOInitType, uint32_t NewState)
149 {
150 /* Check parameters */
151 assert_parameters(IS_FUNCTIONAL_STATE(NewState));
152 assert_parameters(IS_LCD_COMMOD(IOInitType->COMMode));
153
154 if (NewState == ENABLE)
155 {
156 LCD->SEGCTRL0 = IOInitType->SegCtrl0;
157 LCD->SEGCTRL1 = IOInitType->SegCtrl1;
158 LCD->SEGCTRL2 = IOInitType->SegCtrl2;
159
160 /* COMs' IO configuration : forbidden */
161 *lcd_comio[0].GPIO |= lcd_comio[0].Pin;
162 *(lcd_comio[0].GPIO+1) &= ~lcd_comio[0].Pin;
163 *lcd_comio[1].GPIO |= lcd_comio[1].Pin;
164 *(lcd_comio[1].GPIO+1) &= ~lcd_comio[1].Pin;
165 *lcd_comio[2].GPIO |= lcd_comio[2].Pin;
166 *(lcd_comio[2].GPIO+1) &= ~lcd_comio[2].Pin;
167 *lcd_comio[3].GPIO |= lcd_comio[3].Pin;
168 *(lcd_comio[3].GPIO+1) &= ~lcd_comio[3].Pin;
169 if (IOInitType->COMMode & 2UL)
170 {
171 *lcd_comio[4].GPIO |= lcd_comio[4].Pin;
172 *(lcd_comio[4].GPIO+1) &= ~lcd_comio[4].Pin;
173 *lcd_comio[5].GPIO |= lcd_comio[5].Pin;
174 *(lcd_comio[5].GPIO+1) &= ~lcd_comio[5].Pin;
175 }
176 if (IOInitType->COMMode & 4UL)
177 {
178 *lcd_comio[6].GPIO |= lcd_comio[6].Pin;
179 *(lcd_comio[6].GPIO+1) &= ~lcd_comio[6].Pin;
180 *lcd_comio[7].GPIO |= lcd_comio[7].Pin;
181 *(lcd_comio[7].GPIO+1) &= ~lcd_comio[7].Pin;
182 }
183
184 /* Enable LCD */
185 LCD->CTRL |= LCD_CTRL_EN;
186 }
187 else
188 {
189 /* Disable LCD */
190 LCD->CTRL &= ~LCD_CTRL_EN;
191
192 LCD->SEGCTRL0 = IOInitType->SegCtrl0;
193 LCD->SEGCTRL1 = IOInitType->SegCtrl1;
194 LCD->SEGCTRL2 = IOInitType->SegCtrl2;
195
196 /* COMs' IO configuration : ouput low */
197 *(lcd_comio[0].GPIO+2) &= ~lcd_comio[0].Pin;
198 *lcd_comio[0].GPIO &= ~lcd_comio[0].Pin;
199 *(lcd_comio[1].GPIO+2) &= ~lcd_comio[1].Pin;
200 *lcd_comio[1].GPIO &= ~lcd_comio[1].Pin;
201 *(lcd_comio[2].GPIO+2) &= ~lcd_comio[2].Pin;
202 *lcd_comio[2].GPIO &= ~lcd_comio[2].Pin;
203 *(lcd_comio[3].GPIO+2) &= ~lcd_comio[3].Pin;
204 *lcd_comio[3].GPIO &= ~lcd_comio[3].Pin;
205 if (IOInitType->COMMode & 2UL)
206 {
207 *(lcd_comio[4].GPIO+2) &= ~lcd_comio[4].Pin;
208 *lcd_comio[4].GPIO &= ~lcd_comio[4].Pin;
209 *(lcd_comio[5].GPIO+2) &= ~lcd_comio[5].Pin;
210 *lcd_comio[5].GPIO &= ~lcd_comio[5].Pin;
211 }
212 if (IOInitType->COMMode & 4UL)
213 {
214 *(lcd_comio[6].GPIO+2) &= ~lcd_comio[6].Pin;
215 *lcd_comio[6].GPIO &= ~lcd_comio[6].Pin;
216 *(lcd_comio[7].GPIO+2) &= ~lcd_comio[7].Pin;
217 *lcd_comio[7].GPIO &= ~lcd_comio[7].Pin;
218 }
219 }
220 }
221
222 /**
223 * @brief Configures LCD BIAS mode.
224 * @param BiasSelection:
225 LCD_BMODE_DIV3
226 LCD_BMODE_DIV4
227 * @retval None
228 */
LCD_BiasModeConfig(uint32_t BiasSelection)229 void LCD_BiasModeConfig(uint32_t BiasSelection)
230 {
231 uint32_t tmp;
232
233 assert_parameters(IS_LCD_BMODE(BiasSelection));
234
235 tmp = ANA->REG6;
236 tmp &= ~ANA_REG6_LCDBMODE;
237 tmp |= BiasSelection;
238 ANA->REG6 = tmp;
239 }
240
241 /*********************************** END OF FILE ******************************/
242