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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

4x4矩阵键盘工作原理及扫描程序_4X4矩形键盘

發布時間:2025/4/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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矩形键盘的全部內容,希望文章能夠幫你解決所遇到的問題。

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