下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、stm32f103 狀態(tài)機(jī)矩陣鍵盤(pán)矩陣鍵盤(pán)程序, 作為麥知 club 小車(chē)項(xiàng)目的一部分, 從 iar狀態(tài)機(jī)應(yīng)用修改而來(lái)。iar7.4+stm32cubemx調(diào)試通過(guò)。鍵盤(pán)行 4,列 3,每條線(xiàn)都有10k上拉電阻。改到4× 4 矩陣也很容易。行線(xiàn)設(shè)置為輸入,針腳為浮空;列線(xiàn)設(shè)置為開(kāi)漏輸出。不支持長(zhǎng)按和組合鍵,主要是我不會(huì)改。在 os 中使用 20ms 任務(wù)周期調(diào)用。以下貼出代碼。keypad.hcpp view plain copy /* * * name: keypad.h */#ifndef keypad_h#define keypad_h#include "stm32f
2、1xx_hal.h"#include "pinname.h"#define port_key gpiod#define cols(gpio_pin_4|gpio_pin_5|gpio_pin_6)/讀 pin/#define in(gpio_pin) (port_key->idr & gpio_pin)#define in(gpio_pin)hal_gpio_readpin(port_key, gpio_pin)/寫(xiě) 1 到 pin/#define high(gpio_pin) port_key->bsrr = gpio
3、_pin #define high(gpio_pin) hal_gpio_writepin(port_key,gpio_pin, gpio_pin_set)/寫(xiě) 0 到 pin/#definelow(gpio_pin) port_key->bsrr = (uint32_t)gpio_pin << 16#define low(gpio_pin) hal_gpio_writepin(port_key, gpio_pin, gpio_pin_reset)/*0123 *4567 *891011 *12 13 1415 */typedef enumkey_up
4、 = 0x02,key_left = 0x03,key_right = 0x04,key_down = 0x08,key_on = 0x09,key_mode = 0x0a,key_none = 0xff keypressed;static const int row_count = 4;static const int col_count = 3;uint16_t bus_out(void);void keypad(void);char anykey(void);char samekey(void); char scankey(void);void findkey(void);void cl
5、earkey(void);void read(void);/* start the keypad interrupt routines */void start(void);/* stop the keypad interrupt routines */void stop(void);void cols_out(uint16_t v);void scan_keyboard(void);keypressed getkey(void); #endif / keypad_hkeypad.ccpp view plain copy /* * * name: keypad.cpp * */ #includ
6、e "keypad.h"/ state:char keystate;/ bitpattern after each scan:char keycode;/ output value fromthe virtual 74hc922:keypressed keyvalue;/ keydown is set if key is down:char keydown;/ keynew is set every time a new key is down:char keynew;/映射表char keytable122;/ pin of rowuint16_t _rows =keyx
7、0, keyx1, keyx2, keyx3;uint16_t _cols =keyy0, keyy1, keyy2;/ 構(gòu)造函數(shù)void keypad(void)stop();keystate = 0;/按鍵狀態(tài)初始0/ 掃描鍵盤(pán)void scan_keyboard(void)switch (keystate) case 0:if (anykey() char scankey = scankey(); if (scankey != 0xff)keycode = scankey;keystate = 1;break;case 1: if (samekey() findkey();keystat
8、e = 2; elsekeystate = 0;break;case 2:if (samekey() elsekeystate = 3;break;case 3:if (samekey() keystate = 2; else clearkey();keystate = 0; break;/ func end/有鍵按下charanykey(void) /start();/ 拉低int r = -1;for (r= 0; r < row_count; r+) if (in(_rowsr) = 0)/in macrobreak;/stop();/ 恢復(fù)if (!(0 <
9、= r && r < row_count)return 0; elsereturn 1;/鍵按下,鍵值相同char samekey(void) / char keycode_new = keycode;char keycode_new = scankey();if (keycode = keycode_new)return 1;elsereturn 0;/掃描鍵char scankey(void) /*行掃描*/intr = -1;for (r = 0; r < row_count; r+) if (in(_rowsr) = 0)/
10、in macrobreak;/*若沒(méi)有找到有效行,返回*/if (!(0 <= r&& r < row_count) return0xff;/* 列掃描,找出行上哪個(gè)被拉低 */int c = -1;for (c = 0; c < col_count; c+) / 輪流輸出列線(xiàn)cols_out(1 << c);if (in(_rowsr) = 0) /in macrobreak;/*給所有的列重新充電*/start();/*若沒(méi)有找到有效列, 返回*/if (!(0 <= c &
11、amp;amp;& c < col_count) return 0xff;return r * col_count + c;/findkey compares keycode to values in keytable./ if match, keyvalue, keydown and keynew are updated.void findkey(void) keyvalue = (keypressed)keycode;keydown = 1;keynew = 1;void clearkey(void)keydown = 0;keypressed getkey(void)if(keynew)keynew = 0;return keyvalue;elsereturn key_none;void start(void)/*列輸出 0, 拉低行*/port_key->brr = cols;void stop(void)/*列輸出 1,使行不被拉低*/port_key->bsrr = cols;/ cols bus output void cols_out(uint16_t v)if (v & 0x01) > 0)/0b001high(_cols0);elselow(_cols0)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 便民市場(chǎng)攤販工作總結(jié)
- 幼兒園中班教案《秋風(fēng)》含反思
- 2024年度貸款購(gòu)買(mǎi)房產(chǎn)糾紛調(diào)解合同3篇
- 內(nèi)科護(hù)理工作總結(jié)
- 房地產(chǎn)業(yè)員工培訓(xùn)方案
- 建筑行業(yè)裝修設(shè)計(jì)經(jīng)驗(yàn)分享
- 委托清收處置協(xié)議
- 2024年度高科技研發(fā)項(xiàng)目單方保密協(xié)議書(shū)3篇
- 托育大班游戲課程設(shè)計(jì)
- 游泳課程設(shè)計(jì)原理
- 【新收入準(zhǔn)則對(duì)建筑企業(yè)會(huì)計(jì)核算的影響:以J公司為例14000字(論文)】
- 2023北京西城五年級(jí)(上)期末英語(yǔ)試卷含答案
- icu護(hù)士年終工作總結(jié)
- 浙教版七年級(jí)下冊(cè)英語(yǔ)單詞表
- 2024年連云港師范高等專(zhuān)科學(xué)校高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 隧道勘察重點(diǎn)難點(diǎn)分析報(bào)告
- 風(fēng)濕免疫疾病的皮膚病變與管理
- 高端康養(yǎng)項(xiàng)目計(jì)劃書(shū)
- 項(xiàng)目立項(xiàng)匯報(bào)模板課件
- 天然氣站場(chǎng)泄漏原因分析與治理
- 江蘇省鹽城市東臺(tái)市2022-2023學(xué)年四年級(jí)上學(xué)期期末語(yǔ)文試題
評(píng)論
0/150
提交評(píng)論