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

📄 lcd_part_12864j.c

📁 C51单片机对st7920并行方式驱动128*64液晶驱动,实现任意位置坐标位置写入图片;自动画线;自动画圆;任意位置反显等功能。
💻 C
📖 第 1 页 / 共 2 页
字号:
				{
			    case 0:				//processing start data 
					if(xstd > 8)
					{
						if(xsdl > 8)			   	//开始位置LCD原始数据大于8bit,
						{							//st7920 横向为16bit数据,数据需读两次
							B = sd1;			   	//开始位置LCD原始数据(0-7)
							gcount = 8;
							xsdl = xsdl - 8;
						}
						else
						{	
							B = sd2;			   	//开始位置LCD原始数据(8-15)
							gcount = xsdl;
							dstate = 1;
						}
					}
					else
					{
						B = sd1;				   	//开始位置LCD原始数据(0-7)
						gcount = xsdl;
						dstate = 1;
					}
					break;
			      	
			    case 1:				//processing data
					if(dlen > 8)
					{
						 B = Byte[bcount];							  //写入8bit数据处理
						 dlen = dlen - 8;
						 gcount = 8;
						 bcount++;
					}
					else
					{
						 B = Byte[bcount];							   //写入数据不足8bit结尾处理
						 gcount = dlen;
						 if(ovxend > 128)
						 	bcount = bcount + ((ovxend - 128)/8);	   //大于128bit的数据组需要跳读才能正常显示
						 bcount++;									   //横向多出部分进行消隐
						 dstate = 2;
					}
					break;
			      	
			    case 2:				//processing end data 
					if(xetd > 8)
					{
						if(xedl > 8)
						{
							temp1 = 16 - xedl;			//结尾位置LCD原始数据大于8bit,
							B = ed1;					//st7920 横向为16bit数据,数据需读两次
							B = B << temp1;		 		//结尾位置LCD原始数据(0-7)
							gcount = xedl - 8;
							xedl = 0;
						}
						else
						{
							gcount = 0;					//结尾位置LCD原始数据(8-15)
							g = tlen + 1;				//jumping Out the writing lcd's data program
							dstate = 0;					//由于结尾原始数据无需修改,直接跳出
						}
					}
					else
					{
						temp1 = 8 - xedl;				//结尾位置LCD原始数据小于8bit(8-15)
						B = ed2;
						B = B << temp1;
						gcount = xedl;
						dstate = 0;
					}
			        break;
				default:
					break;
				}
			}
//-------------------------------------------------------
// Target's data process
			if(gcount != 0)
			{
				switch (g1)				//击中目标!!
				{
			    case 7:
					P0_7 = B_7;
					g1--;
					break;
			    case 6:
					P0_6 = B_7;
					g1--;
					break;
			    case 5:
					P0_5 = B_7;
					g1--;
					break;
			    case 4:
					P0_4 = B_7;
					g1--;
					break;
				case 3:
					P0_3 = B_7;
					g1--;
					break;
				case 2:
					P0_2 = B_7;
					g1--;
					break;
				case 1:
					P0_1 = B_7;
					g1--;
					break;
				case 0:
					P0_0 = B_7;
					wr_lcd(dat,P0);		//writing lcd's data
					g1 = 7; 
					break;
				 }

//-------------------------------------------------------
// Open fire
							
				B = B << 1;			//move data; 开枪!!
				gcount--;
				g++;
			}
		}
	}
//-------------------------------------------------------
// Complete writing lcd's data task
	wr_lcd (comm,DISPLAY_ON);
	return error;
}


/******************************************************************************************
* 函数名称    :lcd_china 
* 功能描述    :LCD中文显示函数,汉字显示从左上角0位开始,总共显示32个字,中文两个字节,
*				英文只有1个字节,所以英文个数要偶数个才能正常显示,奇数个加空格。
* 参数        :  参数名称:	输入/输出   	类型		        描述
*					*chn		  input			uchar		ASCII数据组,最大32汉字
* 返回值      :
* 作者        :lujian
* 创建日期    :2003-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :0.0.2 			 修改人:lujian                  修改日期:2009-3-16
* 修改说明    :
******************************************************************************************/

void lcd_china(uchar code *chn)
{
  	uchar i, j, c;
	c = strlen(chn);
	wr_lcd(comm,FUN_MODE);
  	for(j=0;j<4;j++)
  	{
    	switch (j)
		{
	    case 0:
	      wr_lcd(comm,0x80); break;
	    case 1:
	      wr_lcd(comm,0x90); break;
	    case 2:
	      wr_lcd(comm,0x88); break;
	    case 3:
	      wr_lcd(comm,0x98); break;
		 }
		for(i=0;i<16;i++)
		{
    		if(c > 0)
			{
				wr_lcd(dat,chn[j*16+i]);			 //writing lcd's data of ASCII
				c--;
			}
			else
			{
				wr_lcd(dat,0x20);
			}
		}
  	}
}

/******************************************************************************************
* 函数名称    :coundisplay 
* 功能描述    :反显函数,在lcd内任意范围反显,条件x1大于或等于x2,y1大于等于y2
* 参数        :  参数名称:	输入/输出   	类型		  描述
* 					  x1		  input			uchar   第一点行位置数据(0-127)
*					  y1		  input			uchar   第一点列位置数据(0-63)
* 					  x2		  input		    uchar   第二点位置数据(0-127)
*					  y2		  input			uchar   第二点位置数据(0-63)
* 返回值      :
* 作者        :lujian
* 创建日期    :2003-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    :0.0.2 			 修改人:lujian                  修改日期:2009-3-16
* 修改说明    :
******************************************************************************************/

bit coundisplay(uchar x1, uchar y1, uchar x2, uchar y2)
{
	uchar xrange, dc, gcount, g, g1, temp1, yt, TDATA;
	uchar dstate, start, end, xetd, tlen;
	uchar cdata[16];

//-------------------------------------------------------
// Boundary detection

	if(x1 > x2 || x1 > 127 || x2 > 127)
	{
		return FALSE;
	}

	if(y1 > y2 || y1 > 63 || y2 > 63)
	{
		return FALSE;
	}

	wr_lcd(comm,DISPLAY_OFF);						//Entry mode set

	xrange = x2 - x1 + 1;
	start = (x1 /16)*16;
	xetd = x2 % 16;

	if(xetd!=0)
		xetd = 16 - xetd;
	end = x2 + xetd;

	tlen = end - start;

//-------------------------------------------------------

//main program

//-------------------------------------------------------

	for(yt = y1;yt < (y2+1); yt++)
	{	
		dc = 0;
		gcount = 0;
		dstate = 0;
		g = start;
		g1 = 7;
		B = 0xff;

		temp1 = x1 /16;						//Reading the start data form lcd.
		XYadr(temp1,yt);
		rd_lcd();

		while(g <= x2)
		{
			if(gcount == 0)					//data empty!!装货物!!
			{
			   TDATA = rd_lcd();			//read lcd's data
			   gcount = 8;
			}
			if(g >= x1 && g <= x2)
			{
				switch (g1)
				{
			    case 7:
					ACC = TDATA;
					B_7 = ACC_7;
					g1--;
					break;
			    case 6:
					ACC = TDATA;
					B_6 = ACC_7;
					g1--;
					break;
			    case 5:
					ACC = TDATA;
					B_5 = ACC_7;
					g1--;
					break;
			    case 4:
					ACC = TDATA;
					B_4 = ACC_7;
					g1--;
					break;
				case 3:
					ACC = TDATA;
					B_3 = ACC_7;
					g1--;
					break;
				case 2:
					ACC = TDATA;
					B_2 = ACC_7;
					g1--;
					break;
				case 1:
					ACC = TDATA;
					B_1 = ACC_7;
					g1--;
					break;
				case 0:
					ACC = TDATA;
					B_0 = ACC_7;
					cdata[dc] = ~B;			//save counter data; 每满8个打包货物(在此数据取反)
					dc++;
					g1 = 7; 
					break;
				 }
			}
			TDATA = TDATA << 1;				//move data;
			gcount--;
			g++;
		}
		if(g1 != 7)
		{
			cdata[dc] = ~B;					//save Less than 8 bits of counter data; 打包不足8个的货物(在此数据取反)
		}
		lcd_display(cdata, x1, yt, xrange, 1);		//writing counter data; 重写打包数据(即需要反显的数据)
	}	 

//-------------------------------------------------------
// Complete writing lcd's data task
	return TRUE;
}

⌨️ 快捷键说明

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