在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32F103單片機的矩陣按鍵設計

CHANBAEK ? 來源:南山府嵌入式 ? 作者:南山府嵌入式 ? 2022-12-09 17:18 ? 次閱讀

需要知識點

按鍵的原理

GPIO輸入輸出

寄存器操作,如果學過51或者對C語言很熟練這里不存在問題。寄存器說白了就是操作他們的位(寄存器我理解就是一串羊肉串,讓你找出你先吃哪個,比如我要吃中間的哪一個該怎么取出來)

矩陣按鍵原理

本實驗使用STM32F103單片機,主題代碼通用的。

如果每個按鍵占用一個GPIO引腳,對于使用多個按鍵來說就是一種資源的浪費,因此當我們在設計時,可以考慮矩陣這種方式。本實驗使用4*4也就是16個按鍵。

矩陣按鍵相對于獨立按鍵稍微麻煩一點。4x4矩陣按鍵按照矩陣方式分別分為4行4列。主要有兩種方式,一種是逐行掃描、一種是行列掃描。

原理圖:

逐行掃描

通過在矩陣按鍵的每一條行線上輪流輸出低電平,檢測矩陣按鍵的列線,當檢測到的列線不全為高電平的時候,說明有按鍵按下。然后,根據當前輸出低電平的行號和檢測到低電平的列號組合,判斷是哪一個按鍵被按下。

行列掃描

首先,在全部行線上輸出低電平,檢測矩陣按鍵的列線,當檢測到的列線不全為高電平的時候,說明有按鍵按下,并判斷是哪一列有按鍵按下。

然后,反過來,在全部列線上輸出低電平,檢測矩陣按鍵的行線,當檢測到的行線不全為高電平的時候,說明有按鍵按下,并判斷是哪一行有按鍵按下。

最后,根據檢測到的行號和檢測的列號組合,以判斷是哪一個按鍵被按下。

按鍵檢測說白了就是按鍵按下之后是不是導通的,而其他沒有按下的按鍵是沒有導通的,代碼也不唯一,是多種多樣的。這里就需要操作寄存器或者使用庫函數的位操作。

流程

矩陣按鍵程序實現

根據是國內棉矩陣按鍵電路圖,編寫矩陣按鍵應用程序,輪徇K1~K8按鍵動作,當對應的按鍵按下后,返回對應的值:

矩陣按鍵:

/************
按鍵表盤為: 1 2 3 10
 4 5 6 11
 7 8 9 12
 13 0 14 15
 /K1-K4(行)/
 /K5-K8(列)/
/************
 K1--->PC0
 K2--->PC1
 K3--->PC2
 K4--->PC3
 K5--->PC4
 K6--->PC5
 K7--->PC6
 ***********************/

編程要點

(1)使能LED燈和矩陣按鍵的GPIO時鐘。調用函數:

RCC_AHB1PeriphClockCmd();

(2)編寫矩陣按鍵掃描程序。

(3)同2-STM32GPIO輸入之按鍵

矩陣按鍵引腳配置

/************************************************************************
 * @brief KEY_Config 按鍵初始化配置
 * @brief 列檢測初始化
 * @param  無
 * @retval 無
 ***********************************************************************/


static void KEY_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    /*開啟RCC時鐘*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);


    /*K1-K4(行)*/
    GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
    //設置引腳為
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    //設置引腳速度50MHZ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);


    /*K5-K8(列)*/
    GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
    //設置引腳為推挽輸出模式
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    //設置引腳速度50MHZ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}

矩陣按鍵掃描程序

/************************************************************************
 * @brief KEY_4_4_Scan 掃描函數  矩陣按鍵掃描,返回一個鍵值
 * @brief 列檢測初始化
 * @param  無
 * @retval uint8_t




***********************************
按鍵表盤為:  1   2  3   10
            4   5  6   11
            7   8  9   12
            13  0  14  15
************************************


矩陣按鍵:
    /************************************
按鍵表盤為:  1   2  3   10
            4   5  6   11
            7   8  9   12
            13  0  14  15
/************************************
        K1--->PC0
    K2--->PC1
    K3--->PC2
    K4--->PC3
    K5--->PC4
    K6--->PC5
    K7--->PC6
 ***********************************************************************/
