4x4矩阵键盘工作原理及扫描程序_4X4矩形键盘
生活随笔
收集整理的這篇文章主要介紹了
4x4矩阵键盘工作原理及扫描程序_4X4矩形键盘
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
介紹
什么是矩陣鍵盤
矩陣鍵盤是單片機外部設備中所使用的排布類似于矩陣的鍵盤組,由于電路設計時需要更多的外部輸入,單獨的控制一個按鍵需要浪費很多的IO資源,所以就有了矩陣鍵盤,常用的矩陣鍵盤有4X4和8X8,其中用的最多的是4X4。
矩陣鍵盤的原理
矩陣鍵盤又稱為行列式鍵盤,它是用4條I/O線作為行線,4條I/O線作為列線組成的鍵盤。
在行線和列線的每一個交叉點上,設置一個按鍵。這樣鍵盤中按鍵的個數是4×4個。
這種行列式鍵盤結構能夠有效地提高單片機系統中I/O口的利用率。由于單片機IO端口具有線與的功能,因此當任意一個按鍵按下時,行和列都有一根線被線與,通過運算就可以得出按鍵的坐標從而判斷按鍵鍵值。
原理如同矩陣數列的行列式。
驅動電路圖
按4*4矩陣搭建的按鍵矩陣還是比較簡單的,也有的人為了保證電路的穩定性,加上二極管保護和上拉電阻,但是一般要求不太高的電路就不需要加了,向下面設置的電路那樣就可以了。
軟件程序實現
在這里宏定義一些GPIO的信息。
KEY.h
#ifndef _KEY_H#define _KEY_H#include "stm32f10x.h"//引腳#define S0 GPIO_Pin_0#define S1 GPIO_Pin_1#define S2 GPIO_Pin_2#define S3 GPIO_Pin_3#define S4 GPIO_Pin_4#define S5 GPIO_Pin_5#define S6 GPIO_Pin_6#define S7 GPIO_Pin_7//GPIO寄存器#define KEY_PORT GPIOB//時鐘#define RCC_APB2_KEY RCC_APB2Periph_GPIOB//函數定義void InitKey(void);int NumKey(void);//延時void Delay( uint32_t count ){ for(; count!=0; count--);}#endif?/*?_KEY_H??*/在這里存放兩個函數,一個是初始化矩形鍵盤GPIO口的函數,在函數里把前四個定義為推挽輸出,后四個GPIO口定義為下拉輸入。
另一個函數是鍵盤掃描函數,通過函數返回值確定是舉行鍵盤的哪一個按鍵被按下。
KEY.c
#include "KEY.h"void InitKey(void)//初始化KEY的GPIO{ //打開GPIO時鐘 RCC_APB2PeriphClockCmd(RCC_APB2_KEY,ENABLE); //把S0,S1,S2,S3配置為推挽輸出 GPIO_InitTypeDef GPIOInit; GPIOInit.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出 GPIOInit.GPIO_Speed=GPIO_Speed_50MHz; GPIOInit.GPIO_Pin=S0|S1|S2|S3; GPIO_Init(KEY_PORT,&GPIOInit); //把S4,S5,S6,S7配置為下拉輸入 GPIOInit.GPIO_Mode=GPIO_Mode_IPU; GPIOInit.GPIO_Pin=S4|S5|S6|S7; GPIO_Init(KEY_PORT,&GPIOInit); //0--3輸出高,4--7輸出低 GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); GPIO_ResetBits(GPIOC,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); }int NumKey(void) //掃描鍵值{ int KeyVal=0; //鍵值,后面自己設定的,用來設置按鍵的序號 u16 KeyWrite=0; //寫給GPIO的值 GPIO_Write(KEY_PORT,(KEY_PORT->ODR & 0xfff0 | 0xf));//0--3全部輸出高 if((KEY_PORT->IDR&0x00f0)==0x0000) //如果4--7全為0,表示沒有按鍵按下,返回值設置為-1 return -1; else { Delay(0xF);//消抖 if((KEY_PORT->IDR&0x00f0)==0x0000) //如果4-7全為0,表示剛才是抖動造成的 return -1; } GPIO_Write(KEY_PORT,(KEY_PORT->ODR & 0xfff0|0x1));//讓0-3輸出0001 switch(KEY_PORT->IDR&0x00f0)//對4--7進行判斷 { case 0x0010: KeyVal=16;break; case 0x0020: KeyVal=12;break; case 0x0040: KeyVal=8; break; case 0x0080: KeyVal=4; break; } GPIO_Write(KEY_PORT,(KEY_PORT->ODR & 0xfff0|0x2));//讓0-3輸出0010 switch(KEY_PORT->IDR&0x00f0)//對4--7進行判斷 { case 0x0010: KeyVal=15;break; case 0x0020: KeyVal=11;break; case 0x0040: KeyVal=7; break; case 0x0080: KeyVal=3; break; } GPIO_Write(KEY_PORT,(KEY_PORT->ODR & 0xfff0|0x4));//讓0-3輸出0100 switch(KEY_PORT->IDR&0x00f0)//對4--7進行判斷 { case 0x0010: KeyVal=14;break; case 0x0020: KeyVal=10;break; case 0x0040: KeyVal=6; break; case 0x0080: KeyVal=2; break; } GPIO_Write(KEY_PORT,(KEY_PORT->ODR & 0xfff0|0x8));//讓0-3輸出1000 switch(KEY_PORT->IDR&0x00f0)//對4--7進行判斷 { case 0x0010: KeyVal=13;break; case 0x0020: KeyVal=9;break; case 0x0040: KeyVal=5; break; case 0x0080: KeyVal=1; break; } return KeyVal;}感覺有用,希望點一下再看。
總結
以上是生活随笔為你收集整理的4x4矩阵键盘工作原理及扫描程序_4X4矩形键盘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中采购订单批导的bapi_跟着团子学SA
- 下一篇: 京东白条怎么借款