写了个按键切换LCD界面的代码
目的是KEY_B2按一下界面就切换一次,还没按下去界面就不停快速切换,大家有没有遇到过类似问题,请指教
int main(void)
{
float adcx;
u8 string[20]; u8 string1[20]; u8 string2[20]; u8 string3[20];u8 string4[20];u8 string5[20];
float temp;
u32 arr=72000;//71999(1kHZ)~~7199(10kHZ)
key_Init();
Adc_Init();
TIM1_PWM_Init(arr,0);//
STM3210B_LCD_Init();//LCD3õê¼»ˉ//LCD1¤×÷Ä£ê½ÅäÖÃ
LCD_Clear(White);
LCD_SetTextColor(Black);
LCD_SetBackColor(White);
LCD_DisplayStringLine(Line1," jiemian ");
LCD_SetTextColor(Black);
LCD_SetBackColor(White);
unsigned int b4=0;
unsigned int b2=1;
while(1)
{
u16 PA9pwmout;//PA9±è½ÏÖμ D¡óúarrêä3öμíμçƽ
if(KEY_B2==0) b2=!b2;
if(b2==0) //////////////////////// ///////////////////////////////////////////////////////////////////////////////////////b2=0界面1
{
if(KEY_B4==0) b4=!b4;
if(b4==1)PA9pwmout=arr;
else PA9pwmout=arr-(adcx*arr)/0xfff;//±è½ÏÖμóëμçÑ11ØÏμ//pwnêä3ö Õ¼¿Õ±è=V/3.3
TIM_SetCompare2(TIM1,PA9pwmout);
adcx=Get_Adc( ADC_Channel_8);
temp=adcx*(3.3/0xfff);
sprintf((char*)string,"%s%.2f"," ADC Value:",temp);
LCD_DisplayStringLine(Line3,string);//LCDÏÔê¾ADC
sprintf((char*)string1,"%s%.1f %%"," PA9:",(float)100*(arr-PA9pwmout)/arr);
LCD_DisplayStringLine(Line5,string1);//PA9Õ¼¿Õ±è
sprintf((char*)string2,"%s%.1f %%"," PB14:",100-(float)100*(arr-PA9pwmout)/arr);
LCD_DisplayStringLine(Line6,string2);//PB14Õ¼¿Õ±è
sprintf((char*)string3,"%s%.1f"," ",(float)72000000/(1000*arr));//KHz
LCD_DisplayStringLine(Line8,string3);//LCDÏÔê¾ÆμÂê
sprintf((char*)string4,"%s%.1f","",(float)arr);
LCD_DisplayStringLine(Line2,string4);
LCD_DisplayStringLine(Line4," state:stop");
unsigned int i;for(i=0x3fffff; i>0; i--);
}
else ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b2=1界面2
{
if(KEY_B3==0)
{
if(arr==72000) arr=36000;
else if(arr==36000)arr=24000;
else if(arr==24000)arr=18000;
else if(arr==18000)arr=14400;
else if(arr==14400)arr=12000;
else if(arr==12000)arr=10285;
else if(arr==10285)arr=9000;
else if(arr==9000)arr=8000;
else if(arr==8000)arr=7200;
else if(arr==7200)arr=72000;
}
sprintf((char*)string5,"%s%.1f"," ",(float)72000000/(1000*arr));//KHz
LCD_DisplayStringLine(Line4,string5);//LCDÏÔê¾ÆμÂê
}
}
}
[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
KeyOnMin, KeyOffMin都是个常量, 它是设定去抖的次数, 去抖时间=KeyOnMin x Tinteval
Tinteval是你多久调用这函数的时间
写这一类的程式, 最好是用状态的定义, 比如
switch(KeyStatus){
case 0: // Idle 等待Key按下的状态
if(KEY_B4==0) { KeyC=0; KeyStatus++;}
break;
case 1: // KeyOn 去抖的状态
if(KEY_B4==1) KeyStatus=0;
else {
if (++KeyC>KeyOnMin) {
b4=!b4; // ShowPanel(b4); // 《----- 在此切换界面
KeyC=0;
KeyStatus++;
}
}
break;
case 2: // Key Off 等待按键松开的状态
if(KEY_B4==0) KeyC=0;
else{
if (++KeyC>=KeyOffMin)
KeyStatus=0;
}
break;
}
那再问下变量 KeyC KeyOnMin KeyOffMin 是什么意思呢,该怎么去定义
一周热门 更多>