矩陣鍵盤程式,作為麥知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 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
/*
** name: keypad.cpp**/
#include "keypad.h"
// state:
char keystate;
// bit pattern after each scan:
char keycode;
// output value from the 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 keytable[12][2];
// pin of row
uint16_t _rows = ;
uint16_t _cols = ;
//建構函式
void keypad(void)
//掃瞄鍵盤
void scan_keyboard(void)
break;
} case 1:
else
keystate = 0;
break;
} case 2:
else
keystate = 3;
break;
}case 3:
else
break;
}}// func end
}// 有鍵按下
char anykey(void)
//stop(); //恢復
if (!(0 <= r && r < row_count))
return 0;
else
return 1;
}// 鍵按下, 鍵值相同
char samekey(void)
// 掃瞄鍵
char scankey(void)
/* 若沒有找到有效行,返回 */
if (!(0 <= r && r < row_count))
/* 列掃瞄,找出行上哪個被拉低 */
int c = -1;
for (c = 0; c < col_count; c++)
/* 給所有的列重新充電 */
start();
/* 若沒有找到有效列,返回 */
if (!(0 <= c && 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)
void clearkey(void)
keypressed getkey(void)
else
return key_none;
}void start(void)
void stop(void)
// cols bus output
void cols_out(uint16_t v)
按鍵操作可以改到暫存器操作,提高速度。
使用mbed寫,會更省事,可惜vbt6的ram太少。
基於stm32f103的矩陣鍵盤
我現在的任務是做乙個8 8的矩陣鍵盤,制pcb版之前,我用電路板搭了乙個3 3的矩陣鍵盤來模擬一下,設定pa0 pa1 pa2為pp輸出,設定p3 p4 p5下拉輸入。大多數的晶元內部上拉或下拉電阻都是弱上拉或弱下拉,stm32f103的內部也一樣,內部上拉或下拉的電阻阻值約為40k,這樣可以方便外...
stm32f103外部中斷
void extix init void 外部中斷0服務程式 void exti9 5 irqhandler void 這是簡單的外部中斷的配置,pc7作為中斷輸入 上面補充io口的初始化 gpio initstructure.gpio mode gpio mode ipu pc6配置為快充指示 1...
STM32F103啟動檔案
目錄 一 概述 二 彙編指令 2.1 equ 2.2 area 2.3 space 2.4 preserve8 2.5 thumb 2.6 export 2.7 dcd 2.8 proc 2.9 ldr 2.10 blx 2.11 bx 2.12 temport 2.13 b 2.14 if,els...