www.pudn.com > tstvlcd.rar > tstvlcd.c


#include "REG51RC2.H" 
#include "intrins.h" 
#include "Lcd.h" 
 
#define BYTE unsigned char 
#define WORD unsigned int 
 
sbit LED=P2^2; 
sbit AO=P3^0; 
sbit WrLcd=P3^1; 
 
bdata BYTE Sym1; 
sbit Tim0Ov=Sym1^0; 
sbit Sd2300Int=Sym1^1; 
sbit RevDis=Sym1^2; 
 
BYTE Crc,*Ptr,LedNum,hs,cx,FiLp,FiLpBuf,TmCt,TmCt1,TimOv,k; 
BYTE xdata LcdBuf[140][5]; 
float FiLpF; 
WORD GB,ZB,TemOv,WetOv; 
 
//曲线结构 
xdata struct CurVar 
{ 
	BYTE Tim; 
	WORD Tem; 
	WORD Wet; 
}*CV; 
 
xdata struct CurVar CurVar1[11]={ 
	{0,30,30}, 
	{6,37,35}, 
	{24,37,36}, 
	{30,41,37}, 
	{60,41,38}, 
	{70,47,38}, 
	{88,47,39}, 
	{100,54,39}, 
	{118,54,40}, 
	{130,66,41}, 
	{140,66,41} 
}; 
 
 
//填充LCD缓冲区的变量 
struct FilVar 
{ 
	BYTE *Pbuf;   //缓冲区首地址 
	BYTE Hang;    //二维数组的行数 
	BYTE Lie;     //二维数组的列数 
	BYTE Zone1;   //第一段线段区间 
	BYTE St1;     //第一段线段起点 
	BYTE Sp1;     //第一段线段终点 
	BYTE Zone2;   //第二段线段区间 
	BYTE Sp2;     //第二段线段终点 
	BYTE Zone3;   //第三段线段区间 
	BYTE Sp3;     //第三段线段终点 
}FilVar1,FV[2]; 
 
 
 
void ClrLcdBuf(BYTE *p,BYTE Hang,BYTE Lie,BYTE Area); 
//填充LCD缓冲区 
void FilLcdBuf(struct FilVar *FVX); 
void SdLcd(BYTE code *p,BYTE n); 
void HzLcd(WORD HzZb,BYTE code *HzP); 
void SzLcd(WORD SzZb,BYTE code *SzP); 
void GbLcd(WORD GbZb); 
void WrCode(BYTE Lcd); 
void WrData(BYTE Lcd); 
 
 
void main(void) 
{ 
	IEN0=0; 
	//IEN1:- - - - - SPI - KBD 
	IEN1=0; 
	//GATE,C/T,M1,M0,GATE,C/T,M1,M0 
	TMOD=0x21; 
	TH0=0x4c;   //50ms 
	TL0=0; 
	IT0=1; 
 
	LED = ~LED; 
 
	AUXR=0x0c; 
	_nop_(); 
	_nop_(); 
 
	//初始化液晶 
	IniLcd(); 
 
	//清屏240*40 
	ClrScr(); 
 
	//显示坐标系 
	GB=2; 
	for(hs=0;hs<140;hs++) 
	{ 
		WrCode(0x46); 
		_nop_(); 
		WrData((BYTE)(GB%256)); 
		_nop_(); 
		WrData((BYTE)(GB/256)); 
		_nop_(); 
		WrCode(0x42); 
		_nop_(); 
		if(hs%20==0) 
			WrData(0x0e0);   //y轴 
		else if(hs%10==0) 
			WrData(0x0c0);   //y轴 
		else 
			WrData(0x80);   //y轴 
		GB+=40; 
	} 
	SzLcd(12*40,liu); 
	SzLcd(12*40+1,ling); 
	SzLcd(32*40,wu); 
	SzLcd(32*40+1,ling); 
	SzLcd(52*40,si); 
	SzLcd(52*40+1,ling); 
	SzLcd(72*40,san); 
	SzLcd(72*40+1,ling); 
	SzLcd(92*40,er); 
	SzLcd(92*40+1,ling); 
	SzLcd(112*40,yi); 
	SzLcd(112*40+1,ling); 
	 
	for(hs=0;hs<38;hs++) 
	{ 
		if(hs%5==0) 
		{ 
			GbLcd(137*40+2+hs); 
			WrCode(0x42); 
			WrData(0x080);   //x轴 
		} 
	} 
 
	GbLcd(138*40+2); 
	WrCode(0x42); 
	for(hs=0;hs<38;hs++) 
	{ 
		WrData(0x080);   //x轴 
	} 
	GbLcd(139*40+2); 
	WrCode(0x42); 
	for(hs=0;hs<38;hs++) 
	{ 
		WrData(0x0ff);   //x轴 
	} 
 
	SzLcd(144*40+1,ling); 
	SzLcd(144*40+6,er); 
	SzLcd(144*40+7,ling); 
	SzLcd(144*40+11,si); 
	SzLcd(144*40+12,ling); 
	SzLcd(144*40+16,liu); 
	SzLcd(144*40+17,ling); 
	SzLcd(144*40+21,ba); 
	SzLcd(144*40+22,ling); 
	SzLcd(144*40+26,yi); 
	SzLcd(144*40+27,ling); 
	SzLcd(144*40+28,ling); 
	SzLcd(144*40+31,yi); 
	SzLcd(144*40+32,er); 
	SzLcd(144*40+33,ling); 
	SzLcd(144*40+36,yi); 
	SzLcd(144*40+37,si); 
	SzLcd(144*40+38,ling); 
 
	CV=CurVar1; 
	TimOv=CV->Tim; 
	TemOv=CV->Tem; 
	WetOv=CV->Wet; 
	CV++; 
	for(FiLp=0,ZB=2;FiLp<7;FiLp++,ZB+=5) 
	{ 
		ClrLcdBuf((BYTE *)LcdBuf,140,5,FiLp); 
 
		FV->Pbuf=(BYTE *)LcdBuf; 
		FV->Hang=140; 
		FV->Lie=5; 
		FV->Zone1=0; 
		FV->St1=0; 
		FV->Sp1=0; 
		FV->Zone2=0; 
		FV->Sp2=0; 
		FV->Zone3=0; 
		FV->Sp3=0; 
		 
		(FV+1)->Pbuf=(BYTE *)LcdBuf; 
		(FV+1)->Hang=140; 
		(FV+1)->Lie=5; 
		(FV+1)->Zone1=0; 
		(FV+1)->St1=0; 
		(FV+1)->Sp1=0; 
		(FV+1)->Zone2=0; 
		(FV+1)->Sp2=0; 
		(FV+1)->Zone3=0; 
		(FV+1)->Sp3=0; 
		 
		TmCt=20; 
		FiLpBuf=CV->Tim-TimOv; 
		if(TmCt>FiLpBuf) 
		{ 
			FV->Zone1=FiLpBuf*2; 
			(FV+1)->Zone1=FiLpBuf*2; 
 
			FiLpBuf=(BYTE)(TemOv*2); 
			FV->St1=FiLpBuf; 
			FiLpBuf=(BYTE)(WetOv*2); 
			(FV+1)->St1=FiLpBuf; 
			 
			FiLpBuf=(BYTE)(CV->Tem*2); 
			FV->Sp1=FiLpBuf; 
			FiLpBuf=(BYTE)(CV->Wet*2); 
			(FV+1)->Sp1=FiLpBuf; 
			 
			FiLpBuf=CV->Tim-TimOv; 
			TmCt-=FiLpBuf; 
			TimOv=CV->Tim; 
			TemOv=CV->Tem; 
			WetOv=CV->Wet; 
			CV++; 
			FiLpBuf=CV->Tim-TimOv; 
			if(TmCt>FiLpBuf) 
			{ 
				FV->Zone2=FiLpBuf*2; 
				(FV+1)->Zone2=FiLpBuf*2; 
 
				FiLpBuf=(BYTE)(CV->Tem*2); 
				FV->Sp2=FiLpBuf; 
				FiLpBuf=(BYTE)(CV->Wet*2); 
				(FV+1)->Sp2=FiLpBuf; 
				 
				FiLpBuf=CV->Tim-TimOv; 
				TmCt-=FiLpBuf; 
				TimOv=CV->Tim; 
				TemOv=CV->Tem; 
				WetOv=CV->Wet; 
				CV++; 
				 
				FV->Zone3=TmCt*2; 
				(FV+1)->Zone3=TmCt*2; 
 
				FiLpF=(float)(CV->Tem-TemOv)/(CV->Tim-TimOv)*TmCt; 
				FiLpBuf=(BYTE)(FiLpF+TemOv); 
				FV->Sp3=FiLpBuf*2; 
				TemOv=FiLpBuf; 
				FiLpF=(float)(CV->Wet-WetOv)/(CV->Tim-TimOv)*TmCt; 
				FiLpBuf=(BYTE)(FiLpF+WetOv); 
				(FV+1)->Sp3=FiLpBuf*2; 
				WetOv=FiLpBuf; 
 
				TimOv+=TmCt; 
			} 
			else 
			{ 
				FV->Zone2=TmCt*2; 
				(FV+1)->Zone2=TmCt*2; 
				 
				FiLpF=(float)(CV->Tem-TemOv)/(CV->Tim-TimOv)*TmCt; 
				FiLpBuf=(BYTE)(FiLpF+TemOv); 
				FV->Sp2=FiLpBuf*2; 
				TemOv=FiLpBuf; 
				FiLpF=(float)(CV->Wet-WetOv)/(CV->Tim-TimOv)*TmCt; 
				FiLpBuf=(BYTE)(FiLpF+WetOv); 
				(FV+1)->Sp2=FiLpBuf*2; 
				WetOv=FiLpBuf; 
 
				TimOv+=TmCt; 
			} 
		} 
		else 
		{ 
			FV->Zone1=TmCt*2; 
			(FV+1)->Zone1=TmCt*2; 
 
			FV->St1=(BYTE)(TemOv*2); 
			(FV+1)->St1=(BYTE)(WetOv*2); 
			//FV->Zone3=FiLpBuf; 
			FiLpF=(float)(CV->Tem-TemOv)/(CV->Tim-TimOv)*TmCt; 
			FiLpBuf=(BYTE)(FiLpF+TemOv); 
			FV->Sp1=FiLpBuf*2; 
			TemOv=FiLpBuf; 
			FiLpF=(float)(CV->Wet-WetOv)/(CV->Tim-TimOv)*TmCt; 
			FiLpBuf=(BYTE)(FiLpF+WetOv); 
			(FV+1)->Sp1=FiLpBuf*2; 
			TemOv=FiLpBuf; 
 
			TimOv+=TmCt; 
		} 
		FilLcdBuf(FV); 
		FilLcdBuf(FV+1); 
		GB=ZB; 
		for(hs=0;hs<140-3;hs++) 
		{ 
			WrCode(0x46); 
			_nop_(); 
			WrData(GB%256); 
			_nop_(); 
			WrData(GB/256); 
			_nop_(); 
			WrCode(0x42); 
			_nop_(); 
			for(cx=0;cx<5;cx++) 
			{ 
				WrData(LcdBuf[hs][cx]); 
			} 
			GB+=40; 
		} 
	} 
				 
	HzLcd(160*40,dang); 
	HzLcd(160*40+2,qian); 
	HzLcd(160*40+4,wen); 
	SzLcd(160*40+6,san); 
	SzLcd(160*40+7,ling); 
	SzLcd(160*40+8,dian); 
	SzLcd(160*40+9,ling); 
	SzLcd(160*40+10,sheshidu); 
 
	HzLcd(160*40+12,shi); 
	SzLcd(160*40+14,san); 
	SzLcd(160*40+15,ling); 
	SzLcd(160*40+16,dian); 
	SzLcd(160*40+17,ling); 
	SzLcd(160*40+18,sheshidu); 
 
	HzLcd(160*40+21,mu); 
	HzLcd(160*40+23,biao); 
	HzLcd(160*40+25,wen); 
	SzLcd(160*40+27,san); 
	SzLcd(160*40+28,ling); 
	SzLcd(160*40+29,dian); 
	SzLcd(160*40+30,ling); 
	SzLcd(160*40+31,sheshidu); 
 
	HzLcd(160*40+33,shi); 
	SzLcd(160*40+35,san); 
	SzLcd(160*40+36,ling); 
	SzLcd(160*40+37,dian); 
	SzLcd(160*40+38,ling); 
	SzLcd(160*40+39,sheshidu); 
 
	RevDis=1; 
	HzLcd(224*40+1,xuan); 
	HzLcd(224*40+3,ze); 
	HzLcd(224*40+5,qu); 
	HzLcd(224*40+7,xian); 
 
	HzLcd(224*40+11,she); 
	HzLcd(224*40+13,ji); 
	HzLcd(224*40+15,qu); 
	HzLcd(224*40+17,xian); 
 
	HzLcd(224*40+21,bao); 
	HzLcd(224*40+23,cun); 
	HzLcd(224*40+25,qu); 
	HzLcd(224*40+27,xian); 
 
	HzLcd(224*40+31,xiu); 
	HzLcd(224*40+33,gai); 
	HzLcd(224*40+35,shi2); 
	HzLcd(224*40+37,jian); 
	RevDis=0; 
 
	ET0=1; 
	TR0=1; 
	EX0=1; 
 
	EA=1; 
 
	while(1) 
	{ 
	} 
} 
 
 
 
 
/*------------------------------------------------------ 
功能: 
	清液晶显示缓冲区 
输入参数: 
	无 
输出参数: 
	无 
描述: 
    一秒. 
------------------------------------------------------*/ 
void ClrLcdBuf(BYTE *p,BYTE Hang,BYTE Lie,BYTE Area) 
{ 
	BYTE i,j; 
	 
	for(i=0;iZone1 + FVX->Zone2 + FVX->Zone3)==(FVX->Lie*8)) 
	{ 
		x=0; 
		j=0x80; 
		if(FVX->Zone1) 
		{ 
			f=(float)(FVX->Sp1 - FVX->St1)/(float)FVX->Zone1; 
			y=FVX->Hang - FVX->St1; 
			for(i=0;iZone1;i++) 
			{ 
				temp=(BYTE)(f*i); 
				*(FVX->Pbuf+(y-temp)*FVX->Lie+x) |= j; 
				j>>=1; 
				if(j==0)   //进行下一个字节的填充 
				{ 
					j=0x80; 
					x+=1; 
				} 
			} 
		} 
 
		if(FVX->Zone2) 
		{ 
			f=(float)(FVX->Sp2 - FVX->Sp1)/(float)FVX->Zone2; 
			y=FVX->Hang - FVX->Sp1; 
			for(i=0;iZone2;i++) 
			{ 
				temp=(BYTE)(f*i); 
				*(FVX->Pbuf+(y-temp)*FVX->Lie+x) |= j; 
				j>>=1; 
				if(j==0) 
				{ 
					j=0x80; 
					x+=1; 
				} 
			} 
		} 
 
 
		if(FVX->Zone3) 
		{ 
			f=(float)(FVX->Sp3 - FVX->Sp2)/(float)FVX->Zone3; 
			y=FVX->Hang - FVX->Sp2; 
			for(i=0;iZone3;i++) 
			{ 
				k=(BYTE)(f*i); 
				*(FVX->Pbuf+(y-k)*FVX->Lie+x) |= j; 
				j>>=1; 
				if(j==0) 
				{ 
					j=0x80; 
					x+=1; 
				} 
			} 
		} 
	} 
} 
 
/*------------------------------------------------------ 
功能: 
	320240图形液晶显示汉字子程序。 
输入参数: 
	数字坐标WORD HzZb,数字字模地址BYTE code *HzP 
	正显反显标志BYTE Reverse 
输出参数: 
	无 
描述: 
------------------------------------------------------*/ 
void HzLcd(WORD HzZb,BYTE code *HzP,BYTE Reverse) 
{ 
	BYTE i; 
	for(i=0;i<16;i++) 
	{ 
		WrCode(0x46); 
		WrData((BYTE)(HzZb%256)); 
		WrData((BYTE)(HzZb/256)); 
		WrCode(0x42); 
		if(Reverse) 
		{ 
			WrData(~(*HzP++)); 
			WrData(~(*HzP++)); 
		} 
		else 
		{ 
			WrData(*HzP++); 
			WrData(*HzP++); 
		} 
		HzZb+=40; 
	} 
	 
} 
 
/*------------------------------------------------------ 
功能: 
	320240图形液晶显示数字子程序。 
输入参数: 
	数字坐标WORD SzZb,数字字模地址BYTE code *SzP 
	正显反显标志BYTE Reverse 
输出参数: 
	无 
描述: 
------------------------------------------------------*/ 
void SzLcd(WORD SzZb,BYTE code *SzP,BYTE Reverse) 
{ 
	BYTE i; 
	for(i=0;i<16;i++) 
	{ 
		WrCode(0x46); 
		WrData((BYTE)(SzZb%256)); 
		WrData((BYTE)(SzZb/256)); 
		WrCode(0x42); 
		if(Reverse) 
			WrData(~(*SzP++)); 
		else 
			WrData(*HzP++); 
		SzZb+=40; 
	} 
	 
} 
 
/*------------------------------------------------------ 
功能: 
	320240图形液晶输入光标子程序。 
输入参数: 
	光标地址WORD GbZb 
输出参数: 
	无 
描述: 
------------------------------------------------------*/ 
void GbLcd(WORD GbZb) 
{ 
		WrCode(0x46); 
		WrData((BYTE)(GbZb%256)); 
		WrData((BYTE)(GbZb/256)); 
} 
 
/*------------------------------------------------------ 
功能: 
	320240图形液晶写固定命令数据子程序。 
输入参数: 
	液晶数据地址BYTE code *p,数据个数BYTE n. 
输出参数: 
	无 
描述: 
------------------------------------------------------*/ 
void SdLcd(BYTE code *p,BYTE n) 
{ 
	BYTE i; 
 
	WrCode(*p++); 
	n-=1; 
	if(n!=0) 
	{ 
		for(i=0;i