STM8的按鍵程序?qū)W習(xí)筆記_第1頁
STM8的按鍵程序?qū)W習(xí)筆記_第2頁
STM8的按鍵程序?qū)W習(xí)筆記_第3頁
STM8的按鍵程序?qū)W習(xí)筆記_第4頁
STM8的按鍵程序?qū)W習(xí)筆記_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、STM8的按鍵程序?qū)W習(xí)筆記本程序基于STM8S105K4 單片機(jī)學(xué)習(xí)程序。程序硬件就是STM8的最小開發(fā)板搭建,用的內(nèi)部晶振1分頻。經(jīng)測試可以正常檢測到按鍵的短按和長按。程序思想見。C程序中的注釋 。最終通過調(diào)試和實(shí)驗(yàn)。所有的程序如下:(程序中可能還有些其他沒有發(fā)現(xiàn)的問題,或其他錯誤有問題再學(xué)習(xí)更改。 )/*按鍵掃描程序*/*本程序定義四個獨(dú)立按鍵,對四個獨(dú)立按鍵的短按長按進(jìn)行識別,返回最終的鍵值key_value為最終鍵值:0x11為按鍵1的短按,0x12為按鍵的長按。0x21為按鍵2的短按,0x22為按鍵的長按。類推注意:鍵值讀取之后應(yīng)將鍵值復(fù)位清零,以備下次檢測;注意:系統(tǒng)中斷函數(shù)中有按

2、鍵掃描的部分程序INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 4)等。調(diào)用方法:void key_port_init(); /按鍵端口的定義void scan_key(); /按鍵的掃描程序,放在定時器中斷中,定時器1ms中斷。extern unsigned char key_down_IF=0x00; /在中斷函數(shù)中加入變量聲明extern scan_key(); /在中斷函數(shù)中加入變量聲明extern key_value; /在主函數(shù)中加入變量聲明*/#ifndef _KEY_SCAN_H#define _KEY_SCAN_H/*定義按鍵的端口位*/#d

3、efine key_1_io GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT)#define key_2_io GPIO_Init(GPIOC, GPIO_PIN_5, GPIO_MODE_IN_PU_IT)#define key_3_io GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_IN_PU_IT)#define key_4_io GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_IT)/#define key_1_in() (GPIO_ReadInputPin(GPI

4、OC, GPIO_PIN_5)=SET)? 1:0/*設(shè)置端口按鍵中斷的觸發(fā)方式 下降沿和低電平觸發(fā)*/#define key_int_way EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);/#define key_short 0x01; /定義短按鍵值, 按鍵按下后根據(jù)按鍵1號按鍵短按最終鍵值為0x11,長按為0x12.類推/#define key_long 0x02; /定義長按鍵值, /#define key_short 0x01;/#define key_short 0x01;unsigne

5、d char key_value=0; /定義一個鍵值變量。unsigned char key_down_IF=0x00; /按鍵按下標(biāo)志位,0x10代表key1按下標(biāo)志,0x20為key2按下,0x30為key3按下。unsigned int key_delay_count=0; /按鍵延時計(jì)數(shù)器unsigned int key_delay_short=100; /定義短按延時判斷時間unsigned int key_delay_long=1000; /定義長按的延時判斷時間/*讀取按鍵的位值*/unsigned char key_1_in() if(GPIO_ReadInputPin(GP

6、IOC, GPIO_PIN_4) return 1; else return 0;unsigned char key_2_in() if(GPIO_ReadInputPin(GPIOC, GPIO_PIN_5) return 1; else return 0;unsigned char key_3_in() if(GPIO_ReadInputPin(GPIOC, GPIO_PIN_6) return 1; else return 0;unsigned char key_4_in() if(GPIO_ReadInputPin(GPIOC, GPIO_PIN_7) return 1; else r

7、eturn 0;#endif/*按鍵掃描程序*/*建檔時間:20151215跟新記錄:20151218測試通過。注意事項(xiàng):調(diào)試中遇到的問題有:按鍵的鍵值讀取函數(shù)unsigned char key_1_in();等本來是準(zhǔn)備放在宏定義里面的,但是總是報(bào)錯有問題。所以放在函數(shù)中。 導(dǎo)致不能直接在其他程序中包含這個頭文件。 程序思想:按鍵按下后進(jìn)入中斷,然后判斷是哪個按鍵按下,并賦值。當(dāng)有按鍵按下后按鍵按下標(biāo)志位會被置位,然后在定時器的中斷中不斷檢測是否有按鍵按下,如果 有按鍵被按下,則開始計(jì)時,如果計(jì)數(shù)值沒有達(dá)到去抖的累計(jì)值則松手之后計(jì)時自動清零。當(dāng)按下后計(jì)數(shù)根據(jù)定時器的計(jì)數(shù)的時間長短判斷是長按還

8、是短按, 然后將數(shù)據(jù)復(fù)制到鍵值返回到主函數(shù)中。按鍵程序沒有在線等待,而是掃描形式判斷。減小CPU的負(fù)擔(dān)。硬件支持:16MHz晶振1分頻。按鍵中斷選擇下降沿中斷。*/#include "key_scan.h"void key_port_init()key_1_io; /端口上拉輸入中斷key_2_io;key_3_io;key_4_io;key_int_way; /按鍵觸發(fā)方式為下降沿低電平觸發(fā)/INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 4)/void key_interrupt_do()key_down_IF=0x10;key_dow

9、n_IF=0x20;key_down_IF=0x30;key_down_IF=0x40;/1ms定時器中調(diào)用次程序,即每1ms掃描檢測一次/void scan_key()if(key_down_IF != 0x00) /有按鍵按下開始掃描 此時key_down_IF就有key1,2,3的信息key_delay_count+; /延時計(jì)數(shù)器開始計(jì)數(shù) if(key_delay_count>=65530) key_delay_count=0;key_down_IF=0; /按鍵按下時間過長,則是故障,不執(zhí)行按鍵反饋if(key_delay_count>=key_delay_long) k

10、ey_down_IF &=0xf0; key_down_IF |=0x02; /加上長按標(biāo)志else if(key_delay_count<key_delay_long)&&(key_delay_count>=key_delay_short) key_down_IF &=0xf0; key_down_IF |=0x01; /加上短按標(biāo)志 if( (key_1_in() && (key_2_in() && (key_3_in() && (key_4_in() ) /松手后判斷switch(key_down

11、_IF&0xf0) /有按鍵按下的條件下,讀取那個鍵按下的,然后判斷是否已經(jīng)松手,當(dāng)前鍵值是什么 case 0x10: if(key_2_in()&&(key_down_IF & 0x0f)> 0) /松手后 如果有長短按標(biāo)志,則將結(jié)果公布 這句可以省略 key_value=key_down_IF; /松手的時候沒有長短按標(biāo)志,則不顯示結(jié)果,且清零標(biāo)志 key_down_IF=0;key_delay_count=0; break; case 0x20: if(key_2_in()&&(key_down_IF & 0x0f) >

12、 0) /松手后 如果有長短按標(biāo)志,則將結(jié)果公布 這句可以省略 下同 key_value=key_down_IF; /松手的時候沒有長短按標(biāo)志,則不顯示結(jié)果 key_down_IF=0;key_delay_count=0; break; case 0x30: if(key_3_in()&&(key_down_IF & 0x0f) > 0) /松手后 如果有長短按標(biāo)志,則將結(jié)果公布 key_value=key_down_IF; /松手的時候沒有長短按標(biāo)志,則不顯示結(jié)果 key_down_IF=0;key_delay_count=0;break; case 0x40: if(key_4_in()&&(key_down_IF &

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論