|
|
/******************************************************************************
函数说明:在指定区域填充颜色
入口数据:xsta,ysta 起始坐标
xend,yend 终止坐标
color 要填充的颜色
返回值: 无
******************************************************************************/
void LCD_Fill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color){
uint16_t i,j;
LCD_Address_Set(xsta,ysta,xend-1,yend-1);//设置显示范围
for(i=ysta;i<yend;i++)
{
for(j=xsta;j<xend;j++)
{
HAL_SPI_Transmit(&LCD_SPI_Handle,(uint8_t*)&color,1,100);
}
}
}
volatile uint8_t IsTransmittingBlock_=0;
/**
* Check if a Frame Buffer Block is beeing transmitted.
*/
int touchgfxDisplayDriverTransmitActive(void)
{
return IsTransmittingBlock_;
}
/**
* Check if a Frame Buffer Block ending at bottom may be sent.
*/
int touchgfxDisplayDriverShouldTransferBlock(uint16_t bottom)
{
return 1;
}
/**
* Transmit a Frame Buffer Block.
*/
void touchgfxDisplayDriverTransmitBlock(const uint8_t* pixels, uint16_t x, uint16_t y, uint16_t w, uint16_t h)
{
IsTransmittingBlock_=1;
LCD_Address_Set(x,y,x+w-1,y+h-1);//设置显示范围,这里的地址-1非常关键不然会造成撕裂的效果。
// ILI9328 要求像素数据高位在前,但 Cortex-M 以小端存储,需逐像素交换字节
uint32_t pixelCount = (uint32_t)w * h;
uint16_t* p = (uint16_t*)pixels;
for (uint32_t i = 0; i < pixelCount; i++)
{
p[i] = (p[i] >> 8) | (p[i] << 8);
}
HAL_SPI_Transmit_DMA(&LCD_SPI_Handle,(uint8_t*)pixels,pixelCount*2);
}
///spi传输完成中断
extern void DisplayDriver_TransferCompleteCallback(void);
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
if (hspi->Instance == SPI4) {
SPI_CS(1); // DMA 传输完毕,拉高 CS 锁存数据
IsTransmittingBlock_ = 0;
DisplayDriver_TransferCompleteCallback();
}
}这个是自定义函数也不知道什么问题 |
|