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

📄 l240128.c

📁 液晶屏分为8行15列汉字源代码程序。 本例程未使用6963的文本模式
💻 C
📖 第 1 页 / 共 2 页
字号:
	}
	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)
					{
					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 + -