微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC12c5a60s2做定时器按键扫描程序,出现问题了!求助!

STC12c5a60s2做定时器按键扫描程序,出现问题了!求助!

时间:10-02 整理:3721RD 点击:
我用STC12c5a60s2做定时器中断扫描按键,可是出现了一个奇葩问题!想不通!请大神帮忙。出现的问题是:单个按键按下都能够正确检测,很快的连续按下多个按键,按键响应也是正常的,可是这个时候,key8按键无效了,怎么按都没反应,复位后又有效了。我将所有按键同时按下,并且复位,这个时候的第八个按键也是无效的,只有不按按键复位,key8按键才有效。这到底是什么问题啊?想不通!
按键在P0口又上拉电阻10K!
uchar idata flag_key1=0;
uchar idata flag_count_key1=0;
uchar idata key1_rock_time=0;
uchar idata flag_key2=0;
uchar idata flag_count_key2=0;
uchar idata key2_rock_time=0;
uchar idata flag_key3=0;
uchar idata flag_count_key3=0;
uchar idata key3_rock_time=0;
uchar idata flag_key4=0;
uchar idata flag_count_key4=0;
uchar idata key4_rock_time=0;
uchar idata flag_key5=0;
uchar idata flag_count_key5=0;
uchar idata key5_rock_time=0;
uchar idata flag_key6=0;
uchar idata flag_count_key6=0;
uchar idata key6_rock_time=0;
                                                          
uchar idata flag_key7=0;
uchar idata flag_count_key7=0;
uchar idata key7_rock_time=0;
uchar idata flag_key8=0;
uchar idata flag_count_key8=0;
uchar idata key8_rock_time=0;

/*----------按键扫描函数------*/
void keyscan()
{
//----------------按键1-----------------//       
        if(key1==0 && flag_key1==0)
        {
                key1_rock_time++;
                if(key1_rock_time>=3)                 //去抖
                {
                        flag_key1=1;
                        key1_rock_time=0;
                ///------------按键信号处理----------------///
                        (省略此处)。
                               
        }
        else if(key1==1 && flag_key1==0)         //抖动
        {
                key1_rock_time=0;
        }
        else if(key1==1 && flag_key1==1)         //刚松手
        {                          
                key1_rock_time=0;
                flag_count_key1++;
        //        flag_key1=0;
        //        flag_key1_over=1;
        }
       
        if(flag_count_key1>10)                        //按键松手后,10*5ms=50ms内不检测按键(定时器5ms)
        {
                flag_key1=0;
                flag_count_key1=0;       
                key1_rock_time=0;               
        }
//----------------按键2-----------------//
        -------相同的方式写了8个按键------
}

void PCA_Routine(void) interrupt 7
{
    CCF0 = 0;                       //Clear interrupt flag                5ms
    CCAP0L = value;
    CCAP0H = value >> 8;            //Update compare value
    value += PCA_time;
   //------------代码----------//
               
        rock_beep_fire();               
        //-------------------------扫描分数-------------------------//
        keyscan();                                                                        //按键扫描
}

  1. void keyscan(void)//按键检测
  2. {//10ms
  3.         if( ( key_up == 1 ) & ( key_down == 1 ) )
  4.         {
  5.                 key_lock = 0;
  6.                 delay_cout = 0;
  7.                 return;
  8.         }
  9.        
  10.         if( (key_up == 0) & (key_lock == 0) )
  11.         {
  12.                 delay_cout++;
  13.                 if( delay_cout >= DELAY_CNT )
  14.                 {
  15.                         key_funcode = UP_100HZ;//加100HZ
  16.                         key_lock = 1;//按键锁掉
  17.                 }
  18.         }
  19.         if( (key_down == 0)&(key_lock == 0) )
  20.         {
  21.                 delay_cout++;
  22.                 if( delay_cout >= DELAY_CNT )
  23.                 {
  24.                         key_funcode = DOWM_100HZ;//减100HZ
  25.                         key_lock = 1;//按键锁掉
  26.                 }
  27.         }               
  28. }

复制代码

看你的看得头疼,你来看我的吧,参考的吴坚鸿的代码以及我老师的框架。我有一个扫面按键函数和一个按键功能执行函数,分开的。对松手不做处理,不理睬。

void keypro(void)//按键处理
{
        if( key_funcode == UP_100HZ )                   //处理频率控制字
        {
                key_funcode = NONE;
………………………………………………

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

网站地图

Top