stm32F103狀態機矩陣鍵盤

2021-07-08 16:56:05 字數 3454 閱讀 9527

矩陣鍵盤程式,作為麥知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...