862 views|3 replies

174

Posts

1

Resources
The OP
 

[ST NUCLEO-U5A5ZJ-Q Development Board Review] 6. Simple transplantation of a GuiLite [Copy link]

This post was last edited by chrisrh on 2024-3-11 16:22

LCD based on SPI driver, simple transplantation of GuiLite

Generate a project and add LCD driver code

main.h

Add LCD_IO macro definition in main.h

#define LCD_BL_SET  HAL_GPIO_WritePin(LCD_BL_GPIO_Port, LCD_BL_Pin, GPIO_PIN_SET)//BL
#define    LCD_CS_SET  HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_SET)//CS
#define    LCD_RS_SET    HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_SET) //RS
#define    LCD_RST_SET    HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_SET)//RST

#define LCD_BL_CLR  HAL_GPIO_WritePin(LCD_BL_GPIO_Port, LCD_BL_Pin, GPIO_PIN_RESET)//BL
#define    LCD_CS_CLR  HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET)//CS
#define    LCD_RS_CLR    HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_RESET)//RS
#define    LCD_RST_CLR    HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_RESET)//RST

lcd.h

The header file of LCD is lcd.h. I was lazy and put gui and test in here before. There are too many programs, so I deleted them this time...

#ifndef __LCD_H
#define __LCD_H        
#include "stdlib.h"
#include "stm32u5xx_hal.h"

//LCD重要参数集
typedef struct  
{                                            
    uint16_t  width;        //LCD 宽度
    uint16_t  height;        //LCD 高度
    uint16_t  id;            //LCD ID
    uint8_t   dir;            //横屏还是竖屏控制:0,竖屏;1,横屏。    
    uint16_t  wramcmd;        //开始写gram指令
    uint16_t  setxcmd;        //设置x坐标指令
    uint16_t  setycmd;        //设置y坐标指令     
    uint8_t   xoffset;    
    uint8_t      yoffset;    
}_lcd_dev;     

//LCD参数
extern _lcd_dev lcddev;    //管理LCD重要参数
/////////////////////////////////////用户配置区///////////////////////////////////     
#define USE_HORIZONTAL       0 //定义液晶屏顺时针旋转方向     0-0度旋转,1-90度旋转,2-180度旋转,3-270度旋转

//////////////////////////////////////////////////////////////////////////////////      
//定义LCD的尺寸
#define LCD_W 240
#define LCD_H 320

//TFTLCD部分外要调用的函数           
extern uint16_t  POINT_COLOR;//默认红色    
extern uint16_t  BACK_COLOR; //背景颜色,默认为白色

/*-----------------LCD端口控制定义----------------*/ 
//QDtech全系列模块采用了三极管控制背光亮灭,用户也可以接PWM调节背光亮度
//直接操作寄存器可以提高LCD刷屏速率

//画笔颜色
#define WHITE       0xFFFF
#define BLACK       0x0000      
#define BLUE        0x001F  
#define BRED        0XF81F
#define GRED        0XFFE0
#define GBLUE       0X07FF
#define RED         0xF800
#define MAGENTA     0xF81F
#define GREEN       0x07E0
#define CYAN        0x7FFF
#define YELLOW      0xFFE0
#define BROWN       0XBC40 //棕色
#define BRRED       0XFC07 //棕红色
#define GRAY        0X8430 //灰色
#define GRAY0       0xEF7D 
#define GRAY1       0x8410 //灰色1      00000 000000 00000
#define GRAY2       0x4208 
//GUI颜色

#define DARKBLUE           0X01CF    //深蓝色
#define LIGHTBLUE          0X7D7C    //浅蓝色  
#define GRAYBLUE           0X5458 //灰蓝色
//以上三色为PANEL的颜色 
 
#define LIGHTGREEN         0X841F //浅绿色
#define LIGHTGRAY          0XEF5B //浅灰色(PANNEL)
#define LGRAY              0XC618 //浅灰色(PANNEL),窗体背景色

#define LGRAYBLUE          0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE             0X2B12 //浅棕蓝色(选择条目的反色)


