arm中stm32中矩陣鍵盤的問題

2021-06-01 12:48:47 字數 3645 閱讀 8850

#ifndef __common_h

#define __common_h 

#include /* 4*4矩陣鍵盤 */

void keyboard_init(void);

void update_key(void);

static unsigned char key[4][4];

void keytest();

static void delay(__io uint32_t ncount);

#define key_row_1 gpio_pin_12 // gpio_pin 為16位的整數

#define key_row_2 gpio_pin_13 // >> 12 //這裡後期可以優化為 直接賦值 0x.....

#define key_row_3 gpio_pin_14 // //前期方便檢視

#define key_row_4 gpio_pin_15 //

#define key_col_1 gpio_pin_7 //

#define key_col_2 gpio_pin_8 //

#define key_col_3 gpio_pin_10 //

#define key_col_4 gpio_pin_11 //

#endif

/**************矩陣鍵盤.c檔案*****************************/

#include "testkey.h"

#include "beep.h"

struct io_port ;

static struct io_port key_output[4] = , ,

, };

static struct io_port key_input[4] = , ,

, };

static unsigned char key[4][4];

void keyboard_init(void)

}void update_key(void)

else

} }

gpio_resetbits(key_output[i].gpio_x, key_output[i].gpio_pin);//還原}}

void keytest()

void delay(__io uint32_t ncount)

//為什麼**一直都能過,而燒到板上就沒得反應呢?beep是個蜂鳴器的程式。beep沒有問題,已經測試過,這程式應該怎麼改呢?

上面紅色的3個問題很是疑惑。

由於這個矩陣鍵盤的問題,把我攪的稀里糊塗的。產生了下面的一堆問題。

什麼都不做那麼gpiox_idr永遠都是 0 ??是麼?

哪種情況下 idr 的值才會改變??自己odr的內容能傳送出去讓idr接收嗎?那應該怎麼做?

idr與ddr 關係到底是怎樣?

這裡附上 io口 idr,,odr的電路圖

還有我矩陣鍵盤的電路圖

問題在一位老師的幫助下得以解決,附上我的測試文件

//冤啊,居然是沒寫這兩個函式

systeminit();rcc_apb2periphclockcmd(rcc_apb2periph_gpiog , enable);

引起下面亂接受。

set 

和 reset

反了 以至於下面的一堆資訊出現問題

gpiog->bsrr = 1<<7 ; //這裡對

io口電壓測試是 

0(低電平)、、那麼我們要觀察

bsrr

指向的位址是否是

brr的位址

gpio_setbits(gpiog,gpio_pin_8) ;   //多個板測試 結果如下

gpio_setbits(gpiog,gpio_pin_12) ; // 這裡是輸入模式 

//測外部引腳 為 

0 gpio_resetbits(gpiog,gpio_pin_13) ; //這裡也是輸入模式 //測外部引腳 為 

0、、//輸入模式對

io口設定沒有任何效果?

gpio_resetbits(gpiog,gpio_pin_10); //這裡對

io口測試是 

1 if(gpio_readinputdatabit(gpiog, gpio_pin_10) == 1)beep();//我們把 

8 和 

10的埠用導線連線後用表測發現 8 

和 10

均為高電平,但是gpio_readinputdatabit(gpiog, gpio_pin_10) == 1 仍然為假,、、//

即是說 

10 口不接受訊號,是由於 是輸出模式?暫存器被鎖了?

if(gpio_readinputdatabit(gpiog, gpio_pin_12) == 1)beep();//輸入模式賦值不起作用哦,所以這裡仍然是0//

我們把10 

和 12

用導線連起來 發現

io口均為高電平但是 

idr裡面仍然沒有資料。

beep

不會被啟用

難道idr

被什麼鎖住了?沒有被開啟? 還是一種可能只執行了一次beep然後裡面就鎖住了idr

》?beep

對整個程式產生了很大的干擾??

#define gpiog               ((gpio_typedef *) gpiog_base)

* @brief general purpose i/o

typedef struct

__io uint32_t crl;

__io uint32_t crh;

__io uint32_t idr;

__io uint32_t odr;

__io uint32_t bsrr;

__io uint32_t brr;

__io uint32_t lckr;

} gpio_typedef;

#define gpiog_base            (apb2periph_base + 0x2000)

、、、加上上面兩個初始化函式後,我們重新對上面的值進行了測試,埠的值均顯示正常,

if(gpio_readinputdatabit(gpiog, gpio_pin_10) == 1)

beep();還是0 

因為是輸出模式??

//8和

10用導線連上後,

idr中為

1,輸出模式 

idr也接收

if(gpio_readinputdatabit(gpiog, gpio_pin_12) == 1)

beep();//執行正常,是

1 因為輸入模式

STM32 矩陣鍵盤的設計實現

專案開發或者日常實驗中有時候需要用到多個按鍵,但微控制器io口資源本身並不多,如果為每乙個按鍵都分配乙個io的話未免太過浪費,所以使用矩陣鍵盤可以盡可能的節省微控制器io口資源。1.系統 windows 2.軟體 keil5 3.微控制器 stm32f103c8t6 矩陣鍵盤與普通的乙個io對應乙個...

STM32使用中斷驅動矩陣鍵盤

巨集定義 b6,b7,c8,c9做行掃瞄,c10 c12做列掃瞄 define row1 gpio port gpiob 行1 define gpio clk rcc apb2periph gpiob rcc apb2periph gpioc gpio埠時鐘 define row1 gpio pin...

STM32(暫存器) 矩陣鍵盤

1 硬體 準備乙個2 2矩陣鍵盤,分別接pb8,9,10,11 2 矩陣鍵盤原理 讓pa8,9輸出高電平,pa10,11輸入 當pa10,11中檢測到高電平時,得到i值。然後翻轉,讓pa8,9輸入,pa10,11輸出高電平 當pa8,9中檢測到高電平時,得到j值 然後通過i,j確定是那個按鍵 3 k...