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

📄 display.c

📁 S3C2440+SM501在wince环境下的应用!
💻 C
📖 第 1 页 / 共 3 页
字号:
#define __DISPLAY#include "display.h"#undef __DISPLAY//********************** Global Variable **********************ushort cLanguage = 0;	//语言选择WORD SHOW_CHINESE;   int NotUseViewmem;		//当前未使用显存SetDataInfoDef 	SetDataInfo[MAXITEMS];	//一页最多只有27个设置项//*************************************************************//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 求平方根.// 描述: 求一个数的平方根.//// [参数表]//	x: 待求数.//// 返回: x的平方根(取整).//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~int Sqrt (DWORD x){	float x0=1.0;float x2=1.0; float x1	;	int reValue;		while((((x1-x2)>=0.0001)||((x1-x2)<=-0.0001)))	{		x1=(x0+x/x0)*0.5;		x2=x0;		x0=x1;	}	reValue = (int)x1;	return reValue;}//Sqrt()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 绘像素.// 描述: 为指定像素点着色.//// [参数表]//	x, y: 像素点坐标.//	color: 颜色.//// 返回: //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void PutPixel (WORD x, WORD y,WORD color){	DWORD	addr;		addr = GetAddress(x,y);		// 显存偏移地址	*(WORD *)addr = color;		// 像素着色}//PutPixel()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 取指定像素点颜色.//// [参数表]//	x, y: 像素点坐标.//// 返回: 颜色值.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~WORD GetPixelColor (WORD x, WORD y){	DWORD	addr;	WORD	value;		if(x >= SCREEN_WIDTH || y >= SCREEN_HEIGHT)		return 0;	addr = GetAddress(x,y);			//内存偏移地址	value  =  *(WORD *)addr;	return value;}//PutPixel()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 反相色像素着色.// 描述: 用指定像素点当前颜色的反相色对该像素点进行着色.//// [参数表]//	x, y: 像素点坐标.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ReversePutPixel (WORD x, WORD y){	WORD recolor;	recolor = GetPixelColor(x, y);	// 读出当前像素点的颜色	recolor ^= 0xffff;	// 求反相色	PutPixel(x,y,recolor);	// 像素像素着色}//ReversePutPixel()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 屏幕刷色.// 描述: 把整个屏幕设成同一种颜色, 可用于清屏.//// [参数表]//	wColor: 颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ClearScreen (WORD wColor){	int	i;	WORD *addr;		addr = (WORD *)CONFIG_SM501_MEM_BASE;	for(i=0;i<SCREEN_HEIGHT*SCREEN_WIDTH;i++)		*addr++ = wColor;}//ClearScreen()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 边界处理.// 描述: 检查输入坐标是否溢出边界.//// [参数表]//	x1, y1: 像素点1坐标.//	x2, y2: 像素点2坐标.//// 返回: 0-溢出边界; 1-无溢出.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~BYTE BorderDeal (WORD *x1, WORD *y1, WORD *x2, WORD *y2){	if((*x1 > SCREEN_WIDTH) ||(*x2 > SCREEN_WIDTH) 	 ||(*y1 > SCREEN_HEIGHT)||(*y2 > SCREEN_HEIGHT))		return 0;	return 1; }//BorderDeal()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 画直线.// 描述: 在屏幕指定起始坐标之间画一条直线.//// [参数表]//	x1, y1: 起始坐标.//	x2, y2: 末端坐标.//	color: 颜色.//	cType: 线型. 0-实线; 1-虚线; 2-反相色直线; 3-反相色虚线////	注: 当采用反相色画线时, color无效.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void Line(WORD x1,WORD y1,WORD x2,WORD y2,WORD color,BYTE cType){	int		dx, dy, steps, k;	float	xInc, yInc, x, y;	short	flag=-1;	// 虚线控制标记		//---------- 边界处理 ----------	if(BorderDeal((WORD *)&x1,(WORD *)&y1,(WORD *)&x2,(WORD *)&y2) == 0)		return;	//---------- 参数计算 ----------	dx = x2 - x1;	// 水平跨度	dy = y2 - y1;	// 垂直跨度	x = x1;		// 画线横坐标赋初值	y = y1;		// 画线纵坐标赋初值		if( abs(dx)>abs(dy) )	// 选择步进跨度		steps = abs(dx);	else			steps = abs(dy);			if (steps == 0)	// 若始末端坐标重合, 则不画线.		return;			xInc = dx/(float)steps;	// 水平步进值	yInc = dy/(float)steps;	// 垂直步进值	//---------- 画线 ----------	PutPixel(x1,y1,color);	// 绘起点	for( k=0; k<steps; k++ )	// 逐点绘线	{		x += xInc;	// 横坐标步进		y += yInc;	// 纵坐标步进		switch(cType)	// 根据线型绘像素		{			case 0:	// 实线				PutPixel(x,y,color);				break;							case 1:	// 虚线				if (k%BROKEN_LEN == 0)					flag =- flag;				if (flag == 1)						PutPixel(x,y,color);				break;							case 2:	//反相色实线				ReversePutPixel(x,y);				break;							case 3:	//反相色虚线				if (k%BROKEN_LEN == 0)     					flag = -flag;				if (flag == 1)						ReversePutPixel(x,y);				break;							default:	break;		}//switch	}//for}//Line()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 画直线(快速).// 描述: 在屏幕指定起始坐标之间画一条直线.//// [参数表]//	x1, y1: 起始坐标.//	x2, y2: 末端坐标.//	color: 颜色.//	cType: 线型. 0-实线; 1-虚线; 2-反相色直线; 3-反相色虚线//// 注: 与Line函数相比, DrawLine不进行边界溢出判断, 而且直接对显存写入, 所以速度快.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void DrawLine (WORD x1,WORD y1,WORD x2,WORD y2,WORD color){	DWORD	addr;	WORD i;		addr = GetAddress(x1,y1);			//显存偏移地址	for(i = y1;i < y2;i++)	{		*(WORD *)addr= color;			addr += 2*SCREEN_WIDTH;	}				}//DrawLine()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 取字符尺寸.// 描述: 取要显示字符的宽度和高度.//// [参数表]//	cfontSize: 字号大小.//	cCharSize: 字符宽度. 用于返回.//	*VSize: 字符高度, 用于返回.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void GetCharSize (BYTE cfontSize,WORD *cCharSize,WORD *VSize){	switch(cfontSize)	{		case 0://8*16			*cCharSize = 8;			break;				case 1://16*16			*cCharSize = 10;			break;				case 2://16*24			*cCharSize = 12;			*VSize = 24;			break;					case 3://24*24			*cCharSize = 12;			*VSize = 24;			break;				case 4://24*32			*cCharSize = 14;			*VSize = 32;					case 5://32*32			*cCharSize = 16;			*VSize = 32;			break;				case 6://32*48			*cCharSize = 28;			*VSize = 48;			break;					case 7://32*64			*cCharSize = 32;			*VSize = 64;			break;					case 8://48*80			*cCharSize = 48;			*VSize = 80;			break;					default:			*cCharSize = 14;			break;	}//switch}//GetCharSize()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示8*16字符.// 描述: 从字库提取点阵, 显示一个8*16字符.//// [参数表]//	addr: 字符点阵地址.//	x, y: 显示坐标.//	fcolor: 前景颜色.//	bcolor: 背景颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChar816 (int addr,WORD x,WORD y,WORD fcolor,int bcolor){	BYTE i,m,value;		//RestoreArea(x,y,8,16);	for(i=0;i<16;i++)//一个英文字符16个字节	{		value = *(BYTE *)(addr+i);		for(m=0;m<8;m++)		{			if( value&0x80 )				PutPixel(x+m,y+i,fcolor);			else				if(bcolor != NO_BACK_COLOR)//有背景色					PutPixel(x+m,y+i,bcolor);			value <<= 1;		}	}	}//ShowChar816()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示英文字符.// 描述: 显示一个英文字符.//// [参数表]//	ch: 需要显示的字符.//	x, y: 字符显示位置的屏幕坐标.//	fcolor: 前景颜色.//	bcolor: 背景颜色.//	cfont: 字号大小.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowEnglishChar (char ch,WORD x,WORD y,WORD fcolor,int bcolor,BYTE cfont){	int		addr;	switch(cfont)	// 根据字号选择字库, 显示字符	{		case 0:	//8*16			addr = (dwEnFontAddr+ch*16);	// 字符点阵地址			ShowChar816(addr,x,y,fcolor,bcolor);			break;				case 1:	//16*16			addr = (dwEnFont1616+ch*32);	//字符点阵地址			ShowChar1616(addr,x,y,fcolor,bcolor);			break;					case 2:	//16*24			addr = (dwEnFont1624+ch*48);	//字符点阵地址			ShowChar1624(addr,x,y,fcolor,bcolor);			break;				case 3:	//24*24			addr = (dwEnFont2424+ch*72);	//字符点阵地址			ShowChar2424(addr,x,y,fcolor,bcolor);			break;					case 4:	//24*32			addr = (dwEnFont2432+ch*96);	//字符点阵地址			ShowChar2432(addr,x,y,fcolor,bcolor);			break;					case 5:	//32*32			addr = (dwEnFont3232+ch*128);	//字符点阵地址			ShowChar3232(addr,x,y,fcolor,bcolor);			break;				case 6:	//32*48			//大数字点阵的特殊处理			if(ch == 32) ch = 58;			if(ch < 48)	 ch += 16;			addr = (dwEnFont3248+(ch-48)*192);//字符点阵地址			ShowChar3248(addr,x,y,fcolor,bcolor);			break;				case 7:	//32*64			//大数字点阵的特殊处理			if(ch == 32) ch = 58;			if(ch < 48)	 ch += 16;			addr = (dwEnFont3264+(ch-48)*256);//字符点阵地址			ShowChar3264(addr,x,y,fcolor,bcolor);			break;					case 8:	//48*80			//大数字点阵的特殊处理			if(ch == 32) ch = 58;			if(ch < 48)	 ch += 16;			addr = (dwEnFont4880+(ch-48)*480);//字符点阵地址			ShowChar4880(addr,x,y,fcolor,bcolor);			break;					default:	break;	}}// ShowEnglishChar//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示24*24点阵汉字.// 描述: 用24*24点阵显示一个汉字.//// [参数表]//	hz: 汉字的基址.//	x, y: 汉字显示位置的屏幕坐标.//	color: 字体颜色.//	bcolor: 背景颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChineseChar24(char *hz,int x,int y,int color,int bcolor){	int		i,j,hzaddr;	int 	pos;	BYTE	value;		//45120*288/32    //计算出汉字在字库中的位置    //16*16(32个字节时 = 33088 + ((hz[0]  - 176) * 94 + (hz[1]  - 161)) * 32	pos =  72 * (33088 + ((hz[0]  - 176) * 94 + (hz[1]  - 161)) * 32) / 32;    // 显示全角字符处理   	if( pos < 0 )   	  	pos = 9 * 12032/ 4 + pos;       	hzaddr = dwChFontAddr +  pos ;	// 汉字点阵地址	for(i=0;i<72;i++)	//一个24*24汉字72字节	{		value = *(BYTE *)(hzaddr+i);		for(j=0;j<8;j++)	// 取8-bit点阵		{            if( value & 0x80 )	/* 前景/背景判别 */            	PutPixel(x+(i%3)*8+j,y+(i/3),color);	// 前景像素            else            	if(bcolor != NO_BACK_COLOR)	// 背景像素(若有背景色)            		PutPixel(x+(i%3)*8+j,y+(i/3),bcolor);            value <<= 1;        }    }}//ShowChineseChar34()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 根据汉字码(hzASC)输出一个汉字.// 描述: 根据给出的汉字码, 在屏幕指定位置输出一个汉字.//// [参数表]// hzASC: 汉字ASC码, 2字节.// x, y: 汉字显示位置的屏幕坐标.// color: 字体颜色.// bcolor: 背景颜色.//	// 返回: //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChineseFromASC(WORD hzASC,WORD x,WORD y,WORD color,int bcolor){	hzASC = ((hzASC & 0xFF) << 8) + (hzASC >> 8);	// 汉字asc码高低字节互换	ShowChineseChar24((char *)&hzASC,x,y,color,bcolor);	// 显示汉字}//ShowChineseFromASC()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示16*16字符.// 描述: 从字库提取点阵, 显示一个16*16字符.//// [参数表]//	addr: 字符点阵地址.//	x, y: 显示坐标.//	fcolor: 前景颜色.//	bcolor: 背景颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChar1616(int addr,WORD x,WORD y,WORD color,int bcolor){	short i,j;	BYTE  value;	for( i=0; i<32; i++ )	// 16*16点阵共占32字节	{		value = *(BYTE *)(addr+i);	// 取8-bit点阵		for(j=0;j<8;j++)		{            if( value & 0x80 )	// 前景/背景判别            	PutPixel(x+(i%2)*8+j,y+(i/2),color);	// 前景像素

⌨️ 快捷键说明

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