RTL8762CMF+字库+LCD显示

1、RTL8762CMF有500多K flash,可以保存1个16*16汉字字库

2、驱动1个8位并口屏,将字库中的汉字中显示出来

bb851bb1ce7a45728dab54c7d7e1b867.jpg

6e7d15d1c1914342b507585819bdb62d.jpg

132d930643d34b86aacb68a156ef2594.jpg

一、将gb2312_80.bin(字库文件)打包到烧录镜像中

打开MPTool工具

 点击User Data

增加gb2312_80.bin,起始位置0X00820000。

这样烧录时,就可以把gb2312_80.bin字库文件烧录到RTL8762中。

二、 用于LCD显示及字库读取的程序

 ILI9225.c

#include "rtl876x_gpio.h"
#include "rtl876x_pinmux.h"
#include "rtl876x_rcc.h"
#include "flash_device.h"

#include "ILI9225.h"
//---汉字的字库头文件---//
#include "charcode.h"
#include "picture.h"
/* Global Variable */
unsigned char fch,fcl;  //前景色高位和低位

uint32_t FLASH_ADDR_BASE=0x00820000;
uint32_t FLASH_ZK24_ADDR_BASE=0x0085c000;


//字模buff
uint8_t MatrixBuff[32];
uint8_t MatrixBuff24X24[72];


void LCD_Write_COM(unsigned char VL);
void lcd_write_comm_word(uint16_t cmd);



void getMatrix(const unsigned short nmCode)
{
	uint8_t i;
	uint32_t offset;
	unsigned char GBH,GBL;
	unsigned short nm=nmCode;
	
	GBH=nm>>8;
	GBL=nm;
	if(GBH>=0xb0)
	{
		offset=((GBH-0xa7)*94+GBL-0xa1)*32;
	}else
	{
		offset=((GBH-0xa1)*94+GBL-0xa1)*32;
	}
	for(i=0;i<32;i++)
	{
		flash_auto_read_locked(FLASH_ADDR_BASE+offset+i,(uint32_t*)&MatrixBuff[i]);
	}
}



void getMatrix24x24(const unsigned short nmCode)
{
	uint8_t i;
	uint32_t offset;
	unsigned char GBH,GBL;
	unsigned short nm=nmCode;
	
	GBH=nm>>8;
	GBL=nm;
	if(GBH>=0xb0)
	{
		offset=((GBH-0xa7)*94+GBL-0xa1)*72;
	}else
	{
		offset=((GBH-0xa1)*94+GBL-0xa1)*72;
	}
	for(i=0;i<72;i++)
	{
		flash_auto_read_locked(FLASH_ADDR_BASE+offset+i,(uint32_t*)&MatrixBuff24X24[i]);
	}
}

void Delay_Us(uint32_t iTime)
{
	while(iTime--)
		for (uint32_t i = 0; i < 100; i++);
}

void Delay_Ms(uint32_t iTime)
{
	while(iTime--)
		for (uint32_t i = 0; i < 10000; i++);
}

void ili9225_gpio_init(void)
{
	//gpio
	Pad_Config(LCD_CS, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE , PAD_OUT_ENABLE , PAD_OUT_LOW);
	Pad_Config(LCD_RS, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE , PAD_OUT_ENABLE , PAD_OUT_LOW);
	Pad_Config(LCD_WR, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE , PAD_OUT_ENABLE , PAD_OUT_LOW);
	Pad_Config(LCD_RD, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE , PAD_OUT_ENABLE , PAD_OUT_LOW);
	Pad_Config(LCD_RST, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE , PAD_OUT_ENABLE , PAD_OUT_LOW);
	Pad_Config(LCD_LED, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE , PAD_OUT_ENABLE , PAD_OUT_LOW);
	
	Pad_Config(LCD_DB0, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE , PAD_OUT_ENABLE , PAD_OUT_LOW);
	Pad_Config(LCD_DB1, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE , PAD_OUT_ENABLE , PAD_OUT_LOW);
	Pad_Config(LCD_DB2, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE , PAD_OUT_ENABLE , PAD_OUT_LOW);
	Pad_Config(LCD_DB3, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE , PAD_OUT_ENABLE , PAD_OUT_LOW);
	Pad_Config(LCD_DB4, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE , PAD_OUT_ENABLE , PAD_OUT_LOW);
	Pad_Config(LCD_DB5, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE , PAD_OUT_ENABLE , PAD_OUT_LOW);
	Pad_Config(LCD_DB6, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE , PAD_OUT_ENABLE , PAD_OUT_LOW);
	Pad_Config(LCD_DB7, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE , PAD_OUT_ENABLE , PAD_OUT_LOW);

	Pinmux_Config(LCD_CS, DWGPIO);
	Pinmux_Config(LCD_RS, DWGPIO);
	Pinmux_Config(LCD_WR, DWGPIO);
	Pinmux_Config(LCD_RD, DWGPIO);
	Pinmux_Config(LCD_RST, DWGPIO);
	Pinmux_Config(LCD_LED, DWGPIO);	
	
	Pinmux_Config(LCD_DB0, DWGPIO);	
	Pinmux_Config(LCD_DB1, DWGPIO);
	Pinmux_Config(LCD_DB2, DWGPIO);
	Pinmux_Config(LCD_DB3, DWGPIO);
	Pinmux_Config(LCD_DB4, DWGPIO);	
	Pinmux_Config(LCD_DB5, DWGPIO);
	Pinmux_Config(LCD_DB6, DWGPIO);
	Pinmux_Config(LCD_DB7, DWGPIO);
}


void driver_lcd_init(void)
{
	ili9225_gpio_init();
	RCC_PeriphClockCmd(APBPeriph_GPIO, APBPeriph_GPIO_CLOCK, ENABLE);

	GPIO_InitTypeDef GPIO_InitStruct;
	
	GPIO_StructInit(&GPIO_InitStruct);
	GPIO_InitStruct.GPIO_Pin    = GPIO_LCD_CS|GPIO_LCD_RS|GPIO_LCD_WR|GPIO_LCD_RD|GPIO_LCD_RST|GPIO_LCD_LED|GPIO_LCD_DB0|GPIO_LCD_DB1|GPIO_LCD_DB2|
	GPIO_LCD_DB3|GPIO_LCD_DB4|GPIO_LCD_DB5|GPIO_LCD_DB6|GPIO_LCD_DB7;
	GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_ITCmd  = DISABLE;
	GPIO_Init(&GPIO_InitStruct);
		
}


void SetLcdDBIn(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	GPIO_StructInit(&GPIO_InitStruct);
	GPIO_InitStruct.GPIO_Pin    = GPIO_LCD_DB0|GPIO_LCD_DB1|GPIO_LCD_DB2|GPIO_LCD_DB3|GPIO_LCD_DB4|GPIO_LCD_DB5|GPIO_LCD_DB6|GPIO_LCD_DB7;
	GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_ITCmd  = DISABLE;
	GPIO_Init(&GPIO_InitStruct);
}

void SetLcdDBOut(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_StructInit(&GPIO_InitStruct);
	GPIO_InitStruct.GPIO_Pin    = GPIO_LCD_DB0|GPIO_LCD_DB1|GPIO_LCD_DB2|GPIO_LCD_DB3|GPIO_LCD_DB4|GPIO_LCD_DB5|GPIO_LCD_DB6|GPIO_LCD_DB7;
	GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_ITCmd  = DISABLE;
	GPIO_Init(&GPIO_InitStruct);
}

/**
 * @prief LCD_ReadData
 */
uint16_t LCD_ReadData(void)
{
    uint16_t dat=0x0000;
    SetLcdDBIn();

    LCD_CS_CLR;
    LCD_RS_SET;
    LCD_WR_SET;
    LCD_RD_CLR;

    Delay_Us(20);
    //dat=LCD_DB_IN;
    if(USE_HIGHEIGHT==1){
    }else {
			dat|=(GPIO_ReadInputDataBit(GPIO_LCD_DB0)<<0)&0x01;
			dat|=(GPIO_ReadInputDataBit(GPIO_LCD_DB1)<<1)&0x02;
			dat|=(GPIO_ReadInputDataBit(GPIO_LCD_DB2)<<2)&0x04;
			dat|=(GPIO_ReadInputDataBit(GPIO_LCD_DB3)<<3)&0x08;
			dat|=(GPIO_ReadInputDataBit(GPIO_LCD_DB4)<<4)&0x10;
			dat|=(GPIO_ReadInputDataBit(GPIO_LCD_DB5)<<5)&0x20;
			dat|=(GPIO_ReadInputDataBit(GPIO_LCD_DB6)<<6)&0x40;
			dat|=(GPIO_ReadInputDataBit(GPIO_LCD_DB7)<<7)&0x80;
    }
    LCD_RD_SET;
    LCD_WR_CLR;

    LCD_CS_SET;

    SetLcdDBOut();

    return dat;

}

