蓝桥杯第十届国赛

【冉冰的成长日记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,想关注的话私信我哈

提取码1234

我写的,感兴趣可以看看!!

在这里插入图片描述

第三届,我也写好了,等我把最后的eeprom搞定就把工程附在这个下边吧

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冉冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值