打印

问一个按键问题

[复制链接]
1515|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
appleye|  楼主 | 2009-3-10 20:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
上星期跑书店买了匠人手记,看了按键相关的内容,自己试着写了个小程序,判断一个按键是短击还是长击,但得不到我想要的结果,望各位指点下,问题出在哪,程序如下


#include <pic.h>

unsigned char Key_count;
unsigned char Delay10mS;
#define Long_Click_DL 50    //0.5S

bit B_Long_Click_Flag;
bit B_Short_Click_Flag;

void Reg_Init(void)
{
    T1CKPS1=0;
    T1CKPS0=0;
    TMR1CS=0;
    TMR1IF=0;
    TMR1IE=1;
    PEIE=1;
    GIE=1;
    TMR1H=0xd8;
    TMR1L=0xf0;
    TMR1ON=1;
    
}

void Port_Init(void)
{
    TRISC=0x00;
    PORTC=0x00;
    TRISB=0xff;
    RBPU=0;    
}


void Variable_Init(void)
{
    Delay10mS=0;
    Key_count=0;
    B_Long_Click_Flag=0;
    B_Short_Click_Flag=0;
    
}
void interrupt ISR(void)
{
    if(TMR1IF)
    {
        TMR1IF=0;
        TMR1H=0xd8;
        TMR1L=0xf0;//10mS
        Delay10mS++;
        if(RB1==0)
        {
            Key_count++;
            if(Key_count>Long_Click_DL)        //是否为长击
            {    
                Key_count=0;
                B_Long_Click_Flag=1;
            }
            else
            {
                B_Long_Click_Flag=0;
            }
        }

        if((RB1)&&(Key_count>Delay10mS)&&(Key_count<Long_Click_DL))    //是否为短击
        {
            Key_count=0;
            B_Short_Click_Flag=1;
        }
        else
        {
            Key_count=0;
        }
        
    }
}



void main()

{
    Reg_Init();
    Port_Init();  
    Variable_Init();
    while(1)
    { 
        if(B_Long_Click_Flag)
        {
            PORTC=0xf0;
        
        }
        if(B_Short_Click_Flag)
        {
            PORTC=0xaa;
            
        }
    }
}

相关帖子

沙发
appleye|  楼主 | 2009-3-11 11:17 | 只看该作者

问一个按键问题

是不是这个问题太弱了,怎么进来的人看了眼就挥一挥翅膀飞了,连根羽毛都没留下

使用特权

评论回复
板凳
twz8858877| | 2009-3-11 14:19 | 只看该作者

这句有问题

if((RB1)&&(Key_count>Delay10mS)&&(Key_count<Long_Click_DL))    
有键按下时,key_count总被清零,

使用特权

评论回复
地板
appleye|  楼主 | 2009-3-11 16:54 | 只看该作者

问一个按键问题

谢谢LS,我现在把if((RB1)&&(Key_count>Delay10mS)&&(Key_count<Long_Click_DL))    //是否为短击
        {
            Key_count=0;
            B_Short_Click_Flag=1;
        }
        else
        {
            Key_count=0;
        }
改成
if((RB1)&&(Key_count>1)&&(Key_count<Long_Click_DL))  //是否为短击
{
    B_Short_Click_Flag=1; 

else
{
    B_Short_Click_Flag=0;

但不清楚要在哪里对Key_count进行清零  

使用特权

评论回复
5
twz8858877| | 2009-3-11 18:03 | 只看该作者

这样试试

if(RB1==0)
        {
            Key_count++;
            if(Key_count>Long_Click_DL)        //是否为长击
            {    
                Key_count=0;
                B_Long_Click_Flag=1;
            }
            else
            {
                B_Long_Click_Flag=0;
            }
        }
else{        
        if((Key_count>1)&&(Key_count<Long_Click_DL))    //是否为短击
        {
            Key_count=0;
            B_Short_Click_Flag=1;
        }
        else
        {
            Key_count=0;
        }
     }

使用特权

评论回复
6
appleye|  楼主 | 2009-3-11 19:33 | 只看该作者

问一个按键问题

谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

27

帖子

1

粉丝