国产MCU-CW32F030开发学习-圆形GC9A01_LCD模块

硬件平台

  1. CW32_48F大学计划板
  2. CW32_IOT_EVA物联网开发评估套件
  3. 1.28寸圆形彩色TFT显示屏高清IPS 模块240X240 SPI接口GC9A01

产品介绍

  • 1.28寸圆形IPS彩屏,支持 RGB 65K色显示,显示色彩丰富
  • 240X240分辨率,显示清晰
  • IPS全视角面板,超宽可视范围
  • 采用4线制SPI串行总线,只需几个IO即可点亮
  • 提供丰富的Arduino、STM32、C51以及MSP430示例程序
  • 军工级工艺标准,长期稳定工作
  • 提供底层驱动技术支持

产品参数

名称 参数
显示颜色 RGB 65K 彩色
SKU MSP1281
尺寸 1.28(inch)
面板材质 TFT
驱动芯片 GC9A01
分辨率 240*240 (Pixel)
显示接口 4-line SPI interface
有效显示区域(AA区) 直径:32.40 (mm)
触摸屏类型 无触摸屏
触摸IC 无触摸IC
模块PCB底板尺寸 38.03x45.80(mm)
视角 全角度
工作温度 -10℃~60℃
存储温度 -20℃~70℃
工作电压 3.3V

接口定义

序号 模块引脚 引脚说明
1 GND 液晶屏电源地
2 VCC 液晶屏电源正(3.3V/5V)
3 SCL 液晶屏SPI总线时钟信号
4 SDA 液晶屏SPI总线写数据信号
5 RES 液晶屏复位控制信号(低电平复位,模块有复位电路,该引脚可不接)
6 DC 液晶屏寄存器/数据选择控制信号(低电平:寄存器,高电平:数据)
7 CS 液晶屏片选控制信号(低电平使能)
8 BLK 液晶屏背光控制信号(高电平点亮,如不需要控制,请接3.3V)

硬件配置

LCD模块硬件电路包含五大部分:FPC接口电路、3.3V稳压电路、背光控制电路、排针接口、复位电路。

  1. FPC接口电路用于连接裸屏。
  2. 3.3V稳压电路用于稳定输出3.3V电压。
  3. 背光控制电路用于用于控制背光亮和灭,如果不需控制背光。可接3.3V电源。
  4. 排针接口用于连接各种开发板。
  5. 复位电路用于模块上电复位

GC9A01控制器

GC9A01控制器支持的最大分辨率为240*240,拥有一个129600字节大小的GRAM。同时支持8位、9位、12位、16位、18位并口数据总线,还支持3线制和4线制SPI串口。由于并行控制需要大量的I0口,所以最常用的还是SPI串口控制。ST7789还支持65K、262KRGB颜色显示,显示色彩很丰富,同时支持旋转和滚动显示以及视频播放,显示方式多样。
GC9A01控制器使用16bit(RGB565)来控制一个像素点显示,因此可以每个像素点显示颜色多达65K种。像素点地址设置按照行列的顺序进行,递增递减方向由扫描方式决定。GC9A01显示方法按照先设置地址再设置颜色值进行。

LCD驱动代码结构

//lcd_gc9a01 硬件驱动层代码
lcd_gc9a01.c
lcd_gc9a01.h
//lcd_gc9a01 软件应用层代码
lcd_guic
lcd_gui.h
lcd_font.h
//lcd_gc9a01 软件测试代码
lcd_example.c
lcd_example.h

lcd_gc9a01.c

