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矩阵按键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优盘识别之后消失怎么办 优盘识别后不见了
- 下一篇: 房东强行收取租户一个月的房租,怎么办?