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

📄 1335c51.c

📁 1335液晶的光标控制
💻 C
📖 第 1 页 / 共 2 页
字号:
//#pragma src 
#include <reg52.h>
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>
#include <absacc.h>
#include"zimo.h"
#include"define.h"
//================================= 演示主程序 =================================
 Uchar keyscan(void) ;
void PutCdotInGraph( Uint Ox, Uchar Oy, Uchar Cnumber, Uchar DotWidth,Uchar attribs ) ;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P3_3=P3^3;           //kk标志位,平时为低,记数完毕后为高,数被读走后又为低 
void Main( void )
{
	Uchar b,c,k;
	Uchar rval;
	Uchar m;	
//	Uchar i,j;
	Delay(32768);			// 足够的延时确保lcm已经准备好	  
	LcmInition();
	LcmClear();
	PutWordInGraph();	
	dprintf(1,56,ASC0,1);			   //8个通道的通道号 
	dprintf(1,74,ASC1,1);
	dprintf(1,92,ASC2,1);	
	dprintf(1,110,ASC3,1);	
	dprintf(1,128,ASC4,1);	
	dprintf(1,146,ASC5,1);	
	dprintf(1,164,ASC6,1);	
	dprintf(1,182,ASC7,1);
	dprintf(0,222,BenDi,1);

	WriteCommand( DispOn );			// 写入指令代码
	WriteData( 0x16 );	
	
		

	WriteCommand( CsrDirR );					// 自动右移光标指向

	WriteCommand( CsrW );						// 制定光标位置
	WriteData(0x04);			// 设置光标地址CSR
	WriteData(0x00);


	WriteCommand( mWrite );	
	WriteData(0x59);
	WriteData(0x45);
	WriteData(0x57);
	WriteData(0x45);
	WriteData(0x49);

//	while(1);		

//	PutWordInGraph();				   //继电器菜单 
	
//	while(1);

	do										//以keyscan为主线的循环 
	{	 
		b=keyscan();
		if(b==2)
		{
			dprintf(0,0,TestJi,1);			 //测继电器界面的提示菜单 
			dprintf(5,32,SheZhi,1);
			dprintf(5,222,JiDianQi,1);
		}
		else if(b==3)
		{
	    	dprintf(0,0,TestJing,1);		   //测晶振界面的提示菜单 
			dprintf(5,32,BiaoCheng,1);
			dprintf(5,222,JingZheng,1);
		}
		else if(b==1)						   //设置分频,对分频好之后用变量m记录下来 
		{
			DelayMs(10);
			if(b==1)
			{
				c++;
				if(c==9)c=0;
			//	while(b==2);
			}
			switch(c)
			{
				case 1:dprintf(18,222,Period0,1); m=0x10;break;		   
				case 2:dprintf(18,222,Period1,1);m=0x11;break;
				case 3:dprintf(18,222,Period2,1);m=0x12; break;
				case 4:dprintf(18,222,Period3,1);m=0x13; break;
				case 5:dprintf(18,222,Period4,1);m=0x14; break;
				case 6:dprintf(18,222,Period5,1);m=0x15; break;
				case 7:dprintf(18,222,Period6,1);m=0x16; break;
				case 8:dprintf(18,222,Period7,1);m=0x17; break;
				case 0:	dprintf(18,222,Next,1); break;

			}
		}
		else if(b==6)						   //在分频的基础上送一个启动信号,开始进行测量 所以要先设置再启动。
		{
			XBYTE[0X8010]=m&0xf7; 
			XBYTE[0X8010]=m|0x08;
			XBYTE[0X8010]=m&0xf7;
			while(P3_3==0) ;
			DATARD0();
			TestDisplay();
			TryDisplay13(24,56,Rslt0);
		}
		
	//	 else{;}
	}while(1);
  
}

/************************键盘扫描***************************************/
Uchar keyscan(void)
{	
	Uchar i,a=0;
	for(i=0;i<8;i++)
	{
		P1_0=1;
		P1_1=0;
		P1_1=1;
	}
	P1_0=0;
	P1_1=0;
	P1_1=1;
	for(i=0;i<9;i++)
	{
	 	if(P1_2==0)
		{																					  //i代表0的移位
			if (i==1) 		a=1;				                                   //i=1~4,负责两行键盘,要用端口线判别一下 
			else if (i==2) 	a=2;	
			else if (i==3) 	a=3;	
			else if (i==4) 	a=4;	
			else if (i==5) a=5;	
			else if (i==6) 	a=6;	
			else if (i==7) 	a=7;	
			else if (i==8) 	a=8;		
			else {;}
		}		  
		if(P1_3==0)
		{
			if (i==1) 		a=9;	
			else if (i==2) 	a=10;	
			else if (i==3) 	a=11;	
			else if (i==4) 	a=12;			
			else {;}
		}

		P1_1=0;
		P1_0=1;
	    P1_1=1;					
	 }

//	 return a;
}


/**********************读数据********************************/
void DATARD0()
{
	Uchar dat;
	dat=DATARD00;
	temp[0]=dat&0x0f;
	temp[1]=(dat&0xf0)/16;
	dat=DATARD01;
	temp[2]=dat&0x0f;
	temp[3]=(dat&0xf0)/16;
	dat=DATARD02;
	temp[4]=dat&0x0f;
	temp[5]=(dat&0xf0)/16;
	dat=DATARD03;
	temp[6]=dat&0x0f;
	temp[7]=(dat&0xf0)/16;
	dat=DATARD04;
	temp[8]=dat&0x0f;
	temp[9]=(dat&0xf0)/16;
	dat=DATARD05;
	temp[10]=dat&0x0f;
	temp[11]=(dat&0xf0)/16;	
}

/***************************************/
void  TestDisplay()
{
	Uchar i;
	for(i=0;i<12;i++)				//目前测脉冲个数,所以是12,真正测多少秒时,换成13
	{
		Rslt0[i]=temp[i];
	}
}


/*************************转换成ASC码************************/
void TryDisplay(Uchar x,Uchar y,Uchar*ptr)
{
	Uchar i,c1;
/*	if(ptr=SET0) c1=6;
	else if(ptr=Rslt0) c1=13;
	else  c1=7; 
*/
//	c1=sizeof(ptr)/sizeof(Uchar);
	for(i=0;i<6;i++)
	{
	    switch(ptr[i])
		{
			case 0:dprintf(x,y,ASC0,0);	 break;	
			case 1:dprintf(x,y,ASC1,0);	 break;	
			case 2:dprintf(x,y,ASC2,0);	 break;	
			case 3:dprintf(x,y,ASC3,0);	 break;	
			case 4:dprintf(x,y,ASC4,0);	 break;	
			case 5:dprintf(x,y,ASC5,0);	 break;	
			case 6:dprintf(x,y,ASC6,0);	 break;	
			case 7:dprintf(x,y,ASC7,0);	 break;	
			case 8:dprintf(x,y,ASC8,0);	 break;	
			case 9:dprintf(x,y,ASC9,0);	 break;	
			default:  dprintf(x,y,ASCdot,0);	
		}
		x++;
	}
}

 void TryDisplay13(Uchar x,Uchar y,Uchar*ptr)
{
	Uchar i,c1;
//	c1=sizeof(ptr);
	for(i=0;i<13;i++)
	{
	    switch(ptr[i])
		{
			case 0:dprintf(x,y,ASC0,0);	 break;	
			case 1:dprintf(x,y,ASC1,0);	 break;	
			case 2:dprintf(x,y,ASC2,0);	 break;	
			case 3:dprintf(x,y,ASC3,0);	 break;	
			case 4:dprintf(x,y,ASC4,0);	 break;	
			case 5:dprintf(x,y,ASC5,0);	 break;	
			case 6:dprintf(x,y,ASC6,0);	 break;	
			case 7:dprintf(x,y,ASC7,0);	 break;	
			case 8:dprintf(x,y,ASC8,0);	 break;	
			case 9:dprintf(x,y,ASC9,0);	 break;	
			default:  dprintf(x,y,ASCdot,0);	
		}
		x--;
	}
}

/*******************************keytest*************/

void KeyDisplay(Uchar x,Uchar y,Uchar val)
{
//	Uchar i,c1;
/*	if(ptr=SET0) c1=6;
	else if(ptr=Rslt0) c1=13;
	else  c1=7; 
*/
//	c1=sizeof(ptr)/sizeof(Uchar);
	    switch(val)
		{
			case 0:dprintf(x,y,ASC0,0);	 break;	
			case 1:dprintf(x,y,ASC1,0);	 break;	
			case 2:dprintf(x,y,ASC2,0);	 break;	
			case 3:dprintf(x,y,ASC3,0);	 break;	
			case 4:dprintf(x,y,ASC4,0);	 break;	
			case 5:dprintf(x,y,ASC5,0);	 break;	
			case 6:dprintf(x,y,ASC6,0);	 break;	
			case 7:dprintf(x,y,ASC7,0);	 break;	
			case 8:dprintf(x,y,ASC8,0);	 break;	
			case 9:dprintf(x,y,ASC9,0);	 break;	
			default:  dprintf(x,y,ASCdot,0);	
		}
		x--;
	
}


//============================== 西文显示演示程序 ==============================
// 仅仅用于文本方式下的西文字符串显示,本函数只写入第3显示区

void TextDisp( Uchar Ox,Uchar Oy, Uchar code *ptr ) {

Uchar TexLength=0,ii;
Uint  iTemp;

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

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

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

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

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

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

		WriteData( ptr[ii] );					// 写入显示字符代码
	}
	DelayMs(350);
}

/*==============================================================================
;	该汉字字模是根据清华蓬远公司提供的PICKHZ.EXE软件从计算机中提取的汉字 16x16	
	点阵字模, 其排列顺序是:	前16字节为汉字左半部分(自上而下), 后16字节为汉字右
	半部分(自上而下). 下面提供的在文本方式下汉字的写入子程序可以在文本显示区任意
	地方写入汉字. 程序如下:
;------------ 文本方式下汉字写入子程序 ------------
;	在文本方式下汉字显示演示程序段 
==============================================================================*/
void PutWordInAlpha( void ) {
//	return;								// 首先建立CGRAM,

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

	BuildCgram( 0,8 );					// 调建立CGRAM子程序设置写入字模量八个汉字模
	
// 开始调用显示cgram内所建立的汉字模	
	PutCdotInAlpha(28,24,0x88);			// 调文本方式下汉字写入子程序,88H= "文"
	PutCdotInAlpha(30,24,0x8c);			// 调文本方式下汉字写入子程序,8cH= "本"
	PutCdotInAlpha(32,24,0x90);			// 调文本方式下汉字写入子程序,90H= "方"
	PutCdotInAlpha(34,24,0x94);			// 调文本方式下汉字写入子程序,94H= "式"
	PutCdotInAlpha(36,24,0x80);			// 调文本方式下汉字写入子程序,80H= "测"
	PutCdotInAlpha(38,24,0x84);			// 调文本方式下汉字写入子程序,84H= "试"
	DelayMs(50);
}

//; 图形方式下汉字显示方法,x方向2字节一个汉字
void PutWordInGraph( void ) {	
//x坐标以半个汉字定位左起0开始计算
//y坐标以像素行定位,顶部0开始计算
//汉字码以点阵码列表所对应32字节位单位进界,从0开始计算


/*    PutCdotInGraph(0,0,30,16);
    PutCdotInGraph(2,0,0,16);
    PutCdotInGraph(4,0,2,16);
    PutCdotInGraph(6,0,3,16);
    PutCdotInGraph(8,0,4,16);
    PutCdotInGraph(10,0,7,16);
    PutCdotInGraph(12,0,8,16);
    PutCdotInGraph(14,0,11,16);		  //延时继电器测试状态 
    PutCdotInGraph(16,0,12,16);

 */

	PutCdotInGraph(0,32,26,16,1);			   // 通  
	PutCdotInGraph(2,32,27,16,1);			   //道 
 
 /*   PutCdotInGraph(5,32,17,16);
    PutCdotInGraph(7,32,18,16);
	PutCdotInGraph(9,32,19,16);			 //设置值  
*/   
	PutCdotInGraph(14,32,38,16,1);		  //实测值 
    PutCdotInGraph(16,32,7,16,1);
	dprintf(18,32,DanWei1,1);    

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

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



 
}

void PutWordInGraph1( void ) 

⌨️ 快捷键说明

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