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

📄 lcd.c

📁 三星的S3C44B0X用IO口驱动LCD240128...对初学者比较有用。
💻 C
📖 第 1 页 / 共 2 页
字号:
			{
				if((lcmRead(1)& 0x08) == 0x08)
				break;
			}
		return i;                             // 若返回零,说明错误
	}

U8 fnST6(void)                       // 状态位ST6判断(屏读/屏拷贝状态)
	{
		U8 i;

		for(i=10;i>0;i--)
			{
				if((lcmRead(1)& 0x40) == 0x40)
					break;
			}
				return i;                                // 若返回零,说明错误
	}

U8 fnPR1(U8 uCmd,U8 uPar1,U8 uPar2) // 写双参数的指令
	{
		if(fnST01() == 0)
			return 1;
		lcmWrite(0,uPar1);
		if(fnST01() == 0)
			return 2;
		lcmWrite(0,uPar2);
		if(fnST01() == 0)
			return 3;
		lcmWrite(1,uCmd);
		return 0;                            // 返回0成功
	}

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

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

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

U8 fnPR2(void)                   // 读数据
	{
		if(fnST01() == 0)
			return 1;
		return lcmRead(0);
	}

// 设置当前地址
void fnSetPos(U8 urow, U8 ucol)
	{
		U8 iPos;

		iPos = urow * 30 + ucol;
		fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
		gCurRow = urow;
		gCurCol = ucol;
	}

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

// 清屏
void cls(U8 uData)
	{
		U16  i;
		U8 j;

		fnPR1(LC_ADD_POS,0x00,0x00);    // 置地址指针
		fnPR12(LC_AUT_WR);       // 自动写
		for(i=0;i<240*30;i++)
			{
				while ((j=fnST3())==0);
				fnPR13(uData);       // 写数据
			}
		fnPR12(LC_AUT_OVR);      // 自动写结束
		//fnPR1(LC_ADD_POS,0x00,0x00);    // 重置地址指针
		//gCurRow = 0;            // 置地址指针存储变量
		//gCurCol = 0;
	}
void cls2(void)
	{
		U16  i;
		fnPR1(LC_ADD_POS,0x00,0x00);    // 置地址指针
		fnPR12(LC_AUT_WR);       // 自动写
		for(i=0;i<0x80;i++)
			{
				fnST3();
				fnPR13(i);       // 写数据
			}
		fnPR12(LC_AUT_OVR);      // 自动写结束
		//fnPR1(LC_ADD_POS,0x00,0x00);    // 重置地址指针
		//gCurRow = 0;            // 置地址指针存储变量
		//gCurCol = 0;
	}

// LCM 初始化
U8 fnLCMInit(void)
	{
		rPDATC = 0x0000;	//All IO is low
		rPCONC = 0x5f555555;	
		rPUPC  = 0x3000;	//PULL UP RESISTOR should be enabled to I/O

		//PORT D GROUP
		/*  PORT D GROUP(I/O OR LCD)										*/
		/*  BIT7		6		5		4		3		2		1		0	*/
		/*  VF			VM		VLINE	VCLK	VD3		VD2		VD1		VD0	*/
		/*	01			01		01		01		01		01		01		01	*/
		rPDATD= 0x00;
		rPCOND= 0x5555;	
		rPUPD = 0x00;

	//	lcmDelay (100);

		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) 显示函数
void dprintf(U8 *fmt, ...)
	{
//U8 tmpBuf[64];   
//U8 i,j,uLen,uRow,uCol;
//				uRow = fnGetRow();
//				uCol = fnGetCol();

		
		U8 c1,c2,cData;
		U8 tmpBuf[64];           // LCD显示数据缓冲区
		U8 i=0,j,uLen,uRow,uCol;
		U16 k;
		
		va_list arg_ptr;
		va_start(arg_ptr, fmt);
		uLen = (U8)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 + -