STM32的4x4鍵盤外擴

2021-09-25 18:49:15 字數 3442 閱讀 3524

在串列埠實驗的基礎上進行了除錯,網上找的輪子問題很多。除錯ok後的.c與.**件如下。(包含了精英板原按鍵的**。。懶得改了)。

.c檔案

#include "stm32f10x.h"

#include "key.h"

#include "sys.h"

#include "delay.h"

#include "stm32f10x_gpio.h"

gpio_initstructure.gpio_pin  = gpio_pin_4|gpio_pin_3;//key0-key1

gpio_initstructure.gpio_mode = gpio_mode_ipu; //設定成上拉輸入

gpio_init(gpioe, &gpio_initstructure);//初始化gpioe4,3

//初始化 wk_up-->gpioa.0      下拉輸入

gpio_initstructure.gpio_pin  = gpio_pin_0;

gpio_initstructure.gpio_mode = gpio_mode_ipd; //pa0設定成輸入,預設下拉      

gpio_init(gpioa, &gpio_initstructure);//初始化gpioa.0

}//按鍵處理函式

//返回按鍵值

//mode:0,不支援連續按;1,支援連續按;

//0,沒有任何按鍵按下

//1,key0按下

//2,key1按下

//3,key3按下 wk_up

//注意此函式有響應優先順序,key0>key1>key_up!!

u8 key_scan(u8 mode)

else if(key0==1&&key1==1&&wk_up==0)key_up=1;         

return 0;// 無按鍵按下

}//r1-r4接p0-p3

//c1-c4接p4-p7

//s1234對應123a

//s4567對應456b

//以此類推

void keyboard_init(void)//?????

u8 keydown(void)

else return 0;

}u8 read_keyvalue(void)   

gpio_resetbits(gpiob,gpio_pin_1);

gpio_setbits(gpiob,gpio_pin_0|gpio_pin_2|gpio_pin_3);

//printf("%c",(gpio_readinputdata(gpiob)&0xff));

switch(gpio_readinputdata(gpiob)&0xff)

gpio_resetbits(gpiob,gpio_pin_2);

gpio_setbits(gpiob,gpio_pin_0|gpio_pin_1|gpio_pin_3);

//printf("%c",(gpio_readinputdata(gpiob)&0xff));

switch(gpio_readinputdata(gpiob)&0xff)

gpio_resetbits(gpiob,gpio_pin_3);

gpio_setbits(gpiob,gpio_pin_0|gpio_pin_1|gpio_pin_2);

//printf("%c",(gpio_readinputdata(gpiob)&0xff));

switch(gpio_readinputdata(gpiob)&0xff)

gpio_resetbits(gpiob,gpio_pin_0|gpio_pin_1|gpio_pin_2|gpio_pin_3);

gpio_setbits(gpiob,gpio_pin_4|gpio_pin_5|gpio_pin_6|gpio_pin_7);

while((gpio_readinputdata(gpiob)&0xff)!=0xf0);

printf("%c",keyvalue);

return keyvalue;

}int scankeyboard(void)

//  else

// }

return 0;

}.**件

//#define key0 pein(4)       //pe4

//#define key1 pein(3)    //pe3

//#define wk_up pain(0)    //pa0  wk_up

#define key0  gpio_readinputdatabit(gpioe,gpio_pin_4)//讀取按鍵0

#define key1  gpio_readinputdatabit(gpioe,gpio_pin_3)//讀取按鍵1

#define wk_up   gpio_readinputdatabit(gpioa,gpio_pin_0)//讀取按鍵3(wk_up)

#define key0_pres     1    //key0按下

#define key1_pres      2    //key1按下

#define wkup_pres   3    //key_up按下(即wk_up/key_up)

void key_init(void);//io初始化

u8 key_scan(u8);      //按鍵掃瞄函式                        

#endif

#ifndef __key_h

#define __key_h

#include "stm32f10x.h"

void keyboard_init(void);

u8 keydown(void);

u8 read_keyvalue(void);

int scankeyboard(void);

#endif

主函式呼叫:

除錯心得:

四個引腳配置為推挽輸出,四個引腳配置為模擬輸入。在除錯中可以用 printf("%c",(gpio_readinputdata(gpiob)&0xff));檢視引腳的狀態。

注意模擬輸入的引腳高阻態讀取狀態時為1。所以初始化引腳時,需將推挽輸出的引腳置低(即reset),這樣按下相應按鍵時,模擬輸入的引腳的狀態就會變為低電平,進而獲取按鍵狀態。4x4鍵盤外擴的原理圖很多,原理也不難。此處不展開說明。

pb3為jtag的乙個引腳,使用時需用如下**初始化時鐘:

rcc_apb2periphclockcmd( rcc_apb2periph_afio|rcc_apb2periph_gpiob|rcc_apb2periph_gpiof, enable);

gpio_pinremapconfig(gpio_remap_swj_jtagdisable,enable);

在正點原子精英板中pb5引腳為led0的1引腳,外接了3.3v的電源,除錯時將led0用烙鐵取下即可。

2019-0801-1525

4X4矩陣鍵盤掃瞄程式

4x4矩陣鍵盤掃瞄 1.4根行線的gio均設為output,根列線的gio均設為input 2.4根行線的gio分別置為0111 1011 1101 1110,讀逐一讀取列線gio的值,可確定是哪乙個按鍵 電路圖如下 注意 1.圖中用作輸入的gio,一定要有乙個上拉電阻。2.晶元中的每乙個引腳是否用...

4X4矩陣鍵盤掃瞄程式

4x4矩陣鍵盤掃瞄 1.4根行線的gio均設為output,根列線的gio均設為input 2.4根行線的gio分別置為0111 1011 1101 1110,讀逐一讀取列線gio的值,可確定是哪乙個按鍵。電路圖例如以下 注意 1.圖中用作輸入的gio,一定要有乙個上拉電阻。2.晶元中的每個引腳是否...

Unity 中的4X4矩陣

1 為什麼模型的變換是4x4而不是3x3的矩陣變換?我們知道,在空間裡的點的座標是vector3型別的,即是三維的,那為什麼要用4維矩陣才能進行旋轉平移和縮放呢?要解決這個問題就要從變換的本質來談起。我們知道,在變換裡分為線性變換和非線性變換,比如 我們対模型進行縮放,那麼縮放後的點座標是 pn a...