SilentSensors / mbed-dev

Fork of mbed-dev by mbed official

Committer:
WaleedElmughrabi
Date:
Thu Sep 20 16:11:23 2018 +0000
Revision:
188:60408c49b6d4
Parent:
174:b96e65c34a4d
Fork modified for BG96 error

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 174:b96e65c34a4d 1 /**************************************************************************//**
AnnaBridge 174:b96e65c34a4d 2 * @file lcd.c
AnnaBridge 174:b96e65c34a4d 3 * @version V1.00
AnnaBridge 174:b96e65c34a4d 4 * $Revision: 9 $
AnnaBridge 174:b96e65c34a4d 5 * $Date: 15/07/06 2:08p $
AnnaBridge 174:b96e65c34a4d 6 * @brief Nano100 series LCD driver header file
AnnaBridge 174:b96e65c34a4d 7 * The LCD driver can directly drives a LCD glass by creating the ac
AnnaBridge 174:b96e65c34a4d 8 * segment and common voltage signals automatically. It can support
AnnaBridge 174:b96e65c34a4d 9 * static, 1/2 duty, 1/3 duty, 1/4 duty, 1/5 duty, 1/6 duty LCD glass with up to 34
AnnaBridge 174:b96e65c34a4d 10 * segments with 6 COM or 36 segments with 4 COM.
AnnaBridge 174:b96e65c34a4d 11 *
AnnaBridge 174:b96e65c34a4d 12 * @note
AnnaBridge 174:b96e65c34a4d 13 * Copyright (C) 2013~2014 Nuvoton Technology Corp. All rights reserved.
AnnaBridge 174:b96e65c34a4d 14 *****************************************************************************/
AnnaBridge 174:b96e65c34a4d 15 #include <stdio.h>
AnnaBridge 174:b96e65c34a4d 16 #include <string.h>
AnnaBridge 174:b96e65c34a4d 17 #include <stdlib.h>
AnnaBridge 174:b96e65c34a4d 18 #include "Nano100Series.h"
AnnaBridge 174:b96e65c34a4d 19
AnnaBridge 174:b96e65c34a4d 20
AnnaBridge 174:b96e65c34a4d 21
AnnaBridge 174:b96e65c34a4d 22 /** @addtogroup NANO100_Device_Driver NANO100 Device Driver
AnnaBridge 174:b96e65c34a4d 23 @{
AnnaBridge 174:b96e65c34a4d 24 */
AnnaBridge 174:b96e65c34a4d 25
AnnaBridge 174:b96e65c34a4d 26 /** @addtogroup NANO100_LCD_Driver LCD Driver
AnnaBridge 174:b96e65c34a4d 27 @{
AnnaBridge 174:b96e65c34a4d 28 */
AnnaBridge 174:b96e65c34a4d 29
AnnaBridge 174:b96e65c34a4d 30
AnnaBridge 174:b96e65c34a4d 31 /// @cond HIDDEN_SYMBOLS
AnnaBridge 174:b96e65c34a4d 32
AnnaBridge 174:b96e65c34a4d 33 /** @addtogroup NANO100_LCD_EXPORTED_VARIABLES LCD Exported Variables
AnnaBridge 174:b96e65c34a4d 34 @{
AnnaBridge 174:b96e65c34a4d 35 */
AnnaBridge 174:b96e65c34a4d 36 /*---------------------------------------------------------------------------------------------------------*/
AnnaBridge 174:b96e65c34a4d 37 /* Global file scope (static) variables */
AnnaBridge 174:b96e65c34a4d 38 /*---------------------------------------------------------------------------------------------------------*/
AnnaBridge 174:b96e65c34a4d 39
AnnaBridge 174:b96e65c34a4d 40 double g_LCDFreq;
AnnaBridge 174:b96e65c34a4d 41 static uint32_t g_LCDFrameRate; /* src:32768Hz, COM:4, FREQ Div:64, frame-rate 64Hz */
AnnaBridge 174:b96e65c34a4d 42 /* src:10240Hz, COM:4, FREQ Div:32, frame-rate 40Hz */
AnnaBridge 174:b96e65c34a4d 43
AnnaBridge 174:b96e65c34a4d 44
AnnaBridge 174:b96e65c34a4d 45 /*@}*/ /* end of group NANO100_LCD_EXPORTED_VARIABLES */
AnnaBridge 174:b96e65c34a4d 46
AnnaBridge 174:b96e65c34a4d 47 /// @endcond /* HIDDEN_SYMBOLS */
AnnaBridge 174:b96e65c34a4d 48
AnnaBridge 174:b96e65c34a4d 49 /** @addtogroup NANO100_LCD_EXPORTED_FUNCTIONS LCD Exported Functions
AnnaBridge 174:b96e65c34a4d 50 @{
AnnaBridge 174:b96e65c34a4d 51 */
AnnaBridge 174:b96e65c34a4d 52
AnnaBridge 174:b96e65c34a4d 53 /**
AnnaBridge 174:b96e65c34a4d 54 * @brief Enables a segment on the LCD display
AnnaBridge 174:b96e65c34a4d 55 *
AnnaBridge 174:b96e65c34a4d 56 * @param[in] u32Com COM number
AnnaBridge 174:b96e65c34a4d 57 * @param[in] u32Seg Segment number
AnnaBridge 174:b96e65c34a4d 58 * @param[in] u32OnFlag 1: segment display
AnnaBridge 174:b96e65c34a4d 59 * 0: segment not display
AnnaBridge 174:b96e65c34a4d 60 *
AnnaBridge 174:b96e65c34a4d 61 * @return None
AnnaBridge 174:b96e65c34a4d 62 *
AnnaBridge 174:b96e65c34a4d 63 */
AnnaBridge 174:b96e65c34a4d 64 void LCD_SetPixel(uint32_t u32Com, uint32_t u32Seg, uint32_t u32OnFlag)
AnnaBridge 174:b96e65c34a4d 65 {
AnnaBridge 174:b96e65c34a4d 66 int32_t memnum = u32Seg / 4;
AnnaBridge 174:b96e65c34a4d 67 int32_t seg_shift = 8*(u32Seg-(4*memnum));
AnnaBridge 174:b96e65c34a4d 68
AnnaBridge 174:b96e65c34a4d 69 if(u32OnFlag) {
AnnaBridge 174:b96e65c34a4d 70 if(memnum==0) {
AnnaBridge 174:b96e65c34a4d 71 LCD->MEM_0 |= (1<<u32Com)<<seg_shift;
AnnaBridge 174:b96e65c34a4d 72 } else if(memnum==1) {
AnnaBridge 174:b96e65c34a4d 73 LCD->MEM_1 |= (1<<u32Com)<<seg_shift;
AnnaBridge 174:b96e65c34a4d 74 } else if(memnum==2) {
AnnaBridge 174:b96e65c34a4d 75 LCD->MEM_2 |= (1<<u32Com)<<seg_shift;
AnnaBridge 174:b96e65c34a4d 76 } else if(memnum==3) {
AnnaBridge 174:b96e65c34a4d 77 LCD->MEM_3 |= (1<<u32Com)<<seg_shift;
AnnaBridge 174:b96e65c34a4d 78 } else if(memnum==4) {
AnnaBridge 174:b96e65c34a4d 79 LCD->MEM_4 |= (1<<u32Com)<<seg_shift;
AnnaBridge 174:b96e65c34a4d 80 } else if(memnum==5) {
AnnaBridge 174:b96e65c34a4d 81 LCD->MEM_5 |= (1<<u32Com)<<seg_shift;
AnnaBridge 174:b96e65c34a4d 82 } else if(memnum==6) {
AnnaBridge 174:b96e65c34a4d 83 LCD->MEM_6 |= (1<<u32Com)<<seg_shift;
AnnaBridge 174:b96e65c34a4d 84 } else if(memnum==7) {
AnnaBridge 174:b96e65c34a4d 85 LCD->MEM_7 |= (1<<u32Com)<<seg_shift;
AnnaBridge 174:b96e65c34a4d 86 } else if(memnum==8) {
AnnaBridge 174:b96e65c34a4d 87 LCD->MEM_8 |= (1<<u32Com)<<seg_shift;
AnnaBridge 174:b96e65c34a4d 88 } else if(memnum==9) {
AnnaBridge 174:b96e65c34a4d 89 LCD->MEM_9 |= (1<<u32Com)<<seg_shift;
AnnaBridge 174:b96e65c34a4d 90 }
AnnaBridge 174:b96e65c34a4d 91 } else {
AnnaBridge 174:b96e65c34a4d 92 if(memnum==0) {
AnnaBridge 174:b96e65c34a4d 93 LCD->MEM_0 &= ~((1<<u32Com)<<seg_shift);
AnnaBridge 174:b96e65c34a4d 94 } else if(memnum==1) {
AnnaBridge 174:b96e65c34a4d 95 LCD->MEM_1 &= ~((1<<u32Com)<<seg_shift);
AnnaBridge 174:b96e65c34a4d 96 } else if(memnum==2) {
AnnaBridge 174:b96e65c34a4d 97 LCD->MEM_2 &= ~((1<<u32Com)<<seg_shift);
AnnaBridge 174:b96e65c34a4d 98 } else if(memnum==3) {
AnnaBridge 174:b96e65c34a4d 99 LCD->MEM_3 &= ~((1<<u32Com)<<seg_shift);
AnnaBridge 174:b96e65c34a4d 100 } else if(memnum==4) {
AnnaBridge 174:b96e65c34a4d 101 LCD->MEM_4 &= ~((1<<u32Com)<<seg_shift);
AnnaBridge 174:b96e65c34a4d 102 } else if(memnum==5) {
AnnaBridge 174:b96e65c34a4d 103 LCD->MEM_5 &= ~((1<<u32Com)<<seg_shift);
AnnaBridge 174:b96e65c34a4d 104 } else if(memnum==6) {
AnnaBridge 174:b96e65c34a4d 105 LCD->MEM_6 &= ~((1<<u32Com)<<seg_shift);
AnnaBridge 174:b96e65c34a4d 106 } else if(memnum==7) {
AnnaBridge 174:b96e65c34a4d 107 LCD->MEM_7 &= ~((1<<u32Com)<<seg_shift);
AnnaBridge 174:b96e65c34a4d 108 } else if(memnum==8) {
AnnaBridge 174:b96e65c34a4d 109 LCD->MEM_8 &= ~((1<<u32Com)<<seg_shift);
AnnaBridge 174:b96e65c34a4d 110 } else if(memnum==9) {
AnnaBridge 174:b96e65c34a4d 111 LCD->MEM_9 &= ~((1<<u32Com)<<seg_shift);
AnnaBridge 174:b96e65c34a4d 112 }
AnnaBridge 174:b96e65c34a4d 113
AnnaBridge 174:b96e65c34a4d 114 }
AnnaBridge 174:b96e65c34a4d 115
AnnaBridge 174:b96e65c34a4d 116 if(CyclesPerUs > 0)
AnnaBridge 174:b96e65c34a4d 117 SysTick->LOAD = 300 * CyclesPerUs;
AnnaBridge 174:b96e65c34a4d 118 else
AnnaBridge 174:b96e65c34a4d 119 SysTick->LOAD = 15;
AnnaBridge 174:b96e65c34a4d 120 SysTick->VAL = (0x00);
AnnaBridge 174:b96e65c34a4d 121 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
AnnaBridge 174:b96e65c34a4d 122
AnnaBridge 174:b96e65c34a4d 123 /* Waiting for down-count to zero */
AnnaBridge 174:b96e65c34a4d 124 while((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0);
AnnaBridge 174:b96e65c34a4d 125 }
AnnaBridge 174:b96e65c34a4d 126
AnnaBridge 174:b96e65c34a4d 127 /**
AnnaBridge 174:b96e65c34a4d 128 * @brief LCD Enable/Disable all segments
AnnaBridge 174:b96e65c34a4d 129 *
AnnaBridge 174:b96e65c34a4d 130 * @param[in] u32OnOff 1: Enable all segments
AnnaBridge 174:b96e65c34a4d 131 * 0: Disable all segment
AnnaBridge 174:b96e65c34a4d 132 *
AnnaBridge 174:b96e65c34a4d 133 * @return None
AnnaBridge 174:b96e65c34a4d 134 *
AnnaBridge 174:b96e65c34a4d 135 */
AnnaBridge 174:b96e65c34a4d 136 void LCD_SetAllPixels(uint32_t u32OnOff)
AnnaBridge 174:b96e65c34a4d 137 {
AnnaBridge 174:b96e65c34a4d 138 uint32_t u32SetValue;
AnnaBridge 174:b96e65c34a4d 139
AnnaBridge 174:b96e65c34a4d 140 if(u32OnOff) {
AnnaBridge 174:b96e65c34a4d 141 u32SetValue = 0xFFFFFFFF;
AnnaBridge 174:b96e65c34a4d 142 } else {
AnnaBridge 174:b96e65c34a4d 143 u32SetValue = 0x00000000;
AnnaBridge 174:b96e65c34a4d 144 }
AnnaBridge 174:b96e65c34a4d 145
AnnaBridge 174:b96e65c34a4d 146 LCD->MEM_0 = u32SetValue;
AnnaBridge 174:b96e65c34a4d 147 LCD->MEM_1 = u32SetValue;
AnnaBridge 174:b96e65c34a4d 148 LCD->MEM_2 = u32SetValue;
AnnaBridge 174:b96e65c34a4d 149 LCD->MEM_3 = u32SetValue;
AnnaBridge 174:b96e65c34a4d 150 LCD->MEM_4 = u32SetValue;
AnnaBridge 174:b96e65c34a4d 151 LCD->MEM_5 = u32SetValue;
AnnaBridge 174:b96e65c34a4d 152 LCD->MEM_6 = u32SetValue;
AnnaBridge 174:b96e65c34a4d 153 LCD->MEM_7 = u32SetValue;
AnnaBridge 174:b96e65c34a4d 154 LCD->MEM_8 = u32SetValue;
AnnaBridge 174:b96e65c34a4d 155
AnnaBridge 174:b96e65c34a4d 156 if(CyclesPerUs > 0)
AnnaBridge 174:b96e65c34a4d 157 SysTick->LOAD = 300 * CyclesPerUs;
AnnaBridge 174:b96e65c34a4d 158 else
AnnaBridge 174:b96e65c34a4d 159 SysTick->LOAD = 15;
AnnaBridge 174:b96e65c34a4d 160 SysTick->VAL = (0x00);
AnnaBridge 174:b96e65c34a4d 161 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
AnnaBridge 174:b96e65c34a4d 162
AnnaBridge 174:b96e65c34a4d 163 /* Waiting for down-count to zero */
AnnaBridge 174:b96e65c34a4d 164 while((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0);
AnnaBridge 174:b96e65c34a4d 165 }
AnnaBridge 174:b96e65c34a4d 166
AnnaBridge 174:b96e65c34a4d 167
AnnaBridge 174:b96e65c34a4d 168 /**
AnnaBridge 174:b96e65c34a4d 169 * @brief Set Frame Count and Enable frame count
AnnaBridge 174:b96e65c34a4d 170 *
AnnaBridge 174:b96e65c34a4d 171 * @param[in] u32Count Frame count value
AnnaBridge 174:b96e65c34a4d 172 *
AnnaBridge 174:b96e65c34a4d 173 *
AnnaBridge 174:b96e65c34a4d 174 * @return real frame count value.
AnnaBridge 174:b96e65c34a4d 175 *
AnnaBridge 174:b96e65c34a4d 176 */
AnnaBridge 174:b96e65c34a4d 177 uint32_t LCD_EnableFrameCounter(uint32_t u32Count)
AnnaBridge 174:b96e65c34a4d 178 {
AnnaBridge 174:b96e65c34a4d 179 uint32_t div = 1; // default prediv == LCD_FCPRESC_DIV1
AnnaBridge 174:b96e65c34a4d 180
AnnaBridge 174:b96e65c34a4d 181 LCD->FCR = 0x00;
AnnaBridge 174:b96e65c34a4d 182 LCD->FCSTS |= LCD_FCSTS_FCSTS_Msk; // clear fcsts flag
AnnaBridge 174:b96e65c34a4d 183
AnnaBridge 174:b96e65c34a4d 184 if(u32Count == 0) return 0;
AnnaBridge 174:b96e65c34a4d 185
AnnaBridge 174:b96e65c34a4d 186 if(u32Count > 0x3F) { // top value max. 63 = 0x3F
AnnaBridge 174:b96e65c34a4d 187 div = u32Count/64;
AnnaBridge 174:b96e65c34a4d 188
AnnaBridge 174:b96e65c34a4d 189 if(div > 3) {
AnnaBridge 174:b96e65c34a4d 190 div = 8;
AnnaBridge 174:b96e65c34a4d 191 LCD->FCR = LCD->FCR & ~LCD_FCR_PRESCL_Msk | LCD_FCPRESC_DIV8;
AnnaBridge 174:b96e65c34a4d 192 } else if(div > 1) {
AnnaBridge 174:b96e65c34a4d 193 div = 4;
AnnaBridge 174:b96e65c34a4d 194 LCD->FCR = LCD->FCR & ~LCD_FCR_PRESCL_Msk | LCD_FCPRESC_DIV4;
AnnaBridge 174:b96e65c34a4d 195 } else {
AnnaBridge 174:b96e65c34a4d 196 div = 2;
AnnaBridge 174:b96e65c34a4d 197 LCD->FCR = LCD->FCR & ~LCD_FCR_PRESCL_Msk | LCD_FCPRESC_DIV2;
AnnaBridge 174:b96e65c34a4d 198 }
AnnaBridge 174:b96e65c34a4d 199
AnnaBridge 174:b96e65c34a4d 200 u32Count = (u32Count+(div/2))/div;
AnnaBridge 174:b96e65c34a4d 201 } else {
AnnaBridge 174:b96e65c34a4d 202 div = 1;
AnnaBridge 174:b96e65c34a4d 203 LCD->FCR = LCD->FCR & ~LCD_FCR_PRESCL_Msk | LCD_FCPRESC_DIV1;
AnnaBridge 174:b96e65c34a4d 204 }
AnnaBridge 174:b96e65c34a4d 205
AnnaBridge 174:b96e65c34a4d 206 LCD->FCR = LCD->FCR & ~LCD_FCR_FCV_Msk | (u32Count << LCD_FCR_FCV_Pos);
AnnaBridge 174:b96e65c34a4d 207
AnnaBridge 174:b96e65c34a4d 208 u32Count = u32Count*div;
AnnaBridge 174:b96e65c34a4d 209
AnnaBridge 174:b96e65c34a4d 210 LCD->FCR |= LCD_FCR_FCEN_Msk; // enable LCD frame count
AnnaBridge 174:b96e65c34a4d 211
AnnaBridge 174:b96e65c34a4d 212 return u32Count;
AnnaBridge 174:b96e65c34a4d 213 }
AnnaBridge 174:b96e65c34a4d 214
AnnaBridge 174:b96e65c34a4d 215 /**
AnnaBridge 174:b96e65c34a4d 216 * @brief Disable frame count function
AnnaBridge 174:b96e65c34a4d 217 *
AnnaBridge 174:b96e65c34a4d 218 * @param None
AnnaBridge 174:b96e65c34a4d 219 *
AnnaBridge 174:b96e65c34a4d 220 * @return None
AnnaBridge 174:b96e65c34a4d 221 *
AnnaBridge 174:b96e65c34a4d 222 */
AnnaBridge 174:b96e65c34a4d 223 void LCD_DisableFrameCounter(void)
AnnaBridge 174:b96e65c34a4d 224 {
AnnaBridge 174:b96e65c34a4d 225 LCD->FCR = 0x00; // disable LCD frame count
AnnaBridge 174:b96e65c34a4d 226
AnnaBridge 174:b96e65c34a4d 227 if( LCD->FCSTS & LCD_FCSTS_FCSTS_Msk) // clear status flag
AnnaBridge 174:b96e65c34a4d 228 LCD->FCSTS = LCD_FCSTS_FCSTS_Msk;
AnnaBridge 174:b96e65c34a4d 229 }
AnnaBridge 174:b96e65c34a4d 230
AnnaBridge 174:b96e65c34a4d 231
AnnaBridge 174:b96e65c34a4d 232 /**
AnnaBridge 174:b96e65c34a4d 233 * @brief LCD Initialization routine.
AnnaBridge 174:b96e65c34a4d 234 *
AnnaBridge 174:b96e65c34a4d 235 * @param[in] u32DrivingType LCD driving type: \ref LCD_C_TYPE / \ref LCD_EXTERNAL_R_TYPE / \ref LCD_INTERNAL_R_TYPE / \ref LCD_EXTERNAL_C_TYPE
AnnaBridge 174:b96e65c34a4d 236 * @param[in] u32ComNum LCD Com number: 1 ~6
AnnaBridge 174:b96e65c34a4d 237 * @param[in] u32BiasLevel LCD bias level: \ref LCD_BIAS_STATIC / \ref LCD_BIAS_HALF / \ref LCD_BIAS_THIRD
AnnaBridge 174:b96e65c34a4d 238 * @param[in] u32FramerateDiv LCD frequency divider: \ref LCD_FREQ_DIV32 / \ref LCD_FREQ_DIV64 / \ref LCD_FREQ_DIV96 / \ref LCD_FREQ_DIV128 /
AnnaBridge 174:b96e65c34a4d 239 * \ref LCD_FREQ_DIV192/ \ref LCD_FREQ_DIV256 / \ref LCD_FREQ_DIV384 / \ref LCD_FREQ_DIV512
AnnaBridge 174:b96e65c34a4d 240 * @param[in] u32DrivingVol LCD charge pump driving voltage: \ref LCD_CPVOl_2_6V / \ref LCD_CPVOl_2_7V / \ref LCD_CPVOl_2_8V / \ref LCD_CPVOl_2_9V /
AnnaBridge 174:b96e65c34a4d 241 * \ref LCD_CPVOl_3V / \ref LCD_CPVOl_3_1V / \ref LCD_CPVOl_3_2V / \ref LCD_CPVOl_3_3V
AnnaBridge 174:b96e65c34a4d 242 *
AnnaBridge 174:b96e65c34a4d 243 * @return LCD frame rate.
AnnaBridge 174:b96e65c34a4d 244 *
AnnaBridge 174:b96e65c34a4d 245 */
AnnaBridge 174:b96e65c34a4d 246 uint32_t LCD_Open(uint32_t u32DrivingType, uint32_t u32ComNum, uint32_t u32BiasLevel, uint32_t u32FramerateDiv, uint32_t u32DrivingVol)
AnnaBridge 174:b96e65c34a4d 247 {
AnnaBridge 174:b96e65c34a4d 248 uint32_t clkdiv, muldiv;
AnnaBridge 174:b96e65c34a4d 249 uint32_t lcd_freq_div[] = {32, 64, 96, 128, 192, 256, 384, 512};
AnnaBridge 174:b96e65c34a4d 250 uint32_t multiplex_freq_div[] = {2, 4, 6, 8, 10, 12};
AnnaBridge 174:b96e65c34a4d 251 uint32_t u32clk_src;
AnnaBridge 174:b96e65c34a4d 252
AnnaBridge 174:b96e65c34a4d 253 /* IP reset */
AnnaBridge 174:b96e65c34a4d 254 SYS->IPRST_CTL2 |= SYS_IPRST_CTL2_LCD_RST_Msk;
AnnaBridge 174:b96e65c34a4d 255 SYS->IPRST_CTL2 &= ~SYS_IPRST_CTL2_LCD_RST_Msk;
AnnaBridge 174:b96e65c34a4d 256
AnnaBridge 174:b96e65c34a4d 257 LCD_DisableDisplay();
AnnaBridge 174:b96e65c34a4d 258
AnnaBridge 174:b96e65c34a4d 259 /* Turn all segments off */
AnnaBridge 174:b96e65c34a4d 260 LCD_SetAllPixels(0);
AnnaBridge 174:b96e65c34a4d 261
AnnaBridge 174:b96e65c34a4d 262
AnnaBridge 174:b96e65c34a4d 263 switch(u32DrivingType) {
AnnaBridge 174:b96e65c34a4d 264 case LCD_C_TYPE:
AnnaBridge 174:b96e65c34a4d 265 case LCD_EXTERNAL_C_TYPE:
AnnaBridge 174:b96e65c34a4d 266
AnnaBridge 174:b96e65c34a4d 267 LCD->DISPCTL &= ~LCD_DISPCTL_BV_SEL_Msk; // internal source for charge pump
AnnaBridge 174:b96e65c34a4d 268 LCD->DISPCTL = LCD->DISPCTL & ~LCD_DISPCTL_CPUMP_FREQ_Msk | (LCD_CPUMP_DIV1);
AnnaBridge 174:b96e65c34a4d 269 LCD->DISPCTL = LCD->DISPCTL & ~LCD_DISPCTL_CPUMP_VOL_SET_Msk | (u32DrivingVol);
AnnaBridge 174:b96e65c34a4d 270 LCD->DISPCTL &= ~LCD_DISPCTL_IBRL_EN_Msk;
AnnaBridge 174:b96e65c34a4d 271 LCD->DISPCTL |= LCD_DISPCTL_CPUMP_EN_Msk; // enable charge pump
AnnaBridge 174:b96e65c34a4d 272
AnnaBridge 174:b96e65c34a4d 273 break;
AnnaBridge 174:b96e65c34a4d 274
AnnaBridge 174:b96e65c34a4d 275 case LCD_EXTERNAL_R_TYPE:
AnnaBridge 174:b96e65c34a4d 276 case LCD_INTERNAL_R_TYPE:
AnnaBridge 174:b96e65c34a4d 277
AnnaBridge 174:b96e65c34a4d 278 LCD->DISPCTL &= ~LCD_DISPCTL_CPUMP_EN_Msk;
AnnaBridge 174:b96e65c34a4d 279 LCD->DISPCTL |= LCD_DISPCTL_BV_SEL_Msk;
AnnaBridge 174:b96e65c34a4d 280 LCD->DISPCTL &= ~LCD_DISPCTL_IBRL_EN_Msk;
AnnaBridge 174:b96e65c34a4d 281 LCD->DISPCTL |= (u32DrivingType == LCD_INTERNAL_R_TYPE)?LCD_DISPCTL_IBRL_EN_Msk:0;
AnnaBridge 174:b96e65c34a4d 282 break;
AnnaBridge 174:b96e65c34a4d 283
AnnaBridge 174:b96e65c34a4d 284 };
AnnaBridge 174:b96e65c34a4d 285
AnnaBridge 174:b96e65c34a4d 286 LCD->CTL &= ~LCD_CTL_FREQ_Msk;
AnnaBridge 174:b96e65c34a4d 287 LCD->CTL |= u32FramerateDiv;
AnnaBridge 174:b96e65c34a4d 288
AnnaBridge 174:b96e65c34a4d 289 LCD->CTL = (LCD->CTL & ~LCD_CTL_MUX_Msk) | ((u32ComNum - 1) << LCD_CTL_MUX_Pos);
AnnaBridge 174:b96e65c34a4d 290 LCD->DISPCTL = LCD->DISPCTL & ~LCD_DISPCTL_BIAS_SEL_Msk | u32BiasLevel;
AnnaBridge 174:b96e65c34a4d 291
AnnaBridge 174:b96e65c34a4d 292 if((CLK->CLKSEL1 & CLK_CLKSEL1_LCD_S_Msk) == 0)
AnnaBridge 174:b96e65c34a4d 293 u32clk_src = 32 * 1024;
AnnaBridge 174:b96e65c34a4d 294 else
AnnaBridge 174:b96e65c34a4d 295 u32clk_src = 10 * 1024;
AnnaBridge 174:b96e65c34a4d 296
AnnaBridge 174:b96e65c34a4d 297 clkdiv = (LCD->CTL & LCD_CTL_FREQ_Msk) >> LCD_CTL_FREQ_Pos;
AnnaBridge 174:b96e65c34a4d 298 muldiv = (LCD->CTL & LCD_CTL_MUX_Msk) >> LCD_CTL_MUX_Pos;
AnnaBridge 174:b96e65c34a4d 299
AnnaBridge 174:b96e65c34a4d 300 g_LCDFreq = (double)u32clk_src / lcd_freq_div[clkdiv];
AnnaBridge 174:b96e65c34a4d 301 g_LCDFrameRate = (uint32_t)g_LCDFreq / multiplex_freq_div[muldiv];
AnnaBridge 174:b96e65c34a4d 302
AnnaBridge 174:b96e65c34a4d 303 return g_LCDFrameRate;
AnnaBridge 174:b96e65c34a4d 304 }
AnnaBridge 174:b96e65c34a4d 305
AnnaBridge 174:b96e65c34a4d 306
AnnaBridge 174:b96e65c34a4d 307
AnnaBridge 174:b96e65c34a4d 308 /**
AnnaBridge 174:b96e65c34a4d 309 * @brief The function is used to disable LCD controller.
AnnaBridge 174:b96e65c34a4d 310 *
AnnaBridge 174:b96e65c34a4d 311 * @param None
AnnaBridge 174:b96e65c34a4d 312 *
AnnaBridge 174:b96e65c34a4d 313 * @return None
AnnaBridge 174:b96e65c34a4d 314 *
AnnaBridge 174:b96e65c34a4d 315 */
AnnaBridge 174:b96e65c34a4d 316 void LCD_Close(void)
AnnaBridge 174:b96e65c34a4d 317 {
AnnaBridge 174:b96e65c34a4d 318 LCD_DisableDisplay();
AnnaBridge 174:b96e65c34a4d 319 }
AnnaBridge 174:b96e65c34a4d 320
AnnaBridge 174:b96e65c34a4d 321
AnnaBridge 174:b96e65c34a4d 322 /**
AnnaBridge 174:b96e65c34a4d 323 * @brief Enable Blink function in LCD controller
AnnaBridge 174:b96e65c34a4d 324 *
AnnaBridge 174:b96e65c34a4d 325 * @param[in] u32ms Blinking display time(unit: ms).
AnnaBridge 174:b96e65c34a4d 326 *
AnnaBridge 174:b96e65c34a4d 327 * @return Real blinking delay time(ms).
AnnaBridge 174:b96e65c34a4d 328 *
AnnaBridge 174:b96e65c34a4d 329 */
AnnaBridge 174:b96e65c34a4d 330 uint32_t LCD_EnableBlink(uint32_t u32ms)
AnnaBridge 174:b96e65c34a4d 331 {
AnnaBridge 174:b96e65c34a4d 332 uint32_t prescale=LCD_FCPRESC_DIV1, div=1;
AnnaBridge 174:b96e65c34a4d 333 uint32_t framecount;
AnnaBridge 174:b96e65c34a4d 334
AnnaBridge 174:b96e65c34a4d 335 if((1000/u32ms) > g_LCDFrameRate) u32ms = (1000/g_LCDFrameRate);
AnnaBridge 174:b96e65c34a4d 336
AnnaBridge 174:b96e65c34a4d 337 framecount = (uint32_t) (u32ms / (1000/g_LCDFrameRate)) ;
AnnaBridge 174:b96e65c34a4d 338
AnnaBridge 174:b96e65c34a4d 339 if(framecount > 0x3F) {
AnnaBridge 174:b96e65c34a4d 340 for(div=2; div<=8; div*=2) {
AnnaBridge 174:b96e65c34a4d 341 framecount = (uint32_t) (u32ms / (1000/(g_LCDFrameRate/div)) );
AnnaBridge 174:b96e65c34a4d 342
AnnaBridge 174:b96e65c34a4d 343 if( framecount <= 0x40 )
AnnaBridge 174:b96e65c34a4d 344 break;
AnnaBridge 174:b96e65c34a4d 345 }
AnnaBridge 174:b96e65c34a4d 346 if(div==2) prescale = LCD_FCPRESC_DIV2;
AnnaBridge 174:b96e65c34a4d 347 else if(div==4) prescale = LCD_FCPRESC_DIV4;
AnnaBridge 174:b96e65c34a4d 348 else if(div==8) prescale = LCD_FCPRESC_DIV8;
AnnaBridge 174:b96e65c34a4d 349 else return 0;
AnnaBridge 174:b96e65c34a4d 350 } else if(framecount == 0) {
AnnaBridge 174:b96e65c34a4d 351 framecount = 1;
AnnaBridge 174:b96e65c34a4d 352 }
AnnaBridge 174:b96e65c34a4d 353
AnnaBridge 174:b96e65c34a4d 354 LCD->FCR = LCD->FCR & ~LCD_FCR_PRESCL_Msk | prescale;
AnnaBridge 174:b96e65c34a4d 355 LCD->FCR = LCD->FCR & ~LCD_FCR_FCV_Msk | ((framecount - 1) << LCD_FCR_FCV_Pos);
AnnaBridge 174:b96e65c34a4d 356 LCD->FCR |= LCD_FCR_FCEN_Msk;
AnnaBridge 174:b96e65c34a4d 357
AnnaBridge 174:b96e65c34a4d 358 /* Enable Blink LCD */
AnnaBridge 174:b96e65c34a4d 359 LCD->CTL |= LCD_CTL_BLINK_Msk;
AnnaBridge 174:b96e65c34a4d 360
AnnaBridge 174:b96e65c34a4d 361 return ( (framecount*1000)/(g_LCDFrameRate/div) );
AnnaBridge 174:b96e65c34a4d 362 }
AnnaBridge 174:b96e65c34a4d 363
AnnaBridge 174:b96e65c34a4d 364
AnnaBridge 174:b96e65c34a4d 365 /**
AnnaBridge 174:b96e65c34a4d 366 * @brief Disable Blink function in LCD controller
AnnaBridge 174:b96e65c34a4d 367 *
AnnaBridge 174:b96e65c34a4d 368 * @param None
AnnaBridge 174:b96e65c34a4d 369 *
AnnaBridge 174:b96e65c34a4d 370 * @return None
AnnaBridge 174:b96e65c34a4d 371 *
AnnaBridge 174:b96e65c34a4d 372 */
AnnaBridge 174:b96e65c34a4d 373 void LCD_DisableBlink(void)
AnnaBridge 174:b96e65c34a4d 374 {
AnnaBridge 174:b96e65c34a4d 375 /* Disable Blink LCD */
AnnaBridge 174:b96e65c34a4d 376 LCD->CTL &= ~LCD_CTL_BLINK_Msk;
AnnaBridge 174:b96e65c34a4d 377
AnnaBridge 174:b96e65c34a4d 378 /* Disable frame count */
AnnaBridge 174:b96e65c34a4d 379 LCD->FCR = 0x00; // disable LCD frame count
AnnaBridge 174:b96e65c34a4d 380
AnnaBridge 174:b96e65c34a4d 381 if( LCD->FCSTS & LCD_FCSTS_FCSTS_Msk) // clear status flag
AnnaBridge 174:b96e65c34a4d 382 LCD->FCSTS = LCD_FCSTS_FCSTS_Msk;
AnnaBridge 174:b96e65c34a4d 383
AnnaBridge 174:b96e65c34a4d 384 }
AnnaBridge 174:b96e65c34a4d 385
AnnaBridge 174:b96e65c34a4d 386 /**
AnnaBridge 174:b96e65c34a4d 387 * @brief This function is used to enable LCD interrupt
AnnaBridge 174:b96e65c34a4d 388 *
AnnaBridge 174:b96e65c34a4d 389 * @param[in] IntSrc Interrupt Source: \ref LCD_FRAMECOUNT_INT / \ref LCD_POWERDOWN_INT / \ref LCD_ALL_INT
AnnaBridge 174:b96e65c34a4d 390 *
AnnaBridge 174:b96e65c34a4d 391 * @return None
AnnaBridge 174:b96e65c34a4d 392 *
AnnaBridge 174:b96e65c34a4d 393 */
AnnaBridge 174:b96e65c34a4d 394 void LCD_EnableInt(uint32_t IntSrc)
AnnaBridge 174:b96e65c34a4d 395 {
AnnaBridge 174:b96e65c34a4d 396 if((IntSrc & LCD_FRAMECOUNT_INT) == LCD_FRAMECOUNT_INT ) {
AnnaBridge 174:b96e65c34a4d 397 LCD->FCR |= LCD_FCR_FCEN_Msk;
AnnaBridge 174:b96e65c34a4d 398 }
AnnaBridge 174:b96e65c34a4d 399
AnnaBridge 174:b96e65c34a4d 400 if((IntSrc & LCD_POWERDOWN_INT) == LCD_POWERDOWN_INT ) {
AnnaBridge 174:b96e65c34a4d 401 LCD->CTL |= LCD_CTL_PDINT_EN_Msk;
AnnaBridge 174:b96e65c34a4d 402 }
AnnaBridge 174:b96e65c34a4d 403
AnnaBridge 174:b96e65c34a4d 404 }
AnnaBridge 174:b96e65c34a4d 405
AnnaBridge 174:b96e65c34a4d 406 /**
AnnaBridge 174:b96e65c34a4d 407 * @brief This function is used to disable LCD specified interrupt
AnnaBridge 174:b96e65c34a4d 408 *
AnnaBridge 174:b96e65c34a4d 409 * @param[in] IntSrc Interrupt Source: \ref LCD_FRAMECOUNT_INT / \ref LCD_POWERDOWN_INT / \ref LCD_ALL_INT
AnnaBridge 174:b96e65c34a4d 410 *
AnnaBridge 174:b96e65c34a4d 411 * @return None
AnnaBridge 174:b96e65c34a4d 412 *
AnnaBridge 174:b96e65c34a4d 413 */
AnnaBridge 174:b96e65c34a4d 414 void LCD_DisableInt(uint32_t IntSrc)
AnnaBridge 174:b96e65c34a4d 415 {
AnnaBridge 174:b96e65c34a4d 416 if((IntSrc & LCD_FRAMECOUNT_INT) == LCD_FRAMECOUNT_INT ) {
AnnaBridge 174:b96e65c34a4d 417 LCD->FCR &= ~LCD_FCR_FCEN_Msk;
AnnaBridge 174:b96e65c34a4d 418 LCD->FCSTS = LCD_FCSTS_FCSTS_Msk;
AnnaBridge 174:b96e65c34a4d 419 }
AnnaBridge 174:b96e65c34a4d 420
AnnaBridge 174:b96e65c34a4d 421 if((IntSrc & LCD_POWERDOWN_INT) == LCD_POWERDOWN_INT ) {
AnnaBridge 174:b96e65c34a4d 422 LCD->CTL &= ~LCD_CTL_PDINT_EN_Msk;
AnnaBridge 174:b96e65c34a4d 423 LCD->FCSTS = LCD_FCSTS_PDSTS_Msk;
AnnaBridge 174:b96e65c34a4d 424 }
AnnaBridge 174:b96e65c34a4d 425 }
AnnaBridge 174:b96e65c34a4d 426
AnnaBridge 174:b96e65c34a4d 427 /*@}*/ /* end of group NANO100_LCD_EXPORTED_FUNCTIONS */
AnnaBridge 174:b96e65c34a4d 428
AnnaBridge 174:b96e65c34a4d 429 /*@}*/ /* end of group NANO100_LCD_Driver */
AnnaBridge 174:b96e65c34a4d 430
AnnaBridge 174:b96e65c34a4d 431 /*@}*/ /* end of group NANO100_Device_Driver */
AnnaBridge 174:b96e65c34a4d 432
AnnaBridge 174:b96e65c34a4d 433 /*** (C) COPYRIGHT 2013~2014 Nuvoton Technology Corp. ***/
AnnaBridge 174:b96e65c34a4d 434