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

📄 hz-disp.c

📁 2410 lcd程序驱动代码是嵌入式开发人员如何加载lcd的代表例程。
💻 C
字号:
/******************************************************
 文件名   :All.c
 描  述   :12,14,16点阵汉字显示文件
 语  言   :TC2.0
 作  者   :刘利国
 修  改   :
 日  期   :2002-11-5
 说  明   :需要12,14,16点阵汉字字库的支持
******************************************************/
#include <stdio.h>
#include <graphics.h>
#include <fcntl.h>
#include <io.h>
int hzk_p,asc_p;
void open_hzk(char filename[]);
void open_asc(char filename[]);
void get_hz(char incode[],char bytes[],unsigned long uiSize );
void get_asc(char incode[],char bytes[],unsigned long uiSize );
void disasc(int x,int y,char code[],int color,
						unsigned int uiDianZhenSize);
void dishz(int x0,int y0,char code[],int color,
					 unsigned int uiDianZhenSize,
					 unsigned int uiDuoYuBit);
/*字模的大小
16*16点阵   ZI_MO_SIZE=32
14*14点阵   ZI_MO_SIZE=28
12*12点阵   ZI_MO_SIZE=24
//该变量一定为long,否则出错
*/
unsigned long  ZI_MO_SIZE[3]={32,28,24};
/*汉字点阵
16*16点阵   ZI_MO_SIZE=16
14*14点阵   ZI_MO_SIZE=14
12*12点阵   ZI_MO_SIZE=12
*/
unsigned int  DIAN_ZHEN_SIZE[3]={16,14,12};
/*多余位数(对于12*12和14*14点阵字库,该位有意义)
16*16点阵   ZI_MO_SIZE=0
14*14点阵   ZI_MO_SIZE=2
12*12点阵   ZI_MO_SIZE=4
*/
unsigned int  DUO_YU_BIT[3]={0,2,4};
#define ZOOMX    1  /*X方向的放大倍数,1为原始尺寸*/
#define ZOOMY    1  /*Y方向的放大倍数,1为原始尺寸*/

main()
{
	int x=10,i;
	int y=10;
	char *s;
	char *filename[3]={"e:\\hzk\\hzk16","e:\\hzk\\hzk14","e:\\hzk\\hzk12"};
	char *fileasc[3]={"e:\\hzk\\asc16","e:\\hzk\\asc14","e:\\hzk\\asc12"};
	char code[32];/*因为不能动态定位,所以取最大值32*/
	char tmpcode[3]={0};
	unsigned char mask=0x80;
	int driver=DETECT,errorcode;
	int mode;
	int iOffset;
	initgraph(&driver,&mode,"");
	errorcode=graphresult();
	if(errorcode!=0)
	{
		printf("error\n");
		getch();
		exit(1);
	}
	for(i=0;i<3;i++)
	{
		open_hzk(filename[i]);
		open_asc(fileasc[i]);
		s="北京惠234悦12通234电s子技术有限234公司";
		while(*s!=NULL)
		{
			while(x<600 && (*s!=NULL))
			{
				tmpcode[0]=*s;
				tmpcode[1]=*(s+1);
				if(tmpcode[0] & mask)
				{
					get_hz(s,code,ZI_MO_SIZE[i]);
					dishz(x,y,code,GREEN,DIAN_ZHEN_SIZE[i],DUO_YU_BIT[i]);
				  x+=20*ZOOMX;
				  s+=2;
				}
				else
				{
				  disasc(x,y,s,LIGHTGREEN,DIAN_ZHEN_SIZE[i]);
				  x+=10*ZOOMX;
				  s+=1;
				}				
			}
			x=10;
			y+=20*ZOOMY;
		}
		y+=20;/*换行*/
		close(hzk_p);
		close(asc_p);
	}
	getch();
	closegraph();
}
/******************************************************
函数名称:open_hzk
函数功能:打开字库文件
传入参数:无
返 回 值:无
建立时间:
修改时间:
建 立 人:
修 改 人:
其它说明:如果失败,则直接退出程序
******************************************************/
void open_hzk(char filename[])
{
	hzk_p=open(filename,O_BINARY|O_RDONLY);
	if(hzk_p==-1)
	{
		printf("The file HZK not exits!\n");
		getch();
		closegraph();
		exit(1);
	}
}
/******************************************************
函数名称:open_asc
函数功能:打开字库文件
传入参数:无
返 回 值:无
建立时间:
修改时间:
建 立 人:
修 改 人:
其它说明:如果失败,则直接退出程序
******************************************************/
void open_asc(char filename[])
{
	asc_p=open(filename,O_BINARY|O_RDONLY);
	if(asc_p==-1)
	{
		printf("The file asc not exits!\n");
		getch();
		closegraph();
		exit(1);
	}
}
/******************************************************
函数名称:
函数功能:
传入参数:
返 回 值:
建立时间:
修改时间:
建 立 人:
修 改 人:
其它说明:
******************************************************/
void get_hz(char incode[],char bytes[],unsigned long uiSize )
{
	unsigned char qh,wh;
	unsigned long offset;
	qh=incode[0]-0xa0;
	wh=incode[1]-0xa0;
	offset=(94*(qh-1)+(wh-1))*uiSize;
	lseek(hzk_p,offset,SEEK_SET);
	read(hzk_p,bytes,uiSize);
}
/******************************************************
函数名称:
函数功能:
传入参数:
返 回 值:
建立时间:
修改时间:
建 立 人:
修 改 人:
其它说明:
******************************************************/
void get_asc(char incode[],char bytes[],unsigned long uiSize )
{
	unsigned char qh,wh;
	unsigned long offset;
	offset=incode[0]*uiSize;
	lseek(asc_p,offset,SEEK_SET);
	read(asc_p,bytes,uiSize);
}
/******************************************************
函数名称:
函数功能:
传入参数:
返 回 值:
建立时间:
修改时间:
建 立 人:
修 改 人:
其它说明:对于24*24的点阵字库,存放格式如下:
          纵向存放3个字节(24位),横向存放24个字节,每个字模占72个字节
          字符排列顺序如下:
          1   4   7   10   ......
          2   5   8   11   ......
          3   6   9   12   ...... 
					
					对于16*16的点阵字库,存放格式如下:
          横向存放2个字节(16位),其中第二个字节没有多余的数据
          纵向存放16个字节,每个字模占32个字节
          字符排列顺序如下:
					1    2
					3    4
					5    6
					......
					
					对于14*14的点阵字库,存放格式如下:
          横向存放2个字节(16位),其中第二个字节的后2位是多余的数据
          纵向存放14个字节,每个字模占28个字节
          字符排列顺序如下:
					1    2
					3    4
					5    6
					......
          
					对于12*12的点阵字库,存放格式如下:
          横向存放2个字节(16位),其中第二个字节的后4位是多余的数据
          纵向存放12个字节,每个字模占24个字节
          字符排列顺序如下:
					1    2
					3    4
					5    6
					......
******************************************************/
void dishz(int x0,int y0,char mat[],int color,
           unsigned int uiDianZhenSize,
	   			 unsigned int uiDuoYuBit
           )
{
	unsigned char mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
	register int x,y,row,col;
	register int byte;
	int zoomX,zoomY;/*x,y方向*/
	x=x0;y=y0;
	byte=0;
	for(col=0;col<uiDianZhenSize;col++) /*列*/
	{
		for(zoomY=0;zoomY<ZOOMY;zoomY++)  /*纵向放大*/
		{
			for(row=0;row<uiDianZhenSize;row++) /*16行(2个8位)*/
			{
				for(zoomX=0;zoomX<ZOOMX;zoomX++) /*横向放大*/
				{
					if((mask[byte%8]& mat[byte/8])!=NULL)
					{
						putpixel(x,y,color);
					}
					x++; /*x位置加一*/
				}
				byte++;
			}
			byte+=uiDuoYuBit; /*去掉多余位,对于16*16点阵来说,该位为0*/
			x=x0;
			y++;/*y坐标加1*/
			byte-=16; /*重新修正byte,重复绘制y像点*/
		}
		byte+=16; /*每次写完1行(2个字节,16位),修正byte*/
	}
}

void disasc(int x0,int y0,char code[],int color,
					  unsigned int uiDianZhenSize
					  )
{
	unsigned char mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
	register int x,y,row,col;
	register int byte;
	int zoomX,zoomY;/*x,y方向*/
	char mat[16]={0};/*因为不能动态定位,所以取最大值16*/
	get_asc(code,mat,uiDianZhenSize);
	x=x0;y=y0;
	byte=0;
	for(col=0;col<uiDianZhenSize;col++) /*列*/
	{
		for(zoomY=0;zoomY<ZOOMY;zoomY++)  /*纵向放大*/
		{
			for(row=0;row<8;row++) 
			{
				for(zoomX=0;zoomX<ZOOMX;zoomX++) /*横向放大*/
				{
					if((mask[byte%8]& mat[byte/8])!=NULL)
					{
						putpixel(x,y,color);
					}
					x++; /*x位置加一*/
				}
				byte++;
			}
			x=x0;
			y++;/*y坐标加1*/
			byte-=8; /*重新修正byte,重复绘制y像点*/
		}
		byte+=8; /*每次写完1行(2个字节,16位),修正byte*/
	}
}

⌨️ 快捷键说明

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