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

📄 gdi.c

📁 基于8051的驱动源码.包括STN LCD driver, I2C driver, 键盘(模拟键盘)驱动,串口驱动,中断应用,部分GDI函数
💻 C
字号:
//
//
//
#include "type.h"
#include "common.h"
#include "lcd.h"
#include "gdi.h"

//function prototype
//

//graphic
//
void ClearScrn(void)
{
	S_BYTE x, y;

	for (x = 0; x < 16; x++)
		for (y = 0; y < 32; y++)
			LcdWriteDRAM(x, y, 0x0000);
}

void FillArea(S_BYTE left, S_BYTE up, S_BYTE right, S_BYTE bottom, S_BYTE c)
{
	S_WORD color;

	if (left >= LCDWIDTH || right >= LCDWIDTH || up >= LCDHEIGHT || bottom >= LCDHEIGHT)
		return;

	if (up > bottom)
	{
		color = (S_WORD)up; up = bottom; bottom = (S_BYTE)color;
	}
	if (left > right)
	{
		color = (S_WORD)left; left = right; right = (S_BYTE)color;
	}

	color = c? 0xFFFF:0x0000;

	if (up == 0 && left == 0 && right == LCDWIDTH-1 && bottom == LCDHEIGHT-1)
	{
		for (up = 0; up < 16; up++)
			for (left = 0; left < 32; left++)
 		   	LcdWriteDRAM(up, left, color);
	}
	else
	{
		while (up <= bottom)
			DrawHLine(left, right, up++, c);
	}
}

void ClearArea(S_BYTE left, S_BYTE up, S_BYTE right, S_BYTE bottom)
{
	FillArea(left, up, right, bottom, 0);
}

void DrawPixel(S_BYTE x, S_BYTE y, S_BYTE c)
{
	S_BYTE tx;
	S_WORD Data, color = 0x0001;

	if (x >= LCDWIDTH || y >= LCDHEIGHT)
		return;

	tx = x >> 4;//x/16;
	if (y >= (LCDHEIGHT>>1))
	{
		tx += 8;
		y -= (LCDHEIGHT>>1);
	}

	Data = LcdReadDRAM(tx, y);
	color <<= 15-(x&0x0F);
	if (c)
		Data |= color;
	else
		Data &= ~color;
	LcdWriteDRAM(tx, y, Data);
}

void DrawHLine(S_BYTE sx, S_BYTE ex, S_BYTE y, S_BYTE c)
{
	S_BYTE x1, x2;
	S_WORD RamData, mask = 0xFFFF;
	
	if (y >= LCDHEIGHT || sx >= LCDWIDTH || ex >= LCDWIDTH)
		return;
	
	if (sx > ex)
		x1 = sx, sx = ex, ex = x1;	
	
	if (sx == 0 && ex == LCDWIDTH-1)
	{
		mask = c? 0xFFFF:0x0000;
		if (y >= LCDHEIGHT>>1)
		{
			y -= LCDHEIGHT>>1;
			sx = 8, ex = 15;
		}
		else
			sx = 0, ex = 7;
		while (sx <= ex)
			LcdWriteDRAM(sx++, y, mask);
	}
	else
	{
		x1 = sx&0xF, x2 = ex&0xF;
		x2 = 15 - x2;
		sx = sx>>4, ex = ex>>4;
		if (y >= LCDHEIGHT>>1)
		{
			y -= LCDHEIGHT>>1;
			sx += 8, ex += 8;
		}
		if (sx == ex)
		{
			mask <<= x1, mask >>= x1;
			mask >>= x2, mask <<= x2;
			RamData = LcdReadDRAM(sx, y);
			if (c) RamData |= mask;
			else RamData &= ~mask;
			LcdWriteDRAM(sx, y, RamData);
		}
		else
		{
			mask <<= x1, mask >>= x1;
			RamData = LcdReadDRAM(sx, y);
			if (c) RamData |= mask;
			else RamData &= ~mask;
			LcdWriteDRAM(sx, y, RamData);
			while (++sx < ex)
			{
				if (c) LcdWriteDRAM(sx, y, 0xFFFF);
				else LcdWriteDRAM(sx, y, 0x0000);
			}
			mask = 0xFFFF;
			mask >>= x2, mask <<= x2;
			RamData = LcdReadDRAM(sx, y);
			if (c) RamData |= mask;
			else RamData &= ~mask;
			LcdWriteDRAM(sx, y, RamData);
		}
	}
}

void DrawVLine(S_BYTE x, S_BYTE sy, S_BYTE ey, S_BYTE c)
{
	S_BYTE m;

	if (x >= LCDWIDTH || sy >= LCDHEIGHT || ey >= LCDHEIGHT)
		return;

	if (sy > ey)
	{
		m = sy; sy = ey; ey = m;
	}

	while (sy <= ey)
		DrawPixel(x, sy++, c);
}

void DrawRect(S_BYTE up, S_BYTE left, S_BYTE right, S_BYTE bottom, S_BYTE c) 
{
	DrawHLine(left, right, up, c);
	DrawHLine(left, right, bottom, c);
	DrawVLine(left, up, bottom, c);
	DrawVLine(right, up, bottom, c);
}

static void ReverseHLine(S_BYTE sx, S_BYTE ex, S_BYTE y)
{
	S_BYTE x1, x2;
	S_WORD RamData, color, mask = 0xFFFF;
	
	if (sx == 0 && ex == LCDWIDTH-1)
	{
		if (y >= LCDHEIGHT>>1)
		{
			y -= LCDHEIGHT>>1;
			sx = 8, ex = 15;
		}
		else
			sx = 0, ex = 7;
		while (sx <= ex)
		{
			RamData = LcdReadDRAM(sx, y);
			RamData = ~RamData;
			LcdWriteDRAM(sx++, y, RamData);
		}
	}
	else
	{
		x1 = sx&0xF, x2 = ex&0xF;
		x2 = 15 - x2;
		sx = sx>>4, ex = ex>>4;
		if (y >= LCDHEIGHT>>1)
		{
			y -= LCDHEIGHT>>1;
			sx += 8, ex += 8;
		}
		if (sx == ex)
		{
			mask <<= x1, mask >>= x1;
			mask >>= x2, mask <<= x2;
			RamData = LcdReadDRAM(sx, y);
			color = RamData;
			RamData &= ~mask;
			color &= mask;
			color = ~color;
			color &= mask;
			RamData |= color;
			LcdWriteDRAM(sx, y, RamData);
		}
		else
		{
			mask <<= x1, mask >>= x1;
			RamData = LcdReadDRAM(sx, y);
			color = RamData;
			RamData &= ~mask;
			color &= mask;
			color = ~color;
			color &= mask;
			RamData |= color;
			LcdWriteDRAM(sx, y, RamData);
			while (++sx < ex)
			{
				RamData = LcdReadDRAM(sx, y);
				RamData = ~RamData;
				LcdWriteDRAM(sx, y, RamData);
			}
			mask = 0xFFFF;
			mask >>= x2, mask <<= x2;
			RamData = LcdReadDRAM(sx, y);
			color = RamData;
			RamData &= ~mask;
			color &= mask;
			color = ~color;
			color &= mask;
			RamData |= color;
			LcdWriteDRAM(sx, y, RamData);
		}
	}
}

void ReverseArea(S_BYTE left, S_BYTE up, S_BYTE right, S_BYTE bottom)
{
	S_BYTE m;

	if (left >= LCDWIDTH || right >= LCDWIDTH || up >= LCDHEIGHT || bottom >= LCDHEIGHT)
		return;

	if (up > bottom)
	{
		m = up; up = bottom; bottom = m;
	}
	if (left > right)
	{
		m = left; left = right; right = m;
	}
	
	while (up <= bottom)
		ReverseHLine(left, right, up++);
}



//text
//
S_BYTE code asc6x12[][9] =
{
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x20,0x82,0x08,0x00,0x80,0x00,
	0x00,0xa5,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x8a,0xfc,0xa5,0x3f,0x51,0x40,0x00,
	0x00,0x87,0xaa,0xa1,0x83,0x0a,0xab,0xc2,0x00,0x00,0x04,0xaa,0xb1,0x42,0x8d,0x55,0x20,0x00,
	0x00,0x02,0x14,0x51,0xea,0xaa,0x91,0xb0,0x00,0x01,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x10,0x84,0x10,0x41,0x04,0x10,0x20,0x40,0x01,0x02,0x04,0x10,0x41,0x04,0x10,0x84,0x00,
	0x00,0x00,0x08,0xa9,0xc7,0x2a,0x20,0x00,0x00,0x00,0x02,0x08,0x23,0xe2,0x08,0x20,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x20,0x00,0x00,0x00,0x03,0xe0,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x21,0x04,0x10,0x82,0x10,0x41,0x08,0x00,
	0x00,0x07,0x22,0x8a,0x28,0xa2,0x89,0xc0,0x00,0x00,0x02,0x18,0x20,0x82,0x08,0x21,0xc0,0x00,
	0x00,0x07,0x22,0x88,0x42,0x10,0x83,0xe0,0x00,0x00,0x07,0x22,0x08,0xc0,0x82,0x89,0xc0,0x00,
	0x00,0x01,0x0c,0x51,0x49,0x1e,0x10,0x60,0x00,0x00,0x0f,0xa0,0x83,0xc0,0x82,0x89,0xc0,0x00,
	0x00,0x07,0x24,0x83,0xc8,0xa2,0x89,0xc0,0x00,0x00,0x0f,0xa4,0x10,0x82,0x08,0x20,0x80,0x00,
	0x00,0x07,0x22,0x89,0xc8,0xa2,0x89,0xc0,0x00,0x00,0x07,0x22,0x8a,0x27,0x82,0x49,0xc0,0x00,
	0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x82,0x00,
	0x00,0x10,0x84,0x21,0x02,0x04,0x08,0x10,0x00,0x00,0x00,0x00,0xf8,0x00,0x3e,0x00,0x00,0x00,
	0x01,0x02,0x04,0x08,0x10,0x84,0x21,0x00,0x00,0x00,0x07,0x22,0x88,0x42,0x08,0x00,0x80,0x00,
	0x00,0x07,0x22,0x9a,0xaa,0xae,0x81,0xe0,0x00,0x00,0x02,0x08,0x31,0x45,0x1e,0x4b,0x30,0x00,
	0x00,0x0f,0x12,0x49,0xc4,0x92,0x4b,0xc0,0x00,0x00,0x07,0xa2,0x82,0x08,0x20,0x89,0xc0,0x00,
	0x00,0x0f,0x12,0x49,0x24,0x92,0x4b,0xc0,0x00,0x00,0x0f,0x92,0x51,0xc5,0x10,0x4b,0xe0,0x00,
	0x00,0x0f,0x92,0x51,0xc5,0x10,0x43,0x80,0x00,0x00,0x03,0x92,0x82,0x09,0xe2,0x48,0xc0,0x00,
	0x00,0x0c,0xd2,0x49,0xe4,0x92,0x4b,0x30,0x00,0x00,0x0f,0x88,0x20,0x82,0x08,0x23,0xe0,0x00,
	0x00,0x07,0xc4,0x10,0x41,0x04,0x12,0x4e,0x00,0x00,0x0e,0xd2,0x51,0x85,0x14,0x4b,0xb0,0x00,
	0x00,0x0e,0x10,0x41,0x04,0x10,0x47,0xf0,0x00,0x00,0x0d,0xb6,0xdb,0x6a,0xaa,0xaa,0xa0,0x00,
	0x00,0x0d,0xd2,0x69,0xa5,0x96,0x4b,0xa0,0x00,0x00,0x07,0x22,0x8a,0x28,0xa2,0x89,0xc0,0x00,
	0x00,0x0f,0x12,0x49,0xc4,0x10,0x43,0x80,0x00,0x00,0x07,0x22,0x8a,0x28,0xba,0x99,0xc1,0x80,
	0x00,0x0f,0x12,0x49,0xc5,0x12,0x4b,0xb0,0x00,0x00,0x07,0xa2,0x81,0x81,0x02,0x8b,0xc0,0x00,
	0x00,0x0f,0xaa,0x20,0x82,0x08,0x21,0xc0,0x00,0x00,0x0c,0xd2,0x49,0x24,0x92,0x48,0xc0,0x00,
	0x00,0x0c,0xd2,0x49,0x45,0x0c,0x20,0x80,0x00,0x00,0x0a,0xaa,0xa9,0xc5,0x14,0x51,0x40,0x00,
	0x00,0x0d,0x94,0x50,0x82,0x14,0x53,0x60,0x00,0x00,0x0d,0x94,0x50,0x82,0x08,0x21,0xc0,0x00,
	0x00,0x0f,0xa4,0x10,0x82,0x10,0x4b,0xe0,0x00,0x00,0xe2,0x08,0x20,0x82,0x08,0x20,0x83,0x80,
	0x01,0x04,0x10,0x20,0x81,0x04,0x10,0x20,0x00,0x01,0xc1,0x04,0x10,0x41,0x04,0x10,0x47,0x00,
	0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,
	0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x8e,0x48,0xf0,0x00,
	0x00,0x0c,0x10,0x41,0xc4,0x92,0x49,0xc0,0x00,0x00,0x00,0x00,0x00,0xe4,0x90,0x40,0xe0,0x00,
	0x00,0x01,0x82,0x08,0xe4,0x92,0x48,0xf0,0x00,0x00,0x00,0x00,0x00,0xc4,0x9e,0x40,0xe0,0x00,
	0x00,0x01,0xc8,0x21,0xe2,0x08,0x21,0xe0,0x00,0x00,0x00,0x00,0x00,0xf4,0x8c,0x41,0xe4,0x4e,
	0x00,0x0c,0x10,0x41,0xc4,0x92,0x4b,0xb0,0x00,0x00,0x02,0x00,0x01,0x82,0x08,0x21,0xc0,0x00,
	0x00,0x01,0x00,0x00,0xc1,0x04,0x10,0x41,0x38,0x00,0x0c,0x10,0x41,0x75,0x1c,0x4b,0xb0,0x00,
	0x00,0x0e,0x08,0x20,0x82,0x08,0x23,0xe0,0x00,0x00,0x00,0x00,0x03,0xca,0xaa,0xaa,0xa0,0x00,
	0x00,0x00,0x00,0x03,0xc4,0x92,0x4b,0xb0,0x00,0x00,0x00,0x00,0x00,0xc4,0x92,0x48,0xc0,0x00,
	0x00,0x00,0x00,0x03,0xc4,0x92,0x49,0xc4,0x38,0x00,0x00,0x00,0x00,0xe4,0x92,0x48,0xe0,0x87,
	0x00,0x00,0x00,0x03,0x66,0x10,0x43,0x80,0x00,0x00,0x00,0x00,0x01,0xe4,0x0c,0x09,0xe0,0x00,
	0x00,0x00,0x08,0x21,0xc2,0x08,0x20,0x60,0x00,0x00,0x00,0x00,0x03,0x64,0x92,0x48,0xf0,0x00,
	0x00,0x00,0x00,0x03,0xb4,0x94,0x30,0x80,0x00,0x00,0x00,0x00,0x02,0xaa,0x9c,0x51,0x40,0x00,
	0x00,0x00,0x00,0x03,0x65,0x08,0x53,0x60,0x00,0x00,0x00,0x00,0x03,0xb4,0x94,0x30,0x82,0x30,
	0x00,0x00,0x00,0x01,0xe1,0x08,0x21,0xe0,0x00,0x00,0x61,0x04,0x10,0x81,0x04,0x10,0x41,0x80,
	0x10,0x41,0x04,0x10,0x41,0x04,0x10,0x41,0x04,0x01,0x82,0x08,0x20,0x42,0x08,0x20,0x86,0x00,
	0x42,0x91,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

//DC
bit TextColor = COLOR_BLACK;
bit BKcolor = COLOR_WHITE;
bit TextMode = TM_TRANSPARENT;

bit GetTextMode(void)
{
	return TextMode;
}

bit SetTextMode(bit textmode)
{
	bit bk = TextMode;

	TextMode = textmode;

	return bk;
}

bit GetTextColor(void)
{
	return TextColor;
}

bit SetTextColor(bit textcolor)
{
	bit bk = TextColor;

	TextColor = textcolor;

	return bk;
}

bit GetBackgroundColor(void)
{
	return BKcolor;
}

bit SetBackgroundColor(bit bkcolor)
{
	bit bk = BKcolor;

	BKcolor = bkcolor;

	return bk;
}

S_BYTE code MatMask[] = 
{
	0x80, 0x40, 0x20, 0x10, 0x08, 0x04
};

void DrawChar(S_BYTE x, S_BYTE y, S_BYTE ch)
{
	S_BYTE i, j;
	S_BYTE code * pMat;
	S_BYTE Mat;

	if (ch < 32 || ch > 127)
		ch = '?';

	pMat = asc6x12[ch-32];

	for (j = 0; j < FONT_HEIGHT; j++)
	{
		switch (j)
		{
			case 0:
			case 4:
			case 8:
				Mat = *pMat++;
				break;
			case 1:
			case 5:
			case 9:
				Mat <<= 6;
				Mat |= (*pMat>>2);
				break;
			case 2:
			case 6:
			case 10:
				Mat = *pMat++<<4;
				Mat |= *pMat>>4;
				break;
			case 3:
			case 7:
			case 11:
				Mat = *pMat++<<2;
				break;
			default:
				break;
		}
		for (i = 0; i < (FONT_WIDTH>>1); i++)
		{
			if (Mat&MatMask[i])
				DrawPixel(x+i, y+j, TextColor);
			else if (TextMode == TM_OPAQUE)
				DrawPixel(x+i, y+j, BKcolor);
		}
	}
}

void DrawFont(S_BYTE x, S_BYTE y, S_WORD font)
{//unsupport font now
	font = font;
	DrawChar(x, y, '?');
	DrawChar(x+(FONT_WIDTH>>1), y, '?');
}

void DrawText(S_BYTE x, S_BYTE y, S_BYTE *text)
{
	S_BYTE X;
	S_BYTE c0, c1;

	if(!text)
		return;

	for (X=x; *text; text++)
	{
		c0 = *text;
		if (c0 == '\n')
		{
			y += FONT_HEIGHT;
			X  = x;
		}
		else if(c0 & 0x80)
		{
			c1 = text[1] ;
			if(!c1) break;
			DrawFont(X, y, (c0<<8)|c1 );
			X += FONT_WIDTH;			
			text++;
		}
		else
		{
			DrawChar(X, y, c0);
			X += FONT_WIDTH>>1;
		}
	}
}

void DrawNum(S_BYTE x, S_BYTE y, S_WORD num)
{
	S_BYTE idata str[6];

	Word2Str(str, num);
	DrawText(x, y, str);
}


//bitmap
//


⌨️ 快捷键说明

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