熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
|
發(fā)布時(shí)間: 2021-5-14 18:21
正文摘要:各位大佬好,在使用STM8的時(shí)候遇到一個(gè)問題,想用比較簡便的方法解決: /* 目標(biāo):想使用一個(gè)撥碼開關(guān)來控制所有的按鍵鎖定:   ... |
名字不是重點(diǎn) 發(fā)表于 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);//寫入時(shí)間; 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; } |
我,菜雞 發(fā)表于 2021-5-15 15:50 定義一個(gè)孌量 uchar Key_vaule; 把K1的狀態(tài)存為Key_vaule的bit0,按下為0,未按下為1,同理,K2存為bit1... 這樣一來再配合switch。case 很方便做組合鍵,也能做長短按。 |
本帖最后由 名字不是重點(diǎn) 于 2021-5-16 15:33 編輯 我,菜雞 發(fā)表于 2021-5-15 15:50 你這個(gè)函數(shù)有點(diǎn)繞。。。 一般常來說,超過3個(gè)并聯(lián)關(guān)系,最好是要用Switch。。。case來做分支。 uchar key_value; key_value=key_scan(); switch (key_value) { case: 0x01 . . break; case: 0x11 . . break; case. . . } |
名字不是重點(diǎn) 發(fā)表于 2021-5-15 11:10 是的,可以通過函數(shù)來先行判斷,但僅通過定義來先一步實(shí)現(xiàn)按鍵鎖定判斷好像行不通。 另外,是不是除了主函數(shù)里或者極個(gè)別情況下,盡量不要使用while、或者for之類的循環(huán)語句,會(huì)過分占用CPU資源, 比如我下面的按鍵函數(shù): //按鍵判斷,帶撥碼開關(guān)BM3按鍵鎖定 int Anjian(void) //返回值: K1(設(shè)置鍵)短/長按:1/11; K2(+鍵)短/長按:2/22; K3(-鍵)短/長按:3/33 { u16 i=0; if(BM3!=0) { while(1) { if(BM3==0) { break; } if(K1==0) //K1(設(shè)置鍵)按下 { while(1) { if(K1==0) { i++; delay_cms(1); //方便 計(jì)算 按鍵K1(設(shè)置鍵)計(jì)數(shù)時(shí)長 if(i>=60000) { i=55555; //防止達(dá)到 計(jì)數(shù)上限 } } if(K1!=0) { if(i<=179) { return 1; //判斷K1(設(shè)置鍵)為:短按(約3秒以內(nèi)) } if(i>=180) { return 11; //判斷K1(設(shè)置鍵)為:長按(約4秒以后) } } } } if(K2==0) //K2(+鍵)按下 { while(1) { if(K2==0) { i++; delay_cms(1); //方便 計(jì)算 按鍵K2(+鍵)計(jì)數(shù)時(shí)長 if(i>=60000) { i=55555; //防止達(dá)到 計(jì)數(shù)上限 } } if(K2!=0) { if(i<=179) { return 2; //判斷K2(+鍵)為:短按(約3秒以內(nèi)) } if(i>=180) { return 22; //判斷K2(+鍵)為:長按(約4秒以后) } } } } if(K3==0) //K3(-鍵)按下 { while(1) { if(K3==0) { i++; delay_cms(1); //方便 計(jì)算 按鍵K3(-鍵)計(jì)數(shù)時(shí)長 if(i>=60000) { i=55555; //防止達(dá)到 計(jì)數(shù)上限 } } if(K3!=0) { if(i<=179) { return 3; //判斷K3(-鍵)為:短按(約3秒以內(nèi)) } if(i>=180) { return 33; //判斷K3(-鍵)為:長按(約4秒以后) } } } } } } } |
|
你的想法沒錯(cuò),在按鍵掃描函數(shù)的開始加入對這個(gè)開關(guān)的判斷,為0就跳過按鍵掃描 |
| 你的想法沒錯(cuò),在按鍵掃描函數(shù)的開始加入對這個(gè)開關(guān)的判斷,為0就跳過按鍵掃描 |
Powered by 單片機(jī)教程網(wǎng)