uint8_t KEY_4_4_Scan(void)
{
    u8 KeyVal = 0;
    GPIO_Write(GPIOC, (GPIOC->ODR & 0xff00 | 0x000f)); // PC0-PC3全部輸出高。
    if (((GPIOC->IDR & 0X00F0)) == 0x0000)             // PC4-PC7為0則沒有按鍵按下(第一次檢測按鍵是否有按下)
    {
        return 0xFF;
    }
    else
    {
        Delay_ms(10);                          //軟件延時
        if (((GPIOC->IDR & 0X00F0)) == 0x0000) // PC4-PC7為0則沒有按鍵按下(第二次檢測按鍵是否有按下)
        {


            return 0xFF;
        }
    }
    GPIO_Write(GPIOC, ((GPIOC->ODR & 0xfff0) | 0x0001)); //僅將PC0置高
    switch ((GPIOC->IDR & 0X00f0))                       //第一行,從PC4開始拉高,其余為0,PC5-PC7一樣
    {
    case 0x0010:
        KeyVal = 1; // PC4
        break;
    case 0x0020:
        KeyVal = 2; // PC5
        break;
    case 0x0040:
        KeyVal = 3; // PC6
        break;
    case 0x0080:
        KeyVal = 10; // PC7
        break;
    }
    while (((GPIOC->IDR & 0X00F0)) > 0) //等待按鍵釋放,
        GPIO_Write(GPIOC, 0x0000);      //重新讓PC0到PC3全部輸出低。


    GPIO_Write(GPIOC, ((GPIOC->ODR & 0xfff0) | 0x0002)); //僅將PC1置高
    switch ((GPIOC->IDR & 0X00F0))                       //第一行,從PC4開始拉高,其余為0,PC5-PC7一樣
    {
    case 0x0010:
        KeyVal = 4;
        break;
    case 0x0020:
        KeyVal = 5;
        break;
    case 0x0040:
        KeyVal = 6;
        break;
    case 0x0080:
        KeyVal = 11;
        break;
    }
    while (((GPIOC->IDR & 0X00F0)) > 0) //等待按鍵釋放
        GPIO_Write(GPIOC, 0x0000);      //重新讓PC0到PC3全部輸出低。


    GPIO_Write(GPIOC, ((GPIOC->ODR & 0xfff0) | 0x0004)); //僅將PC2置高
    switch ((GPIOC->IDR & 0X00F0))
    {
    case 0x0010:
        KeyVal = 7;
        break;
    case 0x0020:
        KeyVal = 8;
        break;
    case 0x0040:
        KeyVal = 9;
        break;
    case 0x0080:
        KeyVal = 12;
        break;
    }
    while (((GPIOC->IDR & 0X00F0)) > 0)
        GPIO_Write(GPIOC, 0x0000); //重新讓PC0到PC3全部輸出低。


    GPIO_Write(GPIOC, ((GPIOC->ODR & 0xfff0) | 0x0008)); //僅將PC3置高
    switch ((GPIOC->IDR & 0X00F0))
    {
    case 0x0010:
        KeyVal = 13;
        break;
    case 0x0020:
        KeyVal = 0;
        break;
    case 0x0040:
        KeyVal = 15;
        break;
    case 0x0080:
        KeyVal = 16;
        break;
    }
    while (((GPIOC->IDR & 0X00F0)) > 0) //等待按鍵釋放
        GPIO_Write(GPIOC, 0x0000);      //重新讓PC0到PC3全部輸出低。


    return KeyVal;
}

主函數