uint16_t ReadID(void)
{
    uint16_t id;
    lcd_write_comm_word(0x0000);

    LCD_ReadData();
    LCD_ReadData();
    id=LCD_ReadData();

    id=id<<8;
    id|=LCD_ReadData();
    return id;
}

uint16_t ReadRegister(unsigned char reg)
{
    uint16_t id;
    lcd_write_comm_word(reg);
    LCD_ReadData();
    LCD_ReadData();
    id=LCD_ReadData();

    id=id<<8;
    id|=LCD_ReadData();
    return id;
}


void LCD_Set_Port8(unsigned char VH)
{
    LCD_RD_SET;
    if(USE_HIGHEIGHT==1){

    }else{
			GPIO_WriteBit(GPIO_LCD_DB0, (VH&0x01)==0x01?(BitAction)(1):(BitAction)(0));
			GPIO_WriteBit(GPIO_LCD_DB1, (VH&0x02)==0x02?(BitAction)(1):(BitAction)(0));
			GPIO_WriteBit(GPIO_LCD_DB2, (VH&0x04)==0x04?(BitAction)(1):(BitAction)(0));
			GPIO_WriteBit(GPIO_LCD_DB3, (VH&0x08)==0x08?(BitAction)(1):(BitAction)(0));
			GPIO_WriteBit(GPIO_LCD_DB4, (VH&0x10)==0x10?(BitAction)(1):(BitAction)(0));
			GPIO_WriteBit(GPIO_LCD_DB5, (VH&0x20)==0x20?(BitAction)(1):(BitAction)(0));
			GPIO_WriteBit(GPIO_LCD_DB6, (VH&0x40)==0x40?(BitAction)(1):(BitAction)(0));
			GPIO_WriteBit(GPIO_LCD_DB7, (VH&0x80)==0x80?(BitAction)(1):(BitAction)(0));
    }
    LCD_WR_CLR;
    LCD_WR_SET;
}

void gpio_lcd_write_data(unsigned char *data, uint8_t size) {
    LCD_RD_SET;
    for (int i=0;i<size;i++) {
        if(USE_HIGHEIGHT==1){

        }else{
					GPIO_WriteBit(GPIO_LCD_DB0, (data[i]&0x01)==0x01?(BitAction)(1):(BitAction)(0));
					GPIO_WriteBit(GPIO_LCD_DB1, (data[i]&0x02)==0x02?(BitAction)(1):(BitAction)(0));
					GPIO_WriteBit(GPIO_LCD_DB2, (data[i]&0x04)==0x04?(BitAction)(1):(BitAction)(0));
					GPIO_WriteBit(GPIO_LCD_DB3, (data[i]&0x08)==0x08?(BitAction)(1):(BitAction)(0));
					GPIO_WriteBit(GPIO_LCD_DB4, (data[i]&0x10)==0x10?(BitAction)(1):(BitAction)(0));
					GPIO_WriteBit(GPIO_LCD_DB5, (data[i]&0x20)==0x20?(BitAction)(1):(BitAction)(0));
					GPIO_WriteBit(GPIO_LCD_DB6, (data[i]&0x40)==0x40?(BitAction)(1):(BitAction)(0));
					GPIO_WriteBit(GPIO_LCD_DB7, (data[i]&0x80)==0x80?(BitAction)(1):(BitAction)(0));

        }
     LCD_WR_CLR;
     LCD_WR_SET;
    }
}


void lcd_write_comm_word(uint16_t cmd)
{
    unsigned char c[2];
    c[0] = (cmd >> 8) & 0xFF;
    c[1] = cmd & 0xFF;

    LCD_CS_CLR;
    LCD_RS_CLR;

    gpio_lcd_write_data(c, 2);

    LCD_CS_SET;
}

void lcd_write_data_word(uint16_t data)
{
    unsigned char c[2];
    c[0] = (data >> 8) & 0xFF;
    c[1] = data & 0xFF;

    LCD_CS_CLR;
    LCD_RS_SET;

    gpio_lcd_write_data(c, 2);

    LCD_CS_SET;
}

void lcd_write_register_word(uint16_t addr, uint16_t data)
{
    LCD_RD_SET;
    lcd_write_comm_word(addr);
    LCD_RD_SET;
    lcd_write_data_word(data);
}


/*
 * CS --_____________________________--,低:有效
 * RD ---------------------------------,高:写
 * WR  -__--__--__--__--__--__--__-----,低:写
 * RS _________________________________,低:Index
 * RS ---------------------------------,高:Data
 *
 */
void LCD_Writ_Bus(unsigned char VH,unsigned char VL)
{
    //u16 val;
    //val=((VH<<8)&0xFF00)+VL;

    LCD_WR_SET;
    LCD_RD_SET;

    //GPIO_Write(LCD_PORT,val);
    //LCD_Set_Port(VH,VL);
    LCD_Set_Port8(VH);
    LCD_Set_Port8(VL);
    LCD_WR_CLR;
    LCD_WR_SET;

}


void LCD_Write_COM(unsigned char VL)
{
    LCD_CS_CLR;
    LCD_RS_CLR;

    LCD_WR_SET;
    LCD_RD_SET;

    //GPIO_Write(LCD_PORT,val);
    //LCD_Set_Port(VH,VL);
    //LCD_Set_Port8(VH);
    LCD_Set_Port8(VL);
    LCD_WR_CLR;
    LCD_WR_SET;

    LCD_CS_SET;
}


void LCD_Write_DATA(unsigned char VH,unsigned char VL)
{
    lcd_write_data_word(VH<<8|VL);
}


void LCD_Write_DATA16(unsigned short val)
{
    LCD_CS_CLR;
    LCD_RS_SET;

    LCD_RD_SET;
    LCD_WR_CLR;
    LCD_Set_Port8((val>>8)&0xFF);
    LCD_Set_Port8(val&0XFF);
    LCD_WR_CLR;
    LCD_WR_SET;

    LCD_CS_SET;

}



void closeBackLed(void)
{
	LCD_LED_CLR;
}

/*
 * @prief InitLCD
 */
void InitLCD()
{
    //printf("reset\r\n");
		driver_lcd_init();
    LCD_Reset();
    Delay_Ms(150);

    //printf("ili9225 Initial\r\n");
    Delay_Ms(50);

    LCD_CS_CLR;

    lcd_write_register_word(0x10, 0x0000);
    lcd_write_register_word(0x11, 0x0000);
    lcd_write_register_word(0x12, 0x0000);
    lcd_write_register_word(0x13, 0x0000);
    lcd_write_register_word(0x14, 0x0000);
    Delay_Ms(40);

    lcd_write_register_word(0x11, 0x0018);
    lcd_write_register_word(0x12, 0x6121);
    lcd_write_register_word(0x13, 0x006F);
    lcd_write_register_word(0x14, 0x495F);
    lcd_write_register_word(0x10, 0x0800);
    Delay_Ms(10);
    lcd_write_register_word(0x11, 0x103B);
    Delay_Ms(50);
    //lcd_write_register_word(0x01, 0x011C);  //0x021C 控制反转
		lcd_write_register_word(0x01, 0x021C);
    lcd_write_register_word(0x02, 0x0100);
    //lcd_write_register_word(0x03, 0x1030);	//竖屏
		lcd_write_register_word(0x03, 0x1028);		//横屏
    lcd_write_register_word(0x07, 0x0000);
    lcd_write_register_word(0x08, 0x0808);
    lcd_write_register_word(0x0b, 0x1100);
    lcd_write_register_word(0x0c, 0x0000);
    lcd_write_register_word(0x0f, 0x0D01);
    lcd_write_register_word(0x15, 0x0020);
    lcd_write_register_word(0x20, 0x0000);
    lcd_write_register_word(0x21, 0x0000);

    lcd_write_register_word(0x30, 0x0000);
    lcd_write_register_word(0x31, 0x00DB);
    lcd_write_register_word(0x32, 0x0000);
    lcd_write_register_word(0x33, 0x0000);

    lcd_write_register_word(0x34, 0x00DB);
    lcd_write_register_word(0x35, 0x0000);
    lcd_write_register_word(0x36, 0x00AF);
    lcd_write_register_word(0x37, 0x0000);
    lcd_write_register_word(0x38, 0x00DB);
    lcd_write_register_word(0x39, 0x0000);

    lcd_write_register_word(0x50, 0x0000);
    lcd_write_register_word(0x51, 0x0808);
    lcd_write_register_word(0x52, 0x080A);
    lcd_write_register_word(0x53, 0x000A);
    lcd_write_register_word(0x54, 0x0A08);
    lcd_write_register_word(0x55, 0x0808);
    lcd_write_register_word(0x56, 0x0000);
    lcd_write_register_word(0x57, 0x0A00);
    lcd_write_register_word(0x58, 0x0710);
    lcd_write_register_word(0x59, 0x0710);

    lcd_write_register_word(0x07, 0x0012);
    Delay_Ms(50);
    lcd_write_register_word(0x07, 0x1017);
    LCD_Write_COM(0x22);
    LCD_CS_SET;
    if(USE_HIGHEIGHT!=1){
        LCD_LED_SET;
    }else{
        LCD_LED_CLR;
    }
		
		clrScr(VGA_BLACK);
		/*
		GUI_Write16CnChar(0,0,"两个黄鹂鸣翠柳",VGA_RED,VGA_BLACK);
		GUI_Write16CnChar(0,16,"一行白鹭上青天",VGA_YELLOW,VGA_BLACK);
		GUI_Write16CnChar(0,32,"窗含西岭千秋雪",VGA_BLUE,VGA_BLACK);
		GUI_Write16CnChar(0,48,"两个黄鹂鸣翠柳",VGA_GREEN,VGA_BLACK);
		GUI_Write16CnChar(0,64,"一行白鹭上青天",VGA_SILVER,VGA_BLACK);
		GUI_Write16CnChar(0,80,"窗含西岭千秋雪",VGA_GRAY,VGA_BLACK);
		GUI_Write16CnChar(0,96,"两个黄鹂鸣翠柳",VGA_MAROON,VGA_BLACK);
		GUI_Write16CnChar(0,112,"一行白鹭上青天",VGA_OLIVE,VGA_BLACK);
		GUI_Write16CnChar(0,128,"窗含西岭千秋雪",VGA_LIME,VGA_BLACK);
		*/
}

