矩陣鍵盤的按鍵識(shí)別方法
矩陣鍵盤的按鍵識(shí)別方法來(lái)自簡(jiǎn)單日記網(wǎng)精選推薦。在學(xué)習(xí)有關(guān)矩陣鍵盤的時(shí)候,往往要學(xué)會(huì)矩陣鍵盤的按鍵識(shí)別方法,那么矩陣鍵盤的按鍵識(shí)別方法有哪些呢?小編帶著你來(lái)了解。
方法一:行掃描法
1、判斷鍵盤中有無(wú)鍵按下 將全部行線p1.4-p1.7置低電平,當(dāng)然p1.0-p1.3為高電平(或許芯片內(nèi)部已經(jīng)將這些引腳它上拉),然后檢測(cè)列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個(gè)按鍵之中。若所有列線均為高電平,則鍵盤中無(wú)鍵按下。
2、判斷閉合鍵所在的位置 在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時(shí),其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測(cè)各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。
方法二:先從p1口的高四位輸出低電平,低四位輸出高電平,從p1口的低四位讀取鍵盤狀態(tài)。再?gòu)膒1口的低四位輸出低電平,高四位輸出高電平,從p1口的高四位讀取鍵盤狀態(tài)。將兩次讀取結(jié)果組合起來(lái)就可以得到當(dāng)前按鍵的特征編碼。
矩陣鍵盤掃描程序
使用芯片STM8S003
所用端口:PD2~PD6, PA1~PA3
其中,PD3~PD6為輸出,PA1~PA3 / PD2為輸入(默認(rèn)上拉)
/*
PortCom BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
PD6 PD5 PD4 PD3 PD2 PA3 PA2 PA1
*/
程序如下:
/* 添加包含芯片的頭文件 */
#include《iostm8s103f3.h》
volatile unsigned char CF[4]; //按鍵觸發(fā)標(biāo)志(表示4列,每一列同一行的
//值是一樣的但列標(biāo)不一樣來(lái)區(qū)分不同列的鍵)
volatile unsigned char Cont[4];
unsigned char KeyVal; //鍵值
//unsigned char KeyOut[4] = {0xef,0xdf,0xbf,0x7f}; //4X4按輸出端控制
//unsigned char KeyOut[4] = {0x7f,0xbf,0xdf,0xef};
unsigned char KeyOut[4] = {0x3f,0x5f,0x6f,0x77}; //兩個(gè)端口組合4x4端口輸出控制
unsigned char PortCom; //兩個(gè)端口組合的端口
unsigned char cIn0,cIn1,cIn2,cIn3;
/*******************************************************************************
**函數(shù)名稱:void delay(unsigned int ms) Name: void delay(unsigned int ms)
**功能描述:大概延時(shí)
**入口參數(shù):unsigned int ms 輸入大概延時(shí)數(shù)值
**輸出:無(wú)
*******************************************************************************/
void delay(unsigned int ms)
{
unsigned int x , y;
for(x = ms; x 》 0; x--)
for(y = 1000 ; y 》 0 ; y--);
}
/*
**描述:新型4X4按鍵掃描程序 放在1ms-10ms中斷內(nèi)使用(十分穩(wěn)定不需要再寫消抖程序)
**備注:按鍵彈起時(shí) keyVal = 0 單鍵按下 keyVal 有16個(gè)值,你自己程序可以針對(duì)不同值
**進(jìn)行不同程序操作 keyVal單鍵值分別為
**0x01,0x02,0x04,0x08,
**0x11,0x12,0x14,0x18,
**0x21,0x22,0x24,0x28,
**0x31,0x32,0x34,0x38,
*/
void Key_Head()
{
unsigned char ReadData[4];
static unsigned char i;
/*
PortCom BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
PD6 PD5 PD4 PD3 PD2 PA3 PA2 PA1
*/
cIn0 = 0;
cIn1 = 0;
cIn2 = 0;
cIn3 = 0;
if(++i》=4)i=0;
// PortCom = KeyOut[i]|0x0f; //忽略低4位
//輸出掃描
PD_ODR = KeyOut[i];
//輸入偵測(cè)
cIn0 = PA_IDR_bit.IDR1;
cIn1 = PA_IDR_bit.IDR2;
cIn2 = PA_IDR_bit.IDR3;
cIn3 = PD_IDR_bit.IDR2;
PortCom = (cIn3《《3) | (cIn2《《2) | (cIn1《《1) | cIn0;
ReadData[i] = (PortCom|0xf0)^0xff; //忽略高4位 取反
CF[i] = ReadData[i] & (ReadData[i] ^ Cont[i]);
Cont[i] = ReadData[i];
//輸出鍵值
switch(CF[i])//第i列
{
case 0x08: KeyVal = ((i《《4)+8);break;
case 0x04: KeyVal = ((i《《4)+4);break;
case 0x02: KeyVal = ((i《《4)+2);break;
case 0x01: KeyVal = ((i《《4)+1);break;
default:KeyVal = 0;break;
}
delay(30);
}
/*******************************************************************************
**函數(shù)名稱:void ALL_LED_Init() Name: void ALL_LED_Init()
**功能描述:初始化LED燈的IO口設(shè)為輸出
**入口參數(shù):無(wú)
**輸出:無(wú)
*******************************************************************************/
void ALL_LED_Init()
{
//LED1 Init
// PD_DDR_bit.DDR2 = 1; //設(shè)置端口PD-》2的輸入輸出方向寄存器為輸出方向
// PD_CR1_bit.C12 = 1; //設(shè)置PD2為推挽輸出
// PD_CR2_bit.C22 = 1; //設(shè)置PD2的輸出最大速度為10MHZ
//LED2 Init
PC_DDR_bit.DDR7 = 1; //設(shè)置端口PC-》7的輸入輸出方向寄存器為輸出方向
PC_CR1_bit.C17 = 1; //設(shè)置PC7為推挽輸出
PC_CR2_bit.C27 = 1; //設(shè)置PC7的輸出最大速度為10MHZ
//LED3 Init
PC_DDR_bit.DDR6 = 1; //設(shè)置端口PC-》6的輸入輸出方向寄存器為輸出方向
PC_CR1_bit.C16 = 1; //設(shè)置PC6為推挽輸出
PC_CR2_bit.C26 = 1; //設(shè)置PC6的輸出最大速度為10MHZ
//LED4 Init
PC_DDR_bit.DDR3 = 1; //設(shè)置端口PC-》3的輸入輸出方向寄存器為輸出方向
PC_CR1_bit.C13 = 1; //設(shè)置PC3為推挽輸出
PC_CR2_bit.C23 = 1; //設(shè)置PC3的輸出最大速度為10MHZ
}
/*******************************************************************************
**函數(shù)名稱:ALLKeyInit()
**功能描述:配置Key1 , Key2 , Key3輸入按鍵
**入口參數(shù):無(wú)
**輸出:無(wú)
*******************************************************************************/
void ALLKeyInit()
{
//PA1_Init
PA_DDR_bit.DDR1 = 0; //GPA-》PIN3 設(shè)置為輸入模式
PA_CR1_bit.C11 = 1; //GPA-》PIN3 帶上拉電阻輸入
PA_CR2_bit.C21 = 0; //GPA-》PIN3 禁止外部中斷
//PA2_Init
PA_DDR_bit.DDR2 = 0; //GPA-》PIN3 設(shè)置為輸入模式
PA_CR1_bit.C12 = 1; //GPA-》PIN3 帶上拉電阻輸入
PA_CR2_bit.C22 = 0; //GPA-》PIN3 禁止外部中斷
//PA3_Init
PA_DDR_bit.DDR3 = 0; //GPA-》PIN3 設(shè)置為輸入模式
PA_CR1_bit.C13 = 1; //GPA-》PIN3 帶上拉電阻輸入
PA_CR2_bit.C23 = 0; //GPA-》PIN3 禁止外部中斷
//PD2_Init
PD_DDR_bit.DDR2 = 0; //GPD-》PIN3 設(shè)置為輸入模式
PD_CR1_bit.C12 = 1; //GPD-》PIN3 帶上拉電阻輸入
PD_CR2_bit.C22 = 0; //GPD-》PIN3 禁止外部中斷
//PD3_Init
PD_DDR_bit.DDR3 = 1; //GPD-》PIN3 設(shè)置為輸入模式
PD_CR1_bit.C13 = 1; //GPD-》PIN3 帶上拉電阻輸入
PD_CR2_bit.C23 = 1; //GPD-》PIN3 禁止外部中斷
//PD4_Init
PD_DDR_bit.DDR4 = 1; //GPD-》PIN3 設(shè)置為輸入模式
PD_CR1_bit.C14 = 1; //GPD-》PIN3 帶上拉電阻輸入
PD_CR2_bit.C24 = 1; //GPD-》PIN3 禁止外部中斷
//PD5_Init
PD_DDR_bit.DDR5 = 1; //GPC-》PIN5 設(shè)置為輸入模式
PD_CR1_bit.C15 = 1; //GPC-》PIN5 帶上拉電阻輸入
PD_CR2_bit.C25 = 1; //GPC-》PIN5 禁止外部中斷
//PD6_Init
PD_DDR_bit.DDR6 = 1; //GPC-》PIN5 設(shè)置為輸入模式
PD_CR1_bit.C16 = 1; //GPC-》PIN5 帶上拉電阻輸入
PD_CR2_bit.C26 = 1; //GPC-》PIN5 禁止外部中斷
}
int main(void)
{
CLK_CKDIVR = 0x00; //內(nèi)部時(shí)鐘為1分頻
ALL_LED_Init(); //調(diào)用LED1初始化函數(shù)
ALLKeyInit(); //調(diào)用按鈕初始化函數(shù)
while(1)
{
Key_Head();
switch(KeyVal)
{
case 0x01:
{
PC_ODR ^= 0x80; //異或取反LED2使其亮滅
break;
}
case 0x02:
{
PC_ODR ^= 0x40; //異或取反LED3使其亮滅
break;
}
case 0x04:
{
PC_ODR ^= 0x08; //異或取反LED4使其亮滅
break;
}
case 0x08:
{
PC_ODR ^= 0x80; //異或取反LED2使其亮滅
PC_ODR ^= 0x40; //異或取反LED3使其亮滅
break;
}
case 0x11:
{
PC_ODR ^= 0x80; //異或取反LED2使其亮滅
break;
}
case 0x12:
{
PC_ODR ^= 0x40; //異或取反LED3使其亮滅
break;
}
case 0x14:
{
PC_ODR ^= 0x08; //異或取反LED4使其亮滅
break;
}
case 0x18:
{
PC_ODR ^= 0x80; //異或取反LED2使其亮滅
PC_ODR ^= 0x40; //異或取反LED3使其亮滅
break;
}
case 0x21:
{
PC_ODR ^= 0x80; //異或取反LED2使其亮滅
break;
}
case 0x22:
{
PC_ODR ^= 0x40; //異或取反LED3使其亮滅
break;
}
case 0x24:
{
PC_ODR ^= 0x08; //異或取反LED4使其亮滅
break;
}
case 0x28:
{
PC_ODR ^= 0x80; //異或取反LED2使其亮滅
PC_ODR ^= 0x40; //異或取反LED3使其亮滅
break;
}
case 0x31:
{
PC_ODR ^= 0x80; //異或取反LED2使其亮滅
break;
}
case 0x32:
{
PC_ODR ^= 0x40; //異或取反LED3使其亮滅
break;
}
case 0x34:
{
PC_ODR ^= 0x08; //異或取反LED4使其亮滅
break;
}
case 0x38:
{
PC_ODR ^= 0x80; //異或取反LED2使其亮滅
PC_ODR ^= 0x40; //異或取反LED3使其亮滅
break;
}
default:
{
KeyVal = 0;
break;
}
}
}
}
-
矩陣鍵盤
+關(guān)注
關(guān)注
7文章
207瀏覽量
32740
發(fā)布評(píng)論請(qǐng)先 登錄
方中禾 FZH100 帶鍵盤掃描接口的 LED(發(fā)光二極管顯示器)驅(qū)動(dòng)控制專用 IC
LT1118 一種帶鍵盤掃描接口的LED(發(fā)光二極管顯示器)驅(qū)動(dòng)控制專用電路 原廠技術(shù)支持
TCA8418:I2C控制的鍵盤掃描IC深度剖析
FZH217 帶鍵盤掃描接口的大筆段 LED 驅(qū)動(dòng)控制專用電路 原廠技術(shù)支持
FZH216 帶鍵盤掃描接口的大筆段 LED 驅(qū)動(dòng)控制專用電路
FZH186 一種帶鍵盤掃描接口的LED(發(fā)光二極管顯示器)驅(qū)動(dòng)控制專用電路
FZH183 帶鍵盤掃描接口的LED(發(fā)光二極管顯示器)驅(qū)動(dòng)控制專用電路--方中禾科技
FZH100 帶鍵盤掃描接口的 LED(發(fā)光二極管顯示器)驅(qū)動(dòng)控制專用 IC 原廠技術(shù)支持
原廠 FZH1697 帶鍵盤掃描接口的LCD驅(qū)動(dòng)控制專用電路
軟鍵盤常見問題的解決方法
鍵盤薄膜高彈UV膠則是一種特殊改性的UV固化膠,用于薄膜鍵盤按鍵彈性體的部分或高彈性密封
HarmonyOS應(yīng)用自定義鍵盤解決方案
ADP5588移動(dòng)I/O擴(kuò)展器和QWERTY鍵盤控制器技術(shù)手冊(cè)
ADP5587移動(dòng)I/O擴(kuò)展器和QWERTY鍵盤控制器技術(shù)手冊(cè)
矩陣鍵盤的按鍵識(shí)別方法_矩陣鍵盤掃描程序
評(píng)論