![]() |
發布時間: 2021-5-14 18:21
正文摘要:各位大佬好,在使用STM8的時候遇到一個問題,想用比較簡便的方法解決: /* 目標:想使用一個撥碼開關來控制所有的按鍵鎖定:   ... |
名字不是重點 發表于 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就跳過按鍵掃描 |