




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(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)的問題,或其他錯(cuò)誤有問題再學(xué)習(xí)更改。 )/*按鍵掃描程序*/*本程序定義四個(gè)獨(dú)立按鍵,對(duì)四個(gè)獨(dú)立按鍵的短按長按進(jìn)行識(shí)別,返回最終的鍵值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(); /按鍵的掃描程序,放在定時(shí)器中斷中,定時(shí)器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號(hào)按鍵短按最終鍵值為0x11,長按為0x12.類推/#define key_long 0x02; /定義長按鍵值, /#define key_short 0x01;/#define key_short 0x01;unsigne
5、d char key_value=0; /定義一個(gè)鍵值變量。unsigned char key_down_IF=0x00; /按鍵按下標(biāo)志位,0x10代表key1按下標(biāo)志,0x20為key2按下,0x30為key3按下。unsigned int key_delay_count=0; /按鍵延時(shí)計(jì)數(shù)器unsigned int key_delay_short=100; /定義短按延時(shí)判斷時(shí)間unsigned int key_delay_long=1000; /定義長按的延時(shí)判斷時(shí)間/*讀取按鍵的位值*/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/*按鍵掃描程序*/*建檔時(shí)間:20151215跟新記錄:20151218測試通過。注意事項(xiàng):調(diào)試中遇到的問題有:按鍵的鍵值讀取函數(shù)unsigned char key_1_in();等本來是準(zhǔn)備放在宏定義里面的,但是總是報(bào)錯(cuò)有問題。所以放在函數(shù)中。 導(dǎo)致不能直接在其他程序中包含這個(gè)頭文件。 程序思想:按鍵按下后進(jìn)入中斷,然后判斷是哪個(gè)按鍵按下,并賦值。當(dāng)有按鍵按下后按鍵按下標(biāo)志位會(huì)被置位,然后在定時(shí)器的中斷中不斷檢測是否有按鍵按下,如果 有按鍵被按下,則開始計(jì)時(shí),如果計(jì)數(shù)值沒有達(dá)到去抖的累計(jì)值則松手之后計(jì)時(shí)自動(dòng)清零。當(dāng)按下后計(jì)數(shù)根據(jù)定時(shí)器的計(jì)數(shù)的時(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定時(shí)器中調(diào)用次程序,即每1ms掃描檢測一次/void scan_key()if(key_down_IF != 0x00) /有按鍵按下開始掃描 此時(shí)key_down_IF就有key1,2,3的信息key_delay_count+; /延時(shí)計(jì)數(shù)器開始計(jì)數(shù) if(key_delay_count>=65530) key_delay_count=0;key_down_IF=0; /按鍵按下時(shí)間過長,則是故障,不執(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) /有按鍵按下的條件下,讀取那個(gè)鍵按下的,然后判斷是否已經(jīng)松手,當(dāng)前鍵值是什么 case 0x10: if(key_2_in()&&(key_down_IF & 0x0f)> 0) /松手后 如果有長短按標(biāo)志,則將結(jié)果公布 這句可以省略 key_value=key_down_IF; /松手的時(shí)候沒有長短按標(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; /松手的時(shí)候沒有長短按標(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; /松手的時(shí)候沒有長短按標(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024成都冶金職工大學(xué)輔導(dǎo)員招聘筆試真題
- 文化旅游項(xiàng)目規(guī)劃師筆試試題及答案
- 2025年隔離接地開關(guān)項(xiàng)目發(fā)展計(jì)劃
- 2025年車用交流發(fā)電機(jī)合作協(xié)議書
- 玉林市陸川縣招聘特崗教師筆試真題2024
- 2025年市場調(diào)查服務(wù)項(xiàng)目合作計(jì)劃書
- 2025年經(jīng)典心理健康知識(shí)競賽考試練習(xí)題庫(350題)【答案】
- 2025年事業(yè)單位考試中國古代近代文學(xué)史知識(shí)考試題庫(五套)【答案】
- 活動(dòng)總結(jié)范文學(xué)校五四青年節(jié)活動(dòng)總結(jié)怎么寫
- 糧食局員工年末述職報(bào)告范文
- 高中英語必背3500單詞表完整版
- 大連農(nóng)商銀行2024年招聘172人管理單位遴選500模擬題附帶答案詳解
- 安徽省工傷職工停工留薪期分類目錄
- 職業(yè)安全衛(wèi)生知識(shí)競賽題
- 消防設(shè)施移交及消防設(shè)施操作維護(hù)人員培訓(xùn)和清單參考模板范本
- SLAP損傷的治療課件
- 廣東省外語藝術(shù)職業(yè)學(xué)院后勤服務(wù)項(xiàng)目檢查評(píng)分標(biāo)準(zhǔn)
- 以理解為中心的歷史教育 西安張漢林 全國歷史教育專家2016年夏高考研討會(huì)最新材料
- 住院醫(yī)師規(guī)范化培訓(xùn)心電圖PPT課件.ppt
- 義務(wù)教育《道德與法治》課程標(biāo)準(zhǔn)(2022年版)
- 加強(qiáng)領(lǐng)導(dǎo)班子和干部隊(duì)伍建設(shè)(同名14988)
評(píng)論
0/150
提交評(píng)論