int main(void)
{
  uint8_t Key_value = 0;
  // 來到這里的時候,系統的時鐘已經被配置成72M。
  LED_Config();
  BEEP_Config();
  SysTick_InitUP(); //配置10us中斷一次


  USART_Config();
  KEY_Init();
  //矩陣按鍵代碼測試
  while (1)
  {
    Key_value = KEY_4_4_Scan();
    if (Key_value != 0xFF)
    {
      Delay_ms(200);
      printf("Key_value=%d\\r\\n", Key_value);
    }
    Delay_ms(200);
  }
}

實驗現象

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6058

    文章

    44821

    瀏覽量

    644651
  • STM32F103
    +關注

    關注

    33

    文章

    481

    瀏覽量

    64840
  • 矩陣按鍵
    +關注

    關注

    0

    文章

    28

    瀏覽量

    8464
收藏 人收藏

    評論

    相關推薦

    STM32F103單片機時鐘樹結構圖及時鐘配置

    STM32屬于Cortex-M3內核的單片機,時鐘結構比之前的51單片機較復雜的多,根據數據手冊,STM32F103的時鐘結構如下圖所示。
    發表于 01-19 16:36 ?1w次閱讀
    <b class='flag-5'>STM32F103</b><b class='flag-5'>單片機</b>時鐘樹結構圖及時鐘配置

    STM32F103教程之STM32F103單片機的使用心得資料免費下載

    本文檔的主要內容詳細介紹的是STM32F103教程之STM32F103單片機的使用心得資料免費下載目前很火的設計STM32教程。
    發表于 09-26 08:00 ?255次下載

    STM32F103單片機頻率測試程序免費下載

    本文檔的主要內容詳細介紹的是STM32F103單片機頻率測試程序免費下載。
    發表于 11-05 08:00 ?66次下載
    <b class='flag-5'>STM32F103</b><b class='flag-5'>單片機</b>頻率測試程序免費下載

    使用STM32F103單片機驅動TM1638八位數碼管八按鍵程序免費下載

    本文檔的主要內容詳細介紹的是使用STM32F103單片機驅動TM1638八位數碼管八按鍵程序免費下載使用了STM32 3.5 庫。
    發表于 08-06 17:34 ?95次下載
    使用<b class='flag-5'>STM32F103</b><b class='flag-5'>單片機</b>驅動TM1638八位數碼管八<b class='flag-5'>按鍵</b>程序免費下載

    使用STM32F103單片機顯示可移動換方向LCD字幕的程序

    本文檔的主要內容詳細介紹的是使用STM32F103單片機顯示可移動換方向LCD字幕的程序。
    發表于 07-22 08:00 ?10次下載
    使用<b class='flag-5'>STM32F103</b><b class='flag-5'>單片機</b>顯示可移動換方向LCD字幕的程序

    使用STM32F103單片機進行溫度OLED顯示實驗的工程文件免費下載

    本文檔的主要內容詳細介紹的是使用STM32F103單片機進行溫度OLED顯示實驗的工程文件免費下載。
    發表于 08-20 08:00 ?49次下載
    使用<b class='flag-5'>STM32F103</b><b class='flag-5'>單片機</b>進行溫度OLED顯示實驗的工程文件免費下載

    STM32F103單片機控制無刷電機的程序源碼免費下載

    本文檔的主要內容詳細介紹的是STM32F103單片機控制無刷電機的源代碼免費下載。
    發表于 09-12 08:00 ?76次下載
    <b class='flag-5'>STM32F103</b><b class='flag-5'>單片機</b>控制無刷電機的程序源碼免費下載

    使用STM32F103單片機采集16路ADC的工程文件和程序免費下載

    本文檔的主要內容詳細介紹的是使用STM32F103單片機采集16路ADC的工程文件和程序免費下載。
    發表于 09-26 08:00 ?33次下載
    使用<b class='flag-5'>STM32F103</b><b class='flag-5'>單片機</b>采集16路ADC的工程文件和程序免費下載

    使用STM32F103單片機實現MP3的電路原理圖免費下載

      本文檔的主要內容詳細介紹的是使用STM32F103單片機實現MP3的電路原理圖免費下載。
    發表于 12-17 08:00 ?7次下載
    使用<b class='flag-5'>STM32F103</b><b class='flag-5'>單片機</b>實現MP3的電路原理圖免費下載

    使用STM32F103系列單片機控制ADS1115的程序免費下載

    本文檔的主要內容詳細介紹的是使用STM32F103系列單片機控制ADS1115的程序免費下載。
    發表于 03-04 08:00 ?139次下載
    使用<b class='flag-5'>STM32F103</b>系列<b class='flag-5'>單片機</b>控制ADS1115的程序免費下載

    使用STM32F103單片機實現定時器實驗的詳細資料說明

    本文檔的主要內容詳細介紹的是使用STM32F103單片機實現定時器實驗的詳細資料說明。
    發表于 04-07 08:00 ?5次下載
    使用<b class='flag-5'>STM32F103</b><b class='flag-5'>單片機</b>實現定時器實驗的詳細資料說明

    基于STM32f103單片機的智能家居步進電機

    基于STM32f103單片機的智能家居步進電機
    發表于 05-20 14:30 ?17次下載

    物聯網小項目:STM32F103單片機通過MQTT協議連接阿里云

    物聯網小項目:STM32F103單片機通過MQTT協議連接阿里云
    發表于 11-19 10:51 ?43次下載
    物聯網小項目:<b class='flag-5'>STM32F103</b><b class='flag-5'>單片機</b>通過MQTT協議連接阿里云

    Keil下,基于STM32F103單片機按鍵中斷的幾種LED實例

    Keil下,基于STM32F103單片機按鍵中斷的幾種LED實例(流水、奇亮偶滅等)這里是通過實驗室的單片機實現的(皮賽公司的)由于Keil版本的問題,5.15版本以下的版本使用C/
    發表于 11-24 16:51 ?24次下載
    Keil下,基于<b class='flag-5'>STM32F103</b><b class='flag-5'>單片機</b>的<b class='flag-5'>按鍵</b>中斷的幾種LED實例

    基于STM32F103單片機設計

    情況,基于STM32F103單片機設計一個數字電壓表仿真設計。該設計應滿足的功能要求為: 1、以STM32單片機為控制核心設計數字電壓表;? 2、可以測量0~3.3V輸入電壓值;? 3
    的頭像 發表于 09-10 09:53 ?2130次閱讀
    基于<b class='flag-5'>STM32F103</b><b class='flag-5'>單片機</b>設計
    主站蜘蛛池模板: 欧美在线天堂 | 性欧美丰满xxxx性久久久 | 亚洲wwwwww| 91寡妇天天综合久久影院 | avtt天堂网永久资源 | 国产精品9999久久久久仙踪林 | 国产三级网站在线观看 | 伊人久久大香线蕉综合网站 | 性8sex亚洲区入口 | 午夜视频在线观看一区 | 激情欧美一区二区三区中文字幕 | 中文字幕一区二区三区四区 | 四虎4545www国产精品 | 午夜影院0606 | 日本不卡视频一区二区三区 | 五月综合色婷婷影院在线观看 | 亚洲三级成人 | 免费一看一级毛片全播放 | 国产亚洲精品在天天在线麻豆 | 天天做人人爱夜夜爽2020毛片 | 久操视频免费观看 | 午夜影院网页 | 欧美精品videosex性欧美 | 伊人久久香 | 精品手机在线视频 | 女人夜夜春 | 亚洲精品乱码久久久久久蜜桃图片 | 国产h在线 | 亚洲成人在线免费 | 欧美特黄一免在线观看 | 亚欧色视频在线观看免费 | 在线天堂中文有限公司 | 黄色xxxx| 2022欧美高清中文字幕在线看 | 亚洲图片 欧美色图 | 久久久久国产一级毛片高清片 | aa1在线天堂 | 2021国产精品成人免费视频 | 久久精品视频免费播放 | 色婷婷成人网 | 四虎国产精品永久地址49 |