/*----------SPI引脚控制----------------*/
void SPI_WriteByte(uint8_t Data);

void LCD_Init(void);
void LCD_DisplayOn(void);
void LCD_DisplayOff(void);
void LCD_Clear(uint16_t Color);     
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos);
void LCD_DrawPoint(uint16_t x,uint16_t y);//画点
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);           
void LCD_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd);                                    
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue);
void LCD_WR_DATA(uint8_t data);
void LCD_WriteRAM_Prepare(void);
void LCD_WriteRAM(uint16_t RGB_Code);
uint16_t LCD_ReadRAM(void);           
uint16_t LCD_BGR2RGB(uint16_t c);
void LCD_SetParam(void);
void LCD_WriteData_16Bit(uint16_t Data);
void LCD_direction(uint8_t direction);                               

//////////////////////////////////////////////////////////////////
/*GUI*/
//////////////////////////////////////////////////////////////////

void GUI_DrawPoint(uint16_t x,uint16_t y,uint16_t color);
void LCD_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t color);
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
void Draw_Triangel(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2);
void Fill_Triangel(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2);
void Draw_Circle(uint16_t x0,uint16_t y0,uint16_t fc,uint8_t r);
void gui_circle(int32_t xc, int32_t yc,uint16_t c,int32_t r, int32_t fill);

#endif  

lcd.c

Add lcd.c

#include "lcd.h"
#include "stdlib.h"
#include "string.h"
#include "main.h"
//#include "pic.h"
//#include "font.h"


//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;

//画笔颜色,背景颜色
uint16_t POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;
uint16_t DeviceCode;

uint16_t ColorTab[5]={RED,GREEN,BLUE,YELLOW,BRED};
extern SPI_HandleTypeDef hspi1;

/*****************************************************************************
 * [url=home.php?mod=space&uid=32621]@name[/url]  :void LCD_WR_REG(u8 data)
 * [url=home.php?mod=space&uid=311857]@date[/url]  :2018-08-09
 * [url=home.php?mod=space&uid=665173]@FUNCTION[/url]  :Write an 8-bit command to the LCD screen
 * @parameters :data:Command value to be written
 * @retvalue   :None
******************************************************************************/
void LCD_WR_REG(uint8_t data)
{
    LCD_CS_CLR;
    LCD_RS_CLR;
    SPI_WriteByte(data);
    LCD_CS_SET;
}

/*****************************************************************************
 * @name       :void LCD_WR_DATA(u8 data)
 * @date       :2018-08-09
 * @function   :Write an 8-bit data to the LCD screen
 * @parameters :data:data value to be written
 * @retvalue   :None
******************************************************************************/
void LCD_WR_DATA(uint8_t data)
{
    LCD_CS_CLR;
    LCD_RS_SET;
    SPI_WriteByte(data);
    LCD_CS_SET;
}

/*****************************************************************************
 * @name       :void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
 * @date       :2018-08-09
 * @function   :Write data into registers
 * @parameters :LCD_Reg:Register address
                LCD_RegValue:Data to be written
 * @retvalue   :None
******************************************************************************/
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)
{
    LCD_WR_REG(LCD_Reg);
    LCD_WR_DATA(LCD_RegValue);
}

/*****************************************************************************
 * @name       :void LCD_WriteRAM_Prepare(void)
 * @date       :2018-08-09
 * @function   :Write GRAM
 * @parameters :None
 * @retvalue   :None
******************************************************************************/
void LCD_WriteRAM_Prepare(void)
{
    LCD_WR_REG(lcddev.wramcmd);
}


/*****************************************************************************
 * @name       :void Lcd_WriteData_16Bit(u16 Data)
 * @date       :2018-08-09
 * @function   :Write an 16-bit command to the LCD screen
 * @parameters :Data:Data to be written
 * @retvalue   :None
******************************************************************************/
void LCD_WriteData_16Bit(uint16_t Data)
{
    LCD_CS_CLR;
    LCD_RS_SET;
    SPI_WriteByte(Data>>8);
    SPI_WriteByte(Data);
    LCD_CS_SET;
}

