关于长按键的识别,如何实现功能,请求指教
程序如下,想通过识别出按键长按2S,来控制DPM这个标志,用的INT0按键中断方式/*time*/
void TimeC(void) //计数初始化,产生5ms程序
{
counter=0;
TR1=0;
TMOD|=0x10;
TH1=0xF8;
TL1=0x30;
EA=1;
ET1=1;
TR1=1;
}
void sec_t0(void) interrupt 3 //中断产生1s程序
{
TH1=0xF8;
TL1=0x30;
INR_5MS=1;
counter++;
if(counter==200)
{
time_counter--;
counter=0;
//L1=!L1;
}
}
void PWM_set(void) //PWM模式激活设定*
{
if(INT_0==0)
{
if(INR_5MS)
{
pwm_counter++;
if(pwm_counter==400)
{
pwm_counter=0;
DPWM=1;
L2=1;
}
}
while(INT_0==0);
//flag=0;
//INR_5MS=0;
}
}
void PWM_close(void) //调光PWM模式返回
{
if(DPWM==1)
{
if(INT_0==0)
{
if(INR_5MS)
{
pwm_counter++;
if(pwm_counter==400)
{
pwm_counter=0;
DPWM=0;
L2=0;
}
}
flag=0;
}
while(INT_0==0);
//INR_5MS=0;
}
}
void key_init (void) //按键中断初始化
{
key_code=0;
IT0=0;
EA=1;
EX0=1;
}
void INT0_SCANkey() interrupt 0 //中断实现按键值增加
{
EX0=0;
flag=1;
while(INT_0==0);
EX0=1;
} 排版的实在是难看。
我尝试看一下,不过看不明白,也不知道lz表达的意思。 想实现长按键2秒对DPWM置为1,然后再按2秒变成0,通过计时器的中断的5ms溢出时标INR_5MS完成按键开始的计时,2秒后使标志状态转换,但是最后没起抓哟用 外部中断方式实现的按键,支不支持长按这个功能呢,求指点 回复【3楼】sheva21
-----------------------------------------------------------------------
外部中断对于时实性来讲,响应是越快越好。
要实现你想要的功能可以设flg。 我一般用键龄的,当有按键按下时,每隔一段时间对一个变量加1,判断变量大小就可以知道按键按下的时间 我就是采用和lS一样的想法,判断INT_0=0,然后每5MS,将计数加1,到400,然后使能DPWM=1,但是貌似这部分程序没有实现功能 受到上面几位兄弟的指点,修改了一下,这个地方改了下,可以实现功能了
void PWM_set(void) //PWM模式激活设定*
{
if(DPWM==0)
{
if(flag)
{
if(INR_5MS)
{
INR_5MS=0;
pwm_counter++;
if(pwm_counter==400)
{
pwm_counter=0;
if(flag)
{
flag=0;
DPWM=1;
L2=0;
//while(INT_0==0);
}
}
}
}
}
}
void PWM_close(void) //调光PWM模式返回
{
if(DPWM==1)
{
if(flag)
{
if(INR_5MS)
{
INR_5MS=0;
pwm_counter++;
if(pwm_counter==400)
{
pwm_counter=0;
if(flag)
{
flag=0;
DPWM=0;
L2=1;
}
//while(INT_0==0);
}
}
}
}
} 最近正在玩这个, 按照上面的方法也成功拉. 可是感觉延时太耗CPU资源拉. 定时扫描按键,如10ms检查一次。
检查到按下时,CNT+1,当CNT>300时即可认为是第一次长按。CNT=301。
没有检查到按下时,如果CNT<300且CNT>0,认为是短按。CNT=0;.
如果是CNT>300,认为是长按松开。CNT=0. LZ就不能把程序全贴出来么?看的好别扭
页:
[1]