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