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

📄 iar240128.c

📁 点阵液晶模块
💻 C
📖 第 1 页 / 共 2 页
字号:
  	uchar i;
  
  	for(i=10;i>0;i--)
  	{
    		if((LCMCW & 0x40) == 0x40)
      		break;
  	}
  	return i;        		// 若返回零,说明错误
}

/********************************************************/
/* 写双参数的指令          				*/
/********************************************************/
uchar fnPR1(uchar uCmd,uchar uPar1,uchar uPar2)
{
  	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)
          			{
            				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 + -