/*****************************************************************************
 * @name       :void LCD_DrawPoint(u16 x,u16 y)
 * @date       :2018-08-09
 * @function   :Write a pixel data at a specified location
 * @parameters :x:the x coordinate of the pixel
                y:the y coordinate of the pixel
 * @retvalue   :None
******************************************************************************/
void LCD_DrawPoint(uint16_t x,uint16_t y)
{
    LCD_SetCursor(x,y);//设置光标位置
    LCD_WriteData_16Bit(POINT_COLOR);
}

/*****************************************************************************
 * @name       :void LCD_Clear(u16 Color)
 * @date       :2018-08-09
 * @function   :Full screen filled LCD screen
 * @parameters :color:Filled color
 * @retvalue   :None
******************************************************************************/
void LCD_Clear(uint16_t Color)
{

    uint32_t i,m;
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);
    LCD_CS_CLR;
    LCD_RS_SET;
    for(i=0;i<lcddev.height;i++)
    {
    for(m=0;m<lcddev.width;m++)
    {
            SPI_WriteByte(Color>>8);
            SPI_WriteByte(Color);
        }
    }
    LCD_CS_SET;
}

/*****************************************************************************
 * @name       :void LCD_GPIOInit(void)
 * @date       :2018-08-09
 * @function   :Initialization LCD screen GPIO
 * @parameters :None
 * @retvalue   :None
******************************************************************************/
void LCD_GPIOInit(void)
{
//    GPIO_InitTypeDef  GPIO_InitStructure;
//    __HAL_RCC_GPIOD_CLK_ENABLE();    //使能GPIOB时钟
//
//    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //高速
//    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;   //推挽输出
//    GPIO_InitStructure.Pull = GPIO_PULLUP;           //上拉
//
//    GPIO_InitStructure.Pin = LCD_BL_PIN;
//    HAL_GPIO_Init(LCD_BL_PORT, &GPIO_InitStructure);//初始化BL引脚
//
//    GPIO_InitStructure.Pin = LCD_CS_PIN;
//    HAL_GPIO_Init(LCD_CS_PORT, &GPIO_InitStructure);//初始化CS引脚
//
//    GPIO_InitStructure.Pin = LCD_RS_PIN;
//    HAL_GPIO_Init(LCD_RS_PORT, &GPIO_InitStructure);//初始化RS引脚
//
//    GPIO_InitStructure.Pin = LCD_RST_PIN;
//    HAL_GPIO_Init(LCD_RST_PORT, &GPIO_InitStructure);//初始化RST引脚
//
    //默认所有的引脚都拉高
    LCD_BL_SET;
    LCD_CS_SET;
    LCD_RS_SET;
    LCD_RST_SET;
}

/*****************************************************************************
 * @name       :void LCD_RESET(void)
 * @date       :2018-08-09
 * @function   :Reset LCD screen
 * @parameters :None
 * @retvalue   :None
******************************************************************************/
void LCD_RESET(void)
{
    LCD_RST_CLR;
    HAL_Delay(20);
    LCD_RST_SET;
    HAL_Delay(20);
}

