微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 同一个按键控制液晶显示不同内容

同一个按键控制液晶显示不同内容

时间:10-02 整理:3721RD 点击:

          我用定时器写的扫描,每个10ms扫描一次按键,我在以下里面计数,发现计数自动增加,不知该怎么处理?求高手教以下如何实现按键计数,
     void TIM2_IRQHandler(void)
{
        u8 temp;
        
        if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
        {        
                if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == Bit_RESET){
                        temp = 0;
                }
                else{
                        temp = 1;
                }
                KeyPrev = KeyCurrent;
                KeyCurrent = temp;
                if((KeyPrev == 0) && (KeyCurrent == 0)){
                        KeyStatus = 1;
                       KeyCount++;
                }
                else{
                        KeyStatus = 0;
                }
                TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);                  
        }                        
}
      在main文件这样写
while(1)
  {
    if ( KeyStatus == 0 )
  {     switch(KeyCount)
        {  case 0:function1();
           break;
         case 1:function2();
        break;
        default: function3();
        break;
}
}                                

M3的arm?
               KeyPrev = KeyCurrent;
                KeyCurrent = temp;
                if((KeyPrev == 0) && (KeyCurrent == 0)){
                        KeyStatus = 1;
                       KeyCount++;
                }
                else{
                        KeyStatus = 0;
                }
本意做防抖吧。
但你忽略一个问题啊,按键释放!

按键防抖,按键释放;之后N进制计数,根据计数情况,显示N个不同内容

路过。

谢谢,F103ze,帮忙看看我该怎么写按键弹起,进而进行判断?给个思路,新手求指导!

呵呵,我也是新手。你这个程序,细看好像很多地方有点没看懂。我试试吧。
Bit_RESET这里按字面理解,是没有按键发生。就是说。temp = 1为按键发生。

void TIM2_IRQHandler(void)
{
        u8 temp;
        
        if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
        {        
                if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == Bit_RESET){
                        temp = 0;
                }
                else{
                        temp = 1;
                }
                KeyPrev = KeyCurrent;
                KeyCurrent = temp;
                if((KeyPrev == 1) && (KeyCurrent == 1)){                    if(KeyStatus == 0)
                    {
                        KeyStatus = 1;
                       KeyCount++; 按键计数
                    }
                }
                else{
                        KeyStatus = 0;
                }
                TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);                  
        }                        
}
      在main文件这样写
while(1)
  {
    if ( KeyStatus == 1)
  {     switch(KeyCount)
        {  case 0:function1();
           break;
         case 1:function2();
        break;
        default: function3();
        break;
     }while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == Bit_RESET);
KeyStatus  = 0;
  }
}     

哦,补充一句,也不完全是按键等待哈。还有中断中的逻辑也有问题。

哦,谢谢, 我编进程序试一下
  [size=14.2857151031494px]  if((KeyPrev == 1) && (KeyCurrent == 1)){                    if(KeyStatus == 0)
[size=14.2857151031494px]
[size=14.2857151031494px]   这个地方怎么写[size=14.2857151031494px] if(KeyStatus == 0),在这之前[size=14.2857151031494px]KeyStatus状态没读?

按键防抖,按键释放;之后N进制计数,根据计数情况,显示N个不同内容

按键防抖,按键释放;之后N进制计数,根据计数情况,显示N个不同内容

按键防抖,按键释放;之后N进制计数,根据计数情况,显示N个不同内容

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top