久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5017|回復: 1
打印 上一主題 下一主題
收起左側

STM32F407使用4*4矩陣鍵盤

[復制鏈接]
跳轉到指定樓層
樓主
ID:350579 發表于 2019-3-7 16:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式


# 基于STM32 使用 4*4 矩陣鍵盤

******************************************************************************



作者:李剴 出處:https://www.cnblogs.com/kevin-nancy/  或者  https://blog.csdn.net/Kevin_8_Lee/article/details/88084516
歡迎轉載,但也請保留上面這段聲明。謝謝!(上面這個也是我寫的博客,只是在另一個平臺)今天發布到51hei上面,

寫在前面: 這是本人第一次開始寫博客,可能寫的不是很好,也請大家諒解。
                   本人現在大三,以前在學習過程中遇到過各種各樣的問題,關于51單片機,STM32單片機,最近在學習ARM11的Tiny6410
                   以后還會更新一些C/C++方面的東西
                  關于寫博客這件事,其實 一直想寫博客記錄下來,但是因為某些原因(懶),so , 沒有寫。現在開始,以后遇到單片機上或者編程上遇到的問題,
                  并且自己很好地解決了,我就會在這里記錄下來。
                  希望通過博客記錄我的學習歷程并希望我所解決問題的過程能夠幫到需要的人,一起加油吧!!!

我是在STM32F407開發板上使用的4*4 矩陣鍵盤
下面是我所使用的開發板

![在這里插入圖片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0tldmluXzhfTGVl,size_16,color_FFFFFF,t_70)


![在這里插入圖片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0tldmluXzhfTGVl,size_16,color_FFFFFF,t_70)
1、首先介紹一下4*4矩陣鍵盤掃描原理

     呃。。。。。就不介紹了,[矩陣鍵盤原理描述](http://www.zg4o1577.cn/mcu/3815.html),這個寫的挺好的

2、Cube配置

![在這里插入圖片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0tldmluXzhfTGVl,size_16,color_FFFFFF,t_70)

      矩陣鍵盤從下到上依次接到STM32F407zg單片機的PD0~7引腳  ,其中,矩陣鍵盤下面的四個排針對應的是鍵盤的行(ROW)
      上面四個對應列(COL)   這里我畫了一張圖來說明我所使用的

![鍵盤原理示意](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0tldmluXzhfTGVl,size_16,color_FFFFFF,t_70)

        PD0-3依次對應3-0行  PD4-7依次對應0-3列   這張圖里可以看到我畫了兩個箭頭,下面就給大家說一下我的配置

        配置PD0~3為推挽輸出   PD4~7為下拉輸入,下圖是我在STM32CubeMX 5.1.0中配置的

![在這里插入圖片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0tldmluXzhfTGVl,size_16,color_FFFFFF,t_70)

        上面的箭頭,橫向的表示是單片機輸出給鍵盤的,豎向的是表示送給單片機的,也就是單片機配置的輸入引腳
        用來讀取PD4~7的電平

3、程序編寫

     因為PD4~7為上拉輸入,所以是處在一種高阻態(可以暫時理解為高電平,就是四列都為1)
     我以掃描第一行為例講解  ,

![在這里插入圖片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0tldmluXzhfTGVl,size_16,color_FFFFFF,t_70)


![在這里插入圖片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0tldmluXzhfTGVl,size_16,color_FFFFFF,t_70)

        上述是軟件實現部分, GPIO->IDR和0xf7相與, 若是0xe7  則二進制位1110 0111,說明PD4變為了0,所以第一列的按鍵
        s1按下
note:PD7對應二進制的最高位,PD0對應二進制的最低位

        后面以此類推
注意注意注意(重要的事情說三遍):在程序編寫完后,可能出現有些行未掃描,有些行的按鍵按下沒有通過串口返回信息
                         我的解決方法是,在每一行的掃描之前,將行所對應的引腳清空

![在這里插入圖片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0tldmluXzhfTGVl,size_16,color_FFFFFF,t_70)
                            這樣就不會有問題了


4、貼上完整程序:

```
#include "keypad.h"

#include "stdint.h"
#include "stm32f4xx_hal.h"



uint16_t Key_scan(void)
{
        uint16_t Key_val = 0;           // 按鍵掃描返回鍵值,初始化為0
                                        // 強調一下: 這里必須付一個初值0 否則串口打印出錯
        uint16_t temp;

        /*=========================以下代碼是按鍵掃描程序=========================*/
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); // 先清空引腳狀態
       
        /*----------------------------Scan the 1st ROW----------------------------*/
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET);   // 設置PD0~2為1
        HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET);                       // 設置PD3為0    二進制編碼為 0111
       
    if((GPIOD->IDR & 0xF0) != 0xF0)
    {
                HAL_Delay(10);   // 10ms延時消抖
                if((GPIOD->IDR & 0xF0) != 0xF0)
                {                                                                       
                        temp = (GPIOD->IDR & 0xF7);                                         // GPIOD->IDR寄存器為端口輸入數據寄存器
                        switch(temp)                                                        // 用來讀取GPIO口的電平狀態
                        {
                                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延時消抖
                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延時消抖
                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延時消抖
                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、 這是我的測試結果,見下圖:

![在這里插入圖片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0tldmluXzhfTGVl,size_16,color_FFFFFF,t_70)


這個程序中的編碼只是對應于我自己的接線,自己寫的時候要注意自己的接線
上面有些連接是我上傳的圖片,我自己看的時候看不到圖片,不知道什么原因,但是點擊鏈接打開就是圖片了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

let‘s dream high   每個不滿意的現在,都有一個不努力的曾經。加油吧


評分

參與人數 2黑幣 +106 收起 理由
BigWheels + 6 贊一個!
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:558624 發表于 2019-7-27 19:28 | 只看該作者
謝謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲午夜电影 | 久青草影院 | 亚洲一区视频在线播放 | 欧美高清免费 | 国产伦精品一区二区三区高清 | 成人精品在线视频 | 精品自拍视频在线观看 | 国产玖玖 | 狠狠爱免费视频 | 夜夜精品视频 | 欧美一级片久久 | 国产精品欧美一区二区三区 | www日韩欧美 | 欧美二区在线 | 欧州一区 | 欧美成人一区二区三区片免费 | 国产成人精品a视频一区www | 欧美一区不卡 | 日韩成人影院 | 中文字幕在线视频免费观看 | 日日干夜夜干 | 天天射夜夜操 | 国产成人久久精品一区二区三区 | 日韩一区二区福利视频 | 99精品久久99久久久久 | 国产免费一区二区三区免费视频 | 日韩成人影院在线观看 | 成人做爰999| 色一阁 | 天色综合网 | 免费在线观看av片 | 情侣av | 亚洲成人久久久 | 久久99精品久久久久久噜噜 | 亚洲精品久久久久久一区二区 | 亚洲精品乱码久久久久v最新版 | 久久国品片 | 99精品视频在线 | 日本不卡一区二区三区 | 99tv| 久久久久亚洲 |