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

📄 8.3-2.c

📁 单片机应用开发实例.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
	if(fnSTA01() == 0)
		return 1;
	LCMDW = uPar1;
	if(fnSTA01() == 0)
		return 2;
	LCMDW = uPar2;
	if(fnSTA01() == 0)
		return 3;
	LCMCW = uCmd;
	return 0;					             // 返回0成功
}

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

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

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

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

/********************************************************/
//设置当前地址						
/********************************************************/
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(0x0);		             //写数据,实际使用时请将0x55改成0x0
		}
	fnPR12(LC_AUT_OVR);		     //自动写结束
	fnPR1(LC_ADD_POS,0x00,0x00);	 // 重置地址指针
	gCurRow = 0;			             // 置地址指针存储变量
	gCurCol = 0;
}

/********************************************************/
//LCM 初始化						
/********************************************************/
char fnLCMInit(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)
{

	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)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);
	}
}
        
void main(void)	                     //测试用
{
	uchar i;
	shortdelay(1200);
	MCUCR |=BIT(SRE)|BIT(SRW);
	fnLCMInit();
	cls();
	cursor(0,0);
	dprintf(3,3,"This is a test: 中文测试");

	dprintf(0,6,"LCM Exsample use 90S8515&6963");
	dprintf(15,7,"~Xiaoqi~");
	Linexy(10,20,239,110,8);			// 画斜线1
	Linexy(10,20,217,1,8);				// 斜线2
	Linexy(239,110,217,1,8);			// 斜线3
	circle(185,45,40,8);				    // 画圆
	circle(185,45,41,8);				    // 画同心圆加粗
	shortdelay(24000);

	while(1)
        {
//变化圆演示,直径不断的变化,由大到小再由小到
//大来回缩放
		for (i=40;i>5;i--)
        	{
            circle(185,45,i+1,0);	  //擦除外圆
	    	circle(185,45,i,8);
    		circle(185,45,i-1,8);
		shortdelay(3600);
            	};

		shortdelay(8000);

		for (i=5;i<40;i++)
        	{
            	circle(185,45,i-1,0);	//擦除内圆
	    	circle(185,45,i,8);					
    		circle(185,45,i+1,8);
		shortdelay(1800);
            	};

		shortdelay(4000);

        };
}

⌨️ 快捷键说明

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