?? lcdparse.txt
字號:
使用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);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -