⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tft_api.c

📁 Zigbee模块的详细电路原理图和C代码.rar
💻 C
📖 第 1 页 / 共 4 页
字号:
//====================================================================================
//文 件 名:TFT_API.c
//功能描述: TFT驱动程序(API)
//维护记录: 
//			2007.08.23			更新日志		by lijian <lijian@sunnorth.com.cn>
//								1. 增加JPEG支持
//								2. 增加显示图片时的自适应窗口支持
//
//			2007.08.21			更新日志		by lijian <lijian@sunnorth.com.cn>
//								1. 增加TFT_PutImage(), 可以显示RGB565格式的不带有文件头的位图数据
//								2. 增加TFT_PutImageEx(), 可以显示RGB565格式的不带有文件头的位图数据
//								3. 增加行缩放函数TFT_ScaleLine()
//								4. 增加位图缩放函数TFT_ScaleImage()
//								5. 增加位图解压函数TFT_DepressBitMap(), 解压之后形成STR_IMAGE数据
//
//			2007.08.20			更新日志		by lijian <lijian@sunnorth.com.cn>
//								1. 修正TFT_MoveWindow以及TFT_CopyWindow当窗体超出屏幕时屏幕乱掉的bug
//								2. 优化程序, 采用统一的方法实现MoveWindow和CopyWindow
//								3. 增加TFT_CreateWindowEx()函数, 使用width和height指定窗体属性
//								4. 分离窗体和字体控制, 字体独立控制, 不再依赖窗体, 节约存储空间
//
//			2007.08.19			更新日志		by lijian <lijian@sunnorth.com.cn>
//								1. 使用"句柄"模式操作窗体, 不再需要自己定义窗体结构体, 不使用指针
//								2. 窗体增加TFT_CopyWindow()特性, 可以移动并复制窗体到其他位置
//								3. 窗体增加TFT_MoveWindow()特性, 可以移动窗体到其他位置
//								4. 窗体增加TFT_MoveWindowBorder()特性, 可以移动窗体边框(不移动窗体内容)到其他位置
//								5. 窗体增加TFT_ResetWindow()特性, 可以重新设置窗体位置和大小(不改变屏幕内容)
//								6. 窗体增加TFT_CloseWindow()特性, 可以关闭当前窗体以便释放系统资源(不影响屏幕显示)
//								7. 窗体增加TFT_DeleteWindow()特性, 可以关闭当前窗体以便释放系统资源, 并清除窗体内容
//			2007.07.11			初始版本		by wangtao <wangtao@sunnorth.com.cn>
//====================================================================================
#include "TFT_API.h"
#include "MPEG4_Driver.h"
#include "Resource.h"
#include <stdarg.h>
#include <stdio.h>

static STR_WINDOW g_WinList[MAX_WINDOW];

//=============================================================
//语法格式:	void TFT_CallBack_GetCharBuf(STR_WINDOW *Window, unsigned short CharCode, STR_FONT *Font_Char);
//实现功能:	获取指定编码的字符(或汉字)的字模信息
//参数:		Window	-	工作窗口指针
//				CharCode - 字符或汉字的编码
//				Font_Char - 字模信息结构体地址
//返回值:		无
//=============================================================
static void TFT_CallBack_GetCharBuf(STR_WINDOW *Window, unsigned short CharCode, STR_FONT *Font_Char)
{
	if(CharCode<=0x00FF)									// ASCII字符
	{
		Font_Char->CharWidth = TFT_GetAsciiFontWidth(Window->AsciiFont);
		Font_Char->CharHeight = TFT_GetAsciiFontHeight(Window->AsciiFont);
		Font_Char->FontBuf = TFT_GetAsciiFontBuf(Window->AsciiFont);
		Font_Char->FontBuf += CharCode * Font_Char->CharHeight * ((Font_Char->CharWidth + 7) >> 3);
	}
	else													// 汉字
	{
		Font_Char->CharWidth = TFT_GetChineseFontWidth(Window->ChineseFont);
		Font_Char->CharHeight = TFT_GetChineseFontHeight(Window->ChineseFont);
		Font_Char->FontBuf = TFT_GetChineseFontBuf(Window->ChineseFont);
		Font_Char->FontBuf += (unsigned int)(94 * ((CharCode & 0xFF) - 0xA1) + ((CharCode >> 8) - 0xA1))
				* Font_Char->CharHeight * ((Font_Char->CharWidth + 7) >> 3);
	}
}

