


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深耕新质生产力
- 浙江国企招聘2025绍兴市城北物业经营管理有限公司招聘8人笔试参考题库附带答案详解
- 2025年中国电动机台数据监测报告
- 航天器电推进系统与离子发动机考核试卷
- 煤气化技术的创新与优化考核试卷
- 眼镜店隐形眼镜配适考核试卷
- 管道配件在智能家居中的应用考核试卷
- 市场营销与宠物护理服务考核试卷
- 电气设备的继电保护与控制考核试卷
- 染整企业品牌形象塑造与传播策略实施考核试卷
- 中欧班列国际运输通道对我国外贸高质量发展的影响效应分析
- 人教版初中数学八年级下册全册教案(2024年春季修订)
- 2025年中国汽车清洗系统行业发展现状调查、竞争格局分析及未来前景预测报告
- 大数据与会计专业专科综合实践报告
- 2025年高考作文素材积累之《黑镜》:科技狂欢与文明困境
- 化妆品生产防渗漏质量控制措施
- 政府绩效评估 课件 蔡立辉 第6-10章 政府绩效评估的结果应用与改进 -政府绩效评估在当代中国的推进
- 2025年职教高考对口升学 护理类 专业综合模拟卷(3)(原卷版)(四川适用)
- 五年级数学下册每日计算小纸条
- 我的家乡成都课件
- 延长石油集团招聘笔试
评论
0/150
提交评论