【STM32学习笔记】STM32f407 使用4*4矩阵键盘
作者:李剴 出處:https://www.cnblogs.com/kevin-nancy/
歡迎轉(zhuǎn)載,但也請(qǐng)保留上面這段聲明。謝謝!
寫(xiě)在前面: 這是本人第一次開(kāi)始寫(xiě)博客,可能寫(xiě)的不是很好,也請(qǐng)大家諒解。
本人現(xiàn)在大三,以前在學(xué)習(xí)過(guò)程中遇到過(guò)各種各樣的問(wèn)題,關(guān)于51單片機(jī),STM32單片機(jī),最近在學(xué)習(xí)ARM11的Tiny6410
以后還會(huì)更新一些C/C++方面的東西
關(guān)于寫(xiě)博客這件事,其實(shí) 一直想寫(xiě)博客記錄下來(lái),但是因?yàn)槟承┰颍☉校瑂o , 沒(méi)有寫(xiě)。現(xiàn)在開(kāi)始,以后遇到單片機(jī)上或者編程上遇到的問(wèn)題,
并且自己很好地解決了,我就會(huì)在這里記錄下來(lái)。
希望通過(guò)博客記錄我的學(xué)習(xí)歷程并希望我所解決問(wèn)題的過(guò)程能夠幫到需要的人,一起加油吧!!!
我使用的是STM32F407zg的最小系統(tǒng)板
使用HAL庫(kù),用STMCubeMX配置
1、首先介紹一下4*4矩陣鍵盤(pán)掃描原理
呃。。。。。就不介紹了,http://www.51hei.com/mcu/3815.html,這個(gè)寫(xiě)的挺好的
2、Cube配置
矩陣鍵盤(pán)從下到上依次接到STM32F407zg單片機(jī)的PD0~7引腳 ,其中,矩陣鍵盤(pán)下面的四個(gè)排針對(duì)應(yīng)的是鍵盤(pán)的行(ROW)
上面四個(gè)對(duì)應(yīng)列(COL) 這里我畫(huà)了一張圖來(lái)說(shuō)明我所使用的
PD0-3依次對(duì)應(yīng)3-0行 PD4-7依次對(duì)應(yīng)0-3列 這張圖里可以看到我畫(huà)了兩個(gè)箭頭,下面就給大家說(shuō)一下我的配置
配置PD0~3為推挽輸出 PD4~7為下拉輸入,下圖是我在STM32CubeMX 5.1.0中配置的
上面的箭頭,橫向的表示是單片機(jī)輸出給鍵盤(pán)的,豎向的是表示送給單片機(jī)的,也就是單片機(jī)配置的輸入引腳
用來(lái)讀取PD4~7的電平
3、程序編寫(xiě)
因?yàn)镻D4~7為上拉輸入,所以是處在一種高阻態(tài)(可以暫時(shí)理解為高電平,就是四列都為1)
我以掃描第一行為例講解 ,
上述是軟件實(shí)現(xiàn)部分, GPIO->IDR和0xf7相與, 若是0xe7 則二進(jìn)制位1110 0111,說(shuō)明PD4變?yōu)榱?,所以第一列的按鍵
s1按下
note:PD7對(duì)應(yīng)二進(jìn)制數(shù)中的最高位 PD0對(duì)應(yīng)最低位
后面以此類推
注意注意注意:在程序編寫(xiě)完后,可能出現(xiàn)有些行未掃描,有些行的按鍵按下沒(méi)有通過(guò)串口返回信息
我的解決方法是,在每一行的掃描之前,將行所對(duì)應(yīng)的引腳清空
這樣就不會(huì)有問(wèn)題了
4、貼上完整程序:
#include "keypad.h"
#include "stdint.h"
#include "stm32f4xx_hal.h"
uint16_t Key_scan(void)
{
uint16_t Key_val = 0; // 按鍵掃描返回鍵值,初始化為0
// 強(qiáng)調(diào)一下: 這里必須付一個(gè)初值0 否則串口打印出錯(cuò)
uint16_t temp;
/*=========================以下代碼是按鍵掃描程序=========================*/
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); // 先清空引腳狀態(tài)
/*----------------------------Scan the 1st ROW----------------------------*/
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET); // 設(shè)置PD0~2為1
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET); // 設(shè)置PD3為0 二進(jìn)制編碼為 0111
if((GPIOD->IDR & 0xF0) != 0xF0)
{
HAL_Delay(10); // 10ms延時(shí)消抖
if((GPIOD->IDR & 0xF0) != 0xF0)
{
temp = (GPIOD->IDR & 0xF7); // GPIOD->IDR寄存器為端口輸入數(shù)據(jù)寄存器
switch(temp) // 用來(lái)讀取GPIO口的電平狀態(tài)
{
case 0xE7 : Key_val = 1;
break;
case 0xD7 : Key_val = 2;
break;
case 0xB7 : Key_val = 3;
break;
case 0x77 : Key_val = 4;
break;
default : Key_val = 0; break;
}
}
}
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
/*----------------------------Scan the 2nd ROW----------------------------*/
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
if((GPIOD->IDR & 0xF0) != 0xF0)
{
HAL_Delay(10); // 10ms延時(shí)消抖
if((GPIOD->IDR & 0xF0) != 0xF0)
{
temp = (GPIOD->IDR & 0xFB);
switch(temp)
{
case 0xEB : Key_val = 5;
break;
case 0xDB : Key_val = 6;
break;
case 0xBB : Key_val = 7;
break;
case 0x7B : Key_val = 8;
break;
default : Key_val = 0; break;
}
}
}
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
/*----------------------------Scan the 3rd ROW----------------------------*/
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET);
if((GPIOD->IDR & 0xF0) != 0xF0)
{
HAL_Delay(10); // 10ms延時(shí)消抖
if((GPIOD->IDR & 0xF0) != 0xF0)
{
temp = (GPIOD->IDR & 0xFD);
switch(temp)
{
case 0xED : Key_val = 9;
break;
case 0xDD : Key_val = 10;
break;
case 0xBD : Key_val = 11;
break;
case 0x7D : Key_val = 12;
break;
default : Key_val = 0; break;
}
}
}
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
/*----------------------------Scan the 4th ROW----------------------------*/
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET);
if((GPIOD->IDR & 0xF0) != 0xF0)
{
HAL_Delay(10); // 10ms延時(shí)消抖
if((GPIOD->IDR & 0xF0) != 0xF0)
{
temp = (GPIOD->IDR & 0xFE);
switch(temp)
{
case 0xEE : Key_val = 13;
break;
case 0xDE : Key_val = 14;
break;
case 0xBE : Key_val = 15;
break;
case 0X7E : Key_val = 16;
break;
default : Key_val = 0; break;
}
}
}
return Key_val;
}
5、 這是我的測(cè)試結(jié)果,見(jiàn)下圖:
這個(gè)程序中的編碼只是對(duì)應(yīng)于我自己的接線,自己寫(xiě)的時(shí)候要注意自己的接線
上面有些連接是我上傳的圖片,我自己看的時(shí)候看不到圖片,不知道什么原因,但是復(fù)制鏈接打開(kāi)就是圖片了
let‘s dream high 每個(gè)不滿意的現(xiàn)在,都有一個(gè)不努力的曾經(jīng)。加油吧
總結(jié)
以上是生活随笔為你收集整理的【STM32学习笔记】STM32f407 使用4*4矩阵键盘的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WIN10 拨号连接下 如何开启移动热点
- 下一篇: spark sql的agg函数,作用:在