lib_lcd.c 7.0 KB

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