/*****************************************************************************
 * @name       :void LCD_RESET(void)
 * @date       :2018-08-09
 * @function   :Initialization LCD screen
 * @parameters :None
 * @retvalue   :None
******************************************************************************/
void LCD_Init(void)
{
//    SPI_GPIO_Init(); //硬件SPI1初始化
//    SPI_SCLK_SET;
//    SPI_MOSI_SET;
    LCD_GPIOInit();//LCD GPIO初始化
     LCD_RESET(); //LCD 复位
//************* ST7789 IPS初始化**********//
    LCD_WR_REG(0x36);
    LCD_WR_DATA(0x00);

    LCD_WR_REG(0x3A);
    LCD_WR_DATA(0x05);

    LCD_WR_REG(0xB2);
    LCD_WR_DATA(0x0C);
    LCD_WR_DATA(0x0C);
    LCD_WR_DATA(0x00);
    LCD_WR_DATA(0x33);
    LCD_WR_DATA(0x33);

    LCD_WR_REG(0xB7);
    LCD_WR_DATA(0x35);

    LCD_WR_REG(0xBB);
    LCD_WR_DATA(0x17);

    LCD_WR_REG(0xC0);
    LCD_WR_DATA(0x2C);

    LCD_WR_REG(0xC2);
    LCD_WR_DATA(0x01);

    LCD_WR_REG(0xC3);
    LCD_WR_DATA(0x12);

    LCD_WR_REG(0xC4);
    LCD_WR_DATA(0x20);

    LCD_WR_REG(0xC6);
    LCD_WR_DATA(0x0F);

    LCD_WR_REG(0xD0);
    LCD_WR_DATA(0xA4);
    LCD_WR_DATA(0xA1);

    LCD_WR_REG(0xE0);
    LCD_WR_DATA(0xD0);
    LCD_WR_DATA(0x04);
    LCD_WR_DATA(0x0D);
    LCD_WR_DATA(0x11);
    LCD_WR_DATA(0x13);
    LCD_WR_DATA(0x2B);
    LCD_WR_DATA(0x3F);
    LCD_WR_DATA(0x54);
    LCD_WR_DATA(0x4C);
    LCD_WR_DATA(0x18);
    LCD_WR_DATA(0x0D);
    LCD_WR_DATA(0x0B);
    LCD_WR_DATA(0x1F);
    LCD_WR_DATA(0x23);

    LCD_WR_REG(0xE1);
    LCD_WR_DATA(0xD0);
    LCD_WR_DATA(0x04);
    LCD_WR_DATA(0x0C);
    LCD_WR_DATA(0x11);
    LCD_WR_DATA(0x13);
    LCD_WR_DATA(0x2C);
    LCD_WR_DATA(0x3F);
    LCD_WR_DATA(0x44);
    LCD_WR_DATA(0x51);
    LCD_WR_DATA(0x2F);
    LCD_WR_DATA(0x1F);
    LCD_WR_DATA(0x1F);
    LCD_WR_DATA(0x20);
    LCD_WR_DATA(0x23);

    LCD_WR_REG(0x21);

    LCD_WR_REG(0x11);
    //Delay (120);

    LCD_WR_REG(0x29);

    LCD_direction(USE_HORIZONTAL);//设置LCD显示方向
    LCD_BL_SET;//点亮背光
    LCD_Clear(WHITE);//清全屏白色
}

/*****************************************************************************
 * @name       :void LCD_SetWindows(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd)
 * @date       :2018-08-09
 * @function   :Setting LCD display window
 * @parameters :xStar:the bebinning x coordinate of the LCD display window
                                yStar:the bebinning y coordinate of the LCD display window
                                xEnd:the endning x coordinate of the LCD display window
                                yEnd:the endning y coordinate of the LCD display window
 * @retvalue   :None
******************************************************************************/
void LCD_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd)
{
    LCD_WR_REG(lcddev.setxcmd);
    LCD_WR_DATA((xStar+lcddev.xoffset)>>8);
    LCD_WR_DATA(xStar+lcddev.xoffset);
    LCD_WR_DATA((xEnd+lcddev.xoffset)>>8);
    LCD_WR_DATA(xEnd+lcddev.xoffset);

    LCD_WR_REG(lcddev.setycmd);
    LCD_WR_DATA((yStar+lcddev.yoffset)>>8);
    LCD_WR_DATA(yStar+lcddev.yoffset);
    LCD_WR_DATA((yEnd+lcddev.yoffset)>>8);
    LCD_WR_DATA(yEnd+lcddev.yoffset);

    LCD_WriteRAM_Prepare();    //开始写入GRAM
}

/*****************************************************************************
 * @name       :void LCD_SetCursor(u16 Xpos, u16 Ypos)
 * @date       :2018-08-09
 * @function   :Set coordinate value
 * @parameters :Xpos:the  x coordinate of the pixel
                                Ypos:the  y coordinate of the pixel
 * @retvalue   :None
******************************************************************************/
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
{
    LCD_SetWindows(Xpos,Ypos,Xpos,Ypos);
}

/*****************************************************************************
 * @name       :void LCD_direction(u8 direction)
 * @date       :2018-08-09
 * @function   :Setting the display direction of LCD screen
 * @parameters :direction:0-0 degree
                          1-90 degree
                                                    2-180 degree
                                                    3-270 degree
 * @retvalue   :None
******************************************************************************/
void LCD_direction(uint8_t direction)
{
            lcddev.setxcmd=0x2A;
            lcddev.setycmd=0x2B;
            lcddev.wramcmd=0x2C;
            lcddev.dir = direction%4;
    switch(lcddev.dir){
        case 0:
            lcddev.width=LCD_W;
            lcddev.height=LCD_H;
            lcddev.xoffset=0;
            lcddev.yoffset=0;
            LCD_WriteReg(0x36,0);//BGR==1,MY==0,MX==0,MV==0
        break;
        case 1:
            lcddev.width=LCD_H;
            lcddev.height=LCD_W;
            lcddev.xoffset=0;
            lcddev.yoffset=0;
            LCD_WriteReg(0x36,(1<<6)|(1<<5));//BGR==1,MY==1,MX==0,MV==1
        break;
        case 2:
            lcddev.width=LCD_W;
            lcddev.height=LCD_H;
      lcddev.xoffset=0;
            lcddev.yoffset=122;
            LCD_WriteReg(0x36,(1<<6)|(1<<7));//BGR==1,MY==0,MX==0,MV==0
        break;
        case 3:
            lcddev.width=LCD_H;
            lcddev.height=LCD_W;
            lcddev.xoffset=122;
            lcddev.yoffset=0;
            LCD_WriteReg(0x36,(1<<7)|(1<<5));//BGR==1,MY==1,MX==0,MV==1
        break;
        default:break;
    }
}



/*****************************************************************************
 * @name       :void  SPI_WriteByte(u8 Data)
 * @date       :2018-08-09
 * @function   :Write a byte of data using STM32's Software SPI
 * @parameters :Data:Data to be written
 * @retvalue   :None
******************************************************************************/
//void SPI_WriteByte(uint8_t Data)
//{
//    uint8_t i=0;
//    for(i=8;i>0;i--)
//    {
//      if(Data&0x80)
//            SPI_MOSI_SET; //输出数据
//      else
//              SPI_MOSI_CLR;
//                SPI_SCLK_CLR;
//                SPI_SCLK_SET;
//                Data<<=1;
//    }
//}

void SPI_WriteByte(uint8_t Data)
{
    HAL_SPI_Transmit(&hspi1,&Data,1,1);
//    HAL_Delay(10);
}


//////////////////////////////////////////////////////////////////
/*GUI*/
//////////////////////////////////////////////////////////////////

/*******************************************************************
 * @name       :void GUI_DrawPoint(u16 x,u16 y,u16 color)
 * @date       :2018-08-09
 * @function   :draw a point in LCD screen
 * @parameters :x:the x coordinate of the point
                y:the y coordinate of the point
                                color:the color value of the point
 * @retvalue   :None
********************************************************************/
void GUI_DrawPoint(uint16_t x,uint16_t y,uint16_t color)
{
    LCD_SetCursor(x,y);//设置光标位置
    LCD_WriteData_16Bit(color);
}

/*******************************************************************
 * @name       :void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
 * @date       :2018-08-09
 * @function   :fill the specified area
 * @parameters :sx:the bebinning x coordinate of the specified area
                sy:the bebinning y coordinate of the specified area
                                ex:the ending x coordinate of the specified area
                                ey:the ending y coordinate of the specified area
                                color:the filled color value
 * @retvalue   :None
********************************************************************/
void LCD_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t color)
{
    uint16_t i,j;
    uint16_t width=ex-sx+1;         //得到填充的宽度
    uint16_t height=ey-sy+1;        //高度
    LCD_SetWindows(sx,sy,ex,ey);//设置显示窗口
    for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        LCD_WriteData_16Bit(color);    //写入数据
    }
    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口设置为全屏
}

