📄 stm3210b_eval_lcd.c
字号:
while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET)
{
}
LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET);
}
/**
* @brief Writes to the selected LCD ILI9320 register.
* @param LCD_Reg: address of the selected register.
* @param LCD_RegValue: value to write to the selected register.
* @retval None
*/
static void LCD_WriteRegILI9320(uint8_t LCD_Reg, uint16_t LCD_RegValue)
{
/* Write 16-bit Index (then Write Reg) */
LCD_WriteRegIndex(LCD_Reg);
/* Write 16-bit Reg */
/* Reset LCD control line(/CS) and Send Start-Byte */
LCD_nCS_StartByte(START_BYTE | LCD_WRITE_REG);
SPI_I2S_SendData(LCD_SPI, LCD_RegValue>>8);
while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET)
{
}
SPI_I2S_SendData(LCD_SPI, (LCD_RegValue & 0xFF));
while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET)
{
}
LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET);
}
/**
* @brief Reads the selected LCD Register.
* @param LCD_Reg: address of the selected register.
* @retval LCD Register Value.
*/
uint16_t LCD_ReadReg(uint8_t LCD_Reg)
{
uint16_t tmp = 0;
uint8_t i = 0;
/* LCD_SPI prescaler: 4 */
LCD_SPI->CR1 &= 0xFFC7;
LCD_SPI->CR1 |= 0x0008;
/* Write 16-bit Index (then Read Reg) */
LCD_WriteRegIndex(LCD_Reg);
/* Read 16-bit Reg */
/* Reset LCD control line(/CS) and Send Start-Byte */
LCD_nCS_StartByte(START_BYTE | LCD_READ_REG);
for(i = 0; i < 5; i++)
{
SPI_I2S_SendData(LCD_SPI, 0xFF);
while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET)
{
}
/* One byte of invalid dummy data read after the start byte */
while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_RXNE) == RESET)
{
}
SPI_I2S_ReceiveData(LCD_SPI);
}
SPI_I2S_SendData(LCD_SPI, 0xFF);
/* Read upper byte */
while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET)
{
}
/* Read lower byte */
while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_RXNE) == RESET)
{
}
tmp = SPI_I2S_ReceiveData(LCD_SPI);
SPI_I2S_SendData(LCD_SPI, 0xFF);
while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET)
{
}
/* Read lower byte */
while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_RXNE) == RESET)
{
}
tmp = ((tmp & 0xFF) << 8) | SPI_I2S_ReceiveData(LCD_SPI);
LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET);
/* LCD_SPI prescaler: 2 */
LCD_SPI->CR1 &= 0xFFC7;
return tmp;
}
/**
* @brief Prepare to write to the LCD RAM.
* @param None
* @retval None
*/
void LCD_WriteRAM_Prepare(void)
{
LCD_WriteRegIndex(LCD_REG_34); /* Select GRAM Reg */
/* Reset LCD control line(/CS) and Send Start-Byte */
LCD_nCS_StartByte(START_BYTE | LCD_WRITE_REG);
}
/**
* @brief Writes 1 word to the LCD RAM.
* @param RGB_Code: the pixel color in RGB mode (5-6-5).
* @retval None
*/
void LCD_WriteRAMWord(uint16_t RGB_Code)
{
LCD_WriteRAM_Prepare();
LCD_WriteRAM(RGB_Code);
LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET);
}
/**
* @brief Writes to the selected LCD HX8312 register.
* @param LCD_Reg: address of the selected register.
* @param LCD_RegValue: value to write to the selected register.
* @retval None
*/
static void LCD_WriteRegHX8312(uint8_t LCD_Reg, uint8_t LCD_RegValue)
{
uint16_t tmp = 0;
LCD_CtrlLinesWrite(LCD_NWR_GPIO_PORT, LCD_NWR_PIN, Bit_RESET);
LCD_CtrlLinesWrite(LCD_RS_GPIO_PORT, LCD_RS_PIN, Bit_RESET);
LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_RESET);
tmp = LCD_Reg << 8;
tmp |= LCD_RegValue;
SPI_I2S_SendData(LCD_SPI, tmp);
while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET)
{
}
LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET);
}
/**
* @brief Writes to the selected LCD register.
* @param LCD_Reg: address of the selected register.
* @param LCD_RegValue: value to write to the selected register.
* @retval None
*/
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)
{
if((LCDType == LCD_ILI9320) || (LCDType == LCD_SPFD5408))
{
LCD_WriteRegILI9320(LCD_Reg, LCD_RegValue);
}
else if(LCDType == LCD_HX8312)
{
LCD_WriteRegHX8312(LCD_Reg, ((uint8_t)LCD_RegValue));
}
}
/**
* @brief Writes to the LCD RAM.
* @param RGB_Code: the pixel color in RGB mode (5-6-5).
* @retval None
*/
void LCD_WriteRAM(uint16_t RGB_Code)
{
if((LCDType == LCD_ILI9320) || (LCDType == LCD_SPFD5408))
{
SPI_I2S_SendData(LCD_SPI, RGB_Code >> 8);
while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET)
{
}
SPI_I2S_SendData(LCD_SPI, RGB_Code & 0xFF);
while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET)
{
}
}
if(LCDType == LCD_HX8312)
{
LCD_CtrlLinesWrite(LCD_NWR_GPIO_PORT, LCD_NWR_PIN, Bit_RESET);
LCD_CtrlLinesWrite(LCD_RS_GPIO_PORT, LCD_RS_PIN, Bit_SET);
LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_RESET);
SPI_I2S_SendData(LCD_SPI, RGB_Code);
while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET)
{
}
LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET);
}
}
/**
* @brief Power on the LCD.
* @param None
* @retval None
*/
void LCD_PowerOn(void)
{
if((LCDType == LCD_ILI9320) || (LCDType == LCD_SPFD5408))
{
/* 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_7, 0x0173); /* 262K color and display ON */
}
else if(LCDType == LCD_HX8312)
{
/* Power On Set */
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 */
}
}
/**
* @brief Enables the Display.
* @param None
* @retval None
*/
void LCD_DisplayOn(void)
{
if((LCDType == LCD_ILI9320) || (LCDType == LCD_SPFD5408))
{
/* Display On */
LCD_WriteReg(LCD_REG_7, 0x0173); /* 262K color and display ON */
}
else if(LCDType == LCD_HX8312)
{
LCD_WriteReg(LCD_REG_1, 0x50);
LCD_WriteReg(LCD_REG_5, 0x04);
/* Display On */
LCD_WriteReg(LCD_REG_0, 0x80);
LCD_WriteReg(LCD_REG_59, 0x01);
_delay_(4); /* Delay 40 ms */
LCD_WriteReg(LCD_REG_0, 0x20);
}
}
/**
* @brief Disables the Display.
* @param None
* @retval None
*/
void LCD_DisplayOff(void)
{
if((LCDType == LCD_ILI9320) || (LCDType == LCD_SPFD5408))
{
/* Display Off */
LCD_WriteReg(LCD_REG_7, 0x0);
}
else if(LCDType == LCD_HX8312)
{
/* Display Off */
LCD_WriteReg(LCD_REG_0, 0xA0);
_delay_(4); /* Delay 40 ms */
LCD_WriteReg(LCD_REG_59, 0x00);
}
}
/**
* @brief Configures LCD control lines in Output Push-Pull mode.
* @param None
* @retval None
*/
void LCD_CtrlLinesConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIO clock */
RCC_APB2PeriphClockCmd(LCD_NCS_GPIO_CLK | LCD_NWR_GPIO_CLK | LCD_RS_GPIO_CLK, ENABLE);
/* Configure NCS in Output Push-Pull mode */
GPIO_InitStructure.GPIO_Pin = LCD_NCS_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
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);
LCD_CtrlLinesWrite(LCD_NWR_GPIO_PORT, LCD_NWR_PIN, Bit_SET);
LCD_CtrlLinesWrite(LCD_RS_GPIO_PORT, LCD_RS_PIN, Bit_SET);
}
/**
* @brief Sets or reset LCD control lines.
* @param GPIOx: where x can be B or D to select the GPIO peripheral.
* @param CtrlPins: the Control line.
* This parameter can be:
* @arg LCD_NCS_PIN: Chip Select pin
* @arg LCD_NWR_PIN: Read/Write Selection pin
* @arg LCD_RS_PIN: Register/RAM Selection pin
* @param BitVal: specifies the value to be written to the selected bit.
* This parameter can be:
* @arg Bit_RESET: to clear the port pin
* @arg Bit_SET: to set the port pin
* @retval None
*/
void LCD_CtrlLinesWrite(GPIO_TypeDef* GPIOx, uint16_t CtrlPins, BitAction BitVal)
{
/* Set or Reset the control line */
GPIO_WriteBit(GPIOx, CtrlPins, BitVal);
}
/**
* @brief Configures the LCD_SPI interface.
* @param None
* @retval None
*/
void LCD_SPIConfig(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIO clock */
RCC_APB2PeriphClockCmd(LCD_SPI_SCK_GPIO_CLK | LCD_SPI_MISO_GPIO_CLK | LCD_SPI_MOSI_GPIO_CLK, ENABLE);
/* Enable SPI clock */
RCC_APB1PeriphClockCmd(LCD_SPI_CLK, ENABLE);
/* Configure SPI pins: SCK, MISO and MOSI */
GPIO_InitStructure.GPIO_Pin = LCD_SPI_SCK_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
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);
SPI_I2S_DeInit(LCD_SPI);
/* SPI Config */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
if((LCDType == LCD_ILI9320) || (LCDType == LCD_SPFD5408))
{
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
}
else if(LCDType == LCD_HX8312)
{
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
}
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(LCD_SPI, &SPI_InitStructure);
/* SPI enable */
SPI_Cmd(LCD_SPI, ENABLE);
}
/**
* @brief Displays a pixel.
* @param x: pixel x.
* @param y: pixel y.
* @retval None
*/
static void PutPixel(int16_t x, int16_t y)
{
if(x < 0 || x > 239 || y < 0 || y > 319)
{
return;
}
LCD_DrawLine(x, y, 1, LCD_DIR_HORIZONTAL);
}
#ifndef USE_Delay
/**
* @brief Inserts a delay time.
* @param nCount: specifies the delay time length.
* @retval None
*/
static void delay(vu32 nCount)
{
vu32 index = 0;
for(index = (100000 * nCount); index != 0; index--)
{
}
}
#endif /* USE_Delay*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -