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

📄 test.c.bak

📁 T6369C控制器的图形液晶显示功能用于烟草的标签显示
💻 BAK
字号:
#include <intrins.h>   

#include	"ZYEL0304.H"
#include	"Matrix16.H"

#define CMDADD XBYTE[0x6100]                  //写指令代码地
#define DATAADD XBYTE[0x6000]                  //写数据通道地址

unsigned char xdata bmp_info[1536];
volatile unsigned char idata info_ln[30];

#define LINEWIDTH 30						//行宽 30个字节
#define LCM_ERR  1
#define LCM_ERR  1

uchar sta01(void) 	                // 状态位STA1,STA0判断(读写指令和读写数据)
{
	uchar i;

	for(i=10;i>0;i--)
	{
		if((CMDADD & 0x03) == 0x03)
		break;
	}
	return i; // 若返回零,说明错误
}

uchar sta2(void)				// 状态位STA2判断
{
	uchar i;

	for(i=10;i>0;i--)
	{
		if((CMDADD & 0x04) == 0x04)
		break;
	}
	return i; // 若返回零,说明错误
}

uchar sta3(void)				// 状态位STA3判断
{
	uchar i;

	for(i=10;i>0;i--)
	{
		if((CMDADD & 0x08) == 0x08)
		break;
	}
	return i; // 若返回零,说明错误
}

uchar sta6(void)				// 状态位STA6判断
{
	uchar i;

	for(i=10;i>0;i--)
	{
		if((CMDADD & 0x40) == 0x40)
		break;
	}
	return i; // 若返回零,说明错误
}

// 返回值
uchar writecode(unsigned char com)             //写无参数指令
{  
	uint ret;
   	ret=sta01();
   	if(ret==0)
   		return LCM_ERR;
   	else
   		CMDADD=com;
   	return LCM_SUC;
}

uchar write1byte(unsigned char dat1,unsigned char com)    //写单字节参数指令
{  
	uint ret;
   	ret=sta01();
   	if(ret==0)
   		return LCM_ERR;
   	else
	   	DATAADD=dat1;
   	ret=sta01();

   	if(ret==0)
   		return LCM_ERR;
   	else
	   	CMDADD=com;
   	return LCM_SUC;
}

uchar write2byte(unsigned char dat1,unsigned char dat2,unsigned char com)           //写双字节参数指令 
{   
	uint ret;
   	ret=sta01();
   	if(ret==0)
   		return LCM_ERR;
   	else
   		DATAADD=dat1;

   	ret=sta01();
   	if(ret==0)
   		return LCM_ERR;
   	else
	   DATAADD=dat2;

   	if(ret==0)
   		return LCM_ERR;
   	else
	   	CMDADD=com;
   	return LCM_SUC;
}

uchar disp_ini(void)                		//显示屏初始化子程序
{
	uint ret;
    	ret=write2byte(0x00,0x00,0x40);		//设置显示区域首地址0000h
 	ret=write2byte(0x10,0x00,0x41);		//设置文本显示的宽度,即一行所占的字节数(12864t,16个8X8点阵字符)
	ret=write2byte(0x00,0x08,0x42);		//设置图形显示区域首地址0800h,或为文本属性区域首地址
	ret=write2byte(LINEWIDTH,0x00,0x43);	//设置图形显示区域宽度,或为文本属性区域宽度
	ret=write2byte(LINEWIDTH,0x00,0x43);	//设置图形显示区域宽度,或为文本属性区域宽度
	ret=writecode(0xa7);			//光标形状设置
	ret=writecode(0x9c);			//显示开关设置,打开图形显示模式
	ret=writecode(0x80);			//显示方式设置,逻辑或合成
   	return ret;
}

uchar clearram(void)                		//清屏程序
{   
    	unsigned int  i;
	uint ret;

    	ret=write2byte(0x00,0x00,0x24);		//设置显示ram首地址0000h
	ret=writecode(0xb0);           		//设置自动写方式
	for(i=8192;i>0;i--)   			//往显示区域写0;区域大小8k
	{
	   ret=sta3();
	   DATAADD=0;
   	};
	ret=writecode(0xb2);              		//关闭自动写指令
   	return ret;
	
}

uchar gshowNullword(unsigned char y,unsigned char x) 	//图形方式下显示空内容
//x--显示在第x(0~29)字符列,y--显示在第y(0~127)
{
   	unsigned int num,ret;
   	unsigned char d1,d2,i=16;
   	num=y*LINEWIDTH+x+0x800;                 //图形显示区首地址为0800h
   
	for(i=16;i>0;i--)
  	{    
		d1=num/256;                       //得到显示屏上汉字显示的相对位置
	    	d2=num%256;
       		ret=write2byte(d2,d1,0x24);
       		ret=write1byte(0x00,0xc0);            //写汉字左代码
       		ret=write1byte(0x00,0xc0);       	  //写汉字右代码
       		num+=LINEWIDTH;                   //显示ram地址修正
    	}
    	return ret;
}

//显示16*16点阵汉字
uchar gshowword(unsigned char y,unsigned char x,unsigned char *w_no) //图形方式下显示一个汉字字符(分为左右两半字模)
{        
   	unsigned int num,ret;
   	unsigned char d1,d2,i=16;
   	num=y*LINEWIDTH+x+0x800;                 //图形显示区首地址为0800h
   
	for(i=16;i>0;i--)
  	{    
		d1=num/256;                       //得到显示屏上汉字显示的相对位置
	    	d2=num%256;
       		ret=write2byte(d2,d1,0x24);
       		ret=write1byte(*w_no,0xc0);            //写汉字左代码
       		ret=write1byte(*(w_no+16),0xc0);       //写汉字右代码
       		w_no++;
       		num+=LINEWIDTH;                         //显示ram地址修正
    	}
    	return ret;
}

//显示16*32点阵汉字
uchar gshow2word(unsigned char y,unsigned char x,unsigned char *w_no) //图形方式下显示一个汉字字符(分为左右两半字模)
{        
   	unsigned int num,ret;
   	unsigned char d1,d2,i=16;
   	num=y*LINEWIDTH+x+0x800;                 //图形显示区首地址为0800h
   
	for(i=16;i>0;i--)
  	{    
		d1=num/256;                       //得到显示屏上汉字显示的相对位置
	    	d2=num%256;
       		ret=write2byte(d2,d1,0x24);
       		ret=write1byte(*w_no,0xc0);            //写汉字左代码
       		ret=write1byte(*(w_no+16),0xc0);       //写汉字右代码
       		num+=LINEWIDTH;                         //显示ram地址修正

		d1=num/256;                       //得到显示屏上汉字显示的相对位置
	    	d2=num%256;
       		ret=write2byte(d2,d1,0x24);
       		ret=write1byte(*w_no,0xc0);            //写汉字左代码
       		ret=write1byte(*(w_no+16),0xc0);       //写汉字右代码
       		w_no++;
       		num+=LINEWIDTH;                         //显示ram地址修正
     	}
    	return ret;
}

//显示8*16点阵字符
uchar gshowchar(unsigned char y,unsigned char x,unsigned char *w_no) 
{
   	unsigned int num,ret;
   	unsigned char d1,d2,i=16;
	num=y*LINEWIDTH+x+0x800;                 //图形显示区首地址为0800h
 
   	for(i=16;i>0;i--)
    	{   
       		d1=num/256;                       //得到显示屏上汉字显示的相对位置
       		d2=num%256;
       		ret=write2byte(d2,d1,0x24);
	   	ret=write1byte(*w_no,0xc0);            //写汉字左代码
       		w_no++;
	   	num+=LINEWIDTH;                         //显示ram地址修正
    	}
    	return ret;
}
 
//显示8*32点阵字符
uchar gshow2char(unsigned char y,unsigned char x,unsigned char *w_no) 
{
   	unsigned int num,ret;
   	unsigned char d1,d2,i=16;
 	num=y*LINEWIDTH+x+0x800;                 //图形显示区首地址为0800h
 
   	for(i=16;i>0;i--)
    	{   
       		d1=num/256;                       //得到显示屏上汉字显示的相对位置
       		d2=num%256;
       		ret=write2byte(d2,d1,0x24);
	   	ret=write1byte(*w_no,0xc0);            //写汉字左代码

	   	num+=LINEWIDTH;                         //显示ram地址修正
       		d1=num/256;                       //得到显示屏上汉字显示的相对位置
       		d2=num%256;
       		ret=write2byte(d2,d1,0x24);
	   	ret=write1byte(*w_no,0xc0);            //写汉字左代码
       		w_no++;
	   	num+=LINEWIDTH;                         //显示ram地址修正
    	}
    	return ret;
}
//显示16*16点阵一行数据
//nLineNo:1-8
uchar Show16Line(unsigned char nLineNo,unsigned char *info_ln)
{
	unsigned int ret,i,pos_x,pos_y=0;
	
	nLineNo=nLineNo-1;
  	for(i=0;i<LINEWIDTH;i++)
	{
		if(info_ln[i]>0xa0)
		{
			GetHzDots(info_ln[i],info_ln[i+1]);
			pos_x=i*16;
			ConvertHzDots(pos_x,pos_y);
    			ret=gshowword(16*nLineNo,i,bmp_info+i*16);
			i++;
		}
		else
		{
			GetChDots(info_ln[i]);
			pos_x=16*i;
			ConvertChDots(pos_x,pos_y);
			ret=gshowchar(16*nLineNo,i,bmp_info+i*16);           
		}
	}
    	return ret;
}

//显示16*32点阵一行数据
//nLineNo:1-4
uchar Show32Line(unsigned char nLineNo,unsigned char *info_ln)
{
	unsigned int i,ret,pos_x,pos_y=0;

	nLineNo=nLineNo-1;
  	for(i=0;i<LINEWIDTH;i++)
	{
		if(info_ln[i]>0xa0)
		{
			GetHzDots(info_ln[i],info_ln[i+1]);
			pos_x=16*i;
			ConvertHzDots(pos_x,pos_y);
    			ret=gshow2word(32*nLineNo,i,bmp_info+i*16);
			i++;
		}
		else
		{
			GetChDots(info_ln[i]);
			pos_x=16*i;
			ConvertChDots(pos_x,pos_y);
			ret=gshow2char(32*nLineNo,i,bmp_info+i*16);           
		}
	}
    	return ret;
}

//清除16*16点阵行数据
uchar Clear16OneLine(unsigned char nLineNo)
{
	int i;
	nLineNo=nLineNo-1;
  	for(i=0;i<LINEWIDTH;i++)
	{
		ret=gshowNullword(16*nLineNo,i);
	}
    	return ret;
}


void main(void)               //test program segment
{ 
	int ret,i=0;

	P0=P1=P2=0x00;P3=0xff;
	
	ret=disp_ini();
   	ret=clearram();
	while(1)
	{
		i++;
		strcpy(info_ln,"所在的字库首址为基地址显示数据");
		ret=Show16Line(1,info_ln);
		strcpy(info_ln,"0日Ac!@$%*日A月__+|>?<N~U日月B");
//		strcpy(info_ln,"09aAc!@#$$%*234_+|>?<N~U4645fr");
		ret=Show32Line(2,info_ln);
		ret=Clear16OneLine(1);
	}	                              
}

⌨️ 快捷键说明

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