#include "main.h"
//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;//画笔颜色,背景颜色
uint16_t POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;
uint16_t DeviceCode;    void SPI_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;__RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.IT = GPIO_IT_NONE; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;  GPIO_InitStruct.Pins = GPIO_PIN_0| GPIO_PIN_1;GPIO_Init(CW_GPIOA, &GPIO_InitStruct);          }/****************************************************************************** @name       :void  SPI_WriteByte(uint8_t 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)
{unsigned char i=0;for(i=8;i>0;i--){if(Data&0x80) SPI_MOSI_SET; //输出数据elseSPI_MOSI_CLR;SPI_SCLK_CLR;       SPI_SCLK_SET;Data<<=1; }
}/****************************************************************************** @name       :void LCD_WR_REG(uint8_t data)* @date       :2018-08-09 * @function   :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(uint8_t 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(uint8_t LCD_Reg, uint16_t LCD_RegValue)* @date       :2018-08-09 * @function   :Write data into registers* @parameters :LCD_Reg:Register addressLCD_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(uint16_t 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(uint16_t x,uint16_t y)* @date       :2018-08-09 * @function   :Write a pixel data at a specified location* @parameters :x:the x coordinate of the pixely: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(uint16_t Color)* @date       :2018-08-09 * @function   :Full screen filled LCD screen* @parameters :color:Filled color* @retvalue   :None
******************************************************************************/
void LCD_Clear(uint16_t Color)
{unsigned int 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_Clear(uint16_t Color)* @date       :2018-08-09 * @function   :Initialization LCD screen GPIO* @parameters :None* @retvalue   :None
******************************************************************************/
void LCD_GPIOInit(void)
{GPIO_InitTypeDef GPIO_InitStruct;__RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.IT = GPIO_IT_NONE; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;  GPIO_InitStruct.Pins = GPIO_PIN_2| GPIO_PIN_3|GPIO_PIN_4| GPIO_PIN_5;GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
}/****************************************************************************** @name       :void LCD_RESET(void)* @date       :2018-08-09 * @function   :Reset LCD screen* @parameters :None* @retvalue   :None
******************************************************************************/
void LCD_RESET(void)
{LCD_RST_CLR;delay_ms(20); LCD_RST_SET;delay_ms(20);
}/****************************************************************************** @name       :void LCD_Init(void)* @date       :2018-08-09 * @function   :Initialization LCD screen* @parameters :None* @retvalue   :None
******************************************************************************/
void LCD_Init(void)
{  SPI_GPIO_Init(); //SPI GPIO初始化LCD_GPIOInit();//LCD GPIO初始化LCD_RESET(); //LCD 复位
//************* GC9A01初始化**********//LCD_WR_REG(0xEF);LCD_WR_REG(0xEB);LCD_WR_DATA(0x14); LCD_WR_REG(0xFE);            LCD_WR_REG(0xEF); LCD_WR_REG(0xEB);  LCD_WR_DATA(0x14); LCD_WR_REG(0x84);          LCD_WR_DATA(0x40); LCD_WR_REG(0x85);          LCD_WR_DATA(0xFF); LCD_WR_REG(0x86);          LCD_WR_DATA(0xFF); LCD_WR_REG(0x87);          LCD_WR_DATA(0xFF);LCD_WR_REG(0x88);           LCD_WR_DATA(0x0A);LCD_WR_REG(0x89);           LCD_WR_DATA(0x21); LCD_WR_REG(0x8A);          LCD_WR_DATA(0x00); LCD_WR_REG(0x8B);          LCD_WR_DATA(0x80); LCD_WR_REG(0x8C);          LCD_WR_DATA(0x01); LCD_WR_REG(0x8D);          LCD_WR_DATA(0x01); LCD_WR_REG(0x8E);          LCD_WR_DATA(0xFF); LCD_WR_REG(0x8F);          LCD_WR_DATA(0xFF); LCD_WR_REG(0xB6);LCD_WR_DATA(0x00);LCD_WR_DATA(0x20);LCD_WR_REG(0x36);LCD_WR_DATA(0x08);LCD_WR_REG(0x3A);           LCD_WR_DATA(0x05); LCD_WR_REG(0x90);          LCD_WR_DATA(0x08);LCD_WR_DATA(0x08);LCD_WR_DATA(0x08);LCD_WR_DATA(0x08); LCD_WR_REG(0xBD);           LCD_WR_DATA(0x06);LCD_WR_REG(0xBC);           LCD_WR_DATA(0x00);   LCD_WR_REG(0xFF);            LCD_WR_DATA(0x60);LCD_WR_DATA(0x01);LCD_WR_DATA(0x04);LCD_WR_REG(0xC3);         LCD_WR_DATA(0x13);LCD_WR_REG(0xC4);           LCD_WR_DATA(0x13);LCD_WR_REG(0xC9);           LCD_WR_DATA(0x22);LCD_WR_REG(0xBE);           LCD_WR_DATA(0x11); LCD_WR_REG(0xE1);          LCD_WR_DATA(0x10);LCD_WR_DATA(0x0E);LCD_WR_REG(0xDF);          LCD_WR_DATA(0x21);LCD_WR_DATA(0x0c);LCD_WR_DATA(0x02);LCD_WR_REG(0xF0);   LCD_WR_DATA(0x45);LCD_WR_DATA(0x09);LCD_WR_DATA(0x08);LCD_WR_DATA(0x08);LCD_WR_DATA(0x26);LCD_WR_DATA(0x2A);LCD_WR_REG(0xF1);    LCD_WR_DATA(0x43);LCD_WR_DATA(0x70);LCD_WR_DATA(0x72);LCD_WR_DATA(0x36);LCD_WR_DATA(0x37);  LCD_WR_DATA(0x6F);LCD_WR_REG(0xF2);   LCD_WR_DATA(0x45);LCD_WR_DATA(0x09);LCD_WR_DATA(0x08);LCD_WR_DATA(0x08);LCD_WR_DATA(0x26);LCD_WR_DATA(0x2A);LCD_WR_REG(0xF3);   LCD_WR_DATA(0x43);LCD_WR_DATA(0x70);LCD_WR_DATA(0x72);LCD_WR_DATA(0x36);LCD_WR_DATA(0x37); LCD_WR_DATA(0x6F);LCD_WR_REG(0xED); LCD_WR_DATA(0x1B); LCD_WR_DATA(0x0B); LCD_WR_REG(0xAE);            LCD_WR_DATA(0x77);LCD_WR_REG(0xCD);           LCD_WR_DATA(0x63);       LCD_WR_REG(0x70);            LCD_WR_DATA(0x07);LCD_WR_DATA(0x07);LCD_WR_DATA(0x04);LCD_WR_DATA(0x0E); LCD_WR_DATA(0x0F); LCD_WR_DATA(0x09);LCD_WR_DATA(0x07);LCD_WR_DATA(0x08);LCD_WR_DATA(0x03);LCD_WR_REG(0xE8);         LCD_WR_DATA(0x34);LCD_WR_REG(0x62);           LCD_WR_DATA(0x18);LCD_WR_DATA(0x0D);LCD_WR_DATA(0x71);LCD_WR_DATA(0xED);LCD_WR_DATA(0x70); LCD_WR_DATA(0x70);LCD_WR_DATA(0x18);LCD_WR_DATA(0x0F);LCD_WR_DATA(0x71);LCD_WR_DATA(0xEF);LCD_WR_DATA(0x70); LCD_WR_DATA(0x70);LCD_WR_REG(0x63);          LCD_WR_DATA(0x18);LCD_WR_DATA(0x11);LCD_WR_DATA(0x71);LCD_WR_DATA(0xF1);LCD_WR_DATA(0x70); LCD_WR_DATA(0x70);LCD_WR_DATA(0x18);LCD_WR_DATA(0x13);LCD_WR_DATA(0x71);LCD_WR_DATA(0xF3);LCD_WR_DATA(0x70); LCD_WR_DATA(0x70);LCD_WR_REG(0x64);          LCD_WR_DATA(0x28);LCD_WR_DATA(0x29);LCD_WR_DATA(0xF1);LCD_WR_DATA(0x01);LCD_WR_DATA(0xF1);LCD_WR_DATA(0x00);LCD_WR_DATA(0x07);LCD_WR_REG(0x66);         LCD_WR_DATA(0x3C);LCD_WR_DATA(0x00);LCD_WR_DATA(0xCD);LCD_WR_DATA(0x67);LCD_WR_DATA(0x45);LCD_WR_DATA(0x45);LCD_WR_DATA(0x10);LCD_WR_DATA(0x00);LCD_WR_DATA(0x00);LCD_WR_DATA(0x00);LCD_WR_REG(0x67);          LCD_WR_DATA(0x00);LCD_WR_DATA(0x3C);LCD_WR_DATA(0x00);LCD_WR_DATA(0x00);LCD_WR_DATA(0x00);LCD_WR_DATA(0x01);LCD_WR_DATA(0x54);LCD_WR_DATA(0x10);LCD_WR_DATA(0x32);LCD_WR_DATA(0x98);LCD_WR_REG(0x74);          LCD_WR_DATA(0x10);   LCD_WR_DATA(0x85);   LCD_WR_DATA(0x80);LCD_WR_DATA(0x00); LCD_WR_DATA(0x00); LCD_WR_DATA(0x4E);LCD_WR_DATA(0x00);                 LCD_WR_REG(0x98);            LCD_WR_DATA(0x3e);LCD_WR_DATA(0x07);LCD_WR_REG(0x35);  LCD_WR_REG(0x21);LCD_WR_REG(0x11); delay_ms(120); LCD_WR_REG(0x29);     LCD_direction(USE_HORIZONTAL);//设置LCD显示方向LCD_LED_SET;//点亮背光LCD_Clear(WHITE);//清全屏白色
}/****************************************************************************** @name       :void LCD_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd)* @date       :2018-08-09 * @function   :Setting LCD display window* @parameters :xStar:the bebinning x coordinate of the LCD display windowyStar:the bebinning y coordinate of the LCD display windowxEnd:the endning x coordinate of the LCD display windowyEnd: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>>8);LCD_WR_DATA(xStar);     LCD_WR_DATA(xEnd>>8);LCD_WR_DATA(xEnd);LCD_WR_REG(lcddev.setycmd);    LCD_WR_DATA(yStar>>8);LCD_WR_DATA(yStar);     LCD_WR_DATA(yEnd>>8);LCD_WR_DATA(yEnd);LCD_WriteRAM_Prepare();   //开始写入GRAM
}   /****************************************************************************** @name       :void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)* @date       :2018-08-09 * @function   :Set coordinate value* @parameters :Xpos:the  x coordinate of the pixelYpos: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(uint8_t direction)* @date       :2018-08-09 * @function   :Setting the display direction of LCD screen* @parameters :direction:0-0 degree1-90 degree2-180 degree3-270 degree* @retvalue   :None
******************************************************************************/
void LCD_direction(uint8_t direction)
{ lcddev.setxcmd=0x2A;lcddev.setycmd=0x2B;lcddev.wramcmd=0x2C;switch(direction){       case 0:                                  lcddev.width=LCD_W;lcddev.height=LCD_H; LCD_WriteReg(0x36,1<<3);//BGR==1,MY==0,MX==0,MV==0break;case 1:lcddev.width=LCD_H;lcddev.height=LCD_W;LCD_WriteReg(0x36,(1<<5)|(1<<6)|(1<<3));//BGR==1,MY==1,MX==0,MV==1break;case 2:                                 lcddev.width=LCD_W;lcddev.height=LCD_H;         LCD_WriteReg(0x36,(1<<6)|(1<<7)|(1<<3));//BGR==1,MY==0,MX==0,MV==0break;case 3:lcddev.width=LCD_H;lcddev.height=LCD_W;LCD_WriteReg(0x36,(1<<7)|(1<<5)|(1<<3));//BGR==1,MY==1,MX==0,MV==1break;   default:break;}
}

lcd_gc9a01.h

#ifndef __LCD_GC9A01_H
#define __LCD_GC9A01_H#include "main.h"//LCD重要参数集
typedef struct
{                                            uint16_t width;            //LCD 宽度uint16_t height;            //LCD 高度uint16_t id;                //LCD IDuint8_t  dir;           //横屏还是竖屏控制:0,竖屏;1,横屏。uint16_t  wramcmd;      //开始写gram指令uint16_t  setxcmd;       //设置x坐标指令uint16_t  setycmd;     //设置y坐标指令
}_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 240//TFTLCD部分外要调用的函数
extern uint16_t  POINT_COLOR;//默认红色
extern uint16_t  BACK_COLOR; //背景颜色.默认为白色//液晶控制口置1操作语句宏定义
#define SPI_PORT  CW_GPIOA
#define LCD_PORT  CW_GPIOA#define SDA_GPIO_PIN  GPIO_PIN_0
#define SCL_GPIO_PIN  GPIO_PIN_1
#define CS_GPIO_PIN   GPIO_PIN_2
#define DC_GPIO_PIN   GPIO_PIN_3
#define RES_GPIO_PIN  GPIO_PIN_4
#define BLK_GPIO_PIN  GPIO_PIN_5#define  SPI_MOSI_SET    GPIO_SetBits(SPI_PORT,SDA_GPIO_PIN)
#define   SPI_SCLK_SET    GPIO_SetBits(SPI_PORT,SCL_GPIO_PIN)#define    SPI_MOSI_CLR    GPIO_ResetBits(SPI_PORT,SDA_GPIO_PIN)
#define   SPI_SCLK_CLR    GPIO_ResetBits(SPI_PORT,SCL_GPIO_PIN)#define  LCD_CS_SET      GPIO_SetBits(LCD_PORT,CS_GPIO_PIN)
#define   LCD_RS_SET      GPIO_SetBits(LCD_PORT,DC_GPIO_PIN)
#define   LCD_RST_SET     GPIO_SetBits(LCD_PORT,RES_GPIO_PIN)
#define   LCD_LED_SET     GPIO_SetBits(LCD_PORT,BLK_GPIO_PIN)//LCD背光#define    LCD_CS_CLR     GPIO_ResetBits(LCD_PORT,CS_GPIO_PIN)
#define   LCD_RS_CLR     GPIO_ResetBits(LCD_PORT,DC_GPIO_PIN)
#define   LCD_RST_CLR    GPIO_ResetBits(LCD_PORT,RES_GPIO_PIN)//画笔颜色
#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//浅棕蓝色(选择条目的反色)void SPI_WriteByte(uint8_t Data);
void SPI_GPIO_Init(void);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);//画点
uint16_t  LCD_ReadPoint(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);uint16_t LCD_RD_DATA(void);//读取LCD数据
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue);
void LCD_WR_DATA(uint8_t data);
uint16_t LCD_ReadReg(uint8_t LCD_Reg);
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 );#endif

lcd_gui.c

#include "main.h"
#include "lcd_font.h"
/*LCD GUI API函数*/
/******************************************************************** @name       :void GUI_DrawPoint(uint16_t x,uint16_t y,uint16_t color)* @date       :2018-08-09 * @function   :draw a point in LCD screen* @parameters :x:the x coordinate of the pointy:the y coordinate of the pointcolor: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(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t color)* @date       :2018-08-09 * @function   :fill the specified area* @parameters :sx:the bebinning x coordinate of the specified areasy:the bebinning y coordinate of the specified areaex:the ending x coordinate of the specified areaey:the ending y coordinate of the specified areacolor: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(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)* @date       :2018-08-09 * @function   :Draw a line between two points* @parameters :x1:the bebinning x coordinate of the liney1:the bebinning y coordinate of the linex2:the ending x coordinate of the liney2: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; int xerr=0,yerr=0,delta_x,delta_y,distance; int 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(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)* @date       :2018-08-09 * @function   :Draw a rectangle* @parameters :x1:the bebinning x coordinate of the rectangley1:the bebinning y coordinate of the rectanglex2:the ending x coordinate of the rectangley2: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 LCD_DrawFillRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)* @date       :2018-08-09 * @function   :Filled a rectangle* @parameters :x1:the bebinning x coordinate of the filled rectangley1:the bebinning y coordinate of the filled rectanglex2:the ending x coordinate of the filled rectangley2:the ending y coordinate of the filled rectangle* @retvalue   :None
******************************************************************************/
void LCD_DrawFillRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{LCD_Fill(x1,y1,x2,y2,POINT_COLOR);
}/****************************************************************************** @name       :void _draw_circle_8(int xc, int yc, int x, int y, uint16_t 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(int xc, int yc, int x, int 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,uint16_t 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 radiusfill:1-filling,0-no filling* @retvalue   :None
******************************************************************************/
void gui_circle(int xc, int yc,uint16_t c,int r, int fill)
{int 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++;}}
}/****************************************************************************** @name       :void Draw_Triangel(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint16_t x2,uint16_t 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 triangulary1:the vertex y coordinate of the triangularx2: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(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint16_t x2,uint16_t 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 triangulary1:the vertex y coordinate of the triangularx2: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 LCD_ShowChar(uint16_t x,uint16_t y,uint16_t fc, uint16_t bc, uint8_t num,uint8_t size,uint8_t mode)* @date       :2018-08-09 * @function   :Display a single English character* @parameters :x:the bebinning x coordinate of the Character display positiony:the bebinning y coordinate of the Character display positionfc:the color value of display characterbc:the background color of display characternum:the ascii code of display character(0~94)size:the size of display charactermode:0-no overlying,1-overlying* @retvalue   :None
******************************************************************************/
void LCD_ShowChar(uint16_t x,uint16_t y,uint16_t fc, uint16_t bc, uint8_t num,uint8_t size,uint8_t mode)
{  uint8_t temp;uint8_t pos,t;uint16_t colortemp=POINT_COLOR;      num=num-' ';//得到偏移后的值LCD_SetWindows(x,y,x+size/2-1,y+size-1);//设置单个文字显示窗口if(!mode) //非叠加方式{     for(pos=0;pos<size;pos++){if(size==12)temp=asc2_1206[num][pos];//调用1206字体else temp=asc2_1608[num][pos];        //调用1608字体for(t=0;t<size/2;t++){                 if(temp&0x01)Lcd_WriteData_16Bit(fc); else Lcd_WriteData_16Bit(bc); temp>>=1; }} }else//叠加方式{for(pos=0;pos<size;pos++){if(size==12)temp=asc2_1206[num][pos];//调用1206字体else temp=asc2_1608[num][pos];        //调用1608字体for(t=0;t<size/2;t++){   POINT_COLOR=fc;              if(temp&0x01)LCD_DrawPoint(x+t,y+pos);//画一个点temp>>=1; }}}POINT_COLOR=colortemp;    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏
}/****************************************************************************** @name       :void LCD_ShowString(uint16_t x,uint16_t y,uint8_t size,uint8_t *p,uint8_t mode)* @date       :2018-08-09 * @function   :Display English string* @parameters :x:the bebinning x coordinate of the English stringy:the bebinning y coordinate of the English stringp:the start address of the English stringsize:the size of display charactermode:0-no overlying,1-overlying* @retvalue   :None
******************************************************************************/
void LCD_ShowString(uint16_t x,uint16_t y,uint8_t size,uint8_t *p,uint8_t mode)
{         while((*p<='~')&&(*p>=' '))//判断是不是非法字符!{   if(x>(lcddev.width-1)||y>(lcddev.height-1)) return;     LCD_ShowChar(x,y,POINT_COLOR,BACK_COLOR,*p,size,mode);x+=size/2;p++;}
} /****************************************************************************** @name       :uint32_t mypow(uint8_t m,uint8_t n)* @date       :2018-08-09 * @function   :get the nth power of m (internal call)* @parameters :m:the multipliern:the power* @retvalue   :the nth power of m
******************************************************************************/
uint32_t mypow(uint8_t m,uint8_t n)
{uint32_t result=1;    while(n--)result*=m;    return result;
}/****************************************************************************** @name       :void LCD_ShowNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size)* @date       :2018-08-09 * @function   :Display number* @parameters :x:the bebinning x coordinate of the numbery:the bebinning y coordinate of the numbernum:the number(0~4294967295)len:the length of the display numbersize:the size of display number* @retvalue   :None
******************************************************************************/
void LCD_ShowNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size)
{            uint8_t t,temp;uint8_t enshow=0;                        for(t=0;t<len;t++){temp=(num/mypow(10,len-t-1))%10;if(enshow==0&&t<(len-1)){if(temp==0){LCD_ShowChar(x+(size/2)*t,y,POINT_COLOR,BACK_COLOR,' ',size,0);continue;}else enshow=1; }LCD_ShowChar(x+(size/2)*t,y,POINT_COLOR,BACK_COLOR,temp+'0',size,0); }
} /****************************************************************************** @name       :void GUI_DrawFont16(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode)* @date       :2018-08-09 * @function   :Display a single 16x16 Chinese character* @parameters :x:the bebinning x coordinate of the Chinese charactery:the bebinning y coordinate of the Chinese characterfc:the color value of Chinese characterbc:the background color of Chinese characters:the start address of the Chinese charactermode:0-no overlying,1-overlying* @retvalue   :None
******************************************************************************/
void GUI_DrawFont16(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode)
{uint8_t i,j;uint16_t k;uint16_t HZnum;uint16_t x0=x;HZnum=sizeof(tfont16)/sizeof(typFNT_GB16);  //自动统计汉字数目for (k=0;k<HZnum;k++) {if ((tfont16[k].Index[0]==*(s))&&(tfont16[k].Index[1]==*(s+1))){     LCD_SetWindows(x,y,x+16-1,y+16-1);for(i=0;i<16*2;i++){for(j=0;j<8;j++){   if(!mode) //非叠加方式{if(tfont16[k].Msk[i]&(0x80>>j))  Lcd_WriteData_16Bit(fc);else Lcd_WriteData_16Bit(bc);}else{POINT_COLOR=fc;if(tfont16[k].Msk[i]&(0x80>>j))    LCD_DrawPoint(x,y);//画一个点x++;if((x-x0)==16){x=x0;y++;break;}}}}}                   continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响}LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏
} /****************************************************************************** @name       :void GUI_DrawFont24(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode)* @date       :2018-08-09 * @function   :Display a single 24x24 Chinese character* @parameters :x:the bebinning x coordinate of the Chinese charactery:the bebinning y coordinate of the Chinese characterfc:the color value of Chinese characterbc:the background color of Chinese characters:the start address of the Chinese charactermode:0-no overlying,1-overlying* @retvalue   :None
******************************************************************************/
void GUI_DrawFont24(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode)
{uint8_t i,j;uint16_t k;uint16_t HZnum;uint16_t x0=x;HZnum=sizeof(tfont24)/sizeof(typFNT_GB24);  //自动统计汉字数目for (k=0;k<HZnum;k++) {if ((tfont24[k].Index[0]==*(s))&&(tfont24[k].Index[1]==*(s+1))){     LCD_SetWindows(x,y,x+24-1,y+24-1);for(i=0;i<24*3;i++){for(j=0;j<8;j++){if(!mode) //非叠加方式{if(tfont24[k].Msk[i]&(0x80>>j)) Lcd_WriteData_16Bit(fc);else Lcd_WriteData_16Bit(bc);}else{POINT_COLOR=fc;if(tfont24[k].Msk[i]&(0x80>>j))    LCD_DrawPoint(x,y);//画一个点x++;if((x-x0)==24){x=x0;y++;break;}}}}}                   continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响}LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏
}/****************************************************************************** @name       :void GUI_DrawFont32(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode)* @date       :2018-08-09 * @function   :Display a single 32x32 Chinese character* @parameters :x:the bebinning x coordinate of the Chinese charactery:the bebinning y coordinate of the Chinese characterfc:the color value of Chinese characterbc:the background color of Chinese characters:the start address of the Chinese charactermode:0-no overlying,1-overlying* @retvalue   :None
******************************************************************************/
void GUI_DrawFont32(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode)
{uint8_t i,j;uint16_t k;uint16_t HZnum;uint16_t x0=x;HZnum=sizeof(tfont32)/sizeof(typFNT_GB32);  //自动统计汉字数目for (k=0;k<HZnum;k++) {if ((tfont32[k].Index[0]==*(s))&&(tfont32[k].Index[1]==*(s+1))){     LCD_SetWindows(x,y,x+32-1,y+32-1);for(i=0;i<32*4;i++){for(j=0;j<8;j++){if(!mode) //非叠加方式{if(tfont32[k].Msk[i]&(0x80>>j)) Lcd_WriteData_16Bit(fc);else Lcd_WriteData_16Bit(bc);}else{POINT_COLOR=fc;if(tfont32[k].Msk[i]&(0x80>>j))    LCD_DrawPoint(x,y);//画一个点x++;if((x-x0)==32){x=x0;y++;break;}}}}}                   continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响}LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏
} /****************************************************************************** @name       :void Show_Str(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *str,uint8_t size,uint8_t mode)* @date       :2018-08-09 * @function   :Display Chinese and English strings* @parameters :x:the bebinning x coordinate of the Chinese and English stringsy:the bebinning y coordinate of the Chinese and English stringsfc:the color value of Chinese and English stringsbc:the background color of Chinese and English stringsstr:the start address of the Chinese and English stringssize:the size of Chinese and English stringsmode:0-no overlying,1-overlying* @retvalue   :None
******************************************************************************/
void Show_Str(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *str,uint8_t size,uint8_t mode)
{                    uint16_t x0=x;                               uint8_t bHz=0;     //字符或者中文while(*str!=0)//数据未结束{ if(!bHz){if(x>(lcddev.width-size/2)||y>(lcddev.height-size)) return; if(*str>0x80)bHz=1;//中文else              //字符{          if(*str==0x0D)//换行符号{         y+=size;x=x0;str++; }  else{if(size>16)//字库中没有集成12X24 16X32的英文字体,用8X16代替{  LCD_ShowChar(x,y,fc,bc,*str,16,mode);x+=8; //字符,为全字的一半}else{LCD_ShowChar(x,y,fc,bc,*str,size,mode);x+=size/2; //字符,为全字的一半}} str++; }}else//中文{   if(x>(lcddev.width-size)||y>(lcddev.height-size)) return;  bHz=0;//有汉字库if(size==32)GUI_DrawFont32(x,y,fc,bc,str,mode);     else if(size==24)GUI_DrawFont24(x,y,fc,bc,str,mode);  elseGUI_DrawFont16(x,y,fc,bc,str,mode);str+=2; x+=size;//下一个汉字偏移}                      }
}/****************************************************************************** @name       :void Gui_StrCenter(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *str,uint8_t size,uint8_t mode)* @date       :2018-08-09 * @function   :Centered display of English and Chinese strings* @parameters :x:the bebinning x coordinate of the Chinese and English stringsy:the bebinning y coordinate of the Chinese and English stringsfc:the color value of Chinese and English stringsbc:the background color of Chinese and English stringsstr:the start address of the Chinese and English stringssize:the size of Chinese and English stringsmode:0-no overlying,1-overlying* @retvalue   :None
******************************************************************************/
void Gui_StrCenter(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *str,uint8_t size,uint8_t mode)
{uint16_t len=strlen((const char *)str);uint16_t x1=(lcddev.width-len*8)/2;Show_Str(x1,y,fc,bc,str,size,mode);
} /****************************************************************************** @name       :void Gui_Drawbmp16(uint16_t x,uint16_t y,const unsigned char *p)* @date       :2018-08-09 * @function   :Display a 16-bit BMP image* @parameters :x:the bebinning x coordinate of the BMP imagey:the bebinning y coordinate of the BMP imagep:the start address of image array* @retvalue   :None
******************************************************************************/
void Gui_Drawbmp16(uint16_t x,uint16_t y,uint16_t w, uint16_t h, const unsigned char *p) //显示40*40 QQ图片
{int i; unsigned char picH,picL; LCD_SetWindows(x,y,x+w-1,y+h-1);//窗口设置for(i=0;i<w*h;i++){ picL=*(p+i*2);   //数据低位在前picH=*(p+i*2+1);                Lcd_WriteData_16Bit(picH<<8|picL);                         }    LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复显示窗口为全屏
}

