📄 picceeprom.c
字号:
void interrupt HI_ISR(void)////高级中断服务。
{
////////////////////////////////////////
//USART 接收中断 接收GPS
if(EEIE&&EEIF)
{EEIF=0;EEIE=0;}
if(RCIF&&RCIE)
{cont++;
RCIF=0;
if(len<6) //先接收GPS信息的前端信息名称长度len=5
{
temp=getch();
if(temp&0x80) return; //非ASCII码,接受出现错误,退出
if(temp=='$') //命令起始符'$'
{
len=1; //开始接受
kind=0xFF; //初始化命令种类
}
else if(len>0)
{
Name[len-1]=temp;
len++;
}
return;
} //end len if
if(kind==0xFF) //还没有辨识信息种类
{
if(memcmp(Name,"GPGGA",5)==0) kind =0;
else if(memcmp(Name,"PGRMF",5)==0) kind =3;
else {len=0;}
seg=1;
} //end kind if
switch(kind) //根据不同种类命令,分配到GPS结构体对象中
{
case 0: getGPGGA();
break;
case 3: getPGRMF();
break;
default:len=0,seg=1;
} //end swicth
} //end RCIF if
} //end HI_IRS
///////////////////////////////////////////////////
//接收GPS命令GPGGA语句,
//典型语句 $GPGGA,133325,4544.6699,N,12637.6172,E,0,00,,,M,,M,,*5A
// 起始符 名称,时分秒 ,纬度 ,南北纬, 经度,东西经,GPS状态,正在使用卫星数,
char getGPGGA(void)//读GPGGA命令语句。
{
uchar temp=0;
temp=getch();
if(temp&0x80) return -1; //非ASCII码,接受出现错误,退出
if (temp==',') //分隔符','
{
switch(seg) //不同段数
{
case 1: pAdd=Time;
break;
case 2: pAdd=latitude;
break;
case 3: pAdd=NorS;
break;
case 4: pAdd=longitude;
break;
case 5: pAdd=EorW;
break;
case 6: pAdd=Status;
break;
case 7: pAdd=workNums;
break;
case 8: pAdd=HDOP;
break;
case 9: pAdd=Aultitude;
break;
case 10: pAdd=M1;
break;
case 11: pAdd=Heigth;
break;
case 12: pAdd=M2;
break;
case 13: pAdd=DifTime;
break;
case 14: pAdd=DifID;
break;
default:;
}
seg++;
return 0;
}
else if(temp=='*') //'*'结束符
{
len=0;
seg=2;
flagGPS=1; //GPS信号1接收完毕
return 1; //
}
else
{
*pAdd = temp;
pAdd++; //接收下一个。
}
return 0;
}
char getPGRMF(void)
{
uchar temp=0;
temp=getch();
if(temp&0x80) return -1;
if (temp==',')
{
switch(seg)
{
case 1: pAdd=NumWeeks;
break;
case 2: pAdd=NumSeconds;
break;
case 3: pAdd=Date;
break;
case 4: pAdd=Time;
break;
case 5: pAdd=GPSJunpSec;
break;
case 10: pAdd=Mode;
break;
case 11:pAdd=Status2;
break;
case 12: pAdd=Velocity;
break;
case 13: pAdd=Direction;
break;
case 14: pAdd=PDOP;
break;
case 15: pAdd=TDOP;
break;
default:;
}
seg++;
return 0;
}
else if(temp=='*')
{
len=0;
flag_GPS2=1;
seg=1;
return 1;
}
else
{
*pAdd = temp;
pAdd++;
}
return 0;
}
unsigned long ReadEEPROM(char Addr)//读EEPROM并且将其转换成为浮点。
{
uchar i;
float b_1,b_2;
unsigned long re_data_of_eeprom,a_1,a_2;
for (i=0;i<=4;i++)
{
EEADR=Addr;
EEPGD=0;
RD=1;
dist_read[i]=EEDATA;
Addr++;
}
re_data_of_eeprom=((unsigned long)(dist_read[4]))*100000000+
((unsigned long)(dist_read[3]))*1000000+((unsigned long)(dist_read[2]))*10000+
((unsigned long)(dist_read[1]))*100+((unsigned long)(dist_read[0]));
b_1=(float)211234.5;
a_1=(unsigned long)b_1;
b_2=(float)a_1;
a_2=(unsigned long)b_2;
return re_data_of_eeprom;
}
char WriteEEPROM(char Addr,uchar data)//写
{ EEADR=Addr;
EEDATA=data;
EEIF=0;
EEIE=0;
EEPGD=0;
GIE=0;
WREN=1;
EECON2=0x55;
EECON2=0xAA;
WR=1;
EEIE=1;
GIE=1;
while(EEIE==1);
WREN=0;
EEIF=0;
return 0;
}
void display(void)//显示
{
if(displayflag==2)
{displaynum=length_display;//displayflag=2时显示单长,
mydisplay(displaynum);
RC0=LED_OFF;
RC1=LED_ON;}
if(displayflag==0)
{displaynum=all_length_display;//displayflag=0时显示总长
mydisplay(displaynum);
RC1=LED_OFF;
RC0=LED_ON;}
if(displayflag==1)
{displaynum=(long)(lat_2*10.0);
displaynum=displaynum+10000*(lat1_flag-'0');
mydisplay(displaynum);
RC1=LED_ON;
RC0=LED_ON;
}
if(displayflag==3)
{
displaynum=(long)(lon_2*10.0);
displaynum=displaynum+100000*(long_flag1-'0')+10000*(long_flag2-'0');
mydisplay(displaynum);
RC1=LED_OFF;
RC0=LED_OFF;
}
if(displayflag==4)
{
displaynum=distanceofvelo_long/10+(unsigned long)(distanceofvelo/10.0);
mydisplay(displaynum);
RC1=!RC1;
}
}
uchar led_case(uchar num)
{
uchar led;
switch(num)
{
case 0:
{led=0x01;break;}
case 1:
{led=0x06;break;}
case 2:
{led=0x03;break;}
case 3:
{led=0x04;break;}
case 4:
{led=0x05;break;}
default:
{led=0x02;break;}
}
return led;
}
uchar N_case(uchar num)
{
uchar disnum;
switch (num)
{case 0:
{disnum=N_0;break;}
case 1:
{disnum=N_1;break;}
case 2:
{disnum=N_2;break;}
case 3:
{disnum=N_3;break;}
case 4:
{disnum=N_4;break;}
case 5:
{disnum=N_5;break;}
case 6:
{disnum=N_6;break;}
case 7:
{disnum=N_7;break;}
case 8:
{disnum=N_8;break;}
default:
{disnum=N_9;break;}
}
return disnum;
}
void mydisplay(unsigned long num)
{
uchar j,bitdata,zero_flag=0;
uchar data;
devide(num);
for(j=0;j<=5;j++)
{
bitdata=displaybit[j];
if(bitdata!=0||j>=4||zero_flag)
{
zero_flag=1;
MAX_CS =LED_ON;
SSPBUF=led_case(j);
while(SSPIF==0);
SSPIF=0;
if(j==4)SSPBUF=N_case(bitdata)+0x20;
else SSPBUF=N_case(bitdata);
while(SSPIF==0);
SSPIF=0;//是否传送完
MAX_CS =LED_OFF;
}
else
{
if(zero_flag==0&&j<4)
{
MAX_CS =LED_ON;
SSPBUF=led_case(j);
while(SSPIF==0);
SSPIF=0;
data=0x00;
SSPBUF=data;
while(SSPIF==0);
SSPIF=0;//是否传送完
MAX_CS =LED_OFF;
}
}
//Delay10TCYx(3); //送数字给led个显示,显示data
}
}
void change2long(void)//没用。
{
length_display=(long)subdist;
all_length_display= (long)distance;
}
void devide(unsigned long num)//显示分开各位按十进制。
{
displaybit[0]=num/100000;
displaybit[1]=num%100000/10000;
displaybit[2]=num%10000/1000;
displaybit[3]=num%1000/100;
displaybit[4]=num%100/10;
displaybit[5]=num%10;
}
void mymode(void)//非译码模式
{ MAX_CS =LED_ON;
SSPBUF=0x09;
while(SSPIF==0);
SSPIF=0;//是否传送完
SSPBUF=0X00;
while(SSPIF==0);
SSPIF=0;//是否传送完
MAX_CS =LED_OFF;
}
void keyserve(void)
{
if(KEYUP&&KEYDOWN)
{switch(KEY_NUM)
{
case KEY_UPDOWN:
{
if(displayflag==0)
{all_length_display=0;
distance=0;
overflowdistance=0;
scale=0;
subdist_change_flag=1;break;
}
}
case KEY_DOWN:
{
if(displayflag==1){displayflag=0;break;}
if(displayflag==0){displayflag=2;break;}
if(displayflag==2){displayflag=3;break;}
if(displayflag==3){displayflag=4;break;}
if(displayflag==4){displayflag=1;break;}
}
case KEY_UP:
{ if(displayflag==2)
{
length_display=0;subdist=0;scale=0;
subdist_change_flag=1;overflowsubdist=0;break;
}
if(displayflag==4)
{
distanceofvelo=0;
distanceofvelo_long=0;
subdist_change_flag=1;break;
}
}
default:break;
}
KEYDOWN=0; }
}
void test(void)//测试SPI和显示器,亮灭各两次。
{int var1;
MAX_CS =LED_ON;//非测试状态正常。
SSPBUF=0x0f;
while(SSPIF==0);
SSPIF=0;//是否传送完。
SSPBUF=0x00;
while(SSPIF==0);
SSPIF=0;//是否传送完
MAX_CS =LED_OFF;
for(var1=0;var1<=100;var1++);
MAX_CS =LED_ON;//非关断方式正常状态。
SSPBUF=0x0c;
while(SSPIF==0);
SSPIF=0;//是否传送完
SSPBUF=0Xff;
while(SSPIF==0);
SSPIF=0;//是否传送完
MAX_CS =LED_OFF;
for(var1=0;var1<=100;var1++);
MAX_CS =LED_ON;//译码方式。
SSPBUF=0x09;
while(SSPIF==0);
SSPIF=0;//是否传送完
SSPBUF=0X00;
while(SSPIF==0);
SSPIF=0;//是否传送完
MAX_CS =LED_OFF;
MAX_CS =LED_ON;//六个显示,扫描范围。
SSPBUF=0x0b;
while(SSPIF==0);
SSPIF=0;//是否传送完
SSPBUF=0X05;
while(SSPIF==0);
SSPIF=0;//是否传送完
MAX_CS =LED_OFF;
for(var1=0;var1<=100;var1++);
MAX_CS =LED_ON;//亮度
SSPBUF=0x0a;
while(SSPIF==0);
SSPIF=0;//是否传送完
SSPBUF=0X08;
while(SSPIF==0);
SSPIF=0;//是否传送完
MAX_CS =LED_OFF;
for(var1=0;var1<=100;var1++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -