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(); //按键扫描
}
按键在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(); //按键扫描
}
- void keyscan(void)//按键检测
- {//10ms
- if( ( key_up == 1 ) & ( key_down == 1 ) )
- {
- key_lock = 0;
- delay_cout = 0;
- return;
- }
-
- if( (key_up == 0) & (key_lock == 0) )
- {
- delay_cout++;
- if( delay_cout >= DELAY_CNT )
- {
- key_funcode = UP_100HZ;//加100HZ
- key_lock = 1;//按键锁掉
- }
- }
- if( (key_down == 0)&(key_lock == 0) )
- {
- delay_cout++;
- if( delay_cout >= DELAY_CNT )
- {
- key_funcode = DOWM_100HZ;//减100HZ
- key_lock = 1;//按键锁掉
- }
- }
- }
void keypro(void)//按键处理
{
if( key_funcode == UP_100HZ ) //处理频率控制字
{
key_funcode = NONE;
………………………………………………
