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

📄 35.c

📁 这是我大学4年来做过的竞赛以及老师的科研项目所积累下来的c51源代码
💻 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(fnST01() == 0)
		return 1;
	LCMDW = uPar1;
	if(fnST01() == 0)
		return 2;
	LCMDW = uPar2;
	if(fnST01() == 0)
		return 3;
	LCMCW = uCmd;
	return 0;	                           // 返回0成功
}

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

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

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

uchar fnPR2(void)				               // 读数据
{
	if(fnST01() == 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*30;i++)
	{
		fnST3();
		fnPR13(0x00);				   // 写数据
	}
	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 -1;
	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(char *fmt, ...)
{
	va_list arg_ptr;
	char  c1,c2,cData;
	char tmpBuf[64];				       // LCD显示数据缓冲区
	uchar i=0,j,uLen,uRow,uCol;
	uint  k;
	
	va_start(arg_ptr, fmt);
	uLen = (uchar)vsprintf(tmpBuf, fmt, arg_ptr);
	va_end(arg_ptr);

	while(i<uLen)
	{
		c1 = tmpBuf[i];
		c2 = tmpBuf[i+1];
		uRow = fnGetRow();
		uCol = fnGetCol();
		if(c1 >= 0)
		{	                                    // ASCII
			if(c1 < 0x20)
			{
				switch(c1)
				{
					case CR:
					case LF:		                // 回车或换行
						i++;
						if(uRow < 112)
							fnSetPos(uRow+16,0);
						else
							fnSetPos(0,0);
						continue;
					case BS:		                  // 退格
						if(uCol > 0)
							uCol--;
						fnSetPos(uRow,uCol);
						cData = 0x00;
						break;
					default:		                   // 其他
						c1 = 0x1f;
				}
			}
			for(j=0;j<16;j++)
			{
				fnPR12(LC_AUT_WR);		            // 写数据
				if(c1 >= 0x1f)
				{
					if(j < (16-ASC_CHR_HEIGHT))
						fnPR13(0x00);
					else
						fnPR13(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]);
				}
				else
					fnPR13(cData);
				fnPR12(LC_AUT_OVR);
				fnSetPos(uRow+j+1,uCol);
			}
			if(c1 != BS)		                       // 非退格
				uCol++;
		}
		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;
}

void main(void)	                                // 测试用
{
	fnLCMInit();
	cls();
	cursor(0,0);
	dprintf("%s","This is a test:中文测试");
}

⌨️ 快捷键说明

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