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

📄 1335c51.c

📁 1335液晶的光标控制
💻 C
📖 第 1 页 / 共 2 页
字号:
{
  	  
 
	  PutCdotInGraph(0,0,15,16);
    PutCdotInGraph(2,0,31,16);
    PutCdotInGraph(4,0,32,16);
    PutCdotInGraph(6,0,29,16);
    PutCdotInGraph(8,0,33,16);
    PutCdotInGraph(10,0,34,16);
    PutCdotInGraph(12,0,35,16);
    PutCdotInGraph(14,0,7,16);
	PutCdotInGraph(16,0,8,16);		
	PutCdotInGraph(18,0,11,16);		
	PutCdotInGraph(20,0,12,16);				  //第2行 



	
	PutCdotInGraph(0,32,26,16);			   // 通  
	PutCdotInGraph(2,32,27,16);			   //道 
 /*
    PutCdotInGraph(5,32,36,16);
    PutCdotInGraph(7,32,37,16);
	PutCdotInGraph(9,32,19,16);		 //标称 值  
*/
	PutCdotInGraph(14,32,38,16);
    PutCdotInGraph(16,32,7,16);
	dprintf(18,32,DanWei5);    			//实测值  


    PutCdotInGraph(26,24,21,16);
    PutCdotInGraph(28,24,22,16);
    PutCdotInGraph(26,40,23,16);
	dprintf(28,40,DanWei5);			  //绝对误差  

    PutCdotInGraph(34,24,25,16);
    PutCdotInGraph(36,24,22,16);
    PutCdotInGraph(34,40,23,16);	//相对误差  
	dprintf(36,40,DanWei4);

}

void PutWord24InGraph( void ) {	
//x坐标以半个汉字定位左起0开始计算
//y坐标以像素行定位,顶部0开始计算
//汉字码以点阵码列表所对应32字节位单位进界,从0开始计算

	PutCdotInGraph( 13, 100, 0, 24 );	// 调汉字写入子程序	 
	PutCdotInGraph( 16, 100, 1, 24 );	// 调汉字写入子程序	 
	PutCdotInGraph( 19, 100, 2, 24 );	// 调汉字写入子程序	 
	PutCdotInGraph(	22, 100, 3, 24 );	// 调汉字写入子程序	 
	PutCdotInGraph( 25, 100, 4, 24 );	// 调汉字写入子程序	 
	DelayMs(50);
}


//--------延时子程序--------------------------
void Delay( Uint tt ) {
	
	while( tt-- );
}

										// 显示三区闪烁

/*========================================================
;  直接访问方式的驱动子程序
;	程序口地址设置CWADD1,DWADD1,CRADD1,DRADD1
;	占用内部资源DAT1,A,COM
;	程序输入变量: DAT1,,COM
;===============直接访问方式驱动子程序==================*/
// 判忙标志BF子程序pr0
/*void WaitForBusy( void ) {
	
	while ( LcmStatusPort & Busy );
}
*/
//---------------------------
// 写指令代码子程序pr1
void WriteCommand( Uchar CommandByte ) {

	LcmCmdPort = CommandByte;
}

//---------------------------
// 写参数及显示数据子程序
void WriteData( Uchar dataW ) {

	LcmWdataPort = dataW;
}

//---------------------------
// 读参数及显示数据子程序
Uchar ReadDataLcm( void ) {

	return LcmRdataPort;
}

/*=====================================
 初始化子程序
======================================*/
void LcmInition( void ) {

Uchar i;
		
	WriteCommand( SystemSet );			// 系统参数设置
	for (i=0;i<8;i++) {				
		WriteData( ParaSysTable8[i] );	//
	}

	WriteCommand( Scroll ); 			//设定显示区域起始地址
	for (i=0;i<10;i++) {
		WriteData( ParaScrTableA[i] );
	}

	WriteCommand( HdotScr );		// 写入点位移指令代码
	WriteData( 0 );					// 写入P1参数
	WriteCommand( Ovlay );			// 显示合成方式设置
	WriteData( 0 );					// 0000 0100 显示一区文本,三区文本属性,二重"或"合成
	WriteCommand( CsrForm );		// 光标形状设置,代码0x5d
	WriteData( 0x07 );				// 设置光标水平点为CSX=8
	WriteData( 0x87 );				// 光标为块状形式,垂直点为CSY=8



}

