
segment lcd
Revision 0:9db958ee524a, committed 2019-03-02
- Comitter:
- siathon13
- Date:
- Sat Mar 02 07:01:28 2019 +0000
- Commit message:
- first
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Mar 02 07:01:28 2019 +0000 @@ -0,0 +1,34 @@ +//#include "stm32l053c8_discovery_glass_lcd.h" +#include "mbed.h" +//PortOut lcd(PortA, 0xFF); +DigitalOut C0(PA_8); +DigitalOut C1(PA_15); + +int main(){ +// lcd = 0x0F; + while(1){ + for(int i = 0; i < 25; i++){ + C0 = 0; + C1 = 1; + // lcd = 0x0F; + wait_ms(20); + C0 = 1; + C1 = 0; + // lcd = 0x00; + wait_ms(20); + } + for(int i = 0; i < 25; i++){ + C0 = 0; + C1 = 0; + // lcd = 0x0F; + wait_ms(20); + C0 = 1; + C1 = 1; + // lcd = 0x00; + wait_ms(20); + } + } + +// BSP_LCD_GLASS_Init(); +// BSP_LCD_GLASS_WriteDigit(3); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sat Mar 02 07:01:28 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/3a7713b1edbc \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stm32l053c8_discovery_glass_lcd.c Sat Mar 02 07:01:28 2019 +0000 @@ -0,0 +1,203 @@ +/** +================================================================================ + GLASS LCD MAPPING +================================================================================ +LCD allows to display informations on four 7-segment digits and 2 arrows: + + 1 2 3 4 + ----- ----- ----- ----- + /\ | | | | o | | | | + -- -- -- -- -- -- -- -- + \/ | | | | o | | | | + ----- * ----- * ----- * ----- + +LCD segment mapping: +-------------------- + -----A----- _ + | | L |_| + F B + | | _ + -----G----- L |_| + | | + E C + | | _ + -----D----- DP |_| + + An LCD digir coding is based on the following matrix: +COM 0 1 +SEG(n) { E , G } +SEG(n+1) { D , F } +SEG(23-n-1) { C , A } +SEG(23-n) { DP, B } +with n positive odd number. + +The DIGIT '0' for example is: + ------------------------------- +LSB { 1 , 0 } + { 1 , 1 } + { 1 , 1 } +MSB { 0 , 1 } + ------------------- + 'A' = 7 E hexa + */ +#include "stm32l053c8_discovery_glass_lcd.h" +#include "mbed_wait_api.h" +const int NumberMap[10] ={ + /* 0 1 2 3 4 5 6 7 8 9 */ + 0x7E, 0x28, 0x67, 0x3D, 0x4B, 0x67, 0x77, 0x4C, 0x7F, 0x6F +}; + +LCD_HandleTypeDef LCDHandle; + +static void LCD_MspInit(LCD_HandleTypeDef *hlcd); +static void LCD_MspDeInit(LCD_HandleTypeDef *hlcd); + +void BSP_LCD_GLASS_Init(void){ + LCDHandle.Instance = LCD; + LCDHandle.Init.Prescaler = LCD_PRESCALER_1; + LCDHandle.Init.Divider = LCD_DIVIDER_16; + LCDHandle.Init.Duty = LCD_DUTY_STATIC; + LCDHandle.Init.Bias = LCD_BIAS_1_2; + LCDHandle.Init.VoltageSource = LCD_VOLTAGESOURCE_INTERNAL; + LCDHandle.Init.Contrast = LCD_CONTRASTLEVEL_5; + LCDHandle.Init.DeadTime = LCD_DEADTIME_0; + LCDHandle.Init.PulseOnDuration = LCD_PULSEONDURATION_6; + LCDHandle.Init.HighDrive = LCD_HIGHDRIVE_0; + LCDHandle.Init.BlinkMode = LCD_BLINKMODE_OFF; + LCDHandle.Init.BlinkFrequency = LCD_BLINKFREQUENCY_DIV32; + LCDHandle.Init.MuxSegment = LCD_MUXSEGMENT_DISABLE; + + /* Initialize the LCD */ + LCD_MspInit(&LCDHandle); + HAL_LCD_Init(&LCDHandle); + + BSP_LCD_GLASS_Clear(); +} + +/** + * @brief DeInitialize the LCD GLASS relative GPIO port IOs and LCD peripheral. + * @retval None + */ +void BSP_LCD_GLASS_DeInit(void){ + /* De-Initialize the LCD */ + LCD_MspDeInit(&LCDHandle); + HAL_LCD_DeInit(&LCDHandle); +} + +/** + * @brief Initialize the LCD MSP. + * @param hlcd: LCD handle + * @retval None + */ +static void LCD_MspInit(LCD_HandleTypeDef *hlcd){ + GPIO_InitTypeDef gpioinitstruct = {0}; + RCC_OscInitTypeDef oscinitstruct = {0}; + RCC_PeriphCLKInitTypeDef periphclkstruct = {0}; + + /*##-1- Enable PWR peripheral Clock #######################################*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /*##-2- Configure LSE as RTC clock soucre ###################################*/ + oscinitstruct.OscillatorType = RCC_OSCILLATORTYPE_LSE; + oscinitstruct.PLL.PLLState = RCC_PLL_NONE; + oscinitstruct.LSEState = RCC_LSE_ON; + if (HAL_RCC_OscConfig(&oscinitstruct) != HAL_OK) + { + while (1); + } + + /*##-3- Select LSE as RTC clock source.##########################*/ + /* Backup domain management is done in RCC function */ + periphclkstruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; + periphclkstruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + HAL_RCCEx_PeriphCLKConfig(&periphclkstruct); + + /*##-4- Enable LCD GPIO Clocks #############################################*/ + __HAL_RCC_GPIOA_CLK_ENABLE(); + // __HAL_RCC_GPIOB_CLK_ENABLE(); + // __HAL_RCC_GPIOC_CLK_ENABLE(); + // __HAL_RCC_GPIOD_CLK_ENABLE(); + + + /*##-5- Configure peripheral GPIO ##########################################*/ + /* Configure Output for LCD */ + /* Port A */ + gpioinitstruct.Pin = LCD_GPIO_BANKA_PINS; + gpioinitstruct.Mode = GPIO_MODE_AF_PP; + gpioinitstruct.Pull = GPIO_NOPULL; + gpioinitstruct.Speed = GPIO_SPEED_FREQ_HIGH; + gpioinitstruct.Alternate = GPIO_AF1_LCD; + HAL_GPIO_Init(GPIOA, &gpioinitstruct); + + /* Port B */ + // gpioinitstruct.Pin = LCD_GPIO_BANKB_PINS; + // HAL_GPIO_Init(GPIOB, &gpioinitstruct); + + /* Port C*/ + // gpioinitstruct.Pin = LCD_GPIO_BANKC_PINS; + // HAL_GPIO_Init(GPIOC, &gpioinitstruct); + + /* Port D */ + // gpioinitstruct.Pin = LCD_GPIO_BANKD_PINS; + // HAL_GPIO_Init(GPIOD, &gpioinitstruct); + + /* Wait for the external capacitor Cext which is connected to the VLCD pin is charged + (approximately 2ms for Cext=1uF) */ + wait_ms(2); + + /*##-6- Enable LCD peripheral Clock ########################################*/ + __HAL_RCC_LCD_CLK_ENABLE(); +} + +/** + * @brief DeInitialize the LCD MSP. + * @param hlcd: LCD handle + * @retval None + */ +static void LCD_MspDeInit(LCD_HandleTypeDef *hlcd){ + uint32_t gpiopin = 0; + + /*##-1- Enable LCD GPIO Clocks #############################################*/ + __HAL_RCC_GPIOA_CLK_ENABLE(); + // __HAL_RCC_GPIOB_CLK_ENABLE(); + // __HAL_RCC_GPIOC_CLK_ENABLE(); + // __HAL_RCC_GPIOD_CLK_ENABLE(); + + /*##-1- Configure peripheral GPIO ##########################################*/ + /* Configure Output for LCD */ + /* Port A */ + gpiopin = LCD_GPIO_BANKA_PINS; + HAL_GPIO_DeInit(GPIOA, gpiopin); + + /* Port B */ + // gpiopin = LCD_GPIO_BANKB_PINS; + // HAL_GPIO_DeInit(GPIOB, gpiopin); + + /* Port C*/ + // gpiopin = LCD_GPIO_BANKC_PINS; + // HAL_GPIO_DeInit(GPIOC, gpiopin); + + /* Port D */ + // gpiopin = LCD_GPIO_BANKD_PINS; + // HAL_GPIO_DeInit(GPIOD, gpiopin); + + /*##-5- Enable LCD peripheral Clock ########################################*/ + __HAL_RCC_LCD_CLK_DISABLE(); +} + +void BSP_LCD_GLASS_Clear(void){ + HAL_LCD_Clear(&LCDHandle); +} + +void BSP_LCD_GLASS_WriteDigit(int digit){ + int Digit = NumberMap[digit]; + + uint32_t data = 0x00; + data = ((Digit & 0x10) << LCD_SEG0_SHIFT) | (((Digit & 0x20) >> 1) << LCD_SEG1_SHIFT) + | (((Digit & 0x40) >> 2) << LCD_SEG2_SHIFT) | (((Digit & 0x80) >> 3) << LCD_SEG3_SHIFT); + HAL_LCD_Write(&LCDHandle, LCD_RAM_REGISTER0, 0xFF, 0xFF); + data = ((Digit & 0x01) << LCD_SEG0_SHIFT) | (((Digit & 0x02) >> 1) << LCD_SEG1_SHIFT) + | (((Digit & 0x04) >> 2) << LCD_SEG2_SHIFT) | (((Digit & 0x08) >> 3) << LCD_SEG3_SHIFT); +// HAL_LCD_Write(&LCDHandle, LCD_RAM_REGISTER1, 0xF0, 0xF0); + HAL_LCD_UpdateDisplayRequest(&LCDHandle); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stm32l053c8_discovery_glass_lcd.h Sat Mar 02 07:01:28 2019 +0000 @@ -0,0 +1,99 @@ +#ifndef __STM32L476G_DISCOVERY_GLASS_LCD_H +#define __STM32L476G_DISCOVERY_GLASS_LCD_H + +#include "stm32l0xx_hal.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum{ + LCD_DIGIT_POSITION_1 = 0, + LCD_DIGIT_POSITION_2 = 1, + LCD_DIGIT_POSITION_3 = 2, + LCD_DIGIT_POSITION_4 = 3, + LCD_DIGIT_MAX_NUMBER = 4, +}DigitPosition_Typedef; + +/** + * @brief LCD Glass Double point + * Warning: element values correspond to LCD Glass Double point. + */ +typedef enum{ + DOUBLEPOINT_OFF = 0, + DOUBLEPOINT_ON = 1 +} DoublePoint_Typedef; + +#define COM_PER_DIGIT_NB 2/*!< Specifies number of COM to address a digit */ +#define SEG_PER_DIGIT_NB 2/*!< Specifies number of SEG to address a digit */ + +#define LCD_MAP_CHAR_COM0_SEG_1ST_POS (1 << LCD_MAP_CHAR_COM0_SEG_1ST_SHIFT) +#define LCD_MAP_CHAR_COM0_SEG_2ND_POS (1 << LCD_MAP_CHAR_COM0_SEG_2ND_SHIFT) +#define LCD_MAP_CHAR_COM0_SEG_3RD_POS (1 << LCD_MAP_CHAR_COM0_SEG_3RD_SHIFT) +#define LCD_MAP_CHAR_COM0_SEG_4TH_POS (1 << LCD_MAP_CHAR_COM0_SEG_4TH_SHIFT) +#define LCD_MAP_CHAR_COM1_SEG_1ST_POS (1 << LCD_MAP_CHAR_COM1_SEG_1ST_SHIFT) +#define LCD_MAP_CHAR_COM1_SEG_2ND_POS (1 << LCD_MAP_CHAR_COM1_SEG_2ND_SHIFT) +#define LCD_MAP_CHAR_COM1_SEG_3RD_POS (1 << LCD_MAP_CHAR_COM1_SEG_3RD_SHIFT) +#define LCD_MAP_CHAR_COM1_SEG_4TH_POS (1 << LCD_MAP_CHAR_COM1_SEG_4TH_SHIFT) +#define LCD_MAP_CHAR_COM0_SEG_1ST_SHIFT 0x00000000 +#define LCD_MAP_CHAR_COM0_SEG_2ND_SHIFT 0x00000001 +#define LCD_MAP_CHAR_COM0_SEG_3RD_SHIFT 0x00000002 +#define LCD_MAP_CHAR_COM0_SEG_4TH_SHIFT 0x00000003 +#define LCD_MAP_CHAR_COM1_SEG_1ST_SHIFT 0x00000004 +#define LCD_MAP_CHAR_COM1_SEG_2ND_SHIFT 0x00000005 +#define LCD_MAP_CHAR_COM1_SEG_3RD_SHIFT 0x00000006 +#define LCD_MAP_CHAR_COM1_SEG_4TH_SHIFT 0x00000007 + +/** + * @brief LCD Digit defines + */ +#define LCD_DIGIT1_COM0 LCD_COM0 +#define LCD_DIGIT1_COM0_SEG_MASK ~(LCD_SEG0 | LCD_SEG1 | LCD_SEG2 | LCD_SEG3) +#define LCD_DIGIT1_COM1 LCD_COM1 +#define LCD_DIGIT1_COM1_SEG_MASK ~(LCD_SEG0 | LCD_SEG1 | LCD_SEG2 | LCD_SEG3) + +#define LCD_COM0 MCU_LCD_COM0 +#define LCD_COM0_1 MCU_LCD_COM0_1 +#define LCD_COM1 MCU_LCD_COM1 +#define LCD_COM1_1 MCU_LCD_COM1_1 + +#define LCD_SEG0 MCU_LCD_SEG0 +#define LCD_SEG1 MCU_LCD_SEG1 +#define LCD_SEG2 MCU_LCD_SEG2 +#define LCD_SEG3 MCU_LCD_SEG3 + +#define LCD_SEG0_SHIFT MCU_LCD_SEG0_SHIFT +#define LCD_SEG1_SHIFT MCU_LCD_SEG1_SHIFT +#define LCD_SEG2_SHIFT MCU_LCD_SEG2_SHIFT +#define LCD_SEG3_SHIFT MCU_LCD_SEG3_SHIFT + +#define MCU_LCD_COM0 LCD_RAM_REGISTER0 +#define MCU_LCD_COM0_1 LCD_RAM_REGISTER1 +#define MCU_LCD_COM1 LCD_RAM_REGISTER2 +#define MCU_LCD_COM1_1 LCD_RAM_REGISTER3 + +#define MCU_LCD_SEG0 (1U << MCU_LCD_SEG0_SHIFT) +#define MCU_LCD_SEG1 (1U << MCU_LCD_SEG1_SHIFT) +#define MCU_LCD_SEG2 (1U << MCU_LCD_SEG2_SHIFT) +#define MCU_LCD_SEG3 (1U << MCU_LCD_SEG3_SHIFT) + +#define MCU_LCD_SEG0_SHIFT 0 +#define MCU_LCD_SEG1_SHIFT 1 +#define MCU_LCD_SEG2_SHIFT 2 +#define MCU_LCD_SEG3_SHIFT 3 + +/** + * @brief LCD Pins definition. + */ +#define LCD_GPIO_BANKA_PINS (GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_6 | GPIO_PIN_8) + +void BSP_LCD_GLASS_Init(void); +void BSP_LCD_GLASS_DeInit(void); +void BSP_LCD_GLASS_Clear(void); +void BSP_LCD_GLASS_WriteDigit(int digit); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L476G_DISCOVERY_GLASS_LCD_H */