1、RTL8762CMF有500多K flash,可以保存1个16*16汉字字库
2、驱动1个8位并口屏,将字库中的汉字中显示出来
一、将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>© 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引脚随便布就好了。