iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
1

今天我們來玩玩4x4鍵盤,這種鍵盤是薄膜開關的4×4矩陣鍵盤,如下圖

https://ithelp.ithome.com.tw/upload/images/20201002/20120093nRQhuHFgSD.jpg

矩陣鍵盤和一般按鍵不一樣的地方,就是不管今天你有幾個按鍵,鍵盤中的鍵分為行和列,我們將使用它來找出按下了哪個按鍵

https://ithelp.ithome.com.tw/upload/images/20201002/20120093wwHdSPLrQE.png

如上圖,鍵盤有16個鍵,它們分為4個行和4個列。每行(ROW)中的所有按鍵連接在一起,而每列(COL)中的所有按鍵連接在一起,如下圖所示

https://ithelp.ithome.com.tw/upload/images/20201002/20120093QPrJURIF79.png

每當我按下按鍵時,行(ROW)與列(COL)之間就會連接,並且列(COL)引腳電位為0
這將告訴我們ROW和COL均為0(LOW),我們就知道按下了甚麼按鍵

假設我按了“9”。要確定這一點,我需要將第三個行(ROW)拉到LOW,然後檢查Columns。每當按下“9”時,第三列將變為0(LOW),所以第三行(ROW)和第三個列(COL)之間就會連接。我們就知道9被按下了

我在這裡使用的方法是輪詢,顯然中斷的方式更好,但我們先確認基本功能完備再來執行中斷

/ *偵測第一行,將R1拉低,其餘拉高* / 
	HAL_GPIO_WritePin ( GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);  // 將 R1 拉低
	HAL_GPIO_WritePin ( GPIOA, GPIO_PIN_2, GPIO_PIN_SET);    // 將 R2 拉高
	HAL_GPIO_WritePin ( GPIOA, GPIO_PIN_3, GPIO_PIN_SET);    // 將 R3 拉高
	HAL_GPIO_WritePin ( GPIOA, GPIO_PIN_4, GPIO_PIN_SET);    // 將 R4 拉高
	
	if (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_1)))   // 如果第一列為0
	{
		while (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_1)));   // 如果1被按下回傳1
		return '1';
	}
	
	if (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_2)))   // 如果第二列為0
	{
		while (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_2)));   // 如果2被按下回傳2
		return '2';
	}
	
	if (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_3)))   // 如果第三列為0
	{
		while (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_3)));   // 如果3被按下回傳3
		return '3';
	}
	
	if (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_4)))   // 如果第四列為0
	{
		while (!(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_4)));   // 如果4被按下回傳4
		return 'A';
	}

相關連結


結語

到底~


上一篇
[Day 16]-【STM32系列】ADC and Joystick 搖桿控制
下一篇
[Day 18]-【STM32系列】IC之間常用的通訊協定 I²C
系列文
熟悉Arduino的Maker必看!30天帶你快速入門基於STM32嵌入式開發~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言