|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2015-1-12 08:34:43
|
显示全部楼层
看了下他的代码,貌似也没有谈论同一个按键 既有长按又有短按的情况。
我现在基本解决问题了。虽然bug还隐含存在,不过几率小很多、
在短按的时候增加了短按时常限制,必须落在范围内的才算有效短按。
部分代码如下:
- void KEY_SCAN(void)
- {
- u8 keys_val;
- READ_KEYS(keys_val);
- //按键端口上拉了,默认是高电平,有按键时变低。这里取反,有按键时变高。
- pinNow = 0xff - keys_val;
- pinSet_now = pinNow & !SET;
- pinUp_now = pinNow>>1 & !UP;
- pinDown_now = pinNow>>2 & !DOWN;
- pinOk_now = pinNow>>3 & !OK;
- if(pinSet_now & pinSet_last)
- {
- set_cnt++;
- if(set_cnt>LONG_PRESS) /*设置长按*/
- {
- set_cnt=0;
- set_long=TRUE;
-
- }
- }
- else
- {
- // else if (set_cnt>SHORT_PRESS) /*设置短按*/
- if ((set_cnt>SHORT_PRESS)&&(set_cnt<SHORT1_PRESS))
- {
- set_cnt = 0;
- set_short = TRUE;
- }
- else
- {
- set_cnt = 0;
- }
- }
-
- if (pinUp_now & pinUp_last)
- {
- up_cnt++;
- if (up_cnt>MID_PRESS) /*up连按*/
- {
- up_short = TRUE;
- up_cnt = up_cnt - REPEAT_PRESS;
- }
- }
- else
- {
- if (up_cnt>SHORT_PRESS) /*up短按*/
- {
- up_short = TRUE;
- up_cnt = 0;
- }
- }
- if (pinDown_now & pinDown_last)
- {
- down_cnt++;
- if (down_cnt>MID_PRESS) /*down连按*/
- {
- down_short = TRUE;
- down_cnt = down_cnt - REPEAT_PRESS;
- }
- }
- else
- {
- if (down_cnt>SHORT_PRESS) /*up短按*/
- {
- down_short = TRUE;
- down_cnt = 0;
- }
- }
- if (pinOk_now & pinOk_last)
- {
- ok_cnt++;
- if(ok_cnt>LONG_PRESS) /*ok长按*/
- {
- ok_long=TRUE;
- ok_cnt=0;
- }
- }
- else
- {
- if(ok_cnt>SHORT_PRESS) /*ok短按*/
- {
- ok_short=TRUE;
- ok_cnt=0;
- }
- else
- ok_cnt=0;
- }
-
- pinSet_last = pinSet_now;
- pinUp_last = pinUp_now;
- pinDown_last = pinDown_now;
- pinOk_last = pinOk_now;
- }
- void KEY_ANSWER(void)
- {
- u8 i;
- if(set_long)
- {
- if(!set_flag)
- {
- if(load_val)
- {
- show16(6,48,2,0,hz[9]); /*载人*/
- load_val=0;
- dat_set[22]=9;
- set_long=FALSE;
- }
- else
- {
- show16(6,48,2,0,hz[10]);
- load_val=1;
- dat_set[22]=10;
- set_long=FALSE;
- }
- EEPROM_WRITE(22, dat_set[22]);
- }
- else set_long=FALSE;
- }
- if(ok_long)
- {
- if(!set_flag)
- {
- if(sound_val)
- {
- MUTE=1;
- show16(0,48,2,0,sound[1]);
- sound_val=0;
- ok_long=FALSE;
- }
- else
- {
- MUTE=0;
- show16(0,48,2,0,sound[0]);
- sound_val=1;
- ok_long=FALSE;
- }
- }
- }
- if(set_short)
- {
- set_flag=1;
- set_short=FALSE;
- set_num++;
- if(set_num==22)
- set_num=0;
- }
- if(up_short)
- {
- up_num++;
- if(up_num>40)
- up_num=0;
- up_short=FALSE;
- }
- if(down_short)
- {
- up_num--;
- if(up_num>40)
- up_num=40;
- down_short=FALSE;
- }
- if(ok_short)
- {
- if(set_flag)
- {
- set_flag=0;
- set_num=-1;
- ok_short=FALSE;
- for(i=0;i<22;i++)
- EEPROM_WRITE(i, dat_set[i]);
- }
- }
- }
复制代码
|
|