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

📄 ledfution.c

📁 多字节汉字屏显示控制程序
💻 C
字号:
#include 	"config.h"
extern	data	struct PRINTLED PRINT_INFOR;
extern 	set_data_l(uchar xdata *pt, uchar xdata *ptr_d, uchar j);
extern 	movedata(uchar xdata *pt, uchar xdata *i, uchar xdata *j);
extern 	adddata(uchar xdata *pt, uchar xdata *i, uchar xdata *j);
extern 	movedata_l(uchar xdata *pt, uchar xdata *i,uchar lie,uchar hang);
extern 	movedata_r(uchar xdata *pt, uchar xdata *i, uchar xdata *j);

uint 	system_run;					//系统运行监视
extern  bit	  	rell_print;	        //可以更新显存标记
extern uchar	comtimeout;

#ifdef  STATIC
	uchar	xdata static_print[HANGDIP][LIEDIP/8];	//静态应用的
#endif
/*****************************************************************************************************************************************************
*宏结实,下面是函数开始
*****************************************************************************************************************************************************/


static void changpage(struct windows xdata *pt) //new
{
	
			/*扫描的*/
            CS_RAM=0;
			if(PRINT_INFOR.SWAP == SWAP_PRINT1)
			{
                PRINT_INFOR.PRINTBUF2_R1 =(uchar xdata *)&pt->PRINT2_R[0][0];
				#ifndef ALONE
					PRINT_INFOR.PRINTBUF2_R2 =(uchar xdata *)&pt->PRINT2_R[16][0];
				#endif
				while(PRINT_INFOR.CHANG < pt->movsize[pt->plan]) REBOOT;
				while(!rell_print);
				PRINT_INFOR.CHANG = 0;
				PRINT_INFOR.SWAP = SWAP_PRINT2;
			}
			else
			{
				PRINT_INFOR.PRINTBUF1_R1 =(uchar xdata *)&pt->PRINT1_R[0][0];
				#ifndef ALONE
				   PRINT_INFOR.PRINTBUF1_R2 =(uchar xdata *)&pt->PRINT1_R[16][0];
				#endif
				while(PRINT_INFOR.CHANG < pt->movsize[pt->plan]) REBOOT;
				while(!rell_print);
				PRINT_INFOR.CHANG = 0;
				PRINT_INFOR.SWAP = SWAP_PRINT1;
		 	} 
}
/*****************************************************************************************************************************************************
*LED屏从上到下添加行=逐行显示
*****************************************************************************************************************************************************/
#ifdef	PRINT_UP_HANG
void print_up_hang(struct windows xdata *pt) //new
{
    uchar xdata  *data ptr_s, *ptr_d;
	while(1)
	{
		if(comtimeout != 0) break;
		/*数据搬家开始*/
        CS_RAM=0;
		if(PRINT_INFOR.SWAP == SWAP_PRINT1)
		{
			ptr_s = &pt->PRINT1_R[0][0];
			ptr_d = &pt->PRINT2_R[0][0];
			movedata(ptr_s,ptr_d,&pt->PRINT2_R[HANGDIP][0]);	//调用汇编拷贝全屏数据
		}
		else
		{
			ptr_s = &pt->PRINT2_R[0][0];
			ptr_d = &pt->PRINT1_R[0][0];
			movedata(ptr_s,ptr_d,&pt->PRINT1_R[HANGDIP][0]);	//调用汇编拷贝全屏数据
		}
		if(PRINT_INFOR.SWAP == SWAP_PRINT1)
		{
			ptr_d = &pt->PRINT2_R[pt->hang][0];
	    }
		else
		{
			ptr_d = &pt->PRINT1_R[pt->hang][0];
	  	}
		/*数据搬家结束*/
		ptr_s = &pt->printbuf[pt->plan][pt->hang*(LIEDIP/8)];
		adddata(ptr_s,ptr_d,ptr_d+LIEDIP/8);
		//通知打印换页
		changpage(pt);

		if(++pt->hang == HANGDIP)
		{
		  PRINT_INFOR.CHANG = 0;
		  while(PRINT_INFOR.CHANG < pt->showtime[pt->plan]);
		  break;
		}
	}
}
#endif
/*****************************************************************************************************************************************************
*LED屏上移动扫描方式	ok
*****************************************************************************************************************************************************/
#ifdef	PRINT_UP
void print_up(struct windows xdata *pt) //new
{
 	uchar xdata  *data ptr_s, *ptr_d;
	while(1)
	{
		if(comtimeout != 0) break;
		/*数据搬家开始*/
        if(PRINT_INFOR.SWAP == SWAP_PRINT1)
		{
			ptr_s = &pt->PRINT1_R[1][0];
			ptr_d = &pt->PRINT2_R[0][0];
			movedata(ptr_s,ptr_d,&pt->PRINT2_R[HANGDIP-1][0]);	//调用汇编上移动数据
			ptr_d = &pt->PRINT2_R[HANGDIP-1][0];
	   	}
		else
		{
			ptr_s = &pt->PRINT2_R[1][0];
			ptr_d = &pt->PRINT1_R[0][0];
			movedata(ptr_s,ptr_d,&pt->PRINT1_R[HANGDIP-1][0]);	//调用汇编上移动数据
			ptr_d = &pt->PRINT1_R[HANGDIP-1][0];
		} 

		/*数据搬家结束*/
		ptr_s = &pt->printbuf[pt->plan][pt->hang*(LIEDIP/8)];
        CS_RAM=0;
		adddata(ptr_s,ptr_d,ptr_d+LIEDIP/8);

		//通知打印换页
		changpage(pt);

		if(++pt->hang == HANGDIP)
		{
		  PRINT_INFOR.CHANG = 0;
		  while(PRINT_INFOR.CHANG < pt->showtime[pt->plan]);
		  break;
		}
	}
}
#endif
/*****************************************************************************************************************************************************
*LED屏上移动扫描方式	ok
*****************************************************************************************************************************************************/
#ifdef	PRINT_DOWN
void print_down(struct windows xdata *pt) //new
{
    uchar xdata  *data ptr_s, *ptr_d;
	while(1)
	{
		if(comtimeout != 0) break;
		/*数据搬家开始*/
		if(PRINT_INFOR.SWAP == SWAP_PRINT1)
		{
			ptr_s = &pt->PRINT1_R[0][0];
			ptr_d = &pt->PRINT2_R[1][0];
			movedata(ptr_s,ptr_d,&pt->PRINT2_R[HANGDIP][0]);	//调用汇编下移动数据
	   	}
		else
		{
			ptr_s = &pt->PRINT2_R[0][0];
			ptr_d = &pt->PRINT1_R[1][0];
			movedata(ptr_s,ptr_d,&pt->PRINT1_R[HANGDIP][0]);	//调用汇编下移动数据
		}
		if(PRINT_INFOR.SWAP == SWAP_PRINT1)
		{
			ptr_d = &pt->PRINT2_R[0][0];
		}
		else
		{
			ptr_d = &pt->PRINT1_R[0][0];
		}
		/*数据搬家结束*/
		ptr_s = &pt->printbuf[pt->plan][(HANGDIP-1-pt->hang)*(LIEDIP/8)];
		adddata(ptr_s,ptr_d,ptr_d+LIEDIP/8);

		//通知打印换页
		changpage(pt);

		if(++pt->hang == HANGDIP)
		{
		  PRINT_INFOR.CHANG = 0;
		  while(PRINT_INFOR.CHANG < pt->showtime[pt->plan]);
		  break;
		}
	}
}
#endif
/*****************************************************************************************************************************************************
*LED屏从下到上添加行=逐行显示
*****************************************************************************************************************************************************/
#ifdef	PRINT_DOWN_HANG
void print_down_hang(struct windows xdata *pt) //new
{
    uchar xdata  *data ptr_s, *ptr_d;
	while(1)
	{
		if(comtimeout != 0) break;
		/*数据搬家开始*/
		if(PRINT_INFOR.SWAP == SWAP_PRINT1)
		{
			ptr_s = &pt->PRINT1_R[0][0];
			ptr_d = &pt->PRINT2_R[0][0];
			movedata(ptr_s,ptr_d,&pt->PRINT2_R[HANGDIP][0]);	//调用汇编下移动数据
	   	}
		else
		{
			ptr_s = &pt->PRINT2_R[0][0];
			ptr_d = &pt->PRINT1_R[0][0];
			movedata(ptr_s,ptr_d,&pt->PRINT1_R[HANGDIP][0]);	//调用汇编下移动数据
		}
		if(PRINT_INFOR.SWAP == SWAP_PRINT1)
		{
			ptr_d = &pt->PRINT2_R[(HANGDIP-1)-pt->hang][0];
		}
		else
		{
			ptr_d = &pt->PRINT1_R[(HANGDIP-1)-pt->hang][0];
		}
		/*数据搬家结束*/
		ptr_s = &pt->printbuf[pt->plan][(HANGDIP-1-pt->hang)*(LIEDIP/8)];
		adddata(ptr_s,ptr_d,ptr_d+LIEDIP/8);

		//通知打印换页
		changpage(pt);

		if(++pt->hang == HANGDIP)
		{
			PRINT_INFOR.CHANG = 0;
			while(PRINT_INFOR.CHANG < pt->showtime[pt->plan]);
			break;
		}
	}
}
#endif
/*****************************************************************************************************************************************************
*LED屏左移动扫描方式	ok
*****************************************************************************************************************************************************/
#ifdef PRINT_L
void print_l(struct windows xdata *pt) //new
{
    uchar data   ii=0;
    uchar xdata  *data ptr_s, *ptr_d;
	while(1)
	{
		if(comtimeout != 0) break;
		/*数据搬家开始*/
		if(PRINT_INFOR.SWAP == SWAP_PRINT1)
		{
			ptr_s = &pt->PRINT1_R[0][0];
			ptr_d = &pt->PRINT2_R[0][0];
		}
		else
		{
			ptr_s = &pt->PRINT2_R[0][0];
			ptr_d = &pt->PRINT1_R[0][0];
		}
		ptr_s += (LIEDIP/8-1);
		ptr_d += (LIEDIP/8-1);
		movedata_l(ptr_s,ptr_d,LIEDIP/8,HANGDIP);	//调用汇编全部拷贝数据
		/*数据搬家结束*/
		for(ii=0; ii<HANGDIP; ii++)			//装载一行数据
		 {
	 		ptr_s = &pt->printbuf[pt->plan][ii*(LIEDIP/8)];	//得到对应行的首地址
			ptr_s += pt->lie;
			set_data_l(ptr_s, ptr_d, pt->bit_cont);//汇编处理
			ptr_d += (LIEDIP/8);
		 }
		//通知打印换页
		changpage(pt);

		if(++pt->bit_cont == 8)
		{
		    pt->bit_cont = 0;
			if(++pt->lie == LIEDIP/8)
			{
			  PRINT_INFOR.CHANG = 0;
			  while(PRINT_INFOR.CHANG < pt->showtime[pt->plan]);
			  break;
			}
		}
   }
}
#endif
/*****************************************************************************************************************************************************
*LED屏从右到左添加列=逐列显示
*****************************************************************************************************************************************************/
#ifdef PRINT_L_LIE
void print_l_lie(struct windows xdata *pt) //new
{
    uchar data   ii=0;
	uchar data   DATA;
    uchar xdata  *data ptr_s, *ptr_d;
	while(1)
	{
		if(comtimeout != 0) break;
			/*数据搬家开始*/
		if(PRINT_INFOR.SWAP == SWAP_PRINT1)
		{
			ptr_s = &pt->PRINT1_R[0][0];
			ptr_d = &pt->PRINT2_R[0][0];
			movedata(ptr_s,ptr_d,&pt->PRINT2_R[HANGDIP][0]);	//调用汇编全屏拷贝数据
		}
		else
		{
			ptr_s = &pt->PRINT2_R[0][0];
			ptr_d = &pt->PRINT1_R[0][0];
			movedata(ptr_s,ptr_d,&pt->PRINT1_R[HANGDIP][0]);	//调用汇编全屏拷贝数据
		 }
		/*数据搬家结束*/
		if(PRINT_INFOR.SWAP == SWAP_PRINT1)
		{
			for(ii=0; ii<HANGDIP; ii++)			//装载一行数据
			 {
		 		ptr_s = &pt->printbuf[pt->plan][ii*(LIEDIP/8)];	//得到对应行的首地址
				ptr_s += (LIEDIP/8 - 1);
				ptr_s -= pt->lie;
				DATA = 0x01<<pt->bit_cont;
				if(DATA & *ptr_s) pt->PRINT2_R[ii][LIEDIP/8-1-pt->lie] |= DATA;
				   else	pt->PRINT2_R[ii][LIEDIP/8-1-pt->lie] &= ~DATA;
			 }
		}
		if(PRINT_INFOR.SWAP == SWAP_PRINT2)
		{
			for(ii=0; ii<HANGDIP; ii++)			//装载一行数据
			 {
		 		ptr_s = &pt->printbuf[pt->plan][ii*(LIEDIP/8)];	//得到对应行的首地址
				ptr_s += (LIEDIP/8 - 1);
				ptr_s -= pt->lie;
				DATA = 0x01<<pt->bit_cont;
				if(DATA & *ptr_s) pt->PRINT1_R[ii][LIEDIP/8-1-pt->lie] |= DATA;
				   else	pt->PRINT1_R[ii][LIEDIP/8-1-pt->lie] &= ~DATA;
			 }
		}
		//通知打印换页
		changpage(pt);

		if(++pt->bit_cont == 8)
		{
		    pt->bit_cont = 0;
			if(++pt->lie == LIEDIP/8)
			{
				  PRINT_INFOR.CHANG = 0;
				  while(PRINT_INFOR.CHANG < pt->showtime[pt->plan]);
				  break;
			}
		}
	}
}
#endif
/*****************************************************************************************************************************************************
*LED屏右移动扫描方式	ok
*****************************************************************************************************************************************************/
#ifdef PRINT_R
void print_r(struct windows xdata *pt) //new
{
    uchar data   ii=0;
	uchar data   DATA;
    uchar xdata  *data ptr_s, *ptr_d;
	while(1)
	{
		if(comtimeout != 0) break;
		/*数据搬家开始*/
		if(PRINT_INFOR.SWAP == SWAP_PRINT1)
		{
			ptr_s = &pt->PRINT1_R[0][0];
			ptr_d = &pt->PRINT2_R[0][0];
			movedata_r(ptr_s,ptr_d,&pt->PRINT2_R[HANGDIP][0]);	//调用汇编全部拷贝数据
		}
		else
		{
			ptr_s = &pt->PRINT2_R[0][0];
			ptr_d = &pt->PRINT1_R[0][0];
			movedata_r(ptr_s,ptr_d,&pt->PRINT1_R[HANGDIP][0]);	//调用汇编全部拷贝数据
		}
		/*数据搬家结束*/
		if(PRINT_INFOR.SWAP == SWAP_PRINT1)
		{
			for(ii=0; ii<HANGDIP; ii++)			//装载一行数据
			 {
		 		ptr_s = &pt->printbuf[pt->plan][ii*(LIEDIP/8)];	//得到对应行的首地址
				ptr_s += (LIEDIP/8 - 1);
				ptr_s -= pt->lie;
				DATA = *ptr_s;
				DATA >>= pt->bit_cont;
				if(DATA & 0x01) pt->PRINT2_R[ii][0] |= 0x80;
				   else	pt->PRINT2_R[ii][0] &= 0x7f;
			 }
		}
		if(PRINT_INFOR.SWAP == SWAP_PRINT2)
		{
			for(ii=0; ii<HANGDIP; ii++)			//装载一行数据
			 {
		 		ptr_s = &pt->printbuf[pt->plan][ii*(LIEDIP/8)];	//得到对应行的首地址
				ptr_s += (LIEDIP/8 - 1);
				ptr_s -= pt->lie;
				DATA = *ptr_s;
				DATA >>= pt->bit_cont;
				if(DATA & 0x01) pt->PRINT1_R[ii][0] |= 0x80;
				   else	pt->PRINT1_R[ii][0] &= 0x7f;
			 }
		}
		//通知打印换页
		changpage(pt);

		if(++pt->bit_cont == 8)
		{
		    pt->bit_cont = 0;
			if(++pt->lie == LIEDIP/8)
			{
			  PRINT_INFOR.CHANG = 0;
			  while(PRINT_INFOR.CHANG < pt->showtime[pt->plan]);
			  break;
			}
		}
   }
}
#endif
/*****************************************************************************************************************************************************
*LED屏从左到右添加列=逐列显示
*****************************************************************************************************************************************************/
#ifdef PRINT_R_LIE
void print_r_lie(struct windows xdata *pt) //new
{
    uchar data   ii=0;
	uchar data   DATA;
    uchar xdata  *data ptr_s, *ptr_d;
	while(1)
	{
			/*数据搬家开始*/
		if(comtimeout != 0) break;
		if(PRINT_INFOR.SWAP == SWAP_PRINT1)
		{
			ptr_s = &pt->PRINT1_R[0][0];
			ptr_d = &pt->PRINT2_R[0][0];
			movedata(ptr_s,ptr_d,&pt->PRINT2_R[HANGDIP][0]);	//调用汇编全屏拷贝数据
		}
		else
		{
			ptr_s = &pt->PRINT2_R[0][0];
			ptr_d = &pt->PRINT1_R[0][0];
			movedata(ptr_s,ptr_d,&pt->PRINT1_R[HANGDIP][0]);	//调用汇编全屏拷贝数据
		}

		/*数据搬家结束*/
		if(PRINT_INFOR.SWAP == SWAP_PRINT1)
		{
			for(ii=0; ii<HANGDIP; ii++)			//装载一行数据
			 {
		 		ptr_s = &pt->printbuf[pt->plan][ii*(LIEDIP/8)];	//得到对应行的首地址
				ptr_s += pt->lie;
				DATA = 0x80>>pt->bit_cont;
				if(DATA & *ptr_s) pt->PRINT2_R[ii][pt->lie] |= DATA;
				   else	pt->PRINT2_R[ii][pt->lie] &= ~DATA;
			 }
		}
		if(PRINT_INFOR.SWAP == SWAP_PRINT2)
		{
			for(ii=0; ii<HANGDIP; ii++)			//装载一行数据
			 {
		 		ptr_s = &pt->printbuf[pt->plan][ii*(LIEDIP/8)];	//得到对应行的首地址
				ptr_s += pt->lie;
				DATA = 0x80>>pt->bit_cont;
				if(DATA & *ptr_s) pt->PRINT1_R[ii][pt->lie] |= DATA;
				   else	pt->PRINT1_R[ii][pt->lie] &= ~DATA;
			 }
		}
		//通知打印换页
		changpage(pt);

		if(++pt->bit_cont == 8)
		{
		    pt->bit_cont = 0;
			if(++pt->lie == LIEDIP/8)
			{
				PRINT_INFOR.CHANG = 0;
				while(PRINT_INFOR.CHANG < pt->showtime[pt->plan]);
				break;
			}
		}
   }
}
#endif

⌨️ 快捷键说明

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