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

📄 yejingqudong.txt

📁 用89C52制作恒流源
💻 TXT
📖 第 1 页 / 共 2 页
字号:
/************************************************/
/* 状态位STA1,STA0判断(读写指令和读写数据)	*/
/* 在读写数据或者写入命令前必须保证均为1	*/
/************************************************/
uchar fnSTA01(void)			
{
	uchar i;
	
	for(i=10;i>0;i--)
	{
		if((Comm_Port & 0x03) == 0x03)		// 读取状态
			break;
	}
	return i;					// 若返回零,说明错误
}

/********************************************************/
/*检查STA2,如果 STA2=1 为自动读状态			*/
/********************************************************/
uchar fnSTA2(void)
{
	uchar i;
	
	for(i=10;i>0;i--)
	{
		if((Comm_Port & 0x04) == 0x04)
			break;
	}
	return i;					// 若返回零,说明错误
}

/********************************************************/
/* 状态位STA3判断(STA3 = 1 数据自动写状态)		*/
/********************************************************/
uchar fnSTA3(void)
{
	uchar i;
	
	for(i=10;i>0;i--)
	{
		if((Comm_Port & 0x08) == 0x08)
			break;
	}
	return i;					// 若返回零,说明错误
}

/********************************************************/
/* 状态位STA6判断(STA6 =1 屏读/屏拷贝状态)		*/
/********************************************************/
uchar fnSTA6(void)
{
	uchar i;
	
	for(i=10;i>0;i--)
	{
		if((Comm_Port & 0x40) == 0x40)
			break;
	}
	return i;					// 若返回零,说明错误
}

/********************************************************/
/* 写双参数的指令					*/
/********************************************************/
uchar fnPR1(uchar uCmd,uchar uPar1,uchar uPar2)
{
	if(fnSTA01() == 0)
		return 1;
	Data_Port = uPar1;
	if(fnSTA01() == 0)
		return 2;
	Data_Port = uPar2;
	if(fnSTA01() == 0)
		return 3; 
	Comm_Port = uCmd;
	return 0;					// 返回0成功
}

/********************************************************/
/* 写单参数的指令					*/
/********************************************************/
uchar fnPR11(uchar uCmd,uchar uPar1)
{
	if(fnSTA01() == 0)
		return 1;
	Data_Port = uPar1;
	if(fnSTA01() == 0)
		return 2;
	Comm_Port = uCmd;
	return 0;					// 返回0成功
}

/********************************************************/
/* 写无参数的指令					*/
/********************************************************/
uchar fnPR12(uchar uCmd)
{
	if(fnSTA01() == 0)
		return 1;
	Comm_Port = uCmd;
	return 0;					// 返回0成功
}

/********************************************************/
/*  写数据						*/
/********************************************************/
uchar fnPR13(uchar uData)
{
	if(fnSTA3() == 0)
		return 1;
	Data_Port = uData;
	return 0;					// 返回0成功
}

/********************************************************/
/* 读数据						*/
/********************************************************/
uchar fnPR2(void)
{
	if(fnSTA01() == 0)return 1;			// 获取状态,如果状态错
	return Data_Port;					// 返回数据
}

/********************************************************/
/* 设置当前地址						*/
/********************************************************/
void fnSetPos(uchar urow, uchar ucol)
{
	uint  iPos;
	iPos = urow * 30 + ucol;
	fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
	gCurRow = urow; 
	gCurCol = ucol;
}

/********************************************************/
/* 设置当前显示行、列					*/
/********************************************************/
void cursor(uchar uRow, uchar uCol)
{
	fnSetPos(uRow * 16, uCol);
}

/********************************************************/
/* 清屏							*/
/********************************************************/
void cls(void)
{
	uint  i;

	fnPR1(LC_ADD_POS,0x00,0x00);	// 置地址指针为从零开始
	fnPR12(LC_AUT_WR);				// 自动写
	for(i=0;i<240*128/8;i++)		// 清一屏
	{
		fnSTA3();
		fnPR13(0x00);				// 写数据,实际使用时请将0x55改成0x0
	}
	fnPR12(LC_AUT_OVR);				// 自动写结束
	fnPR1(LC_ADD_POS,0x00,0x00);	// 重置地址指针
	gCurRow = 0;					// 置地址指针存储变量
	gCurCol = 0;
}

/********************************************************/
/* LCM 初始化						*/
/********************************************************/
char LCMInit(void)
{
	if(fnPR1(LC_TXT_STP,0x00,0x00) != 0)	// 文本显示区首地址
	return (0xff);
	fnPR1(LC_TXT_WID,0x1E,0x00);			// 文本显示区宽度
	fnPR1(LC_GRH_STP,0x00,0x00);			// 图形显示区首地址
	fnPR1(LC_GRH_WID,0x1E,0x00);			// 图形显示区宽度
	fnPR12(LC_CUR_SHP | 0x01);				// 光标形状
	fnPR12(LC_MOD_OR);						// 显示方式设置
	fnPR12(LC_DIS_SW | 0x08);				// 显示开关设置
	
	return 0;
}

/********************************************************/
/* ASCII(8*16) 及 汉字(16*16) 显示函数			*/
/********************************************************/
uchar dprintf(uchar x,uchar y, char *ptr)
{
	unsigned char  c1,c2,cData;
	uchar i,j,uLen,uRow,uCol;
	uint  k;
    uLen=0;
    i=0;
	uRow = y;
	uCol = x;
	fnSetPos(uRow*16,uCol);				//起点定位
	while (ptr[uLen]!=0){uLen++;};		//探测字串长度

	while(i<uLen)
	{
		c1 = ptr[i];
		c2 = ptr[i+1];
//ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
		uRow = fnGetRow();		
		uCol = fnGetCol();
		if(c1 < 128)					// ASCII
		{
			for(j=0;j<16;j++)			//写16行
			{
				fnPR12(LC_AUT_WR);		// 写数据(命令)
				if (c1 >= 0x20)
				{
					if( j < (16-ASC_CHR_HEIGHT) )
						fnPR13(0x00);	// 写数据0输出空
					else
						fnPR13( ASC_MSK[(c1-0x20)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)] );
				}
				else
					fnPR13(cData);
					
				fnPR12(LC_AUT_OVR);	//写数据结束
                fnSetPos(uRow+j+1,uCol);
			}
			if(c1 != BS)			// 非退格
			uCol++;			// 列数加1
		}
		else						// 中文
		{
			for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)	// 查找定位
			{
				if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
					break;
			}
			for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
			{
				fnSetPos(uRow+k,uCol);
				fnPR12(LC_AUT_WR);			// 写数据
				if(j < sizeof(GB_16)/sizeof(GB_16[0]))
				{
					fnPR13(GB_16[j].Msk[k*2]);
					fnPR13(GB_16[j].Msk[k*2+1]);
				}
				else			// 未找到该字
				{
					if(k < sizeof(GB_16[0].Msk)/4)
					{
						fnPR13(0x00);
						fnPR13(0x00);
					}
					else
					{
						fnPR13(0xff);
						fnPR13(0xff);
					}
				}
				fnPR12(LC_AUT_OVR);
			}
			uCol += 2;
			i++;
		};
		if(uCol >= 30)			// 光标后移
		{
			uRow += 16;
			if(uRow < 0x80)
				uCol -= 30;
			else
			{
				uRow = 0;
				uCol = 0;
			}
		}
		fnSetPos(uRow,uCol);
		i++;
	}
	return uLen;				//返回字串长度,汉字按2字节计算
}	

/*==============================*/
/* 延时				*/
/*==============================*/
void shortdelay(uint tt)
{
    uchar i;
    while (tt)
   	{
        i=100;
        while (i--);
        tt--;
        }
}  
        
      
/****************************************/
/*	画点				*/
/****************************************/

/*void point(uchar x,uchar y,uchar s)
	{
	uchar	x1;
	x1=x>>3;			//取Y方向分页地址
	fnSetPos(y,x1);			//起点定位
        x1 = turnf[ x & 0x07 ];
	x1=0xF0|x1|s;			//字节内位置计算
	fnPR12(x1);			//画上屏幕,S显示属性8画点0擦除点
	}

*/
/************************************************/
/*画线。任意方向的斜线,直线数学方程 aX+bY=1	*/
/************************************************/
/*void Linexy(uchar x0,uchar y0,uchar xt,uchar yt,uchar s)
{
	register uchar t;
	int xerr=0,yerr=0,delta_x,delta_y,distance;
	int incx,incy,uRow,uCol;

	delta_x = xt-x0;				//计算坐标增量
	delta_y = yt-y0;
	uRow = x0;
	uCol = y0;
	if(delta_x>0) incx=1;				//设置单步方向
	else if( delta_x==0 ) incx=0;			//垂直线
		else {incx=-1;delta_x=-delta_x;}

	if(delta_y>0) incy=1;
	else if( delta_y==0 ) incy=0;			//水平线
		else {incy=-1;delta_y=-delta_y;}

	if( delta_x > delta_y )	distance=delta_x;	//选取基本增量坐标轴
	else distance=delta_y;

	for( t=0;t <= distance+1; t++ )
        	{					//画线输出
		point(uRow,uCol,s);			//画点
		xerr +=	delta_x	;
		yerr +=	delta_y	;
		
		if( xerr > distance )
                	{
			xerr-=distance;
			uRow+=incx;
			}
		if( yerr > distance )
                	{
			yerr-=distance;
			uCol+=incy;
			}
		}
}

*/
/************************************************/
/*画圆。数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2			*/
/***********************************************/

/*void circle(uchar Ox,uchar Oy,uchar Rx,uchar s)
{
	unsigned int xx,rr,xt,yt,rs,row,col;
	yt=Rx;
	rr=Rx*Rx+1;			//补偿 1 修正方形
	rs=(yt+(yt>>1))>>1;		//(*0.75)分开1/8圆弧来画
	for (xt=0;xt<=rs;xt++)
	{
		xx=xt*xt;
		while ((yt*yt)>(rr-xx))yt--;
		row=Ox+xt;		//第一象限
		col=Oy-yt;
		point(row,col,s);
		row=Ox-xt;		//第二象限
		point(row,col,s);
		col=Oy+yt;		//第三象限
		point(row,col,s);
		row=Ox+xt;		//第四象限
		point(row,col,s);

/***************45度镜象画另一半**************/
/*
		row=Ox+yt;		//第一象限
		col=Oy-xt;
		point(row,col,s);
		row=Ox-yt;		//第二象限
		point(row,col,s);
		col=Oy+xt;		//第三象限
		point(row,col,s);
		row=Ox+yt;		//第四象限
		point(row,col,s);
	}
}*/

⌨️ 快捷键说明

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