📄 stm32100b_eval_lcd.c
字号:
/**
******************************************************************************
* @file stm32100b_eval_lcd.c
* @author MCD Application Team
* @version V4.5.0
* @date 07-March-2011
* @brief This file includes the LCD driver for AM-240320LTNQW00H (LCD_HX8312),
* AM-240320L8TNQW00H (LCD_ILI9320), AM-240320LDTNQW00H (LCD_SPFD5408B)
* Liquid Crystal Display Module of STM32100B-EVAL board.
******************************************************************************
* @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 "stm32100b_eval_lcd.h"
#include "../Common/fonts.c"
/** @addtogroup Utilities
* @{
*/
/** @addtogroup STM32_EVAL
* @{
*/
/** @addtogroup STM32100B_EVAL
* @{
*/
/** @defgroup STM32100B_EVAL_LCD
* @brief This file includes the LCD driver for AM-240320LTNQW00H (LCD_HX8312),
* AM-240320L8TNQW00H (LCD_ILI9320), AM-240320LDTNQW00H (LCD_SPFD5408B)
* Liquid Crystal Display Module of STM32100B-EVAL board.
* @{
*/
/** @defgroup STM32100B_EVAL_LCD_Private_Types
* @{
*/
/**
* @}
*/
/** @defgroup STM32100B_EVAL_LCD_Private_Defines
* @{
*/
#define LCD_ILI9320 0x9320
#define LCD_HX8312 0x8312
#define LCD_SPFD5408 0x5408
#define START_BYTE 0x70
#define SET_INDEX 0x00
#define READ_STATUS 0x01
#define LCD_WRITE_REG 0x02
#define LCD_READ_REG 0x03
#define MAX_POLY_CORNERS 200
#define POLY_Y(Z) ((int32_t)((Points + Z)->X))
#define POLY_X(Z) ((int32_t)((Points + Z)->Y))
/**
* @}
*/
/** @defgroup STM32100B_EVAL_LCD_Private_Macros
* @{
*/
#define ABS(X) ((X) > 0 ? (X) : -(X))
/**
* @}
*/
/** @defgroup STM32100B_EVAL_LCD_Private_Variables
* @{
*/
static sFONT *LCD_Currentfonts;
/* Global variables to set the written text color */
static __IO uint16_t TextColor = 0x0000, BackColor = 0xFFFF;
static __IO uint32_t LCDType = LCD_ILI9320;
/**
* @}
*/
/** @defgroup STM32100B_EVAL_LCD_Private_Function_Prototypes
* @{
*/
#ifndef USE_Delay
static void delay(vu32 nCount);
#endif /* USE_Delay*/
static void LCD_WriteRegHX8312(uint8_t LCD_Reg, uint8_t LCD_RegValue);
static void LCD_WriteRegILI9320(uint8_t LCD_Reg, uint16_t LCD_RegValue);
static void PutPixel(int16_t x, int16_t y);
static void LCD_PolyLineRelativeClosed(pPoint Points, uint16_t PointCount, uint16_t Closed);
/**
* @}
*/
/** @defgroup STM32100B_EVAL_LCD_Private_Functions
* @{
*/
/**
* @brief DeInitializes the LCD.
* @param None
* @retval None
*/
void LCD_DeInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*!< LCD Display Off */
LCD_DisplayOff();
/*!< LCD_SPI disable */
SPI_Cmd(LCD_SPI, DISABLE);
/*!< LCD_SPI DeInit */
SPI_I2S_DeInit(LCD_SPI);
/*!< Disable SPI clock */
RCC_APB1PeriphClockCmd(LCD_SPI_CLK, DISABLE);
/* Configure NCS in Output Push-Pull mode */
GPIO_InitStructure.GPIO_Pin = LCD_NCS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(LCD_NCS_GPIO_PORT, &GPIO_InitStructure);
/* Configure NWR(RNW), RS in Output Push-Pull mode */
GPIO_InitStructure.GPIO_Pin = LCD_RS_PIN;
GPIO_Init(LCD_RS_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LCD_NWR_PIN;
GPIO_Init(LCD_NWR_GPIO_PORT, &GPIO_InitStructure);
/* Configure SPI pins: SCK, MISO and MOSI */
GPIO_InitStructure.GPIO_Pin = LCD_SPI_SCK_PIN;
GPIO_Init(LCD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LCD_SPI_MISO_PIN;
GPIO_Init(LCD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LCD_SPI_MOSI_PIN;
GPIO_Init(LCD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
}
/**
* @brief Setups the LCD.
* @param None
* @retval None
*/
void LCD_Setup(void)
{
/* Configure the LCD Control pins --------------------------------------------*/
LCD_CtrlLinesConfig();
/* Configure the LCD_SPI interface ----------------------------------------------*/
LCD_SPIConfig();
if(LCDType == LCD_ILI9320)
{
_delay_(5); /* Delay 50 ms */
/* Start Initial Sequence ------------------------------------------------*/
LCD_WriteReg(LCD_REG_229, 0x8000); /* Set the internal vcore voltage */
LCD_WriteReg(LCD_REG_0, 0x0001); /* Start internal OSC. */
LCD_WriteReg(LCD_REG_1, 0x0100); /* set SS and SM bit */
LCD_WriteReg(LCD_REG_2, 0x0700); /* set 1 line inversion */
LCD_WriteReg(LCD_REG_3, 0x1030); /* set GRAM write direction and BGR=1. */
LCD_WriteReg(LCD_REG_4, 0x0000); /* Resize register */
LCD_WriteReg(LCD_REG_8, 0x0202); /* set the back porch and front porch */
LCD_WriteReg(LCD_REG_9, 0x0000); /* set non-display area refresh cycle ISC[3:0] */
LCD_WriteReg(LCD_REG_10, 0x0000); /* FMARK function */
LCD_WriteReg(LCD_REG_12, 0x0000); /* RGB interface setting */
LCD_WriteReg(LCD_REG_13, 0x0000); /* Frame marker Position */
LCD_WriteReg(LCD_REG_15, 0x0000); /* RGB interface polarity */
/* Power On sequence -----------------------------------------------------*/
LCD_WriteReg(LCD_REG_16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
LCD_WriteReg(LCD_REG_17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */
LCD_WriteReg(LCD_REG_18, 0x0000); /* VREG1OUT voltage */
LCD_WriteReg(LCD_REG_19, 0x0000); /* VDV[4:0] for VCOM amplitude */
_delay_(20); /* Dis-charge capacitor power voltage (200ms) */
LCD_WriteReg(LCD_REG_16, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
LCD_WriteReg(LCD_REG_17, 0x0137); /* DC1[2:0], DC0[2:0], VC[2:0] */
_delay_(5); /* Delay 50 ms */
LCD_WriteReg(LCD_REG_18, 0x0139); /* VREG1OUT voltage */
_delay_(5); /* Delay 50 ms */
LCD_WriteReg(LCD_REG_19, 0x1d00); /* VDV[4:0] for VCOM amplitude */
LCD_WriteReg(LCD_REG_41, 0x0013); /* VCM[4:0] for VCOMH */
_delay_(5); /* Delay 50 ms */
LCD_WriteReg(LCD_REG_32, 0x0000); /* GRAM horizontal Address */
LCD_WriteReg(LCD_REG_33, 0x0000); /* GRAM Vertical Address */
/* Adjust the Gamma Curve ------------------------------------------------*/
LCD_WriteReg(LCD_REG_48, 0x0006);
LCD_WriteReg(LCD_REG_49, 0x0101);
LCD_WriteReg(LCD_REG_50, 0x0003);
LCD_WriteReg(LCD_REG_53, 0x0106);
LCD_WriteReg(LCD_REG_54, 0x0b02);
LCD_WriteReg(LCD_REG_55, 0x0302);
LCD_WriteReg(LCD_REG_56, 0x0707);
LCD_WriteReg(LCD_REG_57, 0x0007);
LCD_WriteReg(LCD_REG_60, 0x0600);
LCD_WriteReg(LCD_REG_61, 0x020b);
/* Set GRAM area ---------------------------------------------------------*/
LCD_WriteReg(LCD_REG_80, 0x0000); /* Horizontal GRAM Start Address */
LCD_WriteReg(LCD_REG_81, 0x00EF); /* Horizontal GRAM End Address */
LCD_WriteReg(LCD_REG_82, 0x0000); /* Vertical GRAM Start Address */
LCD_WriteReg(LCD_REG_83, 0x013F); /* Vertical GRAM End Address */
LCD_WriteReg(LCD_REG_96, 0x2700); /* Gate Scan Line */
LCD_WriteReg(LCD_REG_97, 0x0001); /* NDL,VLE, REV */
LCD_WriteReg(LCD_REG_106, 0x0000); /* set scrolling line */
/* Partial Display Control -----------------------------------------------*/
LCD_WriteReg(LCD_REG_128, 0x0000);
LCD_WriteReg(LCD_REG_129, 0x0000);
LCD_WriteReg(LCD_REG_130, 0x0000);
LCD_WriteReg(LCD_REG_131, 0x0000);
LCD_WriteReg(LCD_REG_132, 0x0000);
LCD_WriteReg(LCD_REG_133, 0x0000);
/* Panel Control ---------------------------------------------------------*/
LCD_WriteReg(LCD_REG_144, 0x0010);
LCD_WriteReg(LCD_REG_146, 0x0000);
LCD_WriteReg(LCD_REG_147, 0x0003);
LCD_WriteReg(LCD_REG_149, 0x0110);
LCD_WriteReg(LCD_REG_151, 0x0000);
LCD_WriteReg(LCD_REG_152, 0x0000);
/* Set GRAM write direction and BGR = 1 */
/* I/D=01 (Horizontal : increment, Vertical : decrement) */
/* AM=1 (address is updated in vertical writing direction) */
LCD_WriteReg(LCD_REG_3, 0x1018);
LCD_WriteReg(LCD_REG_7, 0x0173); /* 262K color and display ON */
}
else if(LCDType == LCD_SPFD5408)
{
/* Start Initial Sequence --------------------------------------------------*/
LCD_WriteReg(LCD_REG_227, 0x3008); /* Set internal timing */
LCD_WriteReg(LCD_REG_231, 0x0012); /* Set internal timing */
LCD_WriteReg(LCD_REG_239, 0x1231); /* Set internal timing */
LCD_WriteReg(LCD_REG_1, 0x0100); /* Set SS and SM bit */
LCD_WriteReg(LCD_REG_2, 0x0700); /* Set 1 line inversion */
LCD_WriteReg(LCD_REG_3, 0x1030); /* Set GRAM write direction and BGR=1. */
LCD_WriteReg(LCD_REG_4, 0x0000); /* Resize register */
LCD_WriteReg(LCD_REG_8, 0x0202); /* Set the back porch and front porch */
LCD_WriteReg(LCD_REG_9, 0x0000); /* Set non-display area refresh cycle ISC[3:0] */
LCD_WriteReg(LCD_REG_10, 0x0000); /* FMARK function */
LCD_WriteReg(LCD_REG_12, 0x0000); /* RGB interface setting */
LCD_WriteReg(LCD_REG_13, 0x0000); /* Frame marker Position */
LCD_WriteReg(LCD_REG_15, 0x0000); /* RGB interface polarity */
/* Power On sequence -------------------------------------------------------*/
LCD_WriteReg(LCD_REG_16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
LCD_WriteReg(LCD_REG_17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */
LCD_WriteReg(LCD_REG_18, 0x0000); /* VREG1OUT voltage */
LCD_WriteReg(LCD_REG_19, 0x0000); /* VDV[4:0] for VCOM amplitude */
_delay_(20); /* Dis-charge capacitor power voltage (200ms) */
LCD_WriteReg(LCD_REG_17, 0x0007); /* DC1[2:0], DC0[2:0], VC[2:0] */
_delay_(5); /* Delay 50 ms */
LCD_WriteReg(LCD_REG_16, 0x12B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
_delay_(5); /* Delay 50 ms */
LCD_WriteReg(LCD_REG_18, 0x01BD); /* External reference voltage= Vci */
_delay_(5); /* Delay 50 ms */
LCD_WriteReg(LCD_REG_19, 0x1400); /* VDV[4:0] for VCOM amplitude */
LCD_WriteReg(LCD_REG_41, 0x000E); /* VCM[4:0] for VCOMH */
_delay_(5); /* Delay 50 ms */
LCD_WriteReg(LCD_REG_32, 0x0000); /* GRAM horizontal Address */
LCD_WriteReg(LCD_REG_33, 0x013F); /* GRAM Vertical Address */
/* Adjust the Gamma Curve --------------------------------------------------*/
LCD_WriteReg(LCD_REG_48, 0x0007);
LCD_WriteReg(LCD_REG_49, 0x0302);
LCD_WriteReg(LCD_REG_50, 0x0105);
LCD_WriteReg(LCD_REG_53, 0x0206);
LCD_WriteReg(LCD_REG_54, 0x0808);
LCD_WriteReg(LCD_REG_55, 0x0206);
LCD_WriteReg(LCD_REG_56, 0x0504);
LCD_WriteReg(LCD_REG_57, 0x0007);
LCD_WriteReg(LCD_REG_60, 0x0105);
LCD_WriteReg(LCD_REG_61, 0x0808);
/* Set GRAM area -----------------------------------------------------------*/
LCD_WriteReg(LCD_REG_80, 0x0000); /* Horizontal GRAM Start Address */
LCD_WriteReg(LCD_REG_81, 0x00EF); /* Horizontal GRAM End Address */
LCD_WriteReg(LCD_REG_82, 0x0000); /* Vertical GRAM Start Address */
LCD_WriteReg(LCD_REG_83, 0x013F); /* Vertical GRAM End Address */
LCD_WriteReg(LCD_REG_96, 0xA700); /* Gate Scan Line */
LCD_WriteReg(LCD_REG_97, 0x0001); /* NDL,VLE, REV */
LCD_WriteReg(LCD_REG_106, 0x0000); /* Set scrolling line */
/* Partial Display Control -------------------------------------------------*/
LCD_WriteReg(LCD_REG_128, 0x0000);
LCD_WriteReg(LCD_REG_129, 0x0000);
LCD_WriteReg(LCD_REG_130, 0x0000);
LCD_WriteReg(LCD_REG_131, 0x0000);
LCD_WriteReg(LCD_REG_132, 0x0000);
LCD_WriteReg(LCD_REG_133, 0x0000);
/* Panel Control -----------------------------------------------------------*/
LCD_WriteReg(LCD_REG_144, 0x0010);
LCD_WriteReg(LCD_REG_146, 0x0000);
LCD_WriteReg(LCD_REG_147, 0x0003);
LCD_WriteReg(LCD_REG_149, 0x0110);
LCD_WriteReg(LCD_REG_151, 0x0000);
LCD_WriteReg(LCD_REG_152, 0x0000);
/* Set GRAM write direction and BGR = 1
I/D=01 (Horizontal : increment, Vertical : decrement)
AM=1 (address is updated in vertical writing direction) */
LCD_WriteReg(LCD_REG_3, 0x1018);
LCD_WriteReg(LCD_REG_7, 0x0112); /* 262K color and display ON */
}
else if(LCDType == LCD_HX8312)
{
/* Enable the LCD Oscillator ---------------------------------------------*/
LCD_WriteReg(LCD_REG_1, 0x10);
LCD_WriteReg(LCD_REG_0, 0xA0);
LCD_WriteReg(LCD_REG_3, 0x01);
_delay_(1); /* Delay 10 ms */
LCD_WriteReg(LCD_REG_3, 0x00);
LCD_WriteReg(LCD_REG_43, 0x04);
LCD_WriteReg(LCD_REG_40, 0x18);
LCD_WriteReg(LCD_REG_26, 0x05);
LCD_WriteReg(LCD_REG_37, 0x05);
LCD_WriteReg(LCD_REG_25, 0x00);
/* LCD Power On ----------------------------------------------------------*/
LCD_WriteReg(LCD_REG_28, 0x73);
LCD_WriteReg(LCD_REG_36, 0x74);
LCD_WriteReg(LCD_REG_30, 0x01);
LCD_WriteReg(LCD_REG_24, 0xC1);
_delay_(1); /* Delay 10 ms */
LCD_WriteReg(LCD_REG_24, 0xE1);
LCD_WriteReg(LCD_REG_24, 0xF1);
_delay_(6); /* Delay 60 ms */
LCD_WriteReg(LCD_REG_24, 0xF5);
_delay_(6); /* Delay 60 ms */
LCD_WriteReg(LCD_REG_27, 0x09);
_delay_(1); /* Delay 10 ms */
LCD_WriteReg(LCD_REG_31, 0x11);
LCD_WriteReg(LCD_REG_32, 0x0E);
LCD_WriteReg(LCD_REG_30, 0x81);
_delay_(1); /* Delay 10 ms */
/* Chip Set --------------------------------------------------------------*/
LCD_WriteReg(LCD_REG_157, 0x00);
LCD_WriteReg(LCD_REG_192, 0x00);
LCD_WriteReg(LCD_REG_14, 0x00);
LCD_WriteReg(LCD_REG_15, 0x00);
LCD_WriteReg(LCD_REG_16, 0x00);
LCD_WriteReg(LCD_REG_17, 0x00);
LCD_WriteReg(LCD_REG_18, 0x00);
LCD_WriteReg(LCD_REG_19, 0x00);
LCD_WriteReg(LCD_REG_20, 0x00);
LCD_WriteReg(LCD_REG_21, 0x00);
LCD_WriteReg(LCD_REG_22, 0x00);
LCD_WriteReg(LCD_REG_23, 0x00);
LCD_WriteReg(LCD_REG_52, 0x01);
LCD_WriteReg(LCD_REG_53, 0x00);
LCD_WriteReg(LCD_REG_75, 0x00);
LCD_WriteReg(LCD_REG_76, 0x00);
LCD_WriteReg(LCD_REG_78, 0x00);
LCD_WriteReg(LCD_REG_79, 0x00);
LCD_WriteReg(LCD_REG_80, 0x00);
LCD_WriteReg(LCD_REG_60, 0x00);
LCD_WriteReg(LCD_REG_61, 0x00);
LCD_WriteReg(LCD_REG_62, 0x01);
LCD_WriteReg(LCD_REG_63, 0x3F);
LCD_WriteReg(LCD_REG_64, 0x02);
LCD_WriteReg(LCD_REG_65, 0x02);
LCD_WriteReg(LCD_REG_66, 0x00);
LCD_WriteReg(LCD_REG_67, 0x00);
LCD_WriteReg(LCD_REG_68, 0x00);
LCD_WriteReg(LCD_REG_69, 0x00);
LCD_WriteReg(LCD_REG_70, 0xEF);
LCD_WriteReg(LCD_REG_71, 0x00);
LCD_WriteReg(LCD_REG_72, 0x00);
LCD_WriteReg(LCD_REG_73, 0x01);
LCD_WriteReg(LCD_REG_74, 0x3F);
LCD_WriteReg(LCD_REG_29, 0x08); /* R29:Gate scan direction setting */
LCD_WriteReg(LCD_REG_134, 0x00);
LCD_WriteReg(LCD_REG_135, 0x30);
LCD_WriteReg(LCD_REG_136, 0x02);
LCD_WriteReg(LCD_REG_137, 0x05);
LCD_WriteReg(LCD_REG_141, 0x01); /* R141:Register set-up mode for one line clock */
LCD_WriteReg(LCD_REG_139, 0x20); /* R139:One line SYSCLK number in one-line */
LCD_WriteReg(LCD_REG_51, 0x01); /* R51:N line inversion setting */
LCD_WriteReg(LCD_REG_55, 0x01); /* R55:Scanning method setting */
LCD_WriteReg(LCD_REG_118, 0x00);
/* Gamma Set -------------------------------------------------------------*/
LCD_WriteReg(LCD_REG_143, 0x10);
LCD_WriteReg(LCD_REG_144, 0x67);
LCD_WriteReg(LCD_REG_145, 0x07);
LCD_WriteReg(LCD_REG_146, 0x65);
LCD_WriteReg(LCD_REG_147, 0x07);
LCD_WriteReg(LCD_REG_148, 0x01);
LCD_WriteReg(LCD_REG_149, 0x76);
LCD_WriteReg(LCD_REG_150, 0x56);
LCD_WriteReg(LCD_REG_151, 0x00);
LCD_WriteReg(LCD_REG_152, 0x06);
LCD_WriteReg(LCD_REG_153, 0x03);
LCD_WriteReg(LCD_REG_154, 0x00);
/* Display On ------------------------------------------------------------*/
LCD_WriteReg(LCD_REG_1, 0x50);
LCD_WriteReg(LCD_REG_5, 0x04);
LCD_WriteReg(LCD_REG_0, 0x80);
LCD_WriteReg(LCD_REG_59, 0x01);
_delay_(4); /* Delay 40 ms */
LCD_WriteReg(LCD_REG_0, 0x20);
}
}
/**
* @brief Initializes the LCD.
* @param None
* @retval None
*/
void STM32100B_LCD_Init(void)
{
/* Setups the LCD */
LCD_Setup();
/* Try to read new LCD controller ID 0x9320 */
if (LCD_ReadReg(LCD_REG_0) == LCD_ILI9320)
{
LCDType = LCD_ILI9320;
}
else
{
LCDType = LCD_SPFD5408;
/* Setups the LCD */
LCD_Setup();
/* Try to read new LCD controller ID 0x5408 */
if (LCD_ReadReg(LCD_REG_0) != LCD_SPFD5408)
{
LCDType = LCD_HX8312;
/* Setups the LCD */
LCD_Setup();
}
}
LCD_SetFont(&LCD_DEFAULT_FONT);
}
/**
* @brief Sets the LCD Text and Background colors.
* @param _TextColor: specifies the Text Color.
* @param _BackColor: specifies the Background Color.
* @retval None
*/
void LCD_SetColors(__IO uint16_t _TextColor, __IO uint16_t _BackColor)
{
TextColor = _TextColor;
BackColor = _BackColor;
}
/**
* @brief Gets the LCD Text and Background colors.
* @param _TextColor: pointer to the variable that will contain the Text
Color.
* @param _BackColor: pointer to the variable that will contain the Background
Color.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -