版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度farmhouse木門安裝服務(wù)合同
- 深圳購房合同樣本
- 住宅房屋購買合同簡單版
- 2024年《軟件許可合同中不可抗力事件的處理》
- 廣告公司授權(quán)合同模板
- 2024年范文承包土地協(xié)議書
- 2024年發(fā)光字合同
- 跨境客運(yùn)線路租賃合同
- 共建文明施工項(xiàng)目協(xié)議書
- 親子園與醫(yī)療機(jī)構(gòu)合作協(xié)議書
- 國開2024年《中國法律史》平時作業(yè)1-3答案
- 工資流水證明2頁
- 鐵合金生產(chǎn)工藝
- 鋼結(jié)構(gòu)策劃書(范本)
- 急性腎衰竭與crrt治
- 焦化廠生產(chǎn)工序及工藝流程圖
- 嘔吐(急性胃腸炎)診療指南(制訂)編制說明排版
- 江堤道路工程施工方案#江蘇
- (外研版)初中英語語法匯總[新版]
- 李燕璇植樹問題卡通版5
- 有砟軌道鋪設(shè)的施工講解
評論
0/150
提交評論