按键切换LCD界面???

2019-07-21 05:07发布

写了个按键切换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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
edmund1234
1楼-- · 2019-07-21 05:27
int KeyC, KeyStatus=0;  加这一条定义
KeyOnMin, KeyOffMin都是个常量, 它是设定去抖的次数, 去抖时间=KeyOnMin x Tinteval
Tinteval是你多久调用这函数的时间
edmund1234
2楼-- · 2019-07-21 08:26
 精彩回答 2  元偷偷看……
edmund1234
3楼-- · 2019-07-21 12:34
本帖最后由 edmund1234 于 2019-2-22 13:57 编辑

写这一类的程式, 最好是用状态的定义, 比如

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;
}
xsq
4楼-- · 2019-07-21 14:55
edmund1234 发表于 2019-2-22 13:55
写这一类的程式, 最好是用状态的定义, 比如

switch(KeyStatus){

那再问下变量 KeyC  KeyOnMin  KeyOffMin 是什么意思呢,该怎么去定义

一周热门 更多>