本帖最后由 一棵小草 于 2010-6-1 21:04 编辑
写程序是一件很严谨的事情,LZ的态度~~~要改正啊
哪怕一个括号,一个标点,空格,注释都不要放过,这样才能避免小问题,才能专心研究算法,研究-------
把你的程序整理后:
if(G_Key_Flag==4) //所谓的状态应该是0或1吧,怎么有4呢,应该也是一个变量吧。
{
if(!G_Key2) // 这一句好像没有意义,这里是说,只有G_Key_Flag=4成立才扫描键盘
{ //但是下面不用条件也能扫描啊
delay_ms(100);
}
}
if(!G_Key2)
{
G_Counter3++;
}
if(G_Counter3==100)
{
G_Counter3=1;
}
(1)执行的结果不知道。
(2)因为按键按下后,变量一直做加法(哪怕按下的时间很短),所以加的不是1。
(3)不知道你的状态变量能做什么,所以先省略了,下面这个是能加1和连加(连加的快慢设1s)的。
试试看,先做一个定时器(自己写),10ms后让bit变量flag_10ms =1;1s后让bit变量flag_1s = 1。
bit变量flag_shake =1表示消过抖了,bit变量flag_down=1表示按键一直按着,所有变量初始化为0。
if(flag_10ms==1)
{
if(!G_Key2)
{
if(flag_shake==1)
{
if(flag_down==1)
{
if(flag_1s==1)G_Counter3++; //1s做一次加1。
}
else
{
G_Counter3++;//如果在1s内松开键,就算只加1。
flag_down =1; //按键第二次进来,可以做加1了,同时置位一直按标志。
}
if(G_Counter3==100)G_Counter3=1;
}
else flag_shack =1; //按键第一次进来,设置消抖标志。
}
else
{
flag_shack =0; //如果按键已经松开,记得释放消抖标志
flag_down =0; //如果按键已经松开,记得释放按下标志
}
flag_10ms = 0;
}
临时想出来的算法,不是很好。而且5层if,有点耗程序空间了,不过对新手来说,也许不错。
|