lcd_gui.h

#ifndef __LCD_GUI_H__
#define __LCD_GUI_H__#include "main.h"
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_Circle(uint16_t x0,uint16_t y0,uint16_t fc,uint8_t r);
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 LCD_ShowChar(uint16_t x,uint16_t y,uint16_t fc, uint16_t bc, uint8_t num,uint8_t size,uint8_t mode);
void LCD_ShowNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size);
void LCD_Show2Num(uint16_t x,uint16_t y,uint16_t num,uint8_t len,uint8_t size,uint8_t mode);
void LCD_ShowString(uint16_t x,uint16_t y,uint8_t size,uint8_t *p,uint8_t mode);
void GUI_DrawFont16(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode);
void GUI_DrawFont24(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode);
void GUI_DrawFont32(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode);
void Show_Str(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *str,uint8_t size,uint8_t mode);
void Gui_Drawbmp16(uint16_t x,uint16_t y,uint16_t w, uint16_t h, const unsigned char *p); //ÏÔʾ40*40 QQͼƬ
void gui_circle(int xc, int yc,uint16_t c,int r, int fill);
void Gui_StrCenter(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *str,uint8_t size,uint8_t mode);
void LCD_DrawFillRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);#endif

lcd_example.c

#include "main.h"
#include "pic.h"
/*LCD GUI 测试函数*/
//========================variable==========================//
uint16_t ColorTab[5]={RED,GREEN,BLUE,YELLOW,BRED};//定义颜色数组
//=====================end of variable======================///****************************************************************************** @name       :void DrawTestPage(uint8_t *str)* @date       :2018-08-09 * @function   :Drawing test interface* @parameters :str:the start address of the Chinese and English strings* @retvalue   :None
******************************************************************************/
void DrawTestPage(uint8_t *str)
{
//绘制固定栏up
LCD_Clear(WHITE);
//LCD_Fill(0,0,lcddev.width,20,BLUE);
//绘制固定栏down
//LCD_Fill(0,lcddev.height-20,lcddev.width,lcddev.height,BLUE);
//POINT_COLOR=BLUE;
Gui_StrCenter(0,12,WHITE,BLUE,str,16,0);//居中显示
Gui_StrCenter(0,lcddev.height-32,WHITE,BLUE,"www.lcdwiki.com",16,0);//居中显示
//绘制测试区域
//LCD_Fill(0,20,lcddev.width,lcddev.height-20,WHITE);
}/****************************************************************************** @name       :void Display_ButtonUp(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)* @date       :2018-08-24 * @function   :Drawing a 3D button* @parameters :x1:the bebinning x coordinate of the buttony1:the bebinning y coordinate of the buttonx2:the ending x coordinate of the buttony2:the ending y coordinate of the button* @retvalue   :None
******************************************************************************/
void Display_ButtonUp(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{POINT_COLOR=WHITE;LCD_DrawLine(x1,  y1,  x2,y1); //HLCD_DrawLine(x1,  y1,  x1,y2); //VPOINT_COLOR=GRAY1;LCD_DrawLine(x1+1,y2-1,x2,y2-1);  //HPOINT_COLOR=GRAY2;LCD_DrawLine(x1,y2,x2,y2);  //HPOINT_COLOR=GRAY1;LCD_DrawLine(x2-1,y1+1,x2-1,y2);  //VPOINT_COLOR=GRAY2;LCD_DrawLine(x2,y1,x2,y2); //V
}/****************************************************************************** @name       :void menu_test(void)* @date       :2018-08-24 * @function   :Drawing a 3D menu UI* @parameters :None* @retvalue   :None
******************************************************************************/
void menu_test(void)
{LCD_Clear(GRAY0);Display_ButtonUp((lcddev.width-98)/2,65,(lcddev.width-98)/2+98,85); //x1,y1,x2,y2Gui_StrCenter(0,67,BRED,BLUE,"图形显示测试",16,1);Display_ButtonUp((lcddev.width-98)/2,95,(lcddev.width-98)/2+98,115); //x1,y1,x2,y2Gui_StrCenter(0,97,BLACK,GRAY0,"纯色填充测试",16,1);Display_ButtonUp((lcddev.width-98)/2,125,(lcddev.width-98)/2+98,145); //x1,y1,x2,y2Gui_StrCenter(0,127,BLUE,GRAY0,"中文显示测试",16,1);Display_ButtonUp((lcddev.width-98)/2,155,(lcddev.width-98)/2+98,175); //x1,y1,x2,y2Gui_StrCenter(16,157,RED,GRAY0,"图片显示测试",16,1);delay_ms(1500);delay_ms(500);
}/****************************************************************************** @name       :void main_test(void)* @date       :2018-08-09 * @function   :Drawing the main Interface of the Comprehensive Test Program* @parameters :None* @retvalue   :None
******************************************************************************/
void main_test(void)
{DrawTestPage("综合测试程序");  Gui_StrCenter(0,60,RED,BLUE,"武汉芯源",16,1);//居中显示Gui_StrCenter(0,95,RED,BLUE,"  CW32-GC9A01_LCD",16,1);//居中显示Gui_StrCenter(0,112,BLUE,BLUE,"By CoderEnd",16,1);//居中显示Gui_StrCenter(0,129,BLUE,BLUE,"GC9A01_LCD 240X240",16,1);//居中显示Gui_StrCenter(0,146,BLUE,BLUE,"2023-07-04",16,1);//居中显示delay_ms(1500);     delay_ms(1500);
}/****************************************************************************** @name       :void Test_Color(void)* @date       :2018-08-09 * @function   :Color fill test(white,black,red,green,blue)* @parameters :None* @retvalue   :None
******************************************************************************/
void Test_Color(void)
{//DrawTestPage("测试1:纯色填充测试");LCD_Fill(0,0,lcddev.width-1,lcddev.height-1,WHITE);Show_Str(40,30,BLACK,YELLOW,"WHITE",16,1);delay_ms(1000);LCD_Fill(0,0,lcddev.width-1,lcddev.height-1,BLACK);Show_Str(40,30,WHITE,YELLOW,"BLACK",16,1);delay_ms(1000);LCD_Fill(0,0,lcddev.width-1,lcddev.height-1,RED);Show_Str(40,30,BLUE,YELLOW,"RED",16,1);delay_ms(800);LCD_Fill(0,0,lcddev.width-1,lcddev.height-1,GREEN);Show_Str(40,30,BLUE,YELLOW,"GREEN",16,1);delay_ms(800);LCD_Fill(0,0,lcddev.width-1,lcddev.height-1,BLUE);Show_Str(40,30,RED,YELLOW,"BLUE",16,1);delay_ms(800);
}/****************************************************************************** @name       :void Test_FillRec(void)* @date       :2018-08-09 * @function   :Rectangular display and fill testDisplay red,green,blue,yellow,pink rectangular boxes in turn,1500 milliseconds later,Fill the rectangle in red,green,blue,yellow and pink in turn* @parameters :None* @retvalue   :None
******************************************************************************/
void Test_FillRec(void)
{uint8_t i=0;DrawTestPage("GUI矩形填充测试");LCD_Fill(0,30,lcddev.width-1,lcddev.height-32,WHITE);for (i=0; i<5; i++) {POINT_COLOR=ColorTab[i];LCD_DrawRectangle(lcddev.width/2-40+(i*16),lcddev.height/2-40+(i*13),lcddev.width/2-40+(i*16)+30,lcddev.height/2-40+(i*13)+30); }delay_ms(1500); LCD_Fill(0,30,lcddev.width-1,lcddev.height-32,WHITE);for (i=0; i<5; i++) {POINT_COLOR=ColorTab[i];LCD_DrawFillRectangle(lcddev.width/2-40+(i*16),lcddev.height/2-40+(i*13),lcddev.width/2-40+(i*16)+30,lcddev.height/2-40+(i*13)+30); }delay_ms(1500);
}/****************************************************************************** @name       :void Test_Circle(void)* @date       :2018-08-09 * @function   :circular display and fill testDisplay red,green,blue,yellow,pink circular boxes in turn,1500 milliseconds later,Fill the circular in red,green,blue,yellow and pink in turn* @parameters :None* @retvalue   :None
******************************************************************************/
void Test_Circle(void)
{uint8_t i=0;DrawTestPage("GUI画圆填充测试");LCD_Fill(0,30,lcddev.width-1,lcddev.height-32,WHITE);for (i=0; i<5; i++)  gui_circle(lcddev.width/2-40+(i*15),lcddev.height/2-25+(i*13),ColorTab[i],15,0);delay_ms(1500);  LCD_Fill(0,30,lcddev.width-1,lcddev.height-32,WHITE);for (i=0; i<5; i++) gui_circle(lcddev.width/2-40+(i*15),lcddev.height/2-25+(i*13),ColorTab[i],15,1);delay_ms(1500);
}/****************************************************************************** @name       :void English_Font_test(void)* @date       :2018-08-09 * @function   :English display test* @parameters :None* @retvalue   :None
******************************************************************************/
void English_Font_test(void)
{DrawTestPage("英文显示测试");Show_Str(50,77,BLUE,YELLOW,"6X12:abcdefgh01234567",12,0);Show_Str(50,89,BLUE,YELLOW,"6X12:ABCDEFGH01234567",12,1);Show_Str(50,101,BLUE,YELLOW,"6X12:~!@#$%^&*()_+{}:",12,0);Show_Str(50,114,BLUE,YELLOW,"8X16:abcde01234",16,0);Show_Str(50,130,BLUE,YELLOW,"8X16:ABCDE01234",16,1);Show_Str(50,146,BLUE,YELLOW,"8X16:~!@#$%^&*()",16,0); delay_ms(1200);
}/****************************************************************************** @name       :void Test_Triangle(void)* @date       :2018-08-09 * @function   :triangle display and fill testDisplay red,green,blue,yellow,pink triangle boxes in turn,1500 milliseconds later,Fill the triangle in red,green,blue,yellow and pink in turn* @parameters :None* @retvalue   :None
******************************************************************************/
void Test_Triangle(void)
{uint8_t i=0;DrawTestPage("GUI Tri填充测试");LCD_Fill(0,30,lcddev.width-1,lcddev.height-32,WHITE);for(i=0;i<5;i++){POINT_COLOR=ColorTab[i];Draw_Triangel(lcddev.width/2-40+(i*15),lcddev.height/2-12+(i*11),lcddev.width/2-25-1+(i*15),lcddev.height/2-12-26-1+(i*11),lcddev.width/2-10-1+(i*15),lcddev.height/2-12+(i*11));}delay_ms(1500);  LCD_Fill(0,30,lcddev.width-1,lcddev.height-32,WHITE);for(i=0;i<5;i++){POINT_COLOR=ColorTab[i];Fill_Triangel(lcddev.width/2-40+(i*15),lcddev.height/2-12+(i*11),lcddev.width/2-25-1+(i*15),lcddev.height/2-12-26-1+(i*11),lcddev.width/2-10-1+(i*15),lcddev.height/2-12+(i*11));}delay_ms(1500);
}/****************************************************************************** @name       :void Chinese_Font_test(void)* @date       :2018-08-09 * @function   :chinese display test* @parameters :None* @retvalue   :None
******************************************************************************/
void Chinese_Font_test(void)
{    DrawTestPage("中文显示测试");Show_Str(45,82,BLUE,YELLOW,"16X16: 武汉芯源",16,0);Show_Str(45,102,BLUE,YELLOW,"24X24: 武汉芯源",24,1);Show_Str(45,127,BLUE,YELLOW,"32X32: 武汉芯源",32,1);delay_ms(1200);
}/****************************************************************************** @name       :void Pic_test(void)* @date       :2018-08-09 * @function   :picture display test* @parameters :None* @retvalue   :None
******************************************************************************/
void Pic_test(void)
{DrawTestPage("图片显示测试");//LCD_Fill(0,20,lcddev.width,lcddev.height-20,WHITE);Gui_Drawbmp16(50,90,40,40,gImage_qq);Show_Str(50+12,135,BLUE,YELLOW,"QQ",16,1);Gui_Drawbmp16(100,90,40,40,gImage_qq);Show_Str(100+12,135,BLUE,YELLOW,"QQ",16,1);Gui_Drawbmp16(150,90,40,40,gImage_qq);Show_Str(150+12,135,BLUE,YELLOW,"QQ",16,1);delay_ms(1200);
}/****************************************************************************** @name       :void Rotate_Test(void)* @date       :2018-08-09 * @function   :rotate test* @parameters :None* @retvalue   :None
******************************************************************************/
void Rotate_Test(void)
{uint8_t i=0;uint8_t *Direction[4]={"Rotation:0","Rotation:90","Rotation:180","Rotation:270"};for(i=0;i<4;i++){LCD_direction(i);DrawTestPage("屏幕旋转测试");Show_Str(40,35,BLUE,YELLOW,Direction[i],16,1);Gui_Drawbmp16(40,55,40,40,gImage_qq);delay_ms(1000);delay_ms(1000);}LCD_direction(USE_HORIZONTAL);
}

lcd_example.h

#ifndef __LCD_EXAMPLE_H__
#define __LCD_EXAMPLE_H__#include "main.h"void DrawTestPage(uint8_t *str);
void Display_ButtonUp(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2);
void menu_test(void);
void Test_Color(void);
void Test_FillRec(void);
void Test_Circle(void);
void Test_Triangle(void);
void English_Font_test(void);
void Chinese_Font_test(void);
void Pic_test(void);
void Load_Drow_Dialog(void);
void Touch_Test(void);
void main_test(void);
void Rotate_Test(void);#endif

完整代码参考

Gitee Embedded-CW32-Board-Template

测试效果



国产MCU-CW32F030开发学习-圆形GC9A01_LCD模块相关推荐

  1. STM32的国产替代,盘点下我知道的国产MCU

    电子元件涨价和缺货是多少嵌入式工程师的痛,一年内上游厂家晶圆产能告急能有数十次之多.而MCU更是重灾区,且不说国内有超75%的市场都是被国外产品占据,就是本国内的代理和供应商也是漫天要价,而交期更是长 ...

  2. 国产给力啊啊啊----国产MCU-CW32F030开发学习

    国产MCU-CW32F030开发学习 1. 相关资料下载 1.1 武汉芯源半导体 武汉芯源半导体官网 武汉芯源半导体 武汉芯源 21ic 电子论坛 21ic 电子论坛 1.2 CW32F030系列资料 ...

  3. 国产版Jetson Nano学习篇2—详细讲解Jetson Nano的开发环境配置和其 Ubuntu 18.04系统的操作,入门必看

    目录 前言 1.开发环境配置 1.1联网 1.2系统汉化和安装中文输入法 1.2.1系统汉化(按需求选择) 1.2.2安装中文输入法 1.3更换关屏设置 1.4更新源和部分软件(仅供参考) 2.Pyt ...

  4. 文末赠书《GD32 MCU原理及固件库开发指南》5本 | 国产MCU中GD32系列有望成为未来32位MCU的主流

    学习优秀博文([guo产MCU移植]手把手教你使用RT-Thread制作GD32系列BSP)有感 一篇优秀的博文是什么样的?它有什么规律可循吗?优秀的guo产32位单片机处理器是否真的能成功替换掉st ...

  5. Julia 学习笔记(五) | 模块开发 - 保姆级教程

    唠唠闲话 今年参与了 OSPP'22 的 Julia 开源项目,期间学习了 Julia 模块从开发到测试的完整过程.借这个机会,整理这段时间学习到的知识.Julia 在开发提供的工具便捷丰富,且对新人 ...

  6. JavaScript之后端Web服务器开发Node.JS基本模块学习篇

    JavaScript之后端Web服务器开发Node.JS基本模块学习篇 基本模块 fs文件系统模块 stream支持流模块 http crypto加密模块 基本模块 因为Node.js是运行在服务区端 ...

  7. 嵌入式系统开发学习如何起步、如何深入?(转)

    学习有捷径吗?俺认为是有的,正确的道路就是捷径. 就好象是爬山,如果有导游图,那就能找到一条最正确的路线:如果没有导游图,自己瞎琢磨,东问西问,也未必能找到最佳的路线. 有时候回首前尘,会谓叹,要是当 ...

  8. [MM32生态]EVB-L0136开发学习分享

    简介 MM32L0130系列MCU是灵动微电子新推出的低功耗产品,内核使用32位的高性能Arm® Cortex-M0+ 微控制器,最高工作频率可达到48MHz,内置高速存储器,丰富的增强型 I/O 端 ...

  9. 2021物联网开发学习——基于小熊派IoT开发板Bear-Pi-IOT、E53_IA1_智慧农业拓展板与小熊派-鸿蒙·季Bear-Pi-HM Nano并接入Hi-Link

    2021物联网开发学习--基于小熊派IoT开发板Bear-Pi-IOT.E53_IA1_智慧农业拓展板与小熊派-鸿蒙·季Bear-Pi-HM Nano并接入Hi-Link 目录 作者介绍 目的 用到的 ...

最新文章

  1. (五)Maven目录结构及常用命令说明
  2. 网络延迟造成插入多条重复数据
  3. java中类与类之间的关系
  4. 30 校准_校准or质控,傻傻分不清楚
  5. Error: Flash Download failed - Target DLL has been cancelled
  6. android+动态地图+效果图,Android百度地图绘制圆形,圆形半径可动态变化
  7. 数据:以太坊2.0存款合约新增9.4万ETH
  8. 商业认知,在创业的时候,有人今天做服装不赚钱,就换了餐饮;换了餐饮业不赚钱,又继续换?
  9. 常用WebServices返回数据的4种方法比较 (转)
  10. C语言判断文件编码格式
  11. ip切换及时刷新交换机的arp表方法
  12. Vue父组件传参数给子组件时,页面崩溃或者报undefined或者数据为空或者执行了两遍
  13. 呼叫中心系统和外呼机器人的高效组合
  14. 2021全球程序员收入报告出炉,字节高级码农年薪274万元排第5!
  15. 青龙面板--花花阅读
  16. 计算机处理器的CPU主频与指令条数
  17. tagged和untagged
  18. 在调试的时候碰到了Render process gone.问题
  19. 摔倒了不可怕,可怕的是爬不起
  20. 【Java】Ceph对Swift的支持及Java…

热门文章

  1. 在线出售域名页面html源码
  2. 【全文检索_03】Lucene 基本使用
  3. 业内顶级导师团联合力推——首个“可信AI”实战大赛重磅揭幕
  4. Swift3.0通过闭包回调传递参数 / @escaping
  5. mysql报错502_php报错502badgateway怎么解决
  6. video使用,以及解决:网页刷新后,video视频无法播放
  7. Visual Studio2017安装和使用教程(详细)
  8. 《我国生物医学工程现状与发展政策》——选修课论文
  9. NASM语言更改中断向量表
  10. java-php-python-ssm绿叶有限公司工资管理信息系统计算机毕业设计