void LCD_Reset(void)
{
    LCD_RST_CLR;
    Delay_Ms(50);
    LCD_RST_SET;
    Delay_Ms(150);
}

/*
 * @prief clrScr 清屏
 */
void clrScr(unsigned short color)
{
    int i;
    uint8_t c[2];
    c[0]=color>>8;
    c[1]=color&0xff;

    clrXY();

    LCD_CS_CLR;
    LCD_RS_SET;

    for (i=0; i<((disp_x_size+1)*(disp_y_size+1)); i++)
    {
        gpio_lcd_write_data(c, 2);
    }
    LCD_CS_SET;

}

void setXY(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2)
{
 /*   lcd_write_register_word(0x36,x2);
    lcd_write_register_word(0x37,x1);
    lcd_write_register_word(0x38,y2);
    lcd_write_register_word(0x39,y1);
    lcd_write_register_word(0x20,x1);
    lcd_write_register_word(0x21,y1);
	*/
		lcd_write_register_word(0x36,175-y1);
		lcd_write_register_word(0x37,175-y2);
		lcd_write_register_word(0x38,x2);
		lcd_write_register_word(0x39,x1);
		lcd_write_register_word(0x20,175-y1);
		lcd_write_register_word(0x21,x1);
	
    lcd_write_comm_word(0x22);
}

void clrXY()
{
    setXY(0,0,disp_x_size,disp_y_size);
}
void setPixel(unsigned char color)
{

    //LCD_Write_DATA((color>>8),(color&0xFF));    // rrrrrggggggbbbbb
   // LCD_Write_DATA8(color>>8);
    //LCD_Write_DATA(0x00,color&0xFF);
    lcd_write_data_word(color);

}


void drawPixel(unsigned char  x, unsigned char  y)
{
    setXY(x, y, x, y);
    setPixel((fch<<8)|fcl);
    clrXY();
}


void setColor(unsigned short color)
{
    fch=color>>8;
    fcl=color & 0xFF;
}


void drawHLine(unsigned char x, unsigned char y, unsigned char l)
{
    setXY(x, y, x+l, y);

    for(int i=0; i<l+1; i++)
    {
        LCD_Write_DATA(fch, fcl);

    }

    clrXY();
}


void drawVLine(unsigned char x, unsigned char y, unsigned char l)
{
    setXY(x, y, x, y+l);

    for(int i=0; i<l+1; i++)
    {
        LCD_Write_DATA(fch, fcl);
    }

    clrXY();
}

void drawLine(unsigned char  x1, unsigned char  y1, unsigned char  x2, unsigned char  y2)
{
    if (y1==y2)
        drawHLine(x1, y1, x2-x1);
    else if (x1==x2)
        drawVLine(x1, y1, y2-y1);
    else
    {
        unsigned int    dx = (x2 > x1 ? x2 - x1 : x1 - x2);
        short           xstep =  x2 > x1 ? 1 : -1;
        unsigned int    dy = (y2 > y1 ? y2 - y1 : y1 - y2);
        short           ystep =  y2 > y1 ? 1 : -1;
        int             col = x1, row = y1;
        if (dx < dy)
        {
            int t = - (dy >> 1);
            while (1)
            {
                setXY (col, row, col, row);
                LCD_Write_DATA(fch, fcl);
                if (row == y2)
                    return;
                row += ystep;
                t += dx;
                if (t >= 0)
                {
                    col += xstep;
                    t   -= dy;
                }
            }
        }
        else
                {
                    int t = - (dx >> 1);
                    while (1)
                    {
                        setXY (col, row, col, row);
                        LCD_Write_DATA(fch, fcl);
                        if (col == x2)
                            return;
                        col += xstep;
                        t += dy;
                        if (t >= 0)
                        {
                            row += ystep;
                            t   -= dx;
                        }
                    }
                }
        }
        clrXY();
}

void drawRect(int x1, int y1, int x2, int y2)
{
    drawHLine(x1, y1, x2-x1);
    drawHLine(x1, y2, x2-x1);
    drawVLine(x1, y1, y2-y1);
    drawVLine(x2, y1, y2-y1);
}

void drawRect1(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned short c)
{
  setColor(c);
  drawRect(x, y,x+w-1 , y+h-1);
}

void fillRect(int x1, int y1, int x2, int y2)
{
/*
    for (int i=0; i<((x2-x1)/2)+1; i++)
    {
        drawVLine(x1+i, y1, y2-y1);
        drawVLine(x2-i, y1, y2-y1);
    }
    */
    setXY(x1, y1, x2, y2);

    for(int i=0; i<(x2-x1)*(y2-y1)-1; i++)
    {
        LCD_Write_DATA(fch, fcl);
    }
    clrXY();
}
void drawRoundRect(int x1, int y1, int x2, int y2)
{
    if ((x2-x1)>4 && (y2-y1)>4)
    {
        drawPixel(x1+1,y1+1);
        drawPixel(x2-1,y1+1);
        drawPixel(x1+1,y2-1);
        drawPixel(x2-1,y2-1);
        drawHLine(x1+2, y1, x2-x1-4);
        drawHLine(x1+2, y2, x2-x1-4);
        drawVLine(x1, y1+2, y2-y1-4);
        drawVLine(x2, y1+2, y2-y1-4);
    }
}

void fillRoundRect(int x1, int y1, int x2, int y2)
{
    if ((x2-x1)>4 && (y2-y1)>4)
    {
        for (int i=0; i<((y2-y1)/2)+1; i++)
        {
            switch(i)
            {
            case 0:
                drawHLine(x1+2, y1+i, x2-x1-4);
                drawHLine(x1+2, y2-i, x2-x1-4);
                break;
            case 1:
                drawHLine(x1+1, y1+i, x2-x1-2);
                drawHLine(x1+1, y2-i, x2-x1-2);
                break;
            default:
                drawHLine(x1, y1+i, x2-x1);
                drawHLine(x1, y2-i, x2-x1);
            }
        }
    }
}


void drawCircle(int x, int y, int radius)
{
    int f = 1 - radius;
    int ddF_x = 1;
    int ddF_y = -2 * radius;
    int x1 = 0;
    int y1 = radius;


    setXY(x, y + radius, x, y + radius);
    LCD_Write_DATA(fch,fcl);
    setXY(x, y - radius, x, y - radius);
    LCD_Write_DATA(fch,fcl);
    setXY(x + radius, y, x + radius, y);
    LCD_Write_DATA(fch,fcl);
    setXY(x - radius, y, x - radius, y);
    LCD_Write_DATA(fch,fcl);

    while(x1 < y1)
    {
        if(f >= 0)
        {
            y1--;
            ddF_y += 2;
            f += ddF_y;
        }
        x1++;
        ddF_x += 2;
        f += ddF_x;
        setXY(x + x1, y + y1, x + x1, y + y1);
        LCD_Write_DATA(fch,fcl);
        setXY(x - x1, y + y1, x - x1, y + y1);
        LCD_Write_DATA(fch,fcl);
        setXY(x + x1, y - y1, x + x1, y - y1);
        LCD_Write_DATA(fch,fcl);
        setXY(x - x1, y - y1, x - x1, y - y1);
        LCD_Write_DATA(fch,fcl);
        setXY(x + y1, y + x1, x + y1, y + x1);
        LCD_Write_DATA(fch,fcl);
        setXY(x - y1, y + x1, x - y1, y + x1);
        LCD_Write_DATA(fch,fcl);
        setXY(x + y1, y - x1, x + y1, y - x1);
        LCD_Write_DATA(fch,fcl);
        setXY(x - y1, y - x1, x - y1, y - x1);
        LCD_Write_DATA(fch,fcl);
    }
    clrXY();
}

