日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32 4*4矩阵按键

發布時間:2025/3/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32 4*4矩阵按键 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文章講述了如何用STM32編寫4*4矩陣按鍵程序,先簡單介紹一下掃描的基本方法:1.反轉法 2.行列掃描。本文主要介紹行列掃描
歡迎加入嵌入式學習群:559601187

(一)代碼如下

/********************************************************************* *按鍵用的PA8-PA11,PB12-PB15 *PA8-PA11為推挽輸出 *PB12-PB15為下拉輸入 *********************************************************************/ void KEY_Init(void)//按鍵初始化 {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能A端口時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA8-11 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能B端口時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉輸入/逐行掃描GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHzGPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB12-15}/********************************************************************* *函數說明: 按鍵掃描 *返回值 : 按鍵值 *參數 : void **********************************************************************/ int Key_Scan(void) {int keyValue=0;//按鍵值u16 WriteVal=0;//給PA口寫入的數據GPIO_Write(GPIOA,((GPIOA->ODR & 0x00ff )| 0x0f00));//讓PA8-11輸出高電平if((GPIOA->IDR & 0xf000)==0x0000)//若PB12-PB15全為0,則沒有按鍵按下return -1;else{delay_ms(5);//延時消抖if((GPIOA->IDR & 0xf000)==0x0000)//若PB12-PB15全為0,則剛剛是抖動產生return -1; }GPIO_Write(GPIOA,(GPIOA->ODR & 0xf0ff )| 0x0100);//讓PA8-11輸出0001,檢測第四行switch(GPIOB->IDR & 0xf000){case 0x1000 : keyValue=15;break;case 0x2000 : keyValue=14;break;case 0x4000 : keyValue=13;break;case 0x8000 : keyValue=12;break; }GPIO_Write(GPIOA,(GPIOA->ODR & 0xf0ff )| 0x0200);//讓PA8-11輸出0010,檢測第三行switch(GPIOB->IDR & 0xf000){case 0x1000 : keyValue=12;break;case 0x2000 : keyValue=11;break;case 0x4000 : keyValue=10;break;case 0x8000 : keyValue=9;break; }GPIO_Write(GPIOA,(GPIOA->ODR & 0xf0ff )| 0x0400);//讓PA8-11輸出0100,檢測第二行switch(GPIOB->IDR & 0xf000){case 0x1000 : keyValue=8;break;case 0x2000 : keyValue=7;break;case 0x4000 : keyValue=6;break;case 0x8000 : keyValue=5;break; }GPIO_Write(GPIOA,(GPIOA->ODR & 0xf0ff )| 0x0800);//讓PA8-11輸出1000,檢測第一行switch(GPIOB->IDR & 0xf000){case 0x1000 : keyValue=4;break;case 0x2000 : keyValue=3;break;case 0x4000 : keyValue=2;break;case 0x8000 : keyValue=1;break; }return keyValue; }

(二)原理解釋

首先,初始化端口4*4按鍵用了8個端口,我用的是PA和PB分別為4個,設置PA為行,初始化為推挽輸出;設置PB為列,初始化為下拉輸入。
將最后一行變為高電平,其余行為低電平,輸出編碼0001。然后讀取列的電平,判斷某一列是否按下,例如第1列按下,則PB的某一端口必定被拉高(PB被設置為下拉默認為低電平),只要檢測PB口變高的位就可以知道哪一列被按下。若沒有則執行檢測下一行的程序。
接下來開始檢測倒數第三行,將第3行變為高電平,輸出編碼0010.然后讀取列的電平,判斷某一列是否按下,例如第1列按下,則PB的某一端口必定被拉高(PB被設置為下拉默認為低電平),只要檢測PB口變高的位就可以知道哪一列被按下。若沒有則執行檢測下一行的程序。
第二行和第一行的檢測如上,當所有程序都執行一遍若還沒有檢測到按鍵繼續執行下一遍按鍵掃描。

上述只是程序的一種實現方法,和51的檢測方法類似,只不過在STM32里要自己配置IO口。上述程序檢測的順序可以顛倒,按自己喜歡的就好。注意端口一定要改的和自己的硬件相同才能正常工作


本文章僅供學習交流用禁止用作商業用途,文中內容來水枂編輯,如需轉載請告知,謝謝合作

微信公眾號:zhjj0729

微博:文藝to青年

簡書:水枂

總結

以上是生活随笔為你收集整理的STM32 4*4矩阵按键的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。