/*******************************************************************
 * @name       :void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
 * @date       :2018-08-09
 * @function   :Draw a line between two points
 * @parameters :x1:the bebinning x coordinate of the line
                y1:the bebinning y coordinate of the line
                                x2:the ending x coordinate of the line
                                y2:the ending y coordinate of the line
 * @retvalue   :None
********************************************************************/
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
    uint16_t t;
    int32_t xerr=0,yerr=0,delta_x,delta_y,distance;
    int32_t incx,incy,uRow,uCol;

    delta_x=x2-x1; //计算坐标增量
    delta_y=y2-y1;
    uRow=x1;
    uCol=y1;
    if(delta_x>0)incx=1; //设置单步方向
    else if(delta_x==0)incx=0;//垂直线
    else {incx=-1;delta_x=-delta_x;}
    if(delta_y>0)incy=1;
    else if(delta_y==0)incy=0;//水平线
    else{incy=-1;delta_y=-delta_y;}
    if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
    else distance=delta_y;
    for(t=0;t<=distance+1;t++ )//画线输出
    {
        LCD_DrawPoint(uRow,uCol);//画点
        xerr+=delta_x ;
        yerr+=delta_y ;
        if(xerr>distance)
        {
            xerr-=distance;
            uRow+=incx;
        }
        if(yerr>distance)
        {
            yerr-=distance;
            uCol+=incy;
        }
    }
}

/*****************************************************************************
 * @name       :void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
 * @date       :2018-08-09
 * @function   :Draw a rectangle
 * @parameters :x1:the bebinning x coordinate of the rectangle
                y1:the bebinning y coordinate of the rectangle
                                x2:the ending x coordinate of the rectangle
                                y2:the ending y coordinate of the rectangle
 * @retvalue   :None
******************************************************************************/
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
    LCD_DrawLine(x1,y1,x2,y1);
    LCD_DrawLine(x1,y1,x1,y2);
    LCD_DrawLine(x1,y2,x2,y2);
    LCD_DrawLine(x2,y1,x2,y2);
}



/*****************************************************************************
 * @name       :void Draw_Triangel(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2)
 * @date       :2018-08-09
 * @function   :Draw a triangle at a specified position
 * @parameters :x0:the bebinning x coordinate of the triangular edge
                y0:the bebinning y coordinate of the triangular edge
                                x1:the vertex x coordinate of the triangular
                                y1:the vertex y coordinate of the triangular
                                x2:the ending x coordinate of the triangular edge
                                y2:the ending y coordinate of the triangular edge
 * @retvalue   :None
******************************************************************************/
void Draw_Triangel(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
    LCD_DrawLine(x0,y0,x1,y1);
    LCD_DrawLine(x1,y1,x2,y2);
    LCD_DrawLine(x2,y2,x0,y0);
}

static void _swap(uint16_t *a, uint16_t *b)
{
    uint16_t tmp;
  tmp = *a;
    *a = *b;
    *b = tmp;
}

