矩阵键盘程序,作为麦知club小车项目的一部分,从IAR状态机应用修改而来。
IAR7.4+STM32CUBEMX调试通过。
键盘行4,列3,每条线都有10K上拉电阻。改到4×4矩阵也很容易。
行线设置为 输入,针脚为浮空; 列线设置为开漏输出。
不支持长按和组合键,主要是我不会改。
在OS中使用20ms任务周期调用。
以下贴出代码。
keypad.h
- /*
- *
- * Name: keypad.h
- */
- #ifndef KEYPAD_H
- #define KEYPAD_H
-
- #include "stm32f1xx_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_Pin
- #define High(GPIO_Pin) HAL_GPIO_WritePin(PORT_KEY, GPIO_Pin, GPIO_PIN_SET)
- // 写0到Pin
- //#define Low(GPIO_Pin) PORT_KEY->BSRR = (uint32_t)GPIO_Pin << 16
- #define Low(GPIO_Pin) HAL_GPIO_WritePin(PORT_KEY, GPIO_Pin, GPIO_PIN_RESET)
-
- /*
- * 0 1 2 3
- * 4 5 6 7
- * 8 9 10 11
- * 12 13 14 15
- */
-
- typedef enum {
- Key_Up = 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 ClearKey(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_H
keypad.c
按键操作可以改到寄存器操作,提高速度。
使用mbed写,会更省事,可惜VBT6的RAM太少。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。