第九届省赛:
定时器倒计时模块:
void time(u8 *hour,u8 *minute,u8 *second) { if(*second>0) //正常走时 { (*second)--; } else if(*second==0&&(*minute!=0||*hour!=0)) // 23:15:00 { *second=59; if(*minute==0){*minute=59;(*hour)--;} //23:00:00 else (*minute)--; //23:15:00 } if(*second==0&&*minute==0&&*second==0) //判断是否结束 00:00:00 { timestate=stop; state=standby; } }
第九届国赛:
if(good==1)sprintf((char*)lcd_buf," unit:%.2f/kg ",unit1/100.0f); else if(good==2)sprintf((char*)lcd_buf," unit:%.2f/kg ",unit2/100.0f); else if(good==3)sprintf((char*)lcd_buf," unit:%.2f/kg ",unit3/100.0f);
以上代码可以替换为数组,不需要用到三个变量,如:
sprintf((char*)lcd_buf," unit:%.2f/kg ",unit[good-1]/100.0f);
判断数值有没有变化模块:
method1:可以对改变数值的所有按键模块中进行标志位置位,再最后判断标志位是否置位
method2:在界面切换到设置界面时,首先将变量存储起来,然后退出设置界面时,判断变量与存储变量是否相等
第十届国赛:
数组长度一定不能越界!!!!
如果对数组赋值时赋值数量大于数组长度,则会因为内存溢出而报错
(直接导致uwtick运行停止、keil程序死机,这逆天bug找了我一个多小时....)
注意长按功能也只能在特定界面下才生效
else if(B3==0) {keyvalue=3;if(select==wendu&&lcdstate==Para)key3cnt=1;} else if(B4==0) {keyvalue=4;if(select==wendu&&lcdstate==Para)key4cnt=1;}
第十一届国赛:
if(keyvalue==1) { keyvalue=0; lcdstate=!lcdstate; LCD_Clear(Black); if(lcdstate==DATA) //退出参数设定界面 { vol_led_vaild=vol_led; //把参数界面操作的值赋给运行的值 fre_led_vaild=fre_led; ledctrl=0; //对ledctrl清零一次 } } void led_process(void) { if((int)(voltage1*10)>(int)(voltage2*10)) { ledctrl=ledctrl|(0x01<<(vol_led_vaild-1)); //运行的是生效的值 } else { ledctrl=ledctrl&~(0x01<<(vol_led_vaild-1)); } if(fre_1>fre_2) { ledctrl=ledctrl|(0x01<<(fre_led_vaild-1)); } else { ledctrl=ledctrl&~(0x01<<(fre_led_vaild-1)); } LED_CONTROL(ledctrl); }
sprintf函数输出浮点数时,会对保留小数位数后的数进行四舍五入
例如:保留一位
sprintf((char*)lcd_buf," V1:%.1fV ",voltage1);
voltage实际值为1.74,LCD输出显示1.7
voltage实际值为1.76,LCD输出显示1.8
当voltage1=1.74,voltage2=1.68,屏幕上显示:V1:1.7 V2:1.7 但指示灯亮
当voltage1=1.68,voltage2=1.74,屏幕上显示:V1:1.7 V2:1.7 但指示灯灭
if(voltage1>voltage2)
所以上述代码并不能精准体现数值相等,指示灯灭
因此,应本届赛题要求,只比较小数点后一位,也即屏蔽小数点后一位的所有数据
所以只显示前两位有效数字:
在显示时:将voltage1,voltage2放大10倍,再转化成整形变量,再除以10 (不再四舍五入)(1.76,1.72都显示为1.7)
在比较时:将voltage1,voltage2放大10倍,再转化成整形变量进行比较
if(lcdstate==DATA) { sprintf((char*)lcd_buf," V1:%.1fV ",(int)(voltage1*10)/10.0f); LCD_DisplayStringLine(Line3,lcd_buf); sprintf((char*)lcd_buf," V2:%.1fV ",(int)(voltage2*10)/10.0f); LCD_DisplayStringLine(Line4,lcd_buf); }
if((int)(voltage1*10)>(int)(voltage2*10)) { ledctrl=ledctrl|(0x01<<(vol_led_vaild-1)); }