下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、stm32f103 狀態(tài)機(jī)矩陣鍵盤矩陣鍵盤程序, 作為麥知 club 小車項(xiàng)目的一部分, 從 iar狀態(tài)機(jī)應(yīng)用修改而來。iar7.4+stm32cubemx調(diào)試通過。鍵盤行 4,列 3,每條線都有10k上拉電阻。改到4× 4 矩陣也很容易。行線設(shè)置為輸入,針腳為浮空;列線設(shè)置為開漏輸出。不支持長按和組合鍵,主要是我不會(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)/寫 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)/寫 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/ 掃描鍵盤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;/*若沒有找到有效行,返回*/if (!(0 <= r&& r < row_count) return0xff;/* 列掃描,找出行上哪個(gè)被拉低 */int c = -1;for (c = 0; c < col_count; c+) / 輪流輸出列線cols_out(1 << c);if (in(_rowsr) = 0) /in macrobreak;/*給所有的列重新充電*/start();/*若沒有找到有效列, 返回*/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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 六年級第一學(xué)期教學(xué)計(jì)劃范文合集三篇
- 九年級化學(xué)教學(xué)計(jì)劃范文錦集7篇
- 銷售部年度工作計(jì)劃
- 師德師風(fēng)的教師演講稿模板5篇
- 人壽保險(xiǎn)公司實(shí)習(xí)報(bào)告合集六篇
- 關(guān)于年會(huì)策劃方案范文合集6篇
- 大學(xué)生頂崗實(shí)習(xí)周記錦集六篇
- 政府績效評估 課件 蔡立輝 第6-10章 政府績效評估的結(jié)果應(yīng)用與改進(jìn) -政府績效評估在當(dāng)代中國的推進(jìn)
- 2010年高考一輪復(fù)習(xí)教案:必修1 第四章 非金屬及其化合物 全程教學(xué)案
- 2025年農(nóng)林牧漁專用儀器儀表項(xiàng)目發(fā)展計(jì)劃
- 2024年度企業(yè)重組與債務(wù)重組協(xié)議3篇
- 2024年公交車開通儀式講話例文(4篇)
- 年高考新課標(biāo)I卷語文試題講評課件
- 《三 采用合理的論證方法》教學(xué)設(shè)計(jì)統(tǒng)編版高中語文選擇性必修上冊
- 2024-2025學(xué)年語文二年級上冊 部編版期末測試卷 (含答案)
- 2024-2025學(xué)年八年級上冊物理 第五章 透鏡以及其應(yīng)用 測試卷(含答案)
- 《自理理論orem》課件
- 職業(yè)技術(shù)學(xué)院無人機(jī)應(yīng)用技術(shù)專業(yè)人才培養(yǎng)方案
- 神經(jīng)病學(xué)第九版腦梗死
- 2024年浙江省杭州市下城區(qū)教育局所屬事業(yè)單位招聘學(xué)科拔尖人才10人歷年管理單位遴選500模擬題附帶答案詳解
- 研發(fā)項(xiàng)目管理培訓(xùn)課件講解
評論
0/150
提交評論