stm32F103状态机矩阵键盘(精编版)_第1页
stm32F103状态机矩阵键盘(精编版)_第2页
stm32F103状态机矩阵键盘(精编版)_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、stm32f103 状态机矩阵键盘矩阵键盘程序, 作为麦知 club 小车项目的一部分, 从 iar状态机应用修改而来。iar7.4+stm32cubemx调试通过。键盘行 4,列 3,每条线都有10k上拉电阻。改到4× 4 矩阵也很容易。行线设置为输入,针脚为浮空;列线设置为开漏输出。不支持长按和组合键,主要是我不会改。在 os 中使用 20ms 任务周期调用。以下贴出代码。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;/ 构造函数void keypad(void)stop();keystate = 0;/按键状态初始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();/ 恢复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;/* 列扫描,找出行上哪个被拉低 */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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论