/*****************************************************************************
 * @name       :void Fill_Triangel(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2)
 * @date       :2018-08-09
 * @function   :filling a triangle at a specified position
 * @parameters :x0:the bebinning x coordinate of the triangular edge
                y0:the bebinning y coordinate of the triangular edge
                                x1:the vertex x coordinate of the triangular
                                y1:the vertex y coordinate of the triangular
                                x2:the ending x coordinate of the triangular edge
                                y2:the ending y coordinate of the triangular edge
 * @retvalue   :None
******************************************************************************/
void Fill_Triangel(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
    uint16_t a, b, y, last;
    int dx01, dy01, dx02, dy02, dx12, dy12;
    long sa = 0;
    long sb = 0;
     if (y0 > y1)
    {
    _swap(&y0,&y1);
        _swap(&x0,&x1);
     }
     if (y1 > y2)
    {
    _swap(&y2,&y1);
        _swap(&x2,&x1);
     }
  if (y0 > y1)
    {
    _swap(&y0,&y1);
        _swap(&x0,&x1);
  }
    if(y0 == y2)
    {
        a = b = x0;
        if(x1 < a)
    {
            a = x1;
    }
    else if(x1 > b)
    {
            b = x1;
    }
    if(x2 < a)
    {
            a = x2;
    }
        else if(x2 > b)
    {
            b = x2;
    }
        LCD_Fill(a,y0,b,y0,POINT_COLOR);
    return;
    }
    dx01 = x1 - x0;
    dy01 = y1 - y0;
    dx02 = x2 - x0;
    dy02 = y2 - y0;
    dx12 = x2 - x1;
    dy12 = y2 - y1;

    if(y1 == y2)
    {
        last = y1;
    }
  else
    {
        last = y1-1;
    }
    for(y=y0; y<=last; y++)
    {
        a = x0 + sa / dy01;
        b = x0 + sb / dy02;
        sa += dx01;
    sb += dx02;
    if(a > b)
    {
            _swap(&a,&b);
        }
        LCD_Fill(a,y,b,y,POINT_COLOR);
    }
    sa = dx12 * (y - y1);
    sb = dx02 * (y - y0);
    for(; y<=y2; y++)
    {
        a = x1 + sa / dy12;
        b = x0 + sb / dy02;
        sa += dx12;
        sb += dx02;
        if(a > b)
        {
            _swap(&a,&b);
        }
        LCD_Fill(a,y,b,y,POINT_COLOR);
    }
}


/*****************************************************************************
 * @name       :void _draw_circle_8(int xc, int yc, int x, int y, u16 c)
 * @date       :2018-08-09
 * @function   :8 symmetry circle drawing algorithm (internal call)
 * @parameters :xc:the x coordinate of the Circular center
                yc:the y coordinate of the Circular center
                                x:the x coordinate relative to the Circular center
                                y:the y coordinate relative to the Circular center
                                c:the color value of the circle
 * @retvalue   :None
******************************************************************************/
void _draw_circle_8(int32_t xc, int32_t yc, int32_t x, int32_t y, uint16_t c)
{
    GUI_DrawPoint(xc + x, yc + y, c);

    GUI_DrawPoint(xc - x, yc + y, c);

    GUI_DrawPoint(xc + x, yc - y, c);

    GUI_DrawPoint(xc - x, yc - y, c);

    GUI_DrawPoint(xc + y, yc + x, c);

    GUI_DrawPoint(xc - y, yc + x, c);

    GUI_DrawPoint(xc + y, yc - x, c);

    GUI_DrawPoint(xc - y, yc - x, c);
}

/*****************************************************************************
 * @name       :void gui_circle(int xc, int yc,u16 c,int r, int fill)
 * @date       :2018-08-09
 * @function   :Draw a circle of specified size at a specified location
 * @parameters :xc:the x coordinate of the Circular center
                yc:the y coordinate of the Circular center
                                r:Circular radius
                                fill:1-filling,0-no filling
 * @retvalue   :None
******************************************************************************/
void gui_circle(int32_t xc, int32_t yc,uint16_t c,int32_t r, int32_t fill)
{
    int32_t x = 0, y = r, yi, d;

    d = 3 - 2 * r;


    if (fill)
    {
        // 如果填充(画实心圆)
        while (x <= y) {
            for (yi = x; yi <= y; yi++)
                _draw_circle_8(xc, yc, x, yi, c);

            if (d < 0) {
                d = d + 4 * x + 6;
            } else {
                d = d + 4 * (x - y) + 10;
                y--;
            }
            x++;
        }
    } else
    {
        // 如果不填充(画空心圆)
        while (x <= y) {
            _draw_circle_8(xc, yc, x, y, c);
            if (d < 0) {
                d = d + 4 * x + 6;
            } else {
                d = d + 4 * (x - y) + 10;
                y--;
            }
            x++;
        }
    }
}

Porting GuiLite

idea4good (idea4good) - Gitee.com

