3.1.獨(dú)立按鍵基礎(chǔ)知識(shí)
3.1.1.獨(dú)立按鍵結(jié)構(gòu)組成
獨(dú)立按鍵實(shí)際上是一個(gè)非自鎖的輕觸開關(guān),有左右兩個(gè)觸點(diǎn),當(dāng)按下時(shí)左右兩個(gè)觸點(diǎn)閉合,當(dāng)松開時(shí)左右兩個(gè)觸點(diǎn)斷開。
3.1.2.獨(dú)立按鍵控制原理
想要使用外部的按鍵控制單片機(jī)有兩種比較常見的方法:IO掃描和外部中斷。
對(duì)于IO掃描的方式而言,需要單片機(jī)以比較高的頻率去不間斷地判斷IO口的輸入電平,隨后根據(jù)IO電平來執(zhí)行后續(xù)的邏輯。外部中斷的方式會(huì)在章節(jié)十二中進(jìn)行詳細(xì)介紹,本章著重介紹IO掃描的控制方式。(單片機(jī)通過檢測按鍵按下前后的高低電平變化,來判斷按鍵是否按下。通過程序的控制,就可以實(shí)現(xiàn)不同的功能與設(shè)置。機(jī)械式按鍵在按下或者釋放時(shí),由于機(jī)械彈性作用的影響,通常伴隨有一定時(shí)間的觸點(diǎn)機(jī)械抖動(dòng),然后其觸點(diǎn)才穩(wěn)定下來。抖動(dòng)時(shí)間長短與開關(guān)的機(jī)械特性有關(guān),一般為5-10ms。在觸點(diǎn)抖動(dòng)期間檢測按鍵的按下與否,可能會(huì)導(dǎo)致判斷錯(cuò)誤,為了克服機(jī)械抖動(dòng)所產(chǎn)生的影響,必須采取消抖措施,可分為硬件消抖和軟件消抖。)
3.1.3.按鍵亞穩(wěn)態(tài)與按鍵消抖
對(duì)于一個(gè)IO而言,在將其配置為輸入模式之后,該引腳上的電平受外部電路影響,基本可以分為三種狀態(tài):高電平、低電平、浮空。高低電平很好理解,這里說明浮空的意義,浮空就是不對(duì)該IO進(jìn)行任何電氣屬性的連接,此時(shí)該IO上的電平是未知的(雖然從直觀感受上來看此時(shí)IO電壓應(yīng)該是0,但是空氣中會(huì)有噪聲,電路板上也會(huì)有噪聲,某些電磁干擾也會(huì)充當(dāng)噪聲,所以浮空輸入的IO電壓實(shí)際上是未知的)。
典型的浮空輸入型IO電路如圖3-1所示:
圖3-1 浮空輸入IO電路
當(dāng)開關(guān)閉合,IO電壓等于VCC電壓,當(dāng)開關(guān)斷開,IO電壓未知,此時(shí)IO電壓可能會(huì)受到不明來源的干擾,如果使用該電路作為IO掃描的電路方案,抗干擾能力會(huì)不好,容易造成誤觸發(fā),故此應(yīng)用場景下不考慮使用該電路。
和浮空輸入相比,比較好的辦法是使用上拉電阻或下拉電阻將IO的電壓固定下來,帶上拉電阻或下拉電阻電路如圖3-2所示:
圖3-2 上拉電阻(左) 和 下拉電阻(右)電路
上拉電阻可以將IO電壓固定在VCC電壓,當(dāng)開關(guān)閉合時(shí),IO接地使其電壓變?yōu)镚ND電壓;下拉電阻可以將IO電壓固定在GND電壓,當(dāng)開關(guān)閉合時(shí),IO電壓其實(shí)就是電阻R2的電壓,此時(shí)R2的電壓就是VCC。使用上拉/下拉電阻可以很好地提高IO掃描的抗干擾性能,一般情況這兩個(gè)電路不會(huì)有很大區(qū)別,挑一個(gè)你喜歡的用就好。
按鍵通過金屬導(dǎo)體的相互接觸來控制電信號(hào),由于機(jī)械特性,這種接觸實(shí)際上并不可靠,手指按下按鍵不代表按鍵真的閉合且保持穩(wěn)定,這種情況就是按鍵抖動(dòng),抖動(dòng)過程中按鍵控制的信號(hào)處于亞穩(wěn)態(tài),亞穩(wěn)態(tài)的信號(hào)不可靠,不能將其作為IO掃描的最終結(jié)果,為了獲取正確的按鍵狀態(tài),我們需要對(duì)按鍵進(jìn)行消抖處理,按鍵消抖大概可以分為兩種方式:
硬件消抖:硬件消抖一般會(huì)在按鍵兩端并聯(lián)電容,通過電容的充放電作用將按鍵按下時(shí)的高頻振蕩吸收掉,當(dāng)開關(guān)處于亞穩(wěn)態(tài)時(shí),IO電壓不規(guī)則變化,電容會(huì)吸收這些不穩(wěn)定電壓進(jìn)行充電,這對(duì)IO電壓有平緩的效果,以此達(dá)到消抖的目的,硬件消抖電路如圖3-3所示。
圖3-3 硬件消抖電路
簡單的軟件消抖:極為簡單的軟件消抖一般是通過延時(shí)的辦法來跳過亞穩(wěn)態(tài)階段,當(dāng)檢測到按鍵按下時(shí),不會(huì)立即去檢測電平,而是經(jīng)過短暫的延時(shí)之后,再去檢測當(dāng)前引腳的電平,這能在一定程度上消除亞穩(wěn)態(tài)帶來的影響,但需要對(duì)按鍵按下和抬起都進(jìn)行延時(shí)判斷才能更為有效。
更好的軟件消抖:在監(jiān)測到IO電平發(fā)生變化后的一小段時(shí)間內(nèi)快速采集IO的電平狀態(tài),如果這一小段時(shí)間內(nèi)IO電平全都屬于有效電平,則認(rèn)為按鍵已按下(這種利用數(shù)學(xué)進(jìn)行消抖的方式達(dá)到了對(duì)數(shù)字信號(hào)的篩選作用,所以他也是一種簡易濾波器)。
在條件允許的情況下,硬件消抖的效果會(huì)更好,如果PCB沒有多余的空間留給這個(gè)消抖電容,使用軟件消抖同樣是一個(gè)不錯(cuò)的方案。
3.2.獨(dú)立按鍵原理圖
CW32F003核心板上一共有兩個(gè)按鍵,一個(gè)復(fù)位和一個(gè)用戶按鍵,復(fù)位作為單片機(jī)的特殊功能,不可以作為按鍵使用,故只有用戶按鍵可以作為按鍵使用。 CW32F003核心板關(guān)于獨(dú)立按鍵的原理圖如圖3-4所示。
圖3-4 CW32F003按鍵電路
3.3.獨(dú)立按鍵驅(qū)動(dòng)流程
通過上面的原理圖可以了解到,按鍵的一端接到了地,另一端接到單片機(jī)的PB2引腳上。通過檢測PB2引腳的電平狀態(tài),判斷按鍵是否按下。當(dāng)按鍵松開的時(shí)候,PB2檢測到的電平為高電平,當(dāng)按鍵按下的時(shí)候,PB2檢測到的電平為低電平。
外部電路不含上下拉電阻,對(duì)IO而言是浮空輸入,因此需要使用單片機(jī)內(nèi)部的上下拉電阻;電路不含消抖電容,故編程上需要對(duì)按鍵進(jìn)行軟件消抖。
3.4.按鍵控制LED燈亮滅
3.4.1.配置流程
一般我們使用GPIO的輸入功能,都需要有以下幾個(gè)步驟。
配置GPIO的模式
配置GPIO的輸入
編寫消抖函數(shù)
從開發(fā)板原理圖了解到按鍵接的是單片機(jī)的PB2。我們要使能按鍵就需要配置GPIOB端口。下面我們就以按鍵連接的PB2進(jìn)行介紹。
3.4.1.1.開啟GPIO的端口初始化
由于時(shí)鐘的配置在之前的章節(jié)已有說明,故不再贅述,我們直接對(duì)端口進(jìn)行初始化。初始化的代碼與上文GPIO輸出的配置略有不同,完整代碼如下:
void Gpio_Init(void) { __RCC_GPIOC_CLK_ENABLE();//打開GPIOC的時(shí)鐘,PC0控制LED亮滅 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pins = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.IT = GPIO_IT_NONE; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_Init(CW_GPIOC, &GPIO_InitStruct); __RCC_GPIOB_CLK_ENABLE();//打開GPIOB的時(shí)鐘,PB2控制按鍵輸入 GPIO_InitStruct.Pins = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP; //沒有輸入時(shí)PB2默認(rèn)為高電平 GPIO_InitStruct.IT = GPIO_IT_NONE; GPIO_Init(CW_GPIOB, &GPIO_InitStruct); }3.4.1.2.編寫消抖函數(shù)
本次實(shí)驗(yàn)采用軟件消抖,消抖函數(shù)的編寫思路為:設(shè)置按鍵檢測標(biāo)志位(Flag_Key),當(dāng)單片機(jī)檢測到按鍵按下,即PB2為低電平時(shí),將標(biāo)志位置1;在后續(xù)的條件判斷中如果標(biāo)志位為1,則檢測按鍵是否松開,若已松開則完成本次判斷,認(rèn)為按鍵已經(jīng)按下過一次。這種方式可以不用延時(shí)判斷,節(jié)約軟件資源。
完整的按鍵檢測程序如下:
uint8_t Flag_Key; //按鍵標(biāo)志位 extern uint8_t Flag_LED; //LED顯示標(biāo)志位 void Key_Scan(void) { if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_2) == GPIO_Pin_RESET) //檢測PB2是否為低電平 { Flag_Key = 1; } if(Flag_Key) //接著判斷標(biāo)志位 { if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_2) == GPIO_Pin_SET) //如果按鍵已經(jīng)松開 { Flag_Key = 0; //清零標(biāo)志位,等待下一次按鍵檢測 if(Flag_LED == 0) Flag_LED = 1; //按鍵按下該變LED顯示標(biāo)志位的值,由顯示標(biāo)志位控制LED else Flag_LED = 0; } } }3.4.1.3.LED顯示函數(shù)
在按鍵按下更改LED顯示標(biāo)志位后,需要根據(jù)顯示標(biāo)志位的值來控制LED燈的亮滅。
uint8_t Flag_LED; void LED_Init(void) { GPIO_WritePin(CW_GPIOC,GPIO_PIN_0,GPIO_Pin_SET); //初始化讓LED燈處于熄滅狀態(tài) } void LED_Lighting(void) { if(Flag_LED == 1) { GPIO_WritePin(CW_GPIOC,GPIO_PIN_0,GPIO_Pin_RESET); //亮 } else { GPIO_WritePin(CW_GPIOC,GPIO_PIN_0,GPIO_Pin_SET); //滅 } }最終主函數(shù)里只需要運(yùn)行相應(yīng)的初始化函數(shù)和上面的函數(shù):
int main() { RCC_Configuration(); Gpio_Init(); LED_Init(); while(1) {
審核編輯:劉清
-
上拉電阻
+關(guān)注
關(guān)注
5文章
363瀏覽量
30743 -
濾波器
+關(guān)注
關(guān)注
161文章
7873瀏覽量
179057 -
電磁干擾
+關(guān)注
關(guān)注
36文章
2332瀏覽量
105664 -
GND
+關(guān)注
關(guān)注
2文章
540瀏覽量
38915 -
獨(dú)立按鍵
+關(guān)注
關(guān)注
1文章
45瀏覽量
11624 -
電壓電流表
+關(guān)注
關(guān)注
0文章
25瀏覽量
2101 -
CW32
+關(guān)注
關(guān)注
1文章
218瀏覽量
750
原文標(biāo)題:CW32數(shù)字電壓電流表軟件教程-實(shí)驗(yàn)二:按鍵檢測
文章出處:【微信號(hào):武漢芯源半導(dǎo)體,微信公眾號(hào):武漢芯源半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
基于CW32F003E4P7的數(shù)字電壓電流表產(chǎn)品方案
![基于<b class='flag-5'>CW</b>32F003E4P7的<b class='flag-5'>數(shù)字</b><b class='flag-5'>電壓電流表</b>產(chǎn)品方案](https://file1.elecfans.com//web2/M00/F2/57/wKgZomZ5HSaAP1rzAAFWzm_XVTQ10.webp)
CW32數(shù)字電壓電流表軟件進(jìn)階教程-3.電壓電流標(biāo)定
![<b class='flag-5'>CW32</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件</b>進(jìn)階教程-3.<b class='flag-5'>電壓電流</b>標(biāo)定](https://file1.elecfans.com//web2/M00/EA/A6/wKgZomZZiGGATNseAAAMZi3WpOk52.webp)
CW32數(shù)字電壓電流表軟件進(jìn)階教程-2.電壓電流值做均值濾波
CW32數(shù)字電壓電流表軟件進(jìn)階教程-1.電壓電流同時(shí)顯示
![<b class='flag-5'>CW32</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件</b>進(jìn)階教程-1.<b class='flag-5'>電壓電流</b>同時(shí)顯示](https://file1.elecfans.com//web2/M00/EA/A4/wKgZomZZgSiAAlBwAAAQcgp0K5U91.webp)
CW32數(shù)字電壓電流表軟件教程-實(shí)驗(yàn)七:基本數(shù)據(jù)處理算法(均值濾波)
CW32數(shù)字電壓電流表軟件教程-實(shí)驗(yàn)六:串口藍(lán)牙發(fā)送
![<b class='flag-5'>CW32</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件教程</b>-實(shí)驗(yàn)六:串口藍(lán)牙發(fā)送](https://file1.elecfans.com//web2/M00/EB/8C/wKgaomZZgCaAB2sTAAAZ6kqWvsk15.webp)
CW32數(shù)字電壓電流表軟件教程-實(shí)驗(yàn)五:ADC采樣及顯示
![<b class='flag-5'>CW32</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件教程</b>-實(shí)驗(yàn)五:ADC采樣及顯示](https://file1.elecfans.com//web2/M00/EA/A2/wKgZomZZfBKAEBhPAAAwmCXNLXg48.webp)
CW32數(shù)字電壓電流表軟件教程-實(shí)驗(yàn)四:數(shù)碼管動(dòng)態(tài)顯示
![<b class='flag-5'>CW32</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件教程</b>-實(shí)驗(yàn)四:數(shù)碼管動(dòng)態(tài)顯示](https://file1.elecfans.com//web2/M00/EA/A2/wKgZomZZeweAfBHCAAAWnqqL7aI96.webp)
CW32數(shù)字電壓電流表軟件教程-實(shí)驗(yàn)三:數(shù)碼管顯示數(shù)字
![<b class='flag-5'>CW32</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件教程</b>-實(shí)驗(yàn)三:數(shù)碼管顯示<b class='flag-5'>數(shù)字</b>](https://file1.elecfans.com//web2/M00/EA/A2/wKgZomZZenWANHVLAAAeeuF-uJA02.webp)
CW32數(shù)字電壓電流表軟件教程-實(shí)驗(yàn)二:按鍵檢測
![<b class='flag-5'>CW32</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件教程</b>-實(shí)驗(yàn)<b class='flag-5'>二</b>:<b class='flag-5'>按鍵</b><b class='flag-5'>檢測</b>](https://file1.elecfans.com//web2/M00/EA/A1/wKgZomZZeU6ARZslAAARgFBCr4o54.webp)
CW32數(shù)字電壓電流表軟件教程-實(shí)驗(yàn)一:LED原理與驅(qū)動(dòng)
![<b class='flag-5'>CW32</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件教程</b>-實(shí)驗(yàn)一:LED原理與驅(qū)動(dòng)](https://file1.elecfans.com//web2/M00/EB/89/wKgaomZZd6GAG487AAAO6oe2a2E77.webp)
CW32數(shù)字電壓電流表軟件教程(五):ADC采樣及顯示
![<b class='flag-5'>CW32</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件教程</b>(五):ADC采樣及顯示](https://file1.elecfans.com/web2/M00/E7/8E/wKgZomZMCJqAYI-6AAAxk3S3vTA870.png)
CW32數(shù)字電壓電流表軟件教程(三):數(shù)碼管顯示數(shù)字
![<b class='flag-5'>CW32</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件教程</b>(三):數(shù)碼管顯示<b class='flag-5'>數(shù)字</b>](https://file1.elecfans.com/web2/M00/E5/61/wKgZomZDAwuANTYhAAAeV3iXx8M060.png)
CW32數(shù)字電壓電流表軟件教程(一):LED原理與驅(qū)動(dòng)基礎(chǔ)知識(shí)詳解
![<b class='flag-5'>CW32</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件教程</b>(一):LED原理與驅(qū)動(dòng)基礎(chǔ)知識(shí)詳解](https://file1.elecfans.com/web2/M00/E1/82/wKgaomY4i_iAMHZlAAChlnbfG4w608.png)
CW32數(shù)字電壓電流表-產(chǎn)品硬件設(shè)計(jì)要點(diǎn)
![<b class='flag-5'>CW32</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>電壓電流表</b>-產(chǎn)品硬件設(shè)計(jì)要點(diǎn)](https://file1.elecfans.com/web2/M00/D9/6F/wKgZomYqBCCAM04iAACwV739oUA312.png)
評(píng)論