在串列埠實驗的基礎上進行了除錯,網上找的輪子問題很多。除錯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...