名字不是重点 发表于 2021-5-16 15:27 噢噢,受教了,谢谢! |
key=key_scan(); switch (key) { case 0: break; case 1://ENT item++; if (item>3) { RTC_Set(tyear,tmonth,tdate,calendar.hour,calendar.min,calendar.sec);//写入时间; OLED_Screen_Fill(0x00); ret=1; } break; case 2: //+ switch (item) { case 1: if (tyear==2029) tyear=1970; else tyear++; break; case 2: if(tmonth==12) tmonth=1; else tmonth++; break; case 3: max_date=DFM[tmonth-1]; if((Is_Leap_Year(tyear)==1)&&(tmonth==2)) max_date=29; if(tdate==max_date) tdate=1; else tdate++; break; } break; case 3://- switch (item) { case 1: if (tyear==1970) tyear=2099; else tyear--; break; case 2: if(tmonth==1) tmonth=12; else tmonth--; break; case 3: max_date=DFM[tmonth-1]; if((Is_Leap_Year(tyear)==1)&&(tmonth==2)) max_date=29; if (tdate==1) tdate=max_date; else tdate--; break; } break; default: break; } |
我,菜鸡 发表于 2021-5-15 15:50 定义一个娈量 uchar Key_vaule; 把K1的状态存为Key_vaule的bit0,按下为0,未按下为1,同理,K2存为bit1... 这样一来再配合switch。case 很方便做组合键,也能做长短按。 |
本帖最后由 名字不是重点 于 2021-5-16 15:33 编辑 我,菜鸡 发表于 2021-5-15 15:50 你这个函数有点绕。。。 一般常来说,超过3个并联关系,最好是要用Switch。。。case来做分支。 uchar key_value; key_value=key_scan(); switch (key_value) { case: 0x01 . . break; case: 0x11 . . break; case. . . } |
名字不是重点 发表于 2021-5-15 11:10 是的,可以通过函数来先行判断,但仅通过定义来先一步实现按键锁定判断好像行不通。 另外,是不是除了主函数里或者极个别情况下,尽量不要使用while、或者for之类的循环语句,会过分占用CPU资源, 比如我下面的按键函数: //按键判断,带拨码开关BM3按键锁定 int Anjian(void) //返回值: K1(设置键)短/长按:1/11; K2(+键)短/长按:2/22; K3(-键)短/长按:3/33 { u16 i=0; if(BM3!=0) { while(1) { if(BM3==0) { break; } if(K1==0) //K1(设置键)按下 { while(1) { if(K1==0) { i++; delay_cms(1); //方便 计算 按键K1(设置键)计数时长 if(i>=60000) { i=55555; //防止达到 计数上限 } } if(K1!=0) { if(i<=179) { return 1; //判断K1(设置键)为:短按(约3秒以内) } if(i>=180) { return 11; //判断K1(设置键)为:长按(约4秒以后) } } } } if(K2==0) //K2(+键)按下 { while(1) { if(K2==0) { i++; delay_cms(1); //方便 计算 按键K2(+键)计数时长 if(i>=60000) { i=55555; //防止达到 计数上限 } } if(K2!=0) { if(i<=179) { return 2; //判断K2(+键)为:短按(约3秒以内) } if(i>=180) { return 22; //判断K2(+键)为:长按(约4秒以后) } } } } if(K3==0) //K3(-键)按下 { while(1) { if(K3==0) { i++; delay_cms(1); //方便 计算 按键K3(-键)计数时长 if(i>=60000) { i=55555; //防止达到 计数上限 } } if(K3!=0) { if(i<=179) { return 3; //判断K3(-键)为:短按(约3秒以内) } if(i>=180) { return 33; //判断K3(-键)为:长按(约4秒以后) } } } } } } } |
你的想法没错,在按键扫描函数的开始加入对这个开关的判断,为0就跳过按键扫描 |
你的想法没错,在按键扫描函数的开始加入对这个开关的判断,为0就跳过按键扫描 |