/*============================================
 建立 cgram,将显示字符送入cgram中

  入口参数约定:Base.... 起始
=============================================*/
void BuildCgram( Uchar Base, Uchar EndlCode ) {

Uchar iCgram,ii,ij;

	WriteCommand( CgramAdr );		// CGRAMADR 代码
	WriteData( 0 );					// 设置SAG=0C000H
	WriteData( 0x70 );				// 汉字模在cgram中的编码0x70~0x73

	WriteCommand( CsrW );			// CSRW 代码,光标指针设置
	WriteData( 0 );					// 设置CSR=0C400H(字符代码=80H)
	WriteData( 0x74 );				// 汉字模在cgram中的编码0x70~0x73
	WriteCommand( CsrDirR );		// CSRDIR 代码
	WriteCommand( mWrite );			// 代码0x42,数据写入指令
	for (ii=0;ii<EndlCode;ii++){
		for (ij=0;ij<2;ij++){
			for (iCgram=0;iCgram<32;iCgram+=2) 
				WriteData( Cdotlib[Base+ii].Msk[ij+iCgram] );	// 将制定的数据块写入 cgram
		}
		
	}
}	
/*==============================================================================
; 汉字写入子程序(图形方式)。每次调用输出一个汉字			写入一区  
; 支持图形方式使用,完成汉字点阵码的输出。
; 携入参数: Ox,Oy....写入显示的左上角坐标,Ox是以字节单位,Oy以行扫描线单位
			Ptr......汉字码,库内的排列编码,大型程序时请改用unsigned int类型
; 无返回数据。
 ==============================================================================*/

void PutCdotInGraph( Uint Ox, Uchar Oy, Uchar Cnumber, Uchar DotWidth,Uchar attribs ) 
{

	Uint tempPtr,Optr;
	Uchar tempCount1,tempCount2,nByte;		
	Optr = (Uint)Oy * paraP9 + Ox;
	if(attribs)Optr += BasePart2*256;
	nByte = DotWidth/8;
	WriteCommand( CsrDirD );						// 自动右移。
	tempPtr = (Uint)Cnumber * DotWidth*nByte;

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

		WriteCommand( CsrW );						// 光标定位指令
		WriteData( (Uchar)(Optr &0xff) );		// 设置光标地址CSR
		WriteData( (Uchar)(Optr /256 ) );
		WriteCommand( mWrite );						// ram写指令
		
		switch(DotWidth)
		{

			case 16:	for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
						WriteData( Cdotlib[Cnumber].Msk[tempCount2*2+tempCount1] );		// 写入数据
						}
						break;
			case 24:	for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
						WriteData( Cdot24lib[tempPtr] );		// 写入数据
						tempPtr += nByte;
						}
						break;
		}
		tempPtr = Cnumber * DotWidth*nByte + tempCount1 + 1;
		Optr++;
	}
}
/*
void PutCdotInGraph( Uint Ox, Uchar Oy, Uchar Cnumber, Uchar DotWidth,Uchar attribs ) {

Uint tempPtr,Optr;
Uchar tempCount1,tempCount2,nByte;
		
	Optr = (Uint)Oy * paraP9 + Ox;
	nByte = DotWidth/8;
	WriteCommand( CsrDirD );						// 自动右移。


		if(attribs)Optr += BasePart2*256;
		WriteCommand( CsrW );						// 光标定位指令
		WriteData( (Uchar)(Optr &0xff) );		// 设置光标地址CSR
		WriteData( (Uchar)(Optr /256 ) );
		WriteCommand( mWrite );						// ram写指令
		
	
			for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
						WriteData( Cdotlib[Cnumber].Msk[tempCount2*2] );		// 写入数据
						}
					
	
		tempPtr = Cnumber * DotWidth*nByte + tempCount1 + 1;
		Optr++;	
		if(attribs)Optr += BasePart2*256;
		WriteCommand( CsrW );						// 光标定位指令
		WriteData( (Uchar)(Optr &0xff) );		// 设置光标地址CSR
		WriteData( (Uchar)(Optr /256 ) );
		WriteCommand( mWrite );						// ram写指令

		for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
						WriteData( Cdotlib[Cnumber].Msk[tempCount2*2+1] );		// 写入数据
						}

	}

 */
/*============================================================================
 汉字写入子程序(文本方式)
 在文本方式下显示汉字,	首先要建立汉字Cgram, 要定义汉字代码.
 在文本方式下写汉字需要写入4 个代码以组成一个汉字 
 每8字节组成一个点阵Ascii小区,4个小区组合成一个汉字所以需要4个代码
 ============================================================================*/
void PutCdotInAlpha( Uchar Ox, Uchar Oy, Uchar Cnumber) {

Uint tempPtr;
Uchar tempCount;
		
	tempPtr = (Uint)Oy * paraP9 + Ox;
	WriteCommand( CsrDirD );					// CSRDIR 代码(下移)

	for(tempCount=0;tempCount<2;tempCount++) {
		
	
		WriteCommand( CsrW );					// CSRW 代码,光标指针设置
		WriteData( (Uchar)(tempPtr &0xff) );	// 设置光标地址CSR
		WriteData( tempPtr /256 + BasePart3 );
		WriteCommand( mWrite );					// 代码0x42,数据写入指令

		WriteData( Cnumber++ );					// 写入汉字代码

		WriteData( Cnumber++ );					// 写入汉字代码
		tempPtr++;								// 修正光标地址
	}
}

/*======================== 清显示 32K RAM区(清屏)子程序 ======================*/

void LcmClear( void ) {

Uint i1=32768;

	WriteCommand( CsrDirR ); 			// 光标移动方向定义:自动右移
	WriteCommand( CsrW );				// 光标Locate,定位
	WriteData( 0 );						// 写入参数CSRL设置参数光标指针低8位
	WriteData( 0 );						// 写入参数CSRH设置参数光标指针高8位
	WriteCommand( mWrite );				// 数据写入指令,代码0x42
	while(i1--)	{

		WriteData( 0x0 );	// 写入数据0
	}
}

/*============================================================================
 光标位定位,用于在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;	// 如果需要就指向第二区,加上第二区首地址
	WriteCommand( CsrW );				// 光标Locate,定位
	WriteData( (Uchar)(temp & 0xff) );	// 写入参数CSRL设置参数光标指针低8位
	WriteData( (Uchar)(temp /256 ) );	// 写入参数CSRH设置参数光标指针高8位
}

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

	Uchar  c1,c2;
	Uchar i,j,uLen,uRow,uCol,temp;
	Uint  k;
	uRow = x;
	uCol = y;
	uLen=0;
	WriteCommand( CsrDirD ); 						// 光标移动方向定义:自动下移
	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)	{
				WriteCommand( mWrite );				// 写数据(命令)
				for(j=0;j<16;j++) WriteData( 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字节计算
}


/*================================================
   在定时器中断
 ================================================*/
void timers0() interrupt 1 using 1 {

	TH0 = 0x80;
	TL0 = 0x00;
	if (timer1)timer1--;
	if (timer2)timer2--;
}


/*================================================
 使用定时中断的长延时程序
 ===============================================*/
void DelayMs(Uint tt) {
	timer1=tt;
	while(timer1);
}



⌨️ 快捷键说明

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