📄 stm8l15x_lcd.c
字号:
/**
******************************************************************************
* @file stm8l15x_lcd.c
* @author MCD Application Team
* @version V1.5.0
* @date 13-May-2011
* @brief This file provides firmware functions to manage the following
* functionalities of the LCD controller (LCD) peripheral:
* - Initialization and configuration
* - LCD RAM memory write
* - Interrupts and flags management
*
* @verbatim
*
* ===================================================================
* LCD Clock
* ===================================================================
* LCD has tow clock sources:
* - RTCCLK divided by 2 used to generate LCD frame rate
* - LCDCLK to used for LCD registers read/write access
*
* To configure the RTCCLK/LCDCLK, proceed as follows:
* - Enable RTC clock using CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE)
* function
* - Enable LCD clock using CLK_PeripheralClockConfig(CLK_Peripheral_LCD, ENABLE)
* function
* - Select the RTC clock source using the CLK_RTCClockConfig() function.
*
* ===================================================================
* LCD and low power modes
* ===================================================================
* The LCD remains active during Active-halt, Wait, Low power run and
* Low power wait modes unless disabled
*
* ===================================================================
* How to use this driver
* ===================================================================
* 1. Enable RTC clock using CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE) function
*
* 2. Enable LCD clock using CLK_PeripheralClockConfig(CLK_Peripheral_LCD, ENABLE) function
*
* 3. Select the RTC clock source using the CLK_RTCClockConfig() function.
*
* 4. Configure the LCD prescaler, divider, duty, bias and voltage source
* using LCD_Init() function
*
* 5. Call the LCD_PortMaskConfig() function to assign the unused SEGx
* (segment) and COMx (common) pins as standard general purpose IOs
*
* 6. Optionally you can enable/configure:
* - LCD High Drive using the LCD_HighDriveCmd() function
* - LCD Pulse ON Duration using the LCD_PulseOnDurationConfig() function
* - LCD Dead Time using the LCD_DeadTimeConfig() function
* - The LCD Blink mode and frequency using the LCD_BlinkConfig() function
* - The LCD Contrast using the LCD_ContrastConfig() function
*
* 7. Call the LCD_Cmd() to enable the LCD controller
*
* 8. Write to the LCD RAM memory using the LCD_WriteRAM() function.
*
* @endverbatim
*
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm8l15x_lcd.h"
/** @addtogroup STM8L15x_StdPeriph_Driver
* @{
*/
/** @defgroup LCD
* @brief LCD driver modules
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/** @defgroup LCD_Private_Functions
* @{
*/
/** @defgroup LCD_Group1 Initialization and Configuration functions
* @brief Initialization and Configuration functions
*
@verbatim
===============================================================================
Initialization and Configuration functions
===============================================================================
@endverbatim
* @{
*/
/**
* @brief Deinitializes the LCD Controller registers to their default reset values.
* @param None
* @retval None
*/
void LCD_DeInit(void)
{
uint8_t counter = 0;
LCD->CR1 = LCD_CR1_RESET_VALUE;
LCD->CR2 = LCD_CR2_RESET_VALUE;
LCD->CR3 = LCD_CR3_RESET_VALUE;
LCD->FRQ = LCD_FRQ_RESET_VALUE;
for (counter = 0;counter < 0x05; counter++)
{
LCD->PM[counter] = LCD_PM_RESET_VALUE;
}
for (counter = 0;counter < 0x16; counter++)
{
LCD->RAM[counter] = LCD_RAM_RESET_VALUE;
}
LCD->CR4 = LCD_CR4_RESET_VALUE;
}
/**
* @brief Initializes the LCD according to the specified parameters.
* @param LCD_CLKPrescalerDiv : LCD clock prescaler
* This parameter can be one of the following values:
* @arg LCD_Prescaler_1: CLKprescaler = ClKinput
* @arg LCD_Prescaler_2: CLKprescaler = ClKinput/2
* @arg LCD_Prescaler_4: CLKprescaler = ClKinput/4
* @arg LCD_Prescaler_8: CLKprescaler = ClKinput/8
* @arg LCD_Prescaler_16: CLKprescaler = ClKinput/16
* @arg LCD_Prescaler_32: CLKprescaler = ClKinput/32
* @arg LCD_Prescaler_64: CLKprescaler = ClKinput/64
* @arg LCD_Prescaler_128: CLKprescaler = ClKinput/128
* @arg LCD_Prescaler_256: CLKprescaler = ClKinput/256
* @arg LCD_Prescaler_512: CLKprescaler = ClKinput/512
* @arg LCD_Prescaler_1024: CLKprescaler = ClKinput/1024
* @arg LCD_Prescaler_2048: CLKprescaler = ClKinput/2048
* @arg LCD_Prescaler_4096: CLKprescaler = ClKinput/4096
* @arg LCD_Prescaler_8192: CLKprescaler = ClKinput/8192
* @arg LCD_Prescaler_16384: CLKprescaler = ClKinput/16384
* @arg LCD_Prescaler_32768: CLKprescaler = ClKinput/32768
* @param LCD_Divider : LCD clock divider
* This parameter can be one of the following values:
* @arg LCD_Divider_16: LCD frequency = CLKprescaler/16
* @arg LCD_Divider_17: LCD frequency = CLKprescaler/17
* @arg LCD_Divider_18: LCD frequency = CLKprescaler/18
* @arg LCD_Divider_19: LCD frequency = CLKprescaler/19
* @arg LCD_Divider_20: LCD frequency = CLKprescaler/20
* @arg LCD_Divider_21: LCD frequency = CLKprescaler/21
* @arg LCD_Divider_22: LCD frequency = CLKprescaler/22
* @arg LCD_Divider_23: LCD frequency = CLKprescaler/23
* @arg LCD_Divider_24: LCD frequency = CLKprescaler/24
* @arg LCD_Divider_25: LCD frequency = CLKprescaler/25
* @arg LCD_Divider_26: LCD frequency = CLKprescaler/26
* @arg LCD_Divider_27: LCD frequency = CLKprescaler/27
* @arg LCD_Divider_28: LCD frequency = CLKprescaler/28
* @arg LCD_Divider_29: LCD frequency = CLKprescaler/29
* @arg LCD_Divider_30: LCD frequency = CLKprescaler/30
* @arg LCD_Divider_31: LCD frequency = CLKprescaler/31
* @param LCD_Duty : LCD duty
* This parameter can be one of the following values:
* @arg LCD_Duty_Static: Static duty
* @arg LCD_Duty_1_2: 1/2 duty
* @arg LCD_Duty_1_3: 1/3 duty
* @arg LCD_Duty_1_4: 1/4 duty
* @arg LCD_Duty_1_8: 1/8 duty
* @param LCD_Bias : LCD bias
* This parameter can be one of the following values:
* @arg LCD_Bias_1_4: 1/4 bias
* @arg LCD_Bias_1_3: 1/3 bias
* @arg LCD_Bias_1_2: 1/2 bias
* @param LCD_VoltageSource : LCD voltage source
* This parameter can be one of the following values:
* @arg LCD_VoltageSource_Internal: Internal voltage source
* @arg LCD_VoltageSource_External: External voltage source
* @retval None
*/
void LCD_Init(LCD_Prescaler_TypeDef LCD_Prescaler, LCD_Divider_TypeDef LCD_Divider,
LCD_Duty_TypeDef LCD_Duty, LCD_Bias_TypeDef LCD_Bias,
LCD_VoltageSource_TypeDef LCD_VoltageSource)
{
/* Check function parameters */
assert_param(IS_LCD_CLOCK_PRESCALER(LCD_Prescaler));
assert_param(IS_LCD_CLOCK_DIVIDER(LCD_Divider));
assert_param(IS_LCD_DUTY(LCD_Duty));
assert_param(IS_LCD_BIAS(LCD_Bias));
assert_param(IS_LCD_VOLTAGE_SOURCE(LCD_VoltageSource));
LCD->FRQ &= (uint8_t)(~LCD_FRQ_PS); /* Clear the prescaler bits */
LCD->FRQ |= LCD_Prescaler;
LCD->FRQ &= (uint8_t)(~LCD_FRQ_DIV); /* Clear the divider bits */
LCD->FRQ |= LCD_Divider;
/* Configure the Duty cycle */
LCD->CR1 &= (uint8_t)(~LCD_CR1_DUTY); /* Clear the duty bits */
LCD->CR4 &= (uint8_t)(~LCD_CR4_DUTY8); /* Clear the DUTY8 bit */
if (LCD_Duty == LCD_Duty_1_8)
{
LCD->CR4 |= (uint8_t)((uint8_t)((uint8_t)LCD_Duty & (uint8_t)0xF0) >> 4);
}
else
{
LCD->CR1 |= (uint8_t)((uint8_t)LCD_Duty & (uint8_t)0x0F);
}
/* Configure the Bias */
LCD->CR1 &= (uint8_t)(~LCD_CR1_B2); /* Clear the B2 bit */
LCD->CR4 &= (uint8_t)(~LCD_CR4_B4); /* Clear the B4 bit */
if (LCD_Bias == LCD_Bias_1_4)
{
LCD->CR1 |= (uint8_t)((uint8_t)LCD_Bias & (uint8_t)0x0F);
LCD->CR4 |= (uint8_t)((uint8_t)((uint8_t)LCD_Bias & (uint8_t)0xF0) >> 4);
}
else
{
LCD->CR1 |= (uint8_t)((uint8_t)LCD_Bias & (uint8_t)0x0F);
}
LCD->CR2 &= (uint8_t)(~LCD_CR2_VSEL); /* Clear the voltage source bit */
LCD->CR2 |= LCD_VoltageSource;
}
/**
* @brief Configures the LCD Port Mask.
* @param LCD_PortMaskRegister: The LCD register index in the port mask matrix.
* This parameter can be one of the following values:
* @arg LCD_PortMaskRegister_0: PortMask Register 0
* @arg LCD_PortMaskRegister_1: PortMask Register 1
* @arg LCD_PortMaskRegister_2: PortMask Register 2
* @arg LCD_PortMaskRegister_3: PortMask Register 3
* @arg LCD_PortMaskRegister_4: PortMask Register 4
* @arg LCD_PortMaskRegister_5: PortMask Register 5
* @param LCD_Mask : Value to be written
* @retval None
*/
void LCD_PortMaskConfig(LCD_PortMaskRegister_TypeDef LCD_PortMaskRegister, uint8_t LCD_Mask)
{
/* Check function parameters */
assert_param(IS_LCD_PORT_MASK(LCD_PortMaskRegister));
/* Copy data bytes to Port mask register */
LCD->PM[LCD_PortMaskRegister] = LCD_Mask;
}
/**
* @brief Enables or disables the LCD Controller.
* @param NewState: new state of the LCD peripheral.
* This parameter can be: ENABLE or DISABLE.
* @retval None
* @retval None
*/
void LCD_Cmd(FunctionalState NewState)
{
/* Check function parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
LCD->CR3 |= LCD_CR3_LCDEN; /* Enable the LCD peripheral*/
}
else
{
LCD->CR3 &= (uint8_t)(~LCD_CR3_LCDEN); /* Disable the LCD peripheral*/
}
}
/**
* @brief Enables or disables the low resistance divider. Displays with high
* internal resistance may need a longer drive time to achieve
* satisfactory contrast. This function is useful in this case if some
* additional power consumption can be tolerated.
* @note When this mode is enabled, the PulseOn Duration (PON) have to be
* programmed to 1/CK_PS (LCD_PulseOnDuration_1).
* @param NewState: new state of the low resistance divider.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void LCD_HighDriveCmd(FunctionalState NewState)
{
/* Check function parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
LCD->CR2 |= LCD_CR2_HD; /* Permanently enable low resistance divider */
}
else
{
LCD->CR2 &= (uint8_t)(~LCD_CR2_HD); /* Permanently disable low resistance divider */
}
}
/**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -