【冉冰的成长日记012】
呼~这第十届可真够折磨人的,我在这里“重新”学了字符串和指针。学到了很多,这届题真的是没法将给大家,我写一些板块供大家理解吧。剩下的直接代码放上去,需要的自提吧。
这是第十届的国赛题目,不知道大家和我下载的一样不一样,别看错题目了哈
case 0xD7:
S1213_flag=1;
while(P3==0xD7)
{
if(cnt>=500)
{
DS18B20_Start();
T1=DS18B20_Get();
T2=DS18B20_Get1();
TXD_falg=1;Distance();
cnt=0;
DAC();
}
if(S1213==1)
{
S1213_flag=0;S1213_cnt=0;
num=0;
break;
}
}
if(S1213==0)
{
if(jiemian_flag==0){xianshi_flag++;if(xianshi_flag>2) xianshi_flag=0;}
if(jiemian_flag==1){xianshi_flag++;if(xianshi_flag>1) xianshi_flag=0;}
S1213_cnt=0;S1213_flag=0;
break;
}
while(P3==0xD7)
{
if(cnt>=500)
{
DS18B20_Start();
T1=DS18B20_Get();
T2=DS18B20_Get1();
TXD_falg=1;Distance();
cnt=0;
DAC();
}
}
S1213 = 0;
break;//S12
按键的长短按,本题里要求长按达到一秒就要执行命令了,所以,需要一个标志位来判断是否达到一秒,如果达到一秒的话还没松手我们应该要继续刷新其他的数据,
也就是把main函数里的while(1)的内容放在按键的while(P3==0xD7)里继续执行才能够看到数据的刷新
这里挺坑的,如果是正常的长短按键可以让松手后执行,但这里不行,所以需要加标志位,按下while循环,标志位打开计时,达到1s执行命令,并且刷新数据0.0,好好琢磨一下
S13同理!!!
case 0xEB:
{
if(jiemian_flag==1&&xianshi_flag==0) T_flag=T_flag+2;if(T_flag>100) T_flag=100;
if(jiemian_flag==1&&xianshi_flag==1) dist_flag=dist_flag+5;if(dist_flag>99) dist_flag=99;
if(jiemian_flag==0)//判断是否回到了数据页面
{
if(T_flag_flag!=T_flag||dist_flag_flag!=dist_flag)
{
num++;
EE[0]=num>>8;
EE[1]=num&0x00ff;
EEPROM_Write(0x00,EE[0]);
delay(10);
EEPROM_Write(0x01,EE[1]);
delay(10);
T_flag_flag=T_flag;
dist_flag_flag=dist_flag;
}
}
}
这个的话就是设置一个标志位,每次检测到按键按下在执行操作之前就先把值赋给标志位,然后进行操作,切换到数据页面的时候再判断是否变化,然后如果变化就让这个数++,并且把值赋给标志位。
void ServiceUart() interrupt 4
{
if(RI==1)
{
buf_flag=1;
cnt_30ms_flag=0;
shuzu[jishu]=SBUF;
if(shuzu[jishu] == '\n')
end_flag=1;
else
end_flag=0;
jishu++;
// SendByte(urdat);
RI=0;
}
}
void SendByte(unsigned char *dat)
{
while(*dat != '\0')
{
SBUF=*dat;
dat++;
while(TI==0);
TI=0;
}
}
void judge()
{
if(buf_flag==1&&cnt_30ms_flag==1)
{
if(end_flag==1)
{
if(
shuzu[0] == 'S' &&
shuzu[1] == 'T' &&
shuzu[2] == '\r' &&
shuzu[3] == '\n'
)
{
// SendByte("ST\r\n");
// *str=sprintf("%d",dist);
// SendByte(*str);
sprintf(str,"$%d,%d.%d\r\n",dist,T1,T2);
SendByte(str);
}
else if(
shuzu[0] == 'P' &&
shuzu[1] == 'A' &&
shuzu[2] == 'R' &&
shuzu[3] == 'A' &&
shuzu[4] == '\r' &&
shuzu[5] == '\n'
)
{
sprintf(str,"#%d,%d\r\n",dist_flag,T_flag);
SendByte(str);
}
else
{
SendByte("ERROR\r\n");
}
}
else
{
SendByte("ERROR\r\n");
}
buf_flag=0;
jishu=0;
}
}
然后就是串口通信了,这里应该是最烦人的地方了。
你需要解决如何判断
数据是否收发完成,可以通过延时来判断
判断字符结尾是否为\r\n,如果是还需要比较每一位是否正确,如果不是返回ERROR
我们写的这里有个小bug,如果发送的是ST\r\n后边再多跟几个\n,一样会被判定正确。
这里好好看看吧,我自己都觉得很难通过文字讲清楚。。。。。。
就这样吧,能力有限,没办法跟大家讲清楚
附上代码
提取码1234
这个说是我室友写的,大佬不玩csdn,只玩github和gittee,想关注的话私信我哈
我写的,感兴趣可以看看!!
第三届,我也写好了,等我把最后的eeprom搞定就把工程附在这个下边吧