一、硬件:
本开发板可玩性最高的外设,就是这个圆屏了。开发板圆屏的驱动芯片是GC9A01A,屏幕并没有触摸屏,只是一个显示的模组。
分辨率为240RGB×240 dots,内部有129600字节的GRAM。
LCD的电路如下,看定义是IIC的驱动,实际上是SPI的驱动,这个驱动芯片是支持SPI的。
SPI的时钟如下所示,时钟空闲时为低电平,在第一个边沿采样。相应的SPI的参数要配置成匹配的。
其他的控制引脚,如CS,DC,RESET,背光等都是使用的GPIO的功能,这就比较简单了。直接驱动GPIO电平就可以了。
软件:
SPI的初始化函数如下,可以看到配置的SPI参数与时序图是一样的。
uint spi_init(spi_inst_t *spi, uint baudrate) {
spi_reset(spi);
spi_unreset(spi);
uint baud = spi_set_baudrate(spi, baudrate);
spi_set_format(spi, 8, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);
// Always enable DREQ signals -- harmless if DMA is not listening
hw_set_bits(&spi_get_hw(spi)->dmacr, SPI_SSPDMACR_TXDMAE_BITS | SPI_SSPDMACR_RXDMAE_BITS);
// Finally enable the SPI
hw_set_bits(&spi_get_hw(spi)->cr1, SPI_SSPCR1_SSE_BITS);
return baud;
}
GC9A01A支持的写命令、数据、16位数据的函数分别是:
static void LCD_1IN28_SendCommand(UBYTE Reg)
{
DEV_Digital_Write(LCD_DC_PIN, 0);
//DEV_Digital_Write(LCD_CS_PIN, 0);
DEV_SPI_WriteByte(Reg);
//DEV_Digital_Write(LCD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void LCD_1IN28_SendData_8Bit(UBYTE Data)
{
DEV_Digital_Write(LCD_DC_PIN, 1);
//DEV_Digital_Write(LCD_CS_PIN, 0);
DEV_SPI_WriteByte(Data);
//DEV_Digital_Write(LCD_CS_PIN, 1);
}
/******************************************************************************
function : send data
parameter:
Data : Write data
******************************************************************************/
static void LCD_1IN28_SendData_16Bit(UWORD Data)
{
DEV_Digital_Write(LCD_DC_PIN, 1);
//DEV_Digital_Write(LCD_CS_PIN, 0);
DEV_SPI_WriteByte(Data >> 8);
DEV_SPI_WriteByte(Data);
// DEV_Digital_Write(LCD_CS_PIN, 1);
}
有了以上几个基本的SPI操作函数,就可以扩展封装一些特定功能的函数了,比如Paint_DrawLine、Paint_DrawCircle、Paint_DrawString_EN、Paint_DrawImage等等。
由于开发板没有SD卡,所以,要显示图片,要先把图片转换成一个C文件里的数组。再使用Paint_DrawImage函数显示。
官方提供转换工具:Image2Lcd2.9
首先要准备一张240*240的图片,如果图片的尺寸不合适,可能导致转换出来的数据不正确,显示时,会有花屏的问题,或是图形变形的可能,所以,最好是把图片剪裁缩小成240*240的。
输出的灰度设置成16位真彩色。
至于扫描模式这些,根据你屏的使用方向,可以进行修改。
虽然准备的是一张正方的图,显示时,是从中心开始,显示一个圆形的区域,其他的区域是不显示的,所以,要设计界面时,要注意图形的位置。
生成的数组为:const unsigned char gImage_hg[115208]={....};注意这里的数组的大小,如果不是这个尺寸的数组,显示时,可能有问题。
在 ImageData.h中进行声明:
extern const unsigned char gImage_hg[];
使用如下函数进行图片的显示
Paint_DrawImage(gImage_hg, 0, 0, 240, 240);
LCD_1IN28_Display(BlackImage);
DEV_Delay_ms(1000);
显示效果如下: