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