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

📄 lcm320240.c

📁 驱动CE320240液晶显示器
💻 C
📖 第 1 页 / 共 2 页
字号:
    WriteDataLCM(OvlayP1);      //写入P1参数,L1,L2,L3简单或合成 
	delay_1us();

	WriteCommandLCM(CsrForm);   //写入光标形状设定指令 
    WriteDataLCM(CsrFormP1);    //写入P1参数 8列 
    WriteDataLCM(CsrFormP2);    //写入P2参数 8行 
	delay_1us();
    }

void LCMClear(void)
{   
    uint i=0;
	WriteCommandLCM(CsrDirR); 
	delay_1us(); 

	WriteCommandLCM(CsrW); 
    WriteDataLCM(0x00); 
    WriteDataLCM(0x00); 
	delay_1us();

	WriteCommandLCM(mWrite);

    for(i=0;i<32768;i++)
       WriteDataLCM(0x00);   /* 写入数据 */
	      
    delay_1us();
    }



/*====================================================
;  绘点子程序,携入参数X坐标的最高位决定写或擦点
 ====================================================*/
void Point(uint Px, uchar Py, uchar attr )
{
    uint tempPtr;
    uchar tempD,tempP;
		
	tempPtr = (uint)Py * paraP9 + (Px & 0x7fff)/8;	// 去除最高位(显示属性)
	WriteCommandLCM( CsrDirDn );						// CSRDIR 代码(光标自动下移)
	WriteCommandLCM( CsrW );							// 设置光标地址
	WriteDataLCM( (uchar)(tempPtr & 0xff) );
	WriteDataLCM( (uchar)(tempPtr /256) );
	WriteCommandLCM( mRead );						// 读显示ram指令
	tempD = ReadDataLCM();					// 读取当前显示数据
	tempP = 1<<(uchar)(7-(Px&0x0007));
	 
// 根据预定属性决定写点或擦除
	if( attr )tempD |= tempP;	// 画点
	else tempD &= ~tempP;				// 消点

	WriteCommandLCM( CsrW );						// 重新设置光标地址
	WriteDataLCM( (uchar)(tempPtr & 0xff) );
	WriteDataLCM( (uchar)(tempPtr /256) );
	WriteCommandLCM( mWrite );						// 代码0x42,数据写入指令
	WriteDataLCM( tempD );							// 写入合成数据
}

/*=====================================================
                       画边框8*8格
=====================================================*/
void DrawRim(void)
{   uchar i,j;
    Locatexy(0,0,0); //设置光标地址为(0,0)
	WriteCommandLCM(CsrDirR);  
	WriteCommandLCM(mWrite); 
	for(i=0;i<30;i++)
	   WriteDataLCM(0xFF);
    Locatexy(29,1,0);
	WriteCommandLCM(CsrDirDn);
	WriteCommandLCM(mWrite); 
	for(i=0;i<238;i++)
	   WriteDataLCM(0x01);
    Locatexy(29,239,0);
	WriteCommandLCM(CsrDirL);
	WriteCommandLCM(mWrite); 
    for(i=0;i<30;i++)
	   WriteDataLCM(0xFF);
    Locatexy(0,238,0);
	WriteCommandLCM(CsrDirUp);
	WriteCommandLCM(mWrite); 
	for(i=0;i<238;i++)
	   WriteDataLCM(0x80);
    for(i=30;i<240;i=i+30)
	 for(j=1;j<=238;j++)
	 {if((i==120)&&(j%2==0))
         Point(i,j,1);
      else if(j%6==0)
	     Point(i,j,1);
      //else Point(i,j,0);
	  }
    for(i=30;i<240;i=i+30)
	 for(j=1;j<=238;j++)
	 {if((i==120)&&(j%2==0))
         Point(j,i,1);
      else if(j%6==0)
	     Point(j,i,1);
      //else Point(i,j,0);
	  }
    }

/************************************************/
/*画圆。数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2		*/
/************************************************/

void circle(uint Ox,uchar Oy,uchar Rx,uchar attr)
{
	uint xx,rr,xt,yt,rs,col,row;
	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--;
		col=Ox+xt;		//第一象限
		row=Oy-yt;
		Point(col,row,attr);
		col=Ox-xt;		//第二象限
		Point(col,row,attr);
		row=Oy+yt;		//第三象限
		Point(col,row,attr);
		col=Ox+xt;		//第四象限
		Point(col,row,attr);

/***************45度镜象画另一半***************/

		col=Ox+yt;		//第一象限
		row=Oy-xt;
		Point(col,row,attr);
		col=Ox-yt;		//第二象限
		Point(col,row,attr);
		row=Oy+xt;		//第三象限
		Point(col,row,attr);
		col=Ox+yt;		//第四象限
		Point(col,row,attr);
	}
}
/*
//============================== 西文显示演示程序 ==============================
// 仅仅用于文本方式下的西文字符串显示,本函数只写入第3显示区

void TextDisp( uchar Ox,uchar Oy, uchar  *ptr ) 
{
    uchar TexLength=0,ii;
    uint iTemp;

	while(ptr[TexLength]>0x1f) {TexLength++;};   // 获取字串长度

	iTemp = Oy*paraP9+Ox;
	WriteCommandLCM( CsrForm );		// 光标形状设置,代码0x5d
	WriteDataLCM( 0x07 );				// 设置光标水平点为CSX=8
	WriteDataLCM( 0x07 );				// 光标为块状形式,垂直点为CSY=8

	WriteCommandLCM( Ovlay );			// 显示合成方式设置.代码0x5b
	WriteDataLCM( 0x01 );				// 设置参数:显示3区为文本属性,二重xor合成

	WriteCommandLCM( DispOn );			// 写入指令DISP ON/OFF代码,后续参数:
	WriteDataLCM( 0x56 );				// 01 01 01 10显示1~4区开显示,光标闪烁显示
	
	iTemp = (uint)Oy * paraP9 + Ox;			    // 光标位置到实际ram地址换算
	
	WriteCommandLCM( CsrDirR );					// 自动右移光标指向
	
	WriteCommandLCM( CsrW );						// 制定光标位置
	WriteDataLCM( (uchar)(iTemp &0xff) );			// 设置光标地址CSR
	WriteDataLCM( (uchar)(iTemp /256 + BasePart3) );	// 加入显示三区起始地址SAD2H

	WriteCommandLCM( mWrite );						// 当前位置写入数据指令

	for(ii=0;ii < TexLength;ii++) {

		WriteDataLCM( ptr[ii] );					// 写入显示字符代码
	}
	delay_nms(350);
}*/

/*=============================================================================
  ASCII(8*16) 及 汉字(16*16) 混合字符串显示函数	
  输入参数约定:
	x,y显示字符串的左上角xy坐标.x..8点一字节位置; y..一条扫描线定位
							
	*ptr...字符串指针,本函数所指的是flash字串
	att....显示区标志,0...第一区;1...第二区
  返回参数:输出字串长度,留意汉字一个算两个
  其它假定:调用时汉字必须在字库数组中已经存在,否则将输出不正确的结果
==============================================================================*/

/*uchar dprintf(uchar x,uchar y, char  *ptr, uchar att)
{

	uchar  c1,c2;
	uchar i,j,uLen,uRow,uCol,temp;
	uint  k;
	uRow = x;
	uCol = y;
	uLen=0;
	WriteCommandLCM( CsrDirDn ); 						// 光标移动方向定义:自动下移
	Locatexy(uRow,uCol,att);						//起点定位
	while ( (uchar)ptr[uLen] >= 0x10 ){uLen++;};	//探测字串长度
	i=0;
	while(i<uLen)
	{
		c1 = ptr[i];
		c2 = ptr[i+1];

//ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
		if(c1 <=128)								// ASCII
		{
			if (c1 >= 0x10)	{
				WriteCommandLCM( mWrite );				// 写数据(命令)
				for(j=0;j<16;j++) WriteDataLCM( ASC_MSK[(c1-0x20)*16 +j ]);
			}
			uRow++;									// 列数加1
		}
		else										// 中文
		{
			for(j=0;j<sizeof(Cdotlib)/sizeof(Cdotlib[0]);j++)	// 查找定位
			{
				if((c1 == Cdotlib[j].Index[0]) && (c2 == Cdotlib[j].Index[1]))
					break;
			}
			for(k=0;k<2;k++)						// 分16行输出
			{
				Locatexy(uRow+k,uCol,att);
				WriteCommand( mWrite );				// 写数据(命令)

				for(temp=0;temp<16;temp++) WriteData( Cdotlib[j].Msk[temp*2 + k]);
			}
			uRow +=2;								// 光标右移一大格
			i++;
		}
		if(uRow >= 40)								// 光标后移
		{
			uCol += 16;								// Y坐标
			uRow = 0;					    		// X坐标
			if( uCol >= 240 ) uCol = 0;
		}

		Locatexy(uRow,uCol,att);
		i++;
	}
	return uLen;									//返回字串长度,汉字按2字节计算
}
*/



/*==============================================================================
; 汉字写入子程序(图形方式)。每次调用输出一个汉字
; 支持图形方式使用,完成汉字点阵码的输出。
; 携入参数: Ox,Oy....写入显示的左上角坐标,Ox是以字节单位,Oy以行扫描线单位
			Ptr......汉字码,库内的排列编码,大型程序时请改用unsigned int类型
; 无返回数据。
 ==============================================================================*/
void PutCdotInGraph( uint Ox, uchar Oy, uchar Cnumber, uchar DotWidth )
{
    uint tempPtr,Optr;
    uchar tempCount1,tempCount2,nByte;
		
	Optr = (uint)Oy * paraP9 + Ox;
	nByte = DotWidth/8;
	WriteCommandLCM( CsrDirDn );						// 自动右移。
	tempPtr = (uint)Cnumber * DotWidth*nByte;

	for (tempCount1=0;tempCount1<nByte;tempCount1++) {

		WriteCommandLCM( CsrW );						// 光标定位指令
		WriteDataLCM( (uchar)(Optr &0xFF) );		// 设置光标地址CSR
		WriteDataLCM( (uchar)(Optr /256 ) );
		WriteCommandLCM( mWrite );						// ram写指令
		
		switch(DotWidth){

			case 16:	for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
						WriteDataLCM( Cdotlib[Cnumber][tempCount2*2+tempCount1] );		// 写入数据
						}
						break;
			case 24:	for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
						WriteDataLCM( Cdot24lib[tempPtr] );		// 写入数据
						tempPtr += nByte;
						}
						break;
		}
		tempPtr = Cnumber * DotWidth*nByte + tempCount1 + 1;
		Optr++;
	}
}

/*============================================================================
 光标位定位,用于在1区图形方式下。
 输入参数约定:	x...水平方向字节单位坐标,即可以以半个汉字宽度设定水平坐标。
 				y...垂直方向以行线定位的坐标,可以定位到点单位。
				左上角约定坐标为( 0, 0 )

 ============================================================================*/
void Locatexy(uchar x,uchar y, uchar attribs) 
{
    uint temp;
	temp = (uint)y*paraP9+x;
	if(attribs)temp += BasePart2*256;	 // 如果需要就指向第二区,加上第二区首地址
	WriteCommandLCM( CsrW );				// 光标Locate,定位
	WriteDataLCM( (uchar)(temp & 0xff) );	// 写入参数CSRL设置参数光标指针低8位
	WriteDataLCM( (uchar)(temp /256 ) );	// 写入参数CSRH设置参数光标指针高8位
}

/*************************************
              延时函数       
*************************************/

void delay_1us(void)
{
    asm("nop"); 
    asm("nop"); 
    asm("nop"); 
    asm("nop"); 
    asm("nop"); 
    asm("nop"); 
    asm("nop"); 
    asm("nop");
    }

void delay_nus(uint n)
{
   for(;n>0;n--)
      delay_1us();
	} 

void delay_nms(uint n)
{
    for(;n>0;n--)
	   delay_nus(1000);
    }

void delay_ns(uint n)
{
    for(;n>0;n--)
	   delay_nms(1000);
	}

⌨️ 快捷键说明

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