①. Download GuiLiteSamples, enter the project to be ported, and find UIcode;

②. Add the UIcode that needs to be transplanted to the project, add UIcode.cpp and GuiLite.h to the project

③. Confirm the point drawing function, GUI_DrawPoint(uint16_t x,uint16_t y,uint16_t color);

Then add before the main function in main.c

void delay_ms(int ms)
{
    HAL_Delay(ms);
}
//RGB888/RGB565
//Transfer GuiLite 32 bits color to your LCD color
#define GL_RGB_32_to_16(rgb) (((((unsigned int)(rgb)) & 0xFF) >> 3) | ((((unsigned int)(rgb)) & 0xFC00) >> 5) | ((((unsigned int)(rgb)) & 0xF80000) >> 8))
//Encapsulate your LCD driver:
void gfx_draw_pixel(int x, int y, unsigned int rgb)
{


    GUI_DrawPoint(x, y, GL_RGB_32_to_16(rgb));
}
//Implement it, if you have more fast solution than drawing pixels one by one.
//void gfx_fill_rect(int x0, int y0, int x1, int y1, unsigned int rgb){}

//UI entry
struct EXTERNAL_GFX_OP
{
   void (*draw_pixel)(int x, int y, unsigned int rgb);
   void (*fill_rect)(int x0, int y0, int x1, int y1, unsigned int rgb);
} my_gfx_op;

extern void startHello3D(void* phy_fb, int width, int height, int color_bytes, struct EXTERNAL_GFX_OP* gfx_op);

④. Add a startup function before while(1)

LCD_Init();
my_gfx_op.draw_pixel = gfx_draw_pixel;
my_gfx_op.fill_rect = NULL;//gfx_fill_rect;
startHello3D(NULL, 240, 320, 2, &my_gfx_op);

Run and download the project;

VID_20240311_152003

SPI_LCD_Hello3D.hex (135.71 KB, downloads: 0)

VID_20240311_161925

SPI_LCD_HelloCircle.hex (154.61 KB, downloads: 0)

Without SPI_DMA, without hardware acceleration, and with single SPI driver, the response is much faster than the previous SPI+DMA on L452Nucleo. On the one hand, it may be because the main frequency of the system and SPI has increased, and on the other hand, it may be the architecture of U5. I will try the effect of SPI_DMA driver later.

This post is from stm32/stm8

Latest reply

After looking at the code page and the game, it seems that the rendering efficiency is quite high.   Details Published on 2024-3-12 18:45
 

7422

Posts

2

Resources
2
 

Is GuiLite a new library? I haven't heard of it before.

This post is from stm32/stm8

Comments

It should be more than two years old. It is lightweight and compatible with all platforms. There is only one GuiLite.h header file. It is indeed simple. Processor Disk/ROM space Memory 24 MHZ 29 KB 9 KB  Details Published on 2024-3-11 23:08
 
Personal signature

默认摸鱼,再摸鱼。2022、9、28

 

174

Posts

1

Resources
3
 
freebsder posted on 2024-3-11 19:29 Is GuiLite a new library? I have never heard of it before

It should be more than two years. It is lightweight and supports all platforms. There is only one GuiLite.h header file. It is indeed the simplest existence.

Processor Disk/ROM space Memory
24 MHZ 29 KB 9 KB
This post is from stm32/stm8

Comments

After looking at the code page and the game, it seems that the rendering efficiency is quite high.  Details Published on 2024-3-12 18:45
 
 

7422

Posts

2

Resources
4
 
chrisrh posted on 2024-3-11 23:08 It should be more than two years old. It is relatively lightweight and all platforms. There is only one GuiLite.h header file. It is indeed the simplest existence~ Proc ...

After looking at the code page and the game, it seems that the rendering efficiency is quite high.

This post is from stm32/stm8
 
Personal signature

默认摸鱼,再摸鱼。2022、9、28

 
 

Guess Your Favourite
Just looking around
Find a datasheet?

EEWorld Datasheet Technical Support

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号
快速回复 返回顶部 Return list