|
使用LPC932制作的一款电表---LcdParse redbug 发表于 2005-10-14 16:35:00
#i nclude <REG932.H> #i nclude <define.h> #i nclude <Stdio.h> #i nclude <Intrins.h>
void LcdFull(unsigned char DataOne,unsigned char DataTwo,unsigned char DataThree,unsigned char DataFour) { unsigned char data i,j,k; unsigned char idata DataBufA[4],DataBufB[4]; unsigned char code Digit[12]={ 0xBE, //0 0x06, //1 0x7C, //2 0x5E, //3 0xC6, //4 0xDA, //5 0xFA, //6 0x0E, //7 0xFE, //8 0xDE, //9 0xf8, //a--E 0x40, //b--_ }; DataBufA[0]=DataOne; DataBufA[1]=DataTwo; DataBufA[2]=DataThree; DataBufA[3]=DataFour; if(BataMoveFg) { for(i=0;i<4;i++)// { k=DataBufA[i]; j=DataBufA[i+1]; k=k&0x0f; k=k<<4; j=j>>4; j=j&0x0f; DataBufB[i]=k|j; } } for(i=0;i<3;i++) { k=DataBufB[i] & 0xf0; k=k>>4; LcdShowBuf[i+i]=Digit[k]; k=DataBufB[i] & 0x0f; LcdShowBuf[i+i+1]=Digit[k]; }
} void LcdDisplayData(unsigned char DataOne,unsigned char DataTwo,unsigned char DataThree,unsigned char DataFour,unsigned char DataFive,unsigned char DataSix,unsigned char DataSeven) { unsigned char data i;
LcdShowBuf[6]=DataFive; LcdShowBuf[7]=DataSix;
switch(DataSeven) { case 0x00 : //没有小数点的显示/ LcdFull(DataOne,DataTwo,DataThree,DataFour); break; case 0x21 : //第2位带小数点的显示/ LcdFull(DataOne,DataTwo,DataThree,DataFour); LcdShowBuf[1]=LcdShowBuf[1]|0x01; break; case 0x41 : //第4位带小数点的显示/ LcdFull(DataOne,DataTwo,DataThree,DataFour); LcdShowBuf[1]=LcdShowBuf[1]|0x01; LcdShowBuf[3]=LcdShowBuf[3]|0x01; break; case 0x51 : //第5位带小数点的显示/ LcdFull(DataOne,DataTwo,DataThree,DataFour); LcdShowBuf[4]=LcdShowBuf[4]|0x01; break; } if(ComFg) { LcdShowBuf[7]=LcdShowBuf[7]|0x10; } else { LcdShowBuf[7]=LcdShowBuf[7]&0xef; } if(ReverseFgToLcd) { LcdShowBuf[7]=LcdShowBuf[7]|0x40; } else { LcdShowBuf[7]=LcdShowBuf[7]&0xbf; } LcdStart(); LcdSendId(0xa0); //写数据操作 LcdSendAddress(0x00); for(i=0;i<8;i++) { LcdSendByte(LcdShowBuf[i]); Delay(LcdDelay); } LcdStop(); } void LcdParse(void) { unsigned char data i,j,k,l,m; unsigned char data databuf[4]; if(LcdTimeFg) { m=LcdShowBit[0]&0x80; switch(LcdRunData) { case 0x01 ://第01种显示方式数据提取到显示缓冲区---当前日期/ if(LcdShowBit[0]&0x01) { i=IicByteRead(0x64,0x40) & 0x3f; j=IicByteRead(0x64,0x50) & 0x1f; k=IicByteRead(0x64,0x60); l=0; BataMoveFg=0;//不执行移位操作 LcdDisplayData(i,j,k,l,0x80,0x00,0x41); } else { LcdRunData=0x02; } break; case 0x02 ://第02种显示方式数据提取到显示缓冲区---当前时间/ if(LcdShowBit[0]&0x02) { k=IicByteRead(0x64,0x00) & 0x7f; j=IicByteRead(0x64,0x10) & 0x7f; i=IicByteRead(0x64,0x20) & 0x3f; l=0; BataMoveFg=0;//不执行移位操作 LcdDisplayData(i,j,k,l,0x40,0x0c,0x00); } else { LcdRunData=0x03; } break; case 0x03 ://第03种显示方式数据提取到显示缓冲区---当前总电量(整数加小数|整数) //电表先显示整数---6位整数 if(m) { BataMoveFg=0;//不执行移位操作 for(i=0;i<4;i++) { databuf[i]=HexToBcd(SumPulseData[i]); } LcdDisplayData(databuf[2],databuf[1],databuf[0],0x00,0x08,0x82,0x00); } //电表显示整数加小数---5位整数加一位小数 else { BataMoveFg=1;//执行移位操? for(i=0;i<4;i++) { databuf[i]=HexToBcd(SumPulseData[i]); } LcdDisplayData(databuf[3],databuf[2],databuf[1],databuf[0],0x08,0x82,0x51); } break; case 0x04 ://第04种显示方式数据提取到显示缓冲区---当前总电量(小数)/ //显示小数---4位小数最后两位代表脉冲个数 if(m) { BataMoveFg=0;//不执行移位操作 LcdDisplayData(0x00,SumPulseData[4],SumPulseData[3],0x00,0x08,0x82,0x21); } else { LcdRunData=0x05; } break; case 0x05 ://第05种显示方式数据提取到显示缓冲区---当前峰电量(整数加小数|整数)/ //电表先显示整数---6位整数 if(m) { BataMoveFg=0;//不执行移位操作 for(i=0;i<4;i++) { databuf[i]=HexToBcd(FengPulseData[i]); } LcdDisplayData(databuf[2],databuf[1],databuf[0],0x00,0x04,0x82,0x00); } //电表显示整数加小数---5位整数加一位小数 else { BataMoveFg=1;//执行移位操? for(i=0;i<4;i++) { databuf[i]=HexToBcd(FengPulseData[i]); } LcdDisplayData(databuf[3],databuf[2],databuf[1],databuf[0],0x04,0x82,0x51); } break; case 0x06 ://第06种显示方式数据提取到显示缓冲区---当前峰电量(小数)/ //显示小数---4位小数最后两位代表脉冲个数 if(m) { BataMoveFg=0;//不执行移位操作 for(i=0;i<4;i++) { databuf[i]=HexToBcd(FengPulseData[i]); } LcdDisplayData(0x00,databuf[4],databuf[3],0x00,0x04,0x82,0x21); } else { LcdRunData=0x07; } break; case 0x07 ://第07种显示方式数据提取到显示缓冲区---当前谷电量(整数加小数|整数)/ //电表先显示整数---6位整数 if(m) { BataMoveFg=0;//不执行移位操作 for(i=0;i<4;i++) { databuf[i]=HexToBcd(GuPulseData[i]); } LcdDisplayData(databuf[2],databuf[1],databuf[0],0x00,0x01,0x82,0x00); } //电表显示整数加小数---5位整数加一位小数 else { BataMoveFg=1;//执行移位操? for(i=0;i<4;i++) { databuf[i]=HexToBcd(GuPulseData[i]); } LcdDisplayData(databuf[3],databuf[2],databuf[1],databuf[0],0x01,0x82,0x51); } break; case 0x08 ://第08种显示方式数据提取到显示缓冲区---当前谷电量(小数)/ //显示小数---4位小数最后两位代表脉冲个数 if(m) { BataMoveFg=0;//不执行移位操作 for(i=0;i<4;i++) { databuf[i]=HexToBcd(GuPulseData[i]); } LcdDisplayData(0x00,databuf[4],databuf[3],0x00,0x01,0x82,0x21); } else { LcdRunData=0x09; } break; case 0x09 ://第09种显示方式数据提取到显示缓冲区---电表地址(后6位)/ //电表显示后六位表地址---6位整数 if(LcdShowBit[0]&0x20) { IicMuchByteRead(0xa0,0x83,3); BataMoveFg=0;//不执行移位操作 LcdDisplayData(IIcBuf[0],IIcBuf[1],IIcBuf[2],0x00,0x01,0x82,0x00); } else { LcdRunData=0x0a; } break; case 0x0a ://第10种显示方式数据提取到显示缓冲区---电表自检/ //电表显示错误特征码(E-0000) if(LcdShowBit[0]&0x40) { IIcBuf[2]=IicByteRead(0xa0,0xC9); BataMoveFg=0;//不执行移位操作 LcdDisplayData(0xab,0x00,IIcBuf[2],0x00,0x00,0x00,0x00); } else { LcdRunData=0x0b; } break; case 0x0b ://第11种显示方式数据提取到显示缓冲区---上月总电量(整数加小数|整数)/ //电表先显示整数---6位整数 if(LcdShowBit[1]&0x01) { if(m) { IicMuchByteRead(0xa0,0x20,3); BataMoveFg=0;//不执行移位操作 LcdDisplayData(IIcBuf[2],IIcBuf[1],IIcBuf[0],0x00,0x18,0x82,0x00); } //电表显示整数加小数---5位整数加一位小数 else { IicMuchByteRead(0xa0,0x20,4); BataMoveFg=1;//执行移位操作 LcdDisplayData(IIcBuf[3],IIcBuf[2],IIcBuf[2],IIcBuf[0],0x18,0x82,0x51); } } else { LcdRunData=0x0d; } break; case 0x0c ://第12种显示方式数据提取到显示缓冲区---上月总电量(小数)/ //显示小数---4位小数最后两位代表脉冲个数 if(m) { IicMuchByteRead(0xa0,0x23,2); BataMoveFg=0;//不执行移位操作 LcdDisplayData(0x00,IIcBuf[2],IIcBuf[1],0x00,0x18,0x82,0x21); } break; case 0x0d ://第13种显示方式数据提取到显示缓冲区---上月峰电量(整数加小数|整数)/ //电表先显示整数---6位整数 if(LcdShowBit[1]&0x02) { if(m) { IicMuchByteRead(0xa0,0x25,3); BataMoveFg=0;//不执行移位操作 LcdDisplayData(IIcBuf[2],IIcBuf[1],IIcBuf[0],0x00,0x14,0x82,0x00); } //电表显示整数加小数---5位整数加一位小数 else { IicMuchByteRead(0xa0,0x25,4); BataMoveFg=1;//执行移位操作 LcdDisplayData(IIcBuf[3],IIcBuf[2],IIcBuf[1],IIcBuf[0],0x14,0x82,0x51); }
|