OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2252|回复: 4

按键切换LCD界面???

[复制链接]

10

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2019-2-12
在线时间
36 小时
发表于 2019-2-22 13:00:07 | 显示全部楼层 |阅读模式
8金钱
写了个按键切换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]

最佳答案

查看完整内容[请看2#楼]

int KeyC, KeyStatus=0; 加这一条定义 KeyOnMin, KeyOffMin都是个常量, 它是设定去抖的次数, 去抖时间=KeyOnMin x Tinteval Tinteval是你多久调用这函数的时间
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-2-22 13:00:08 | 显示全部楼层
int KeyC, KeyStatus=0;  加这一条定义
KeyOnMin, KeyOffMin都是个常量, 它是设定去抖的次数, 去抖时间=KeyOnMin x Tinteval
Tinteval是你多久调用这函数的时间
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-2-22 13:47:26 | 显示全部楼层
if(KEY_B4==0) b4=!b4;
这一句是问题
当键按下后, 每一次执行这一句时, 它都会反转b4一次, 所以你的页面不停的切换。
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-2-22 13:55:06 | 显示全部楼层
本帖最后由 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;
}
回复

使用道具 举报

10

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2019-2-12
在线时间
36 小时
 楼主| 发表于 2019-2-22 14:24:47 | 显示全部楼层
edmund1234 发表于 2019-2-22 13:55
写这一类的程式, 最好是用状态的定义, 比如

switch(KeyStatus){

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 19:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表