说明
- 底层需要实现4个函数即可:lcd_rst, write_command, write_command_data, write_data
- 注意write_command_data和write_data的length需要是u32长度
main.c
#include "ACZ702_Lib/COMMON.h"
#include "lvgl/lvgl.h"
#include "lvgl/examples/porting/lv_port_disp_template.h"
#include "lvgl/examples/porting/lv_port_indev_template.h"
#include "lvgl/demos/lv_demos.h"
//GPIO2, V1扩展板
#define PS_DCX (54+0)
#define PS_RSTN (54+1)
#define PL_DCX (54+2)
#define PL_RSTN (54+3)
int main_ps_emio(void)
{
PS_GPIO_Init(); //初始化PS端MIO和EMIO
PS_GPIO_SetMode(PS_DCX, OUTPUT, 1);
PS_GPIO_SetMode(PS_RSTN, OUTPUT, 1);
PS_GPIO_SetMode(PL_DCX, OUTPUT, 1);
PS_GPIO_SetMode(PL_RSTN, OUTPUT, 1);
}
void lcd_rst()
{
PS_GPIO_SetPort(PL_RSTN,0);
usleep(100*1000);
PS_GPIO_SetPort(PL_RSTN,1);
usleep(100*1000);
}
void write_command(u8 cmd)
{
// PS_GPIO_SetPort(PL_DCX,0);
// AXI_SPI_Transfer(&AXI_SPI0, 0, NULL, &cmd, 1);
}
void write_command_data(u8 cmd, u8 *pdata, u32 length)
{
// PS_GPIO_SetPort(PL_DCX,0);
// AXI_SPI_Transfer(&AXI_SPI0, 0, NULL, &cmd, 1);
// usleep(1);
// PS_GPIO_SetPort(PL_DCX,1);
// AXI_SPI_Transfer(&AXI_SPI0, 0, NULL, pdata, length);
}
void write_data(u8 *pdata, u32 length)
{
// PS_GPIO_SetPort(PL_DCX,1);
// AXI_SPI_Transfer(&AXI_SPI0, 0, NULL, pdata, length);
}
/**************************************************************************************/
/**************************************************************************************/
void lcd_init()
{
write_command(0x11);
usleep(100*1000);
write_command(0x21);
u8 data=0x55;
write_command_data(0x3a, &data, 1);
write_command(0x29);
}
#define LCD_X_SIZE 240
#define LCD_Y_SIZE 240
void lcdqspi_fill_block(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t color)
{
u8 xwin_list[]={(x0>>8)&0xff, x0&0xff, (x1>>8)&0xff, x1&0xff};
u8 ywin_list[]={(y0>>8)&0xff, y0&0xff, (y1>>8)&0xff, y1&0xff};
write_command_data(0x2a, xwin_list, 4);
write_command_data(0x2b, ywin_list, 4);
u32 length=(x1-x0)*(y1-y0);
write_command(0x2c);
while(length--){
u8 color_list[]={(color>>8)&0xff, color&0xff};
write_data(color_list,2);
}
}
void lcdqspi_clear(uint32_t color)
{
lcdqspi_fill_block(0, 0, LCD_X_SIZE - 1, LCD_Y_SIZE - 1, color);
}
void lcdqspi_fill_pcolor(uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint16_t *pcolor)
{
u8 xwin_list[]={(x0>>8)&0xff, x0&0xff, (x1>>8)&0xff, x1&0xff};
u8 ywin_list[]={(y0>>8)&0xff, y0&0xff, (y1>>8)&0xff, y1&0xff};
write_command_data(0x2a, xwin_list, 4);
write_command_data(0x2b, ywin_list, 4);
u32 length=(x1-x0)*(y1-y0);
write_command(0x2c);
// while(length--){
// //u8 color_list[]={(*pcolor>>8)&0xff, *pcolor&0xff};
// //write_data(color_list,2);
// write_data((u8 *)pcolor,2);
// pcolor++;
// }
write_data((u8 *)pcolor,2*length);
}
void ScuTimer_IRQ_Handler(void *CallBackRef)
{
/* ↓↓↓用户处理↓↓↓ */
lv_tick_inc(1);
/* ↑↑↑结束处理↑↑↑ */
XScuTimer_ClearInterruptStatus(&ScuTimer);
}
int mainx(void)
{
Xil_DCacheDisable();
/* 私有定时器初始化 */
ScuGic_Init();
ScuTimer_Int_Init(1000);
//初始化SPI0,设为主机模式,64分频
AXI_SPI_Init(&AXI_SPI0, XPAR_SPI_0_DEVICE_ID, XSP_MASTER_OPTION|XSP_CLK_ACTIVE_LOW_OPTION|XSP_CLK_PHASE_1_OPTION);
main_ps_emio();
lcd_rst();
lcd_init();
/* lvgl初始化 */
lv_init();
// lv_port_disp_init();
// lv_port_indev_init();
/* 创建demo */
//lv_demo_printer();
//lv_demo_keypad_encoder();
// lv_demo_widgets();
//lv_demo_stress();
//lv_demo_benchmark();
/* 死循环 */
for ( ; ; ) {
lv_task_handler();
usleep(5 * 1000);
}
return 0;
}