//=============================================================
//语法格式:	static unsigned short TFT_CalcTransparent(STR_WINDOW *Window, unsigned short OldColor, unsigned short MaskColor);
//实现功能:	计算当前透明度下的叠加颜色
//参数:		Window - 工作窗口指针
//				OldColor	- 	原有颜色
//				MaskColor	-	待叠加的颜色
//返回值:		叠加后的颜色代码,以16位存储,格式为RRRRR-GGGGGG-BBBBB
//=============================================================
static unsigned short TFT_CalcTransparent(STR_WINDOW *Window, unsigned short OldColor, unsigned short MaskColor)
{
	int R, G, B;
	int dR, dG, dB;
	
	if((Window == 0) || (Window->Flag == 0))
		return 0;
	// 计算公式为 New = Old * K + Mask * (1-K)   其中K为透明度(0%~100%)
	dR = (int)(OldColor&0xF800) - (int)(MaskColor&0xF800);	// 计算R分量
	dR = ((dR * Window->Transparency)>>7)&0xF800;
	R = ((MaskColor&0xF800)+dR)&0xF800;

	dG = (int)(OldColor&0x07E0) - (int)(MaskColor&0x07E0);	// 计算G分量
	dG = ((dG * Window->Transparency)>>7)&0x07E0;
	G = ((MaskColor&0x07E0)+dG)&0x07E0;
			
	dB = (int)(OldColor&0x001F) - (int)(MaskColor&0x001F);	// 计算B分量
	dB = ((dB * Window->Transparency)>>7)&0x001F;
	B = ((MaskColor&0x001F)+dB)&0x001F;

	return R + G + B;
}

//=============================================================
//语法格式:	static int TFT_AllocWindow(void)
//实现功能:	申请可用的窗口
//参数:		无
//返回值:		窗口句柄
//=============================================================
static WIN_HANDLE TFT_AllocWindow(void)
{
	int i;
	for(i = 0; i < MAX_WINDOW; i++)
	{
		if(g_WinList[i].Flag == 0)
		{
			g_WinList[i].Flag = 1;
			return i;
		}
	}
	return NO_FREE_WIN;
}

//=============================================================
//语法格式:	static void TFT_FreeWindow(WIN_HANDLE Handle)
//实现功能:	销毁窗口
//参数:		Handle	-	窗口句柄
//返回值:		无
//=============================================================
static void TFT_FreeWindow(WIN_HANDLE Handle)
{
	if((Handle >= 0) && (Handle < MAX_WINDOW))
		g_WinList[Handle].Flag = 0;
}

//=============================================================
//语法格式:	static int TFT_CopyRectToBuffer(void *Buf, short TLx, short TLy, short BRx, short BRy)
//实现功能:	复制窗体内容到缓冲区
//参数:		Buf		-	缓冲区首地址
//				TLx,TLy	-	左上角坐标
//				BRx,BRy	-	右下角坐标
//返回值:		1: 成功;  0: 失败
//=============================================================
void *memcpy(void *dest, void *src, unsigned int count);
static int TFT_CopyRectToBuffer(void *Buf, short TLx, short TLy, short BRx, short BRy)
{
	COLOR *Dest = (COLOR *)Buf;
	short i;
	short W, H;

	TFT_GetWorkBufSize(&W, &H);

	for(i = TLy; i < BRy; i++)
	{
		memcpy(Dest, TFT_SelWorkBuf(-1) + i * W + TLx, (BRx - TLx) * sizeof(COLOR));
		Dest += (BRx - TLx);
	}
	return 1;
}

//=============================================================
//语法格式:	static int TFT_CopyBufferToRect(void *Buf, short TLx, short TLy, short BRx, short BRy)
//实现功能:	显示缓冲区内容到窗体
//参数:		Buf		-	缓冲区首地址
//				TLx,TLy	-	左上角坐标
//				BRx,BRy	-	右下角坐标
//返回值:		1: 成功;  0: 失败
//=============================================================
static int TFT_CopyBufferToRect(void *Buf, short TLx, short TLy, short BRx, short BRy)
{
	COLOR *Dest = (COLOR *)Buf;
	short i;
	short W, H;

	TFT_GetWorkBufSize(&W, &H);

	for(i = TLy; i < BRy; i++)
	{
		memcpy(TFT_SelWorkBuf(-1) + i * W + TLx, Dest, (BRx - TLx) * sizeof(COLOR));
		Dest += (BRx - TLx);
	}
	return 1;
}

//=============================================================
//语法格式:	void TFT_Init(void);
//实现功能:	TFT驱动程序初始化
//参数:		无
//返回值:		无
//=============================================================
void TFT_Init(void)
{
	//BLNDMA_Init();
	int i;
	STR_FONT FontInfo;

	for(i = 0; i < MAX_WINDOW; i++)
	{
		g_WinList[i].Flag = 0;
	}

	TFT_FontInit();
#ifdef RES_ASC16
	FontInfo.CharWidth = 8;			// 窗口默认ASCII字体列表
	FontInfo.CharHeight = 16;
	FontInfo.FontBuf = RES_ASC16;
	TFT_LoadAsciiFont(&FontInfo);
#endif
#ifdef RES_HZK16
	FontInfo.CharWidth = 16;		// 窗口默认中文字体列表
	FontInfo.CharHeight = 16;
	FontInfo.FontBuf = RES_HZK16;
	TFT_LoadChineseFont(&FontInfo);
#endif
#ifdef RES_ASC12
	FontInfo.CharWidth = 6;
	FontInfo.CharHeight = 12;
	FontInfo.FontBuf = RES_ASC12;
	TFT_LoadAsciiFont(&FontInfo);
#endif
#ifdef RES_HZK12
	FontInfo.CharWidth = 12;
	FontInfo.CharHeight = 12;
	FontInfo.FontBuf = RES_HZK12;
	TFT_LoadChineseFont(&FontInfo);
#endif
	TFT_InitHardware();
	MPEG4_Init();
}

//=============================================================
//语法格式:	WIN_HANDLE TFT_CreateWindow(short TLx, short TLy, short BRx, short BRy, COLOR BGColor)
//实现功能:	创建工作窗口
//参数:		TLx		-	工作窗口相对于LCD工作缓冲区的起始x坐标
//				TLy		-	工作窗口相对于LCD工作缓冲区的起始y坐标
//				width	-	工作窗口宽度
//				height	-	工作窗口高度
//				BGColor	-	工作窗口的背景色
//返回值:		窗口句柄
//=============================================================
WIN_HANDLE TFT_CreateWindowEx(short TLx, short TLy, short width, short height, COLOR BGColor)
{
	return(TFT_CreateWindow(TLx, TLy, TLx + width - 1, TLy + height - 1, BGColor));
}

//=============================================================
//语法格式:	WIN_HANDLE TFT_CreateWindow(short TLx, short TLy, short BRx, short BRy, COLOR BGColor)
//实现功能:	创建工作窗口
//参数:		TLx		-	工作窗口相对于LCD工作缓冲区的起始x坐标
//				TLy		-	工作窗口相对于LCD工作缓冲区的起始y坐标
//				BRx		-	工作窗口相对于LCD工作缓冲区的结束x坐标
//				BRy		-	工作窗口相对于LCD工作缓冲区的结束y坐标
//				BGColor	-	工作窗口的背景色
//返回值:		窗口句柄
//=============================================================
WIN_HANDLE TFT_CreateWindow(short TLx, short TLy, short BRx, short BRy, COLOR BGColor)
{
	WIN_HANDLE Handle;
	STR_WINDOW *Window;
	short W, H;
	short i, j;
	unsigned short *p_Buf;

	if((Handle = TFT_AllocWindow()) == NO_FREE_WIN)
		return NO_FREE_WIN;

	Window = g_WinList + Handle;

	TFT_GetWorkBufSize(&W, &H);

	Window->TLx = TLx < BRx ? TLx : BRx;
	if(Window->TLx > W)
	{
		TFT_FreeWindow(Handle);
		return NO_FREE_WIN;
	}
	Window->TLy = TLy < BRy ? TLy : BRy;
	if(Window->TLy > H)
	{
		TFT_FreeWindow(Handle);
		return NO_FREE_WIN;
	}
	Window->BRx = TLx > BRx ? TLx : BRx;
	if(Window->BRx >= W)
		Window->BRx = W - 1;
	Window->BRy = TLy >= BRy ? TLy : BRy;
	if(Window->BRy > H)
		Window->BRy = H - 1;

	if(((Window->TLx < 0) && (Window->BRx < 0))
		|| ((Window->TLy < 0) && (Window->BRy < 0)))
	{
		TFT_FreeWindow(Handle);
		return NO_FREE_WIN;
	}
	Window->Flag = 1;
	Window->CurTextX = Window->CurTextY = 0;		// 窗口初始文本绘制坐标
	Window->Transparency = 0;						// 窗口初始透明度
	Window->FGColor = COLOR_WHITE;					// 窗口初始前景色
	Window->BGColor = BGColor;						// 窗口初始背景色
	Window->AsciiFont = 0;							// 窗口初始使用的ASCII字体
	Window->ChineseFont = 0;						// 窗口初始使用的中文字体
	Window->Width = Window->BRx - Window->TLx + 1;
	Window->Height = Window->BRy - Window->TLy + 1;
	if(Window->BGColor != COLOR_BLACK)				// 如果背景色不是0x0000则为工作区着背景色
	{
		for(i = (Window->TLy >= 0 ? Window->TLy : 0); i <= Window->BRy; i++)
		{
			p_Buf = TFT_SelWorkBuf(-1) + i * W;
			for(j=(Window->TLx >= 0 ? Window->TLx : 0); j <= Window->BRx; j++)
			{
				*(p_Buf+j) = Window->BGColor;
			}
		}
	}
	return Handle;
}

//=============================================================
//语法格式:	void TFT_CloseWindow(WIN_HANDLE Handle)
//实现功能:	释放窗口
//参数:		Handle		-	窗口句柄
//返回值:		无
//=============================================================
void TFT_CloseWindow(WIN_HANDLE Handle)
{
	if((Handle < 0) && (Handle >= MAX_WINDOW))
		return;
	TFT_FreeWindow(Handle);
}

//=============================================================
//语法格式:	void TFT_DeleteWindow(WIN_HANDLE Handle)
//实现功能:	删除窗口
//参数:		Handle		-	窗口句柄
//返回值:		无
//=============================================================
void TFT_DeleteWindow(WIN_HANDLE Handle)
{
	if((Handle < 0) && (Handle >= MAX_WINDOW))
		return;
	TFT_SetBGColor(Handle, COLOR_BLACK);
	TFT_ClearWindow(Handle);
	TFT_FreeWindow(Handle);
}

//=============================================================
//语法格式:	int TFT_MoveWindowEx(WIN_HANDLE Handle, short TLx, short TLy, int Cut)
//实现功能:	移动窗口
//参数:		Handle		-	窗口句柄
//				TLx,TLy		-	新位置左上角坐标
//				Cut			-	原窗口内容是否清除
//返回值:		1: 成功;  0:失败
//=============================================================
int TFT_MoveWindowEx(WIN_HANDLE Handle, short TLx, short TLy, int Cut)
{
	STR_WINDOW *Window = g_WinList + Handle;
//	COLOR *TempBuf = (COLOR*)0xa0500000;
	COLOR TempBuf[640][480];
	short x1, y1, x2, y2;
	short Dx1, Dy1, Dx2, Dy2;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -