记录下stm32f4移植ucgui的过程!
移植步骤:
第一步:首先,得把你的TFT底层驱动写好。(为了方便,我直接用写好液晶屏的工程作为模板,在此基础上移植ucgui)
第二步:加入UCGUI程序包
第三步:配置UCGUI的文件
工程结构如下图:
配置LCDConf.h文件如下:
#ifndef LCDCONF_H
#define LCDCONF_H
#define LCD_XSIZE (320) //配置TFT的水平分辨率
#define LCD_YSIZE (240) //配置TFT的垂直分辨率
#define LCD_CONTROLLER (9320) //TFT控制器的名称
#define LCD_BITSPERPIXEL (16) //每个像素的位数
#define LCD_FIXEDPALETTE (565) //调色板格式
#define LCD_SWAP_RB (1) //红蓝反色交换
#define LCD_INIT_CONTROLLER() TFT_Init() ; //此处需要定义的是你的TFT初始化函数
#endif /* LCDCONF_H */
配置GUIConf.h文件如下:
#ifndef GUICONF_H
#define GUICONF_H
#define GUI_OS (1) //多任务
#define GUI_SUPPORT_TOUCH (1) //触摸
#define GUI_SUPPORT_UNICODE (1) //Unicode支持
#define GUI_DEFAULT_FONT &GUI_Font6x8 //GUI默认字体
#define GUI_ALLOC_SIZE 5000 //动态内存的大小
#define GUI_WINSUPPORT 1 //窗口控件支持
#define GUI_SUPPORT_MEMDEV 1 //支持内存设备
#define GUI_SUPPORT_AA 1 /* Anti aliasing available */
第四步:让GUI能够找到你的LCD驱动,修改LCDDriver。
在编写你的TFT底层驱动程序的时候,这两个函数:设置一个像素和获取一个像素的颜色void LCD_SetPixel(unsigned short x,unsigned short y, unsigned short color){
….
}
unsigned short LCD_GetPixel(unsigned shortx, unsigned short y){
…
}这两个函数写好,并测试可以正常显示后,接下来需要修改TFT与UCGUI关联的函数(在一个C文件下(我的是ili9320_ucgui.c)
int LCD_L0_Init(void)
{
TFT_Init();
return 0;
}
//这个函数,是GCGUI初始化TFT需要调用的,里面的函数就是你TFT底层驱动的初始化函数。
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)
{
LCD_SetPixel(x,y,PixelIndex);
}
unsigned int LCD_L0_GetPixelIndex(int x, int y)
{
return LCD_GetPixel(x,y);
}
上面两个函数是其他函数的最基本元素,其他函数比如画线、点、圆都需要调用改函数。里面的LCD_SetPixel(x,y,PixelIndex)、LCD_GetPixel(x,y);就是你TFT底层驱动设置像素和获取像素的两个函数。
最后说下touch.c的修改:
void Touch_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//pen_int:PD6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
SPI1_Init();
CSPin_init();
GUI_TOUCH_Calibrate(0,0,319,1855,90);//X轴校准
GUI_TOUCH_Calibrate(1,0,239,80,1895);//Y轴校准
}
void GUI_TOUCH_X_ActivateX(void){}
void GUI_TOUCH_X_ActivateY(void){}
int GUI_TOUCH_X_MeasureX(void)
{
unsigned char t=0,t1,count=0;
unsigned short int databuffer[10]={5,7,9,3,2,6,4,0,3,1};//数据组
unsigned short temp=0,X=0;
while(count<10)//循环读数10次
{
databuffer[count]=ADS_Read(CMD_RDX);
count++;
}
if(count==10)//一定要读到10次数据,否则丢弃
{
do//将数据X升序排列
{
t1=0;
for(t=0;t<count-1;t++)
{
if(databuffer[t]>databuffer[t+1])//升序排列
{
temp=databuffer[t+1];
databuffer[t+1]=databuffer[t];
databuffer[t]=temp;
t1=1;
}
}
}while(t1);
X=(databuffer[3]+databuffer[4]+databuffer[5])/3;
}
return(X);
}
int GUI_TOUCH_X_MeasureY(void)
{
unsigned char t=0,t1,count=0;
unsigned short int databuffer[10]={5,7,9,3,2,6,4,0,3,1};//数据组
unsigned short temp=0,Y=0;
while(count<10) //循环读数10次
{
databuffer[count]=ADS_Read(CMD_RDY);
count++;
}
if(count==10)//一定要读到10次数据,否则丢弃
{
do//将数据X升序排列
{
t1=0;
for(t=0;t<count-1;t++)
{
if(databuffer[t]>databuffer[t+1])//升序排列
{
temp=databuffer[t+1];
databuffer[t+1]=databuffer[t];
databuffer[t]=temp;
t1=1;
}
}
}while(t1);
Y=(databuffer[3]+databuffer[4]+databuffer[5])/3;
}
return(Y);
}