void fillCircle(int x, int y, int radius)
{
    for(int y1=-radius; y1<=0; y1++)
        for(int x1=-radius; x1<=0; x1++)
            if(x1*x1+y1*y1 <= radius*radius)
            {
                drawHLine(x+x1, y+y1, 2*(-x1));
                drawHLine(x+x1, y-y1, 2*(-x1));
                break;
            }
}

void show_color_bar()
{
    unsigned long i,j;
    clrXY();

        for (i=0; i<disp_y_size; i++)
        {
            for (j=0; j<disp_x_size; j++)
            {
                  if(i>210){lcd_write_data_word(0xFA00);}
                  else if(i>180){lcd_write_data_word(0x0400);}
                  else if(i>150){lcd_write_data_word(0xC618);}
                  else if(i>120){lcd_write_data_word(0x001F);}
                  else if(i>90){lcd_write_data_word(0x8410);}
                  else if(i>60){lcd_write_data_word(0x8000);}
                  else if(i>30){lcd_write_data_word(0xFFE0);}
                  else {lcd_write_data_word(0x8010);}
                }
            }
}


/****************************************************************************
*函数名:GUI_Dot
*输  入:x:点的X坐标
*      * y:点的Y坐标
*      * color:点的颜色
*输  出:
*功  能:给一块3*3像素涂上颜色。
****************************************************************************/

void GUI_Dot(uint8_t x, uint8_t y, uint16_t color)
{
    uint8_t i;

    setXY(x , y , x, y);  //单个像素  XS YS XE YE
    for(i=0; i<9; i++)
    {
        //LCD_Write_DATA(color>>8,color&0xFF);
        lcd_write_data_word(color);
    }
}


void GUI_Write32CnChar(unsigned char x, unsigned char y, unsigned char *cn, unsigned short wordColor, unsigned short backColor)
{
    uint8_t i, j, wordNum;
    uint16_t color;
    while (*cn != '\0')
    {
        setXY(x, y, x+31, y+28);
        for (wordNum=0; wordNum<(sizeof(CnChar32x29) / sizeof(CnChar32x29[0])); wordNum++)
        {   //wordNum扫描字库的字数
            if ((CnChar32x29[wordNum].Index[0]==*cn)
                 &&(CnChar32x29[wordNum].Index[1]==*(cn+1)))
            {
                for(i=0; i<116; i++)
                {   //MSK的位数
                    color=CnChar32x29[wordNum].Msk[i];
                    for(j=0;j<8;j++)
                    {
                        if((color&0x80)==0x80)
                        {

                            //LCD_Write_DATA(wordColor>>8,wordColor&0xFF);
                            lcd_write_data_word(wordColor);
                        }
                        else
                        {
                            //LCD_Write_DATA(backColor>>8,backColor&0xFF);
                            lcd_write_data_word(backColor);
                        }
                        color<<=1;
                    }//for(j=0;j<8;j++)结束
                }
            }
        } //for (wordNum=0; wordNum<20; wordNum++)结束
        cn += 2;
        x += 32;
    }
}

void GUI_Write24CnCharMatrix(unsigned char x, unsigned char y, unsigned char *cn, unsigned short wordColor, unsigned short backColor)
{
    uint8_t i, j, wordNum;
		uint16_t zm;
    uint16_t color;
    while (*cn != '\0')
    {
        setXY(x, y, x+23, y+23);
						zm=*cn;
						zm<<=8;
						zm|=*(cn+1);
					
						getMatrix24x24(zm);
						

                for(i=0; i<72; i++)
                {   //MSK的位数
                    color=MatrixBuff24X24[i];
                    for(j=0;j<8;j++)
                    {
                        if((color&0x80)==0x80)
                        {
                            lcd_write_data_word(wordColor);
                        }
                        else
                        {
                            lcd_write_data_word(backColor);
                        }
                        color<<=1;
                    }//for(j=0;j<8;j++)结束
                }
            

        cn += 2;
        x += 24;
    }
}

void GUI_Write16CnCharMatrix(unsigned char x, unsigned char y, unsigned char *cn, unsigned short wordColor, unsigned short backColor)
{
    uint8_t i, j, wordNum;
		uint16_t zm;
    uint16_t color;
    while (*cn != '\0')
    {
        setXY(x, y, x+15, y+15);
						zm=*cn;
						zm<<=8;
						zm|=*(cn+1);
					
						getMatrix(zm);
						

                for(i=0; i<32; i++)
                {   //MSK的位数
                    color=MatrixBuff[i];
                    for(j=0;j<8;j++)
                    {
                        if((color&0x80)==0x80)
                        {
                            lcd_write_data_word(wordColor);
                        }
                        else
                        {
                            lcd_write_data_word(backColor);
                        }
                        color<<=1;
                    }//for(j=0;j<8;j++)结束
                }
            

        cn += 2;
        x += 16;
    }
}

void GUI_Write16CnChar(unsigned char x, unsigned char y, unsigned char *cn, unsigned short wordColor, unsigned short backColor)
{
    uint8_t i, j, wordNum;
    uint16_t color;
    while (*cn != '\0')
    {
        setXY(x, y, x+15, y+15);
        for (wordNum=0; wordNum<(sizeof(CnChar16x16) / sizeof(CnChar16x16[0])); wordNum++)
        {   //wordNum扫描字库的字数
            if ((CnChar16x16[wordNum].Index[0]==*cn)
                 &&(CnChar16x16[wordNum].Index[1]==*(cn+1)))
            {
                for(i=0; i<32; i++)
                {   //MSK的位数
                    color=CnChar16x16[wordNum].Msk[i];
                    for(j=0;j<8;j++)
                    {
                        if((color&0x80)==0x80)
                        {

                            //LCD_Write_DATA(wordColor>>8,wordColor&0xFF);
                            lcd_write_data_word(wordColor);
                        }
                        else
                        {
                            //LCD_Write_DATA(backColor>>8,backColor&0xFF);
                            lcd_write_data_word(backColor);
                        }
                        color<<=1;
                    }//for(j=0;j<8;j++)结束
                }
            }
        } //for (wordNum=0; wordNum<20; wordNum++)结束
        cn += 2;
        x += 16;
    }
}

void GUI_Write14CnChar(unsigned char x,unsigned char y,unsigned char *cn,unsigned short wordColor,unsigned short backColor)
{
    uint8_t i, j, wordNum;

    unsigned short color;
    while (*cn != '\0')
    {
        setXY(x, y, x+23, y+18);
        for (wordNum=0; wordNum< (sizeof(CnChar19x24) / sizeof(CnChar19x24[0])) ; wordNum++)
        {   //wordNum扫描字库的字数
            if ((CnChar19x24[wordNum].Index[0]==*cn)
                 &&(CnChar19x24[wordNum].Index[1]==*(cn+1)))
            {
                for(i=0; i<57; i++)
                {   //MSK的位数
                    color=CnChar19x24[wordNum].Msk[i];
                    for(j=0;j<8;j++)
                    {
                        if((color&0x80)==0x80)
                        {

                            //LCD_Write_DATA(wordColor>>8,wordColor&0xFF);
                            lcd_write_data_word(wordColor);
                        }
                        else
                        {

                            //LCD_Write_DATA(backColor>>8,backColor&0xFF);
                            lcd_write_data_word(backColor);
                        }
                        color<<=1;
                    }//for(j=0;j<8;j++)结束
                }
            }
        } //for (wordNum=0; wordNum<20; wordNum++)结束
        cn += 2;
        x += 19;
    }
}

void GUI_WriteASCII(unsigned char  x, unsigned char  y, unsigned char  *p, unsigned short  wordColor, unsigned short  backColor)
{
    uint8_t j, wordByte,wordNum;
    uint16_t color;
    while(*p != '\0')
    {
        wordNum = *p - 32;
        setXY(x,y,x+15, y+23);
        for (wordByte=0; wordByte<48; wordByte++)
        {
            color = ASCII16x24[wordNum][wordByte];
            for (j=0; j<8; j++)
            {
                if ((color&0x80) == 0x80)
                {
                    //LCD_Write_DATA(wordColor>>8,wordColor&0xFF);
                    lcd_write_data_word(wordColor);
                }
                else
                {
                    //LCD_Write_DATA(backColor>>8,backColor&0xFF);
                    lcd_write_data_word(backColor);
                }
                color <<= 1;
            }
        }
        p++;
        x +=16;
    }
}


void GUI_ShowPicture(unsigned char x, unsigned char  y, unsigned char  wide, unsigned char  high)
{
    uint16_t temp = 0, tmp = 0, num = 0;
    setXY(x, y, x+wide-1, y+high-1);
    num = wide * high * 2;
    do
    {
        temp = pic[tmp + 1];
        temp = temp << 8;
        temp = temp | pic[tmp];
        //LCD_Write_DATA(temp>>8,temp&0xFF);
        lcd_write_data_word(temp);
        tmp += 2;
    }
    while(tmp < num);
}

ILI9225.h 

#ifndef USER_ILI9225_H_
#define USER_ILI9225_H_

#define disp_x_size 220
#define disp_y_size 176



//*********************************
// COLORS
//*********************************
// VGA color palette
#define VGA_BLACK       0x0000
#define VGA_WHITE       0xFFFF
#define VGA_RED         0xF800
#define VGA_GREEN       0x0400
#define VGA_BLUE        0x001F
#define VGA_SILVER      0xC618
#define VGA_GRAY        0x8410
#define VGA_MAROON      0x8000
#define VGA_YELLOW      0xFFE0
#define VGA_OLIVE       0x8400
#define VGA_LIME        0x07E0
#define VGA_AQUA        0x07FF
#define VGA_TEAL        0x0410
#define VGA_NAVY        0x0010
#define VGA_FUCHSIA     0xF81F
#define VGA_PURPLE      0x8010
#define VGA_TRANSPARENT 0xFFFFFFFF


/*
 *  GND-1;VDD(3V3)-2;  IM0-25 接GND 16bit; LED-:31~33;LED+:34
 */
#define LCD_CS  (P3_3)       //PA0
#define LCD_RS  (P3_2)      //PA1
#define LCD_WR  (P2_2)      //PA2
#define LCD_RD  (P2_3)      //PA3
#define LCD_RST (P2_4)      //PA4
#define LCD_LED (P2_5)      //PA5

#define GPIO_LCD_CS  GPIO_GetPin(P3_3)       //PA0
#define GPIO_LCD_RS  GPIO_GetPin(P3_2)      //PA1
#define GPIO_LCD_WR  GPIO_GetPin(P2_2)      //PA2
#define GPIO_LCD_RD  GPIO_GetPin(P2_3)      //PA3
#define GPIO_LCD_RST GPIO_GetPin(P2_4)      //PA4
#define GPIO_LCD_LED GPIO_GetPin(P2_5)      //PA5

#define USE_HIGHEIGHT   0       //1:使用高八位;0:使用低八位
//#define LCD_PORT GPIOD          //8-23
#define LCD_DB0 (P3_1)     //PA10
#define LCD_DB1 (P3_0)     //PA9
#define LCD_DB2 (P0_5)    //PA8
#define LCD_DB3 (P0_6)    //PA7
#define LCD_DB4 (P4_0)    //PA6
#define LCD_DB5 (P4_1)    //PB5
#define LCD_DB6 (P2_7)    //PB8
#define LCD_DB7 (P2_6)    //PB9

#define GPIO_LCD_DB0 GPIO_GetPin(LCD_DB0)     //PA10
#define GPIO_LCD_DB1 GPIO_GetPin(LCD_DB1)     //PA9
#define GPIO_LCD_DB2 GPIO_GetPin(P0_5)    //PA8
#define GPIO_LCD_DB3 GPIO_GetPin(P0_6)    //PA7
#define GPIO_LCD_DB4 GPIO_GetPin(P4_0)    //PA6
#define GPIO_LCD_DB5 GPIO_GetPin(P4_1)    //PB5
#define GPIO_LCD_DB6 GPIO_GetPin(P2_7)    //PB8
#define GPIO_LCD_DB7 GPIO_GetPin(P2_6)    //PB9



#define LCD_DB0_SET GPIO_WriteBit(GPIO_LCD_DB0, (BitAction)(1))
#define LCD_DB0_CLR GPIO_WriteBit(GPIO_LCD_DB0, (BitAction)(0))

#define LCD_DB1_SET GPIO_WriteBit(GPIO_LCD_DB1, (BitAction)(1))
#define LCD_DB1_CLR GPIO_WriteBit(GPIO_LCD_DB1, (BitAction)(0))

#define LCD_DB2_SET GPIO_WriteBit(GPIO_LCD_DB2, (BitAction)(1))
#define LCD_DB2_CLR GPIO_WriteBit(GPIO_LCD_DB2, (BitAction)(0))

#define LCD_DB3_SET GPIO_WriteBit(GPIO_LCD_DB3, (BitAction)(1))
#define LCD_DB3_CLR GPIO_WriteBit(GPIO_LCD_DB3, (BitAction)(0))

#define LCD_DB4_SET GPIO_WriteBit(GPIO_LCD_DB4, (BitAction)(1))
#define LCD_DB4_CLR GPIO_WriteBit(GPIO_LCD_DB4, (BitAction)(0))

#define LCD_DB5_SET GPIO_WriteBit(GPIO_LCD_DB5, (BitAction)(1))
#define LCD_DB5_CLR GPIO_WriteBit(GPIO_LCD_DB5, (BitAction)(0))

#define LCD_DB6_SET GPIO_WriteBit(GPIO_LCD_DB6, (BitAction)(1))
#define LCD_DB6_CLR GPIO_WriteBit(GPIO_LCD_DB6, (BitAction)(0))

#define LCD_DB7_SET GPIO_WriteBit(GPIO_LCD_DB7, (BitAction)(1))
#define LCD_DB7_CLR GPIO_WriteBit(GPIO_LCD_DB7, (BitAction)(0))



#define LCD_CS_SET GPIO_WriteBit(GPIO_LCD_CS, (BitAction)(1))
#define LCD_CS_CLR GPIO_WriteBit(GPIO_LCD_CS, (BitAction)(0))

#define LCD_RS_SET GPIO_WriteBit(GPIO_LCD_RS, (BitAction)(1))
#define LCD_RS_CLR GPIO_WriteBit(GPIO_LCD_RS, (BitAction)(0))

#define LCD_WR_SET GPIO_WriteBit(GPIO_LCD_WR, (BitAction)(1))
#define LCD_WR_CLR GPIO_WriteBit(GPIO_LCD_WR, (BitAction)(0))

#define LCD_RD_SET GPIO_WriteBit(GPIO_LCD_RD, (BitAction)(1))
#define LCD_RD_CLR GPIO_WriteBit(GPIO_LCD_RD, (BitAction)(0))

#define LCD_RST_SET GPIO_WriteBit(GPIO_LCD_RST, (BitAction)(1))
#define LCD_RST_CLR GPIO_WriteBit(GPIO_LCD_RST, (BitAction)(0))

#define LCD_LED_SET GPIO_WriteBit(GPIO_LCD_LED, (BitAction)(1))
#define LCD_LED_CLR GPIO_WriteBit(GPIO_LCD_LED, (BitAction)(0))

void LCD_Writ_Bus16(unsigned char VH,unsigned char VL);
void LCD_Write_COM(unsigned char VL);
void LCD_Write_DATA(unsigned char VH,unsigned char VL);
void LCD_Write_DATA16(unsigned short val);
void LCD_Write_COM_DATA(unsigned char com1,unsigned short dat1);

void Delay_Us(uint32_t iTime);
void Delay_Ms(uint32_t iTime);
void ili9225_gpio_init(void);
void driver_lcd_init(void);
void closeBackLed(void);
void InitLCD(void);
void LCD_Reset(void);
void clrScr(unsigned short color);
void clrXY(void);
void setPixel(unsigned char color);
void drawPixel(unsigned char  x, unsigned char  y);
void setColor(unsigned short color);
void drawHLine(unsigned char x, unsigned char y, unsigned char l);
void drawVLine(unsigned char x, unsigned char y, unsigned char l);
void drawLine(unsigned char  x1, unsigned char  y1, unsigned char  x2, unsigned char  y2);

void fillRoundRect(int x1, int y1, int x2, int y2);
void drawCircle(int x, int y, int radius);
void fillCircle(int x, int y, int radius);
void drawRect(int x1, int y1, int x2, int y2);
void drawRect1(unsigned char x, unsigned char y, unsigned char w, unsigned char h, unsigned short c);
void fillRect(int x1, int y1, int x2, int y2);
void drawRoundRect(int x1, int y1, int x2, int y2);
void show_color_bar(void);

void GUI_Write24CnCharMatrix(unsigned char x, unsigned char y, unsigned char *cn, unsigned short wordColor, unsigned short backColor);
void GUI_Write16CnCharMatrix(unsigned char x, unsigned char y, unsigned char *cn, unsigned short wordColor, unsigned short backColor);
void GUI_Write32CnChar(unsigned char x, unsigned char y, unsigned char *cn, unsigned short wordColor, unsigned short backColor);
void GUI_Write16CnChar(unsigned char x, unsigned char y, unsigned char *cn, unsigned short wordColor, unsigned short backColor);
void GUI_Write14CnChar(unsigned char x,unsigned char y,unsigned char *cn,unsigned short wordColor,unsigned short backColor);
void GUI_WriteASCII(unsigned char  x, unsigned char  y, unsigned char  *p, unsigned short  wordColor, unsigned short  backColor);

void GUI_ShowPicture(unsigned char x, unsigned char  y, unsigned char  wide, unsigned char  high);
unsigned short ReadID(void);
unsigned short ReadRegister(unsigned char reg);

#endif /* USER_ILI9225_H_ */

 peripheral_app.c

/**
*****************************************************************************************
*     Copyright(c) 2017, Realtek Semiconductor Corporation. All rights reserved.
*****************************************************************************************
   * @file      peripheral_app.c
   * @brief     This file handles BLE peripheral application routines.
   * @author    jane
   * @date      2017-06-06
   * @version   v1.0
   **************************************************************************************
   * @attention
   * <h2><center>&copy; COPYRIGHT 2017 Realtek Semiconductor Corporation</center></h2>
   **************************************************************************************
  */

/*============================================================================*
 *                              Header Files
 *============================================================================*/
#include <trace.h>
#include <string.h>
#include <gap.h>
#include <gap_adv.h>
#include <gap_bond_le.h>
#include <profile_server.h>
#include <gap_msg.h>
#include <simple_ble_service.h>
#include <bas.h>
#include <app_msg.h>
#include <peripheral_app.h>
#include <gap_conn_le.h>
#if F_BT_ANCS_CLIENT_SUPPORT
#include <ancs_client.h>
#include <ancs.h>
#endif


#include "ILI9225.h"


/** @defgroup  PERIPH_APP Peripheral Application
    * @brief This file handles BLE peripheral application routines.
    * @{
    */
/*============================================================================*
 *                              Variables
 *============================================================================*/
/** @addtogroup  PERIPH_SEVER_CALLBACK Profile Server Callback Event Handler
    * @brief Handle profile server callback event
    * @{
    */
T_SERVER_ID simp_srv_id; /**< Simple ble service id*/
T_SERVER_ID bas_srv_id;  /**< Battery service id */
/** @} */ /* End of group PERIPH_SEVER_CALLBACK */
/** @defgroup  PERIPH_GAP_MSG GAP Message Handler
    * @brief Handle GAP Message
    * @{
    */
T_GAP_DEV_STATE gap_dev_state = {0, 0, 0, 0};                 /**< GAP device state */
T_GAP_CONN_STATE gap_conn_state = GAP_CONN_STATE_DISCONNECTED; /**< GAP connection state */

/*============================================================================*
 *                              Functions
 *============================================================================*/
void app_handle_gap_msg(T_IO_MSG  *p_gap_msg);
/**
 * @brief    All the application messages are pre-handled in this function
 * @note     All the IO MSGs are sent to this function, then the event handling
 *           function shall be called according to the MSG type.
 * @param[in] io_msg  IO message data
 * @return   void
 */
void app_handle_io_msg(T_IO_MSG io_msg)
{
    uint16_t msg_type = io_msg.type;

    switch (msg_type)
    {
    case IO_MSG_TYPE_BT_STATUS:
        {
            app_handle_gap_msg(&io_msg);
        }
        break;
#if F_BT_ANCS_CLIENT_SUPPORT
    case IO_MSG_TYPE_ANCS:
        {
            ancs_handle_msg(&io_msg);
        }
        break;
#endif
    default:
        break;
    }
}

/**
 * @brief    Handle msg GAP_MSG_LE_DEV_STATE_CHANGE
 * @note     All the gap device state events are pre-handled in this function.
 *           Then the event handling function shall be called according to the new_state
 * @param[in] new_state  New gap device state
 * @param[in] cause GAP device state change cause
 * @return   void
 */
void app_handle_dev_state_evt(T_GAP_DEV_STATE new_state, uint16_t cause)
{
    APP_PRINT_INFO3("app_handle_dev_state_evt: init state %d, adv state %d, cause 0x%x",
                    new_state.gap_init_state, new_state.gap_adv_state, cause);
    if (gap_dev_state.gap_init_state != new_state.gap_init_state)
    {
        if (new_state.gap_init_state == GAP_INIT_STATE_STACK_READY)
        {
            APP_PRINT_INFO0("GAP stack ready");
            /*stack ready*/
            le_adv_start();
        }
    }

    if (gap_dev_state.gap_adv_state != new_state.gap_adv_state)
    {
        if (new_state.gap_adv_state == GAP_ADV_STATE_IDLE)
        {
            if (new_state.gap_adv_sub_state == GAP_ADV_TO_IDLE_CAUSE_CONN)
            {
                APP_PRINT_INFO0("GAP adv stoped: because connection created");
            }
            else
            {
                APP_PRINT_INFO0("GAP adv stoped");
            }
        }
        else if (new_state.gap_adv_state == GAP_ADV_STATE_ADVERTISING)
        {
            APP_PRINT_INFO0("GAP adv start");
						
						//clrScr(VGA_BLACK);
						//GUI_WriteASCII(0,32,"GAP adv start",VGA_RED,VGA_BLACK);
        }
    }

    gap_dev_state = new_state;
}

/**
 * @brief    Handle msg GAP_MSG_LE_CONN_STATE_CHANGE
 * @note     All the gap conn state events are pre-handled in this function.
 *           Then the event handling function shall be called according to the new_state
 * @param[in] conn_id Connection ID
 * @param[in] new_state  New gap connection state
 * @param[in] disc_cause Use this cause when new_state is GAP_CONN_STATE_DISCONNECTED
 * @return   void
 */
void app_handle_conn_state_evt(uint8_t conn_id, T_GAP_CONN_STATE new_state, uint16_t disc_cause)
{
    APP_PRINT_INFO4("app_handle_conn_state_evt: conn_id %d old_state %d new_state %d, disc_cause 0x%x",
                    conn_id, gap_conn_state, new_state, disc_cause);
    switch (new_state)
    {
    case GAP_CONN_STATE_DISCONNECTED:
        {
            if ((disc_cause != (HCI_ERR | HCI_ERR_REMOTE_USER_TERMINATE))
                && (disc_cause != (HCI_ERR | HCI_ERR_LOCAL_HOST_TERMINATE)))
            {
                APP_PRINT_ERROR1("app_handle_conn_state_evt: connection lost cause 0x%x", disc_cause);
            }
						closeBackLed();
            le_adv_start();
        }
        break;

    case GAP_CONN_STATE_CONNECTED:
        {
            uint16_t conn_interval;
            uint16_t conn_latency;
            uint16_t conn_supervision_timeout;
            uint8_t  remote_bd[6];
            T_GAP_REMOTE_ADDR_TYPE remote_bd_type;

            le_get_conn_param(GAP_PARAM_CONN_INTERVAL, &conn_interval, conn_id);
            le_get_conn_param(GAP_PARAM_CONN_LATENCY, &conn_latency, conn_id);
            le_get_conn_param(GAP_PARAM_CONN_TIMEOUT, &conn_supervision_timeout, conn_id);
            le_get_conn_addr(conn_id, remote_bd, &remote_bd_type);
            APP_PRINT_INFO5("GAP_CONN_STATE_CONNECTED:remote_bd %s, remote_addr_type %d, conn_interval 0x%x, conn_latency 0x%x, conn_supervision_timeout 0x%x",
                            TRACE_BDADDR(remote_bd), remote_bd_type,
                            conn_interval, conn_latency, conn_supervision_timeout);
						InitLCD();
						GUI_Write16CnCharMatrix(10,0,"【蓝牙已连接!】",VGA_BLUE,VGA_BLACK);
						GUI_Write16CnCharMatrix(10,150,"成王败寇自有天定",VGA_WHITE,VGA_BLACK);		
						GUI_Write16CnCharMatrix(10,110,"人生苦短终归尘土",VGA_WHITE,VGA_BLACK);
						GUI_Write16CnCharMatrix(10,70,"凭什么仙家就可以遨游天地",VGA_WHITE,VGA_BLACK);
						GUI_Write16CnCharMatrix(10,30,"而我等凡人只能做这井底之蛙",VGA_WHITE,VGA_BLACK);
        }
        break;

    default:
        break;
    }
    gap_conn_state = new_state;
}

/**
 * @brief    Handle msg GAP_MSG_LE_AUTHEN_STATE_CHANGE
 * @note     All the gap authentication state events are pre-handled in this function.
 *           Then the event handling function shall be called according to the new_state
 * @param[in] conn_id Connection ID
 * @param[in] new_state  New authentication state
 * @param[in] cause Use this cause when new_state is GAP_AUTHEN_STATE_COMPLETE
 * @return   void
 */
void app_handle_authen_state_evt(uint8_t conn_id, uint8_t new_state, uint16_t cause)
{
    APP_PRINT_INFO2("app_handle_authen_state_evt:conn_id %d, cause 0x%x", conn_id, cause);

    switch (new_state)
    {
    case GAP_AUTHEN_STATE_STARTED:
        {
            APP_PRINT_INFO0("app_handle_authen_state_evt: GAP_AUTHEN_STATE_STARTED");
        }
        break;

    case GAP_AUTHEN_STATE_COMPLETE:
        {
            if (cause == GAP_SUCCESS)
            {
#if F_BT_ANCS_CLIENT_SUPPORT
                ancs_start_discovery(conn_id);
#endif
                APP_PRINT_INFO0("app_handle_authen_state_evt: GAP_AUTHEN_STATE_COMPLETE pair success");

            }
            else
            {
                APP_PRINT_INFO0("app_handle_authen_state_evt: GAP_AUTHEN_STATE_COMPLETE pair failed");
            }
        }
        break;

    default:
        {
            APP_PRINT_ERROR1("app_handle_authen_state_evt: unknown newstate %d", new_state);
        }
        break;
    }
}

/**
 * @brief    Handle msg GAP_MSG_LE_CONN_MTU_INFO
 * @note     This msg is used to inform APP that exchange mtu procedure is completed.
 * @param[in] conn_id Connection ID
 * @param[in] mtu_size  New mtu size
 * @return   void
 */
void app_handle_conn_mtu_info_evt(uint8_t conn_id, uint16_t mtu_size)
{
    APP_PRINT_INFO2("app_handle_conn_mtu_info_evt: conn_id %d, mtu_size %d", conn_id, mtu_size);
}

/**
 * @brief    Handle msg GAP_MSG_LE_CONN_PARAM_UPDATE
 * @note     All the connection parameter update change  events are pre-handled in this function.
 * @param[in] conn_id Connection ID
 * @param[in] status  New update state
 * @param[in] cause Use this cause when status is GAP_CONN_PARAM_UPDATE_STATUS_FAIL
 * @return   void
 */
void app_handle_conn_param_update_evt(uint8_t conn_id, uint8_t status, uint16_t cause)
{
    switch (status)
    {
    case GAP_CONN_PARAM_UPDATE_STATUS_SUCCESS:
        {
            uint16_t conn_interval;
            uint16_t conn_slave_latency;
            uint16_t conn_supervision_timeout;

            le_get_conn_param(GAP_PARAM_CONN_INTERVAL, &conn_interval, conn_id);
            le_get_conn_param(GAP_PARAM_CONN_LATENCY, &conn_slave_latency, conn_id);
            le_get_conn_param(GAP_PARAM_CONN_TIMEOUT, &conn_supervision_timeout, conn_id);
            APP_PRINT_INFO3("app_handle_conn_param_update_evt update success:conn_interval 0x%x, conn_slave_latency 0x%x, conn_supervision_timeout 0x%x",
                            conn_interval, conn_slave_latency, conn_supervision_timeout);
        }
        break;

    case GAP_CONN_PARAM_UPDATE_STATUS_FAIL:
        {
            APP_PRINT_ERROR1("app_handle_conn_param_update_evt update failed: cause 0x%x", cause);
        }
        break;

    case GAP_CONN_PARAM_UPDATE_STATUS_PENDING:
        {
            APP_PRINT_INFO0("app_handle_conn_param_update_evt update pending.");
        }
        break;

    default:
        break;
    }
}

/**
 * @brief    All the BT GAP MSG are pre-handled in this function.
 * @note     Then the event handling function shall be called according to the
 *           subtype of T_IO_MSG
 * @param[in] p_gap_msg Pointer to GAP msg
 * @return   void
 */
void app_handle_gap_msg(T_IO_MSG *p_gap_msg)
{
    T_LE_GAP_MSG gap_msg;
    uint8_t conn_id;
    memcpy(&gap_msg, &p_gap_msg->u.param, sizeof(p_gap_msg->u.param));

    APP_PRINT_TRACE1("app_handle_gap_msg: subtype %d", p_gap_msg->subtype);
    switch (p_gap_msg->subtype)
    {
    case GAP_MSG_LE_DEV_STATE_CHANGE:
        {
            app_handle_dev_state_evt(gap_msg.msg_data.gap_dev_state_change.new_state,
                                     gap_msg.msg_data.gap_dev_state_change.cause);
        }
        break;

    case GAP_MSG_LE_CONN_STATE_CHANGE:
        {
            app_handle_conn_state_evt(gap_msg.msg_data.gap_conn_state_change.conn_id,
                                      (T_GAP_CONN_STATE)gap_msg.msg_data.gap_conn_state_change.new_state,
                                      gap_msg.msg_data.gap_conn_state_change.disc_cause);
        }
        break;

    case GAP_MSG_LE_CONN_MTU_INFO:
        {
            app_handle_conn_mtu_info_evt(gap_msg.msg_data.gap_conn_mtu_info.conn_id,
                                         gap_msg.msg_data.gap_conn_mtu_info.mtu_size);
        }
        break;

    case GAP_MSG_LE_CONN_PARAM_UPDATE:
        {
            app_handle_conn_param_update_evt(gap_msg.msg_data.gap_conn_param_update.conn_id,
                                             gap_msg.msg_data.gap_conn_param_update.status,
                                             gap_msg.msg_data.gap_conn_param_update.cause);
        }
        break;

    case GAP_MSG_LE_AUTHEN_STATE_CHANGE:
        {
            app_handle_authen_state_evt(gap_msg.msg_data.gap_authen_state.conn_id,
                                        gap_msg.msg_data.gap_authen_state.new_state,
                                        gap_msg.msg_data.gap_authen_state.status);
        }
        break;

    case GAP_MSG_LE_BOND_JUST_WORK:
        {
            conn_id = gap_msg.msg_data.gap_bond_just_work_conf.conn_id;
            le_bond_just_work_confirm(conn_id, GAP_CFM_CAUSE_ACCEPT);
            APP_PRINT_INFO0("GAP_MSG_LE_BOND_JUST_WORK");
        }
        break;

    case GAP_MSG_LE_BOND_PASSKEY_DISPLAY:
        {
            uint32_t display_value = 0;
            conn_id = gap_msg.msg_data.gap_bond_passkey_display.conn_id;
            le_bond_get_display_key(conn_id, &display_value);
            APP_PRINT_INFO1("GAP_MSG_LE_BOND_PASSKEY_DISPLAY:passkey %d", display_value);
            le_bond_passkey_display_confirm(conn_id, GAP_CFM_CAUSE_ACCEPT);
        }
        break;

    case GAP_MSG_LE_BOND_USER_CONFIRMATION:
        {
            uint32_t display_value = 0;
            conn_id = gap_msg.msg_data.gap_bond_user_conf.conn_id;
            le_bond_get_display_key(conn_id, &display_value);
            APP_PRINT_INFO1("GAP_MSG_LE_BOND_USER_CONFIRMATION: passkey %d", display_value);
            le_bond_user_confirm(conn_id, GAP_CFM_CAUSE_ACCEPT);
        }
        break;

    case GAP_MSG_LE_BOND_PASSKEY_INPUT:
        {
            uint32_t passkey = 888888;
            conn_id = gap_msg.msg_data.gap_bond_passkey_input.conn_id;
            APP_PRINT_INFO1("GAP_MSG_LE_BOND_PASSKEY_INPUT: conn_id %d", conn_id);
            le_bond_passkey_input_confirm(conn_id, passkey, GAP_CFM_CAUSE_ACCEPT);
        }
        break;

    case GAP_MSG_LE_BOND_OOB_INPUT:
        {
            uint8_t oob_data[GAP_OOB_LEN] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
            conn_id = gap_msg.msg_data.gap_bond_oob_input.conn_id;
            APP_PRINT_INFO0("GAP_MSG_LE_BOND_OOB_INPUT");
            le_bond_set_param(GAP_PARAM_BOND_OOB_DATA, GAP_OOB_LEN, oob_data);
            le_bond_oob_input_confirm(conn_id, GAP_CFM_CAUSE_ACCEPT);
        }
        break;

    default:
        APP_PRINT_ERROR1("app_handle_gap_msg: unknown subtype %d", p_gap_msg->subtype);
        break;
    }
}
/** @} */ /* End of group PERIPH_GAP_MSG */

/** @defgroup  PERIPH_GAP_CALLBACK GAP Callback Event Handler
    * @brief Handle GAP callback event
    * @{
    */
/**
  * @brief Callback for gap le to notify app
  * @param[in] cb_type callback msy type @ref GAP_LE_MSG_Types.
  * @param[in] p_cb_data point to callback data @ref T_LE_CB_DATA.
  * @retval result @ref T_APP_RESULT
  */
T_APP_RESULT app_gap_callback(uint8_t cb_type, void *p_cb_data)
{
    T_APP_RESULT result = APP_RESULT_SUCCESS;
    T_LE_CB_DATA *p_data = (T_LE_CB_DATA *)p_cb_data;

    switch (cb_type)
    {
    case GAP_MSG_LE_DATA_LEN_CHANGE_INFO:
        APP_PRINT_INFO3("GAP_MSG_LE_DATA_LEN_CHANGE_INFO: conn_id %d, tx octets 0x%x, max_tx_time 0x%x",
                        p_data->p_le_data_len_change_info->conn_id,
                        p_data->p_le_data_len_change_info->max_tx_octets,
                        p_data->p_le_data_len_change_info->max_tx_time);
        break;

    case GAP_MSG_LE_MODIFY_WHITE_LIST:
        APP_PRINT_INFO2("GAP_MSG_LE_MODIFY_WHITE_LIST: operation %d, cause 0x%x",
                        p_data->p_le_modify_white_list_rsp->operation,
                        p_data->p_le_modify_white_list_rsp->cause);
        break;

    default:
        APP_PRINT_ERROR1("app_gap_callback: unhandled cb_type 0x%x", cb_type);
        break;
    }
    return result;
}
/** @} */ /* End of group PERIPH_GAP_CALLBACK */

/** @defgroup  PERIPH_SEVER_CALLBACK Profile Server Callback Event Handler
    * @brief Handle profile server callback event
    * @{
    */
/**
    * @brief    All the BT Profile service callback events are handled in this function
    * @note     Then the event handling function shall be called according to the
    *           service_id
    * @param    service_id  Profile service ID
    * @param    p_data      Pointer to callback data
    * @return   T_APP_RESULT, which indicates the function call is successful or not
    * @retval   APP_RESULT_SUCCESS  Function run successfully
    * @retval   others              Function run failed, and return number indicates the reason
    */
T_APP_RESULT app_profile_callback(T_SERVER_ID service_id, void *p_data)
{
    T_APP_RESULT app_result = APP_RESULT_SUCCESS;
    if (service_id == SERVICE_PROFILE_GENERAL_ID)
    {
        T_SERVER_APP_CB_DATA *p_param = (T_SERVER_APP_CB_DATA *)p_data;
        switch (p_param->eventId)
        {
        case PROFILE_EVT_SRV_REG_COMPLETE:// srv register result event.
            APP_PRINT_INFO1("PROFILE_EVT_SRV_REG_COMPLETE: result %d",
                            p_param->event_data.service_reg_result);
            break;

        case PROFILE_EVT_SEND_DATA_COMPLETE:
            APP_PRINT_INFO5("PROFILE_EVT_SEND_DATA_COMPLETE: conn_id %d, cause 0x%x, service_id %d, attrib_idx 0x%x, credits %d",
                            p_param->event_data.send_data_result.conn_id,
                            p_param->event_data.send_data_result.cause,
                            p_param->event_data.send_data_result.service_id,
                            p_param->event_data.send_data_result.attrib_idx,
                            p_param->event_data.send_data_result.credits);
            if (p_param->event_data.send_data_result.cause == GAP_SUCCESS)
            {
                APP_PRINT_INFO0("PROFILE_EVT_SEND_DATA_COMPLETE success");
            }
            else
            {
                APP_PRINT_ERROR0("PROFILE_EVT_SEND_DATA_COMPLETE failed");
            }
            break;

        default:
            break;
        }
    }
    else  if (service_id == simp_srv_id)
    {
        TSIMP_CALLBACK_DATA *p_simp_cb_data = (TSIMP_CALLBACK_DATA *)p_data;
        switch (p_simp_cb_data->msg_type)
        {
        case SERVICE_CALLBACK_TYPE_INDIFICATION_NOTIFICATION:
            {
                switch (p_simp_cb_data->msg_data.notification_indification_index)
                {
                case SIMP_NOTIFY_INDICATE_V3_ENABLE:
                    {
                        APP_PRINT_INFO0("SIMP_NOTIFY_INDICATE_V3_ENABLE");
                    }
                    break;

                case SIMP_NOTIFY_INDICATE_V3_DISABLE:
                    {
                        APP_PRINT_INFO0("SIMP_NOTIFY_INDICATE_V3_DISABLE");
                    }
                    break;
                case SIMP_NOTIFY_INDICATE_V4_ENABLE:
                    {
                        APP_PRINT_INFO0("SIMP_NOTIFY_INDICATE_V4_ENABLE");
                    }
                    break;
                case SIMP_NOTIFY_INDICATE_V4_DISABLE:
                    {
                        APP_PRINT_INFO0("SIMP_NOTIFY_INDICATE_V4_DISABLE");
                    }
                    break;
                default:
                    break;
                }
            }
            break;

        case SERVICE_CALLBACK_TYPE_READ_CHAR_VALUE:
            {
                if (p_simp_cb_data->msg_data.read_value_index == SIMP_READ_V1)
                {
                    uint8_t value[2] = {0x01, 0x02};
                    APP_PRINT_INFO0("SIMP_READ_V1");
                    simp_ble_service_set_parameter(SIMPLE_BLE_SERVICE_PARAM_V1_READ_CHAR_VAL, 2, &value);
                }
            }
            break;
        case SERVICE_CALLBACK_TYPE_WRITE_CHAR_VALUE:
            {
                switch (p_simp_cb_data->msg_data.write.opcode)
                {
                case SIMP_WRITE_V2:
                    {
                        APP_PRINT_INFO2("SIMP_WRITE_V2: write type %d, len %d", p_simp_cb_data->msg_data.write.write_type,
                                        p_simp_cb_data->msg_data.write.len);
												GUI_Write16CnCharMatrix(0,32,p_simp_cb_data->msg_data.write.p_value,VGA_YELLOW,VGA_BLACK);
                    }
                    break;
                default:
                    break;
                }
            }
            break;

        default:
            break;
        }
    }
    else if (service_id == bas_srv_id)
    {
        T_BAS_CALLBACK_DATA *p_bas_cb_data = (T_BAS_CALLBACK_DATA *)p_data;
        switch (p_bas_cb_data->msg_type)
        {
        case SERVICE_CALLBACK_TYPE_INDIFICATION_NOTIFICATION:
            {
                switch (p_bas_cb_data->msg_data.notification_indification_index)
                {
                case BAS_NOTIFY_BATTERY_LEVEL_ENABLE:
                    {
                        APP_PRINT_INFO0("BAS_NOTIFY_BATTERY_LEVEL_ENABLE");
                    }
                    break;

                case BAS_NOTIFY_BATTERY_LEVEL_DISABLE:
                    {
                        APP_PRINT_INFO0("BAS_NOTIFY_BATTERY_LEVEL_DISABLE");
                    }
                    break;
                default:
                    break;
                }
            }
            break;

        case SERVICE_CALLBACK_TYPE_READ_CHAR_VALUE:
            {
                if (p_bas_cb_data->msg_data.read_value_index == BAS_READ_BATTERY_LEVEL)
                {
                    uint8_t battery_level = 90;
                    APP_PRINT_INFO1("BAS_READ_BATTERY_LEVEL: battery_level %d", battery_level);
                    bas_set_parameter(BAS_PARAM_BATTERY_LEVEL, 1, &battery_level);
										GUI_Write16CnCharMatrix(0,150,"读取电池电量",VGA_GREEN,VGA_BLACK);
                }
            }
            break;

        default:
            break;
        }
    }

    return app_result;
}

/** @} */ /* End of group PERIPH_SEVER_CALLBACK */
/** @} */ /* End of group PERIPH_APP */

三、总结

1、上电后直接显示有问题,所以LCD只在蓝牙连接时才初始化显示。

 case GAP_CONN_STATE_CONNECTED:
        {
            uint16_t conn_interval;
            uint16_t conn_latency;
            uint16_t conn_supervision_timeout;
            uint8_t  remote_bd[6];
            T_GAP_REMOTE_ADDR_TYPE remote_bd_type;

            le_get_conn_param(GAP_PARAM_CONN_INTERVAL, &conn_interval, conn_id);
            le_get_conn_param(GAP_PARAM_CONN_LATENCY, &conn_latency, conn_id);
            le_get_conn_param(GAP_PARAM_CONN_TIMEOUT, &conn_supervision_timeout, conn_id);
            le_get_conn_addr(conn_id, remote_bd, &remote_bd_type);
            APP_PRINT_INFO5("GAP_CONN_STATE_CONNECTED:remote_bd %s, remote_addr_type %d, conn_interval 0x%x, conn_latency 0x%x, conn_supervision_timeout 0x%x",
                            TRACE_BDADDR(remote_bd), remote_bd_type,
                            conn_interval, conn_latency, conn_supervision_timeout);
                        InitLCD();
                        GUI_Write16CnCharMatrix(10,0,"【蓝牙已连接!】",VGA_BLUE,VGA_BLACK);
                        GUI_Write16CnCharMatrix(10,150,"成王败寇自有天定",VGA_WHITE,VGA_BLACK);        
                        GUI_Write16CnCharMatrix(10,110,"人生苦短终归尘土",VGA_WHITE,VGA_BLACK);
                        GUI_Write16CnCharMatrix(10,70,"凭什么仙家就可以遨游天地",VGA_WHITE,VGA_BLACK);
                        GUI_Write16CnCharMatrix(10,30,"而我等凡人只能做这井底之蛙",VGA_WHITE,VGA_BLACK);
        }
        break;

2、字库偏移量计算公式:

    if(GBH>=0xb0)
    {
        offset=((GBH-0xa7)*94+GBL-0xa1)*32;
    }else
    {
        offset=((GBH-0xa1)*94+GBL-0xa1)*32;
    } 

3、RTL8672驱动LCD比BK7231(基于RT-THREAD)速度快好多,可能是RT-THREAD对GPIO输出速率有限速。

4、RTL8672有一好处,就是任何一个PIN都可以配置为IIC、SPI或GPIO,这个和ESP32一样。在设计PCB引脚随便布就好了。

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值