📄 lcd.c
字号:
/* Increment the character counter */
i++;
}
}
/*******************************************************************************
* Function Name : LCD_SetDisplayWindow
* Description : Sets a display window
* Input : - Xpos: specifies the X buttom left position.
* - Ypos: specifies the Y buttom left position.
* - Height: display window height.
* - Width: display window width.
* Output : None
* Return : None
*******************************************************************************/
void LCD_SetDisplayWindow(u8 Xpos, u16 Ypos, u8 Height, u16 Width)
{
if(LCDType == LCD_ILI9320)
{
/* Horizontal GRAM Start Address */
if(Xpos >= Height)
{
LCD_WriteReg(R80, (Xpos - Height + 1));
}
else
{
LCD_WriteReg(R80, 0);
}
/* Horizontal GRAM End Address */
LCD_WriteReg(R81, Xpos);
/* Vertical GRAM Start Address */
if(Ypos >= Width)
{
LCD_WriteReg(R82, (Ypos - Width + 1));
}
else
{
LCD_WriteReg(R82, 0);
}
/* Vertical GRAM End Address */
LCD_WriteReg(R83, Ypos);
}
else if(LCDType == LCD_HX8312)
{
LCD_WriteReg(R1, 0xD0);
LCD_WriteReg(R5, 0x14);
LCD_WriteReg(R69, (Xpos - Height + 1));
LCD_WriteReg(R70, Xpos);
LCD_WriteReg(R71, (((Ypos - Width + 1) & 0x100)>> 8));
LCD_WriteReg(R72, ((Ypos - Width + 1) & 0xFF));
LCD_WriteReg(R73, ((Ypos & 0x100)>> 8));
LCD_WriteReg(R74, (Ypos & 0xFF));
}
LCD_SetCursor(Xpos, Ypos);
}
/*******************************************************************************
* Function Name : LCD_WindowModeDisable
* Description : Disables LCD Window mode.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void LCD_WindowModeDisable(void)
{
if(LCDType == LCD_ILI9320)
{
LCD_SetDisplayWindow(239, 0x13F, 240, 320);
LCD_WriteReg(R3, 0x1018);
}
else if(LCDType == LCD_HX8312)
{
LCD_WriteReg(R1, 0x50);
LCD_WriteReg(R5, 0x04);
}
}
/*******************************************************************************
* Function Name : LCD_DrawLine
* Description : Displays a line.
* Input : - Xpos: specifies the X position.
* - Ypos: specifies the Y position.
* - Length: line length.
* - Direction: line direction.
* This parameter can be one of the following values: Vertical
* or Horizontal.
* Output : None
* Return : None
*******************************************************************************/
void LCD_DrawLine(u8 Xpos, u16 Ypos, u16 Length, u8 Direction)
{
u32 i = 0;
LCD_SetCursor(Xpos, Ypos);
if(Direction == Horizontal)
{
if(LCDType == LCD_ILI9320)
{
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
}
for(i = 0; i < Length; i++)
{
LCD_WriteRAM(TextColor);
}
if(LCDType == LCD_ILI9320)
{
LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
}
}
else
{
for(i = 0; i < Length; i++)
{
if(LCDType == LCD_ILI9320)
{
LCD_WriteRAMWord(TextColor);
}
else if(LCDType == LCD_HX8312)
{
LCD_WriteRAM(TextColor);
}
Xpos++;
LCD_SetCursor(Xpos, Ypos);
}
}
}
/*******************************************************************************
* Function Name : LCD_DrawRect
* Description : Displays a rectangle.
* Input : - Xpos: specifies the X position.
* - Ypos: specifies the Y position.
* - Height: display rectangle height.
* - Width: display rectangle width.
* Output : None
* Return : None
*******************************************************************************/
void LCD_DrawRect(u8 Xpos, u16 Ypos, u8 Height, u16 Width)
{
LCD_DrawLine(Xpos, Ypos, Width, Horizontal);
LCD_DrawLine((Xpos + Height), Ypos, Width, Horizontal);
LCD_DrawLine(Xpos, Ypos, Height, Vertical);
LCD_DrawLine(Xpos, (Ypos - Width + 1), Height, Vertical);
}
/*******************************************************************************
* Function Name : LCD_DrawCircle
* Description : Displays a circle.
* Input : - Xpos: specifies the X position.
* - Ypos: specifies the Y position.
* - Height: display rectangle height.
* - Width: display rectangle width.
* Output : None
* Return : None
*******************************************************************************/
void LCD_DrawCircle(u8 Xpos, u16 Ypos, u16 Radius)
{
s32 D;/* Decision Variable */
u32 CurX;/* Current X Value */
u32 CurY;/* Current Y Value */
D = 3 - (Radius << 1);
CurX = 0;
CurY = Radius;
while (CurX <= CurY)
{
LCD_SetCursor(Xpos + CurX, Ypos + CurY);
if(LCDType == LCD_ILI9320)
{
LCD_WriteRAMWord(TextColor);
}
else if(LCDType == LCD_HX8312)
{
LCD_WriteRAM(TextColor);
}
LCD_SetCursor(Xpos + CurX, Ypos - CurY);
if(LCDType == LCD_ILI9320)
{
LCD_WriteRAMWord(TextColor);
}
else if(LCDType == LCD_HX8312)
{
LCD_WriteRAM(TextColor);
}
LCD_SetCursor(Xpos - CurX, Ypos + CurY);
if(LCDType == LCD_ILI9320)
{
LCD_WriteRAMWord(TextColor);
}
else if(LCDType == LCD_HX8312)
{
LCD_WriteRAM(TextColor);
}
LCD_SetCursor(Xpos - CurX, Ypos - CurY);
if(LCDType == LCD_ILI9320)
{
LCD_WriteRAMWord(TextColor);
}
else if(LCDType == LCD_HX8312)
{
LCD_WriteRAM(TextColor);
}
LCD_SetCursor(Xpos + CurY, Ypos + CurX);
if(LCDType == LCD_ILI9320)
{
LCD_WriteRAMWord(TextColor);
}
else if(LCDType == LCD_HX8312)
{
LCD_WriteRAM(TextColor);
}
LCD_SetCursor(Xpos + CurY, Ypos - CurX);
if(LCDType == LCD_ILI9320)
{
LCD_WriteRAMWord(TextColor);
}
else if(LCDType == LCD_HX8312)
{
LCD_WriteRAM(TextColor);
}
LCD_SetCursor(Xpos - CurY, Ypos + CurX);
if(LCDType == LCD_ILI9320)
{
LCD_WriteRAMWord(TextColor);
}
else if(LCDType == LCD_HX8312)
{
LCD_WriteRAM(TextColor);
}
LCD_SetCursor(Xpos - CurY, Ypos - CurX);
if(LCDType == LCD_ILI9320)
{
LCD_WriteRAMWord(TextColor);
}
else if(LCDType == LCD_HX8312)
{
LCD_WriteRAM(TextColor);
}
if (D < 0)
{
D += (CurX << 2) + 6;
}
else
{
D += ((CurX - CurY) << 2) + 10;
CurY--;
}
CurX++;
}
}
/*******************************************************************************
* Function Name : LCD_DrawMonoPict
* Description : Displays a monocolor picture.
* Input : - Pict: pointer to the picture array.
* Output : None
* Return : None
*******************************************************************************/
void LCD_DrawMonoPict(uc32 *Pict)
{
u32 index = 0, i = 0;
LCD_SetCursor(0, 319);
if(LCDType == LCD_ILI9320)
{
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
}
for(index = 0; index < 2400; index++)
{
for(i = 0; i < 32; i++)
{
if((Pict[index] & (1 << i)) == 0x00)
{
LCD_WriteRAM(BackColor);
}
else
{
LCD_WriteRAM(TextColor);
}
}
}
if(LCDType == LCD_ILI9320)
{
LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
}
}
/*******************************************************************************
* Function Name : LCD_DrawBMP
* Description : Displays a bitmap picture loaded in the SPI Flash.
* Input : - BmpAddress: Bmp picture address in the SPI Flash.
* Output : None
* Return : None
*******************************************************************************/
void LCD_DrawBMP(u32 BmpAddress)
{
u32 i = 0, size = 0;
/* Read bitmap size */
SPI_FLASH_BufferRead((u8*)&size, BmpAddress + 2, 4);
/* get bitmap data address offset */
SPI_FLASH_BufferRead((u8*)&i, BmpAddress + 10, 4);
size = (size - i)/2;
SPI_FLASH_StartReadSequence(BmpAddress + i);
/* Disable SPI1 */
SPI_Cmd(SPI1, DISABLE);
/* SPI in 16-bit mode */
SPI_DataSizeConfig(SPI1, SPI_DataSize_16b);
/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE);
if(LCDType == LCD_ILI9320)
{
/* Set GRAM write direction and BGR = 1 */
/* I/D=00 (Horizontal : decrement, Vertical : decrement) */
/* AM=1 (address is updated in vertical writing direction) */
LCD_WriteReg(R3, 0x1008);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
}
/* Read bitmap data from SPI Flash and send them to LCD */
for(i = 0; i < size; i++)
{
LCD_WriteRAM(__REV_HalfWord(SPI_FLASH_SendHalfWord(0xA5A5)));
}
if(LCDType == LCD_ILI9320)
{
LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
}
/* Deselect the FLASH: Chip Select high */
SPI_FLASH_CS_HIGH();
/* Disable SPI1 */
SPI_Cmd(SPI1, DISABLE);
/* SPI in 8-bit mode */
SPI_DataSizeConfig(SPI1, SPI_DataSize_8b);
/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE);
if(LCDType == LCD_ILI9320)
{
/* 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(R3, 0x1018);
}
}
/*******************************************************************************
* Function Name : LCD_nCS_StartByte
* Description : Reset LCD control line(/CS) and Send Start-Byte
* Input : - Start_Byte: the Start-Byte to be sent
* Output : None
* Return : None
*******************************************************************************/
void LCD_nCS_StartByte(u8 Start_Byte)
{
LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_RESET);
SPI_SendData(SPI2, Start_Byte);
while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
{
}
}
/*******************************************************************************
* Function Name : LCD_WriteRegIndex
* Description : Writes index to select the LCD register.
* Input : - LCD_Reg: address of the selected register.
* Output : None
* Return : None
*******************************************************************************/
void LCD_WriteRegIndex(u8 LCD_Reg)
{
/* Reset LCD control line(/CS) and Send Start-Byte */
LCD_nCS_StartByte(START_BYTE | SET_INDEX);
/* Write 16-bit Reg Index (High Byte is 0) */
SPI_SendData(SPI2, 0x00);
while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
{
}
SPI_SendData(SPI2, LCD_Reg);
while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
{
}
LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
}
/*******************************************************************************
* Function Name : LCD_WriteRegILI9320
* Description : Writes to the selected LCD ILI9320 register.
* Input : - LCD_Reg: address of the selected register.
* - LCD_RegValue: value to write to the selected register.
* Output : None
* Return : None
*******************************************************************************/
static void LCD_WriteRegILI9320(u8 LCD_Reg, u16 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 | WRITE_REG);
SPI_SendData(SPI2, LCD_RegValue>>8);
while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
{
}
SPI_SendData(SPI2, (LCD_RegValue & 0xFF));
while(SPI_GetFlagStatus(SPI2, SPI_FLAG_BSY) != RESET)
{
}
LCD_CtrlLinesWrite(GPIOB, CtrlPin_NCS, Bit_SET);
}
/*******************************************************************************
* Function Name : LCD_ReadReg
* Description : Reads the selected LCD Register.
* Input : None
* Output : None
* Return : LCD Register Value.
*******************************************************************************/
u16 LCD_ReadReg(u8 LCD_Reg)
{
u16 tmp = 0;
u8 i = 0;
/* SPI2 prescaler: 4 */
SPI2->CR1 &= 0xFFC7;
SPI2->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 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -