衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

矩陣鍵盤的按鍵識別方法_矩陣鍵盤掃描程序

姚小熊27 ? 來源:網絡整理 ? 作者:網絡整理 ? 2020-04-20 09:39 ? 次閱讀

矩陣鍵盤的按鍵識別方法

矩陣鍵盤的按鍵識別方法來自簡單日記網精選推薦。在學習有關矩陣鍵盤的時候,往往要學會矩陣鍵盤的按鍵識別方法,那么矩陣鍵盤的按鍵識別方法有哪些呢?小編帶著你來了解。

方法一:行掃描法

1、判斷鍵盤中有無鍵按下 將全部行線p1.4-p1.7置低電平,當然p1.0-p1.3為高電平(或許芯片內部已經將這些引腳它上拉),然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。

2、判斷閉合鍵所在的位置 在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。

方法二:先從p1口的高四位輸出低電平,低四位輸出高電平,從p1口的低四位讀取鍵盤狀態。再從p1口的低四位輸出低電平,高四位輸出高電平,從p1口的高四位讀取鍵盤狀態。將兩次讀取結果組合起來就可以得到當前按鍵的特征編碼。

矩陣鍵盤掃描程序

使用芯片STM8S003

所用端口:PD2~PD6, PA1~PA3

其中,PD3~PD6為輸出,PA1~PA3 / PD2為輸入(默認上拉)

/*

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]; //按鍵觸發標志(表示4列,每一列同一行的

//值是一樣的但列標不一樣來區分不同列的鍵)

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}; //兩個端口組合4x4端口輸出控制

unsigned char PortCom; //兩個端口組合的端口

unsigned char cIn0,cIn1,cIn2,cIn3;

/*******************************************************************************

**函數名稱:void delay(unsigned int ms) Name: void delay(unsigned int ms)

**功能描述:大概延時

**入口參數:unsigned int ms 輸入大概延時數值

**輸出:無

*******************************************************************************/

void delay(unsigned int ms)

{

unsigned int x , y;

for(x = ms; x 》 0; x--)

for(y = 1000 ; y 》 0 ; y--);

}

/*

**描述:新型4X4按鍵掃描程序 放在1ms-10ms中斷內使用(十分穩定不需要再寫消抖程序)

**備注:按鍵彈起時 keyVal = 0 單鍵按下 keyVal 有16個值,你自己程序可以針對不同值

**進行不同程序操作 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];

//輸入偵測

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);

}

/*******************************************************************************

**函數名稱:void ALL_LED_Init() Name: void ALL_LED_Init()

**功能描述:初始化LED燈的IO口設為輸出

**入口參數:無

**輸出:無

*******************************************************************************/

void ALL_LED_Init()

{

//LED1 Init

// PD_DDR_bit.DDR2 = 1; //設置端口PD-》2的輸入輸出方向寄存器為輸出方向

// PD_CR1_bit.C12 = 1; //設置PD2為推挽輸出

// PD_CR2_bit.C22 = 1; //設置PD2的輸出最大速度為10MHZ

//LED2 Init

PC_DDR_bit.DDR7 = 1; //設置端口PC-》7的輸入輸出方向寄存器為輸出方向

PC_CR1_bit.C17 = 1; //設置PC7為推挽輸出

PC_CR2_bit.C27 = 1; //設置PC7的輸出最大速度為10MHZ

//LED3 Init

PC_DDR_bit.DDR6 = 1; //設置端口PC-》6的輸入輸出方向寄存器為輸出方向

PC_CR1_bit.C16 = 1; //設置PC6為推挽輸出

PC_CR2_bit.C26 = 1; //設置PC6的輸出最大速度為10MHZ

//LED4 Init

PC_DDR_bit.DDR3 = 1; //設置端口PC-》3的輸入輸出方向寄存器為輸出方向

PC_CR1_bit.C13 = 1; //設置PC3為推挽輸出

PC_CR2_bit.C23 = 1; //設置PC3的輸出最大速度為10MHZ

}

/*******************************************************************************

**函數名稱:ALLKeyInit()

**功能描述:配置Key1 , Key2 , Key3輸入按鍵

**入口參數:無

**輸出:無

*******************************************************************************/

void ALLKeyInit()

{

//PA1_Init

PA_DDR_bit.DDR1 = 0; //GPA-》PIN3 設置為輸入模式

PA_CR1_bit.C11 = 1; //GPA-》PIN3 帶上拉電阻輸入

PA_CR2_bit.C21 = 0; //GPA-》PIN3 禁止外部中斷

//PA2_Init

PA_DDR_bit.DDR2 = 0; //GPA-》PIN3 設置為輸入模式

PA_CR1_bit.C12 = 1; //GPA-》PIN3 帶上拉電阻輸入

PA_CR2_bit.C22 = 0; //GPA-》PIN3 禁止外部中斷

//PA3_Init

PA_DDR_bit.DDR3 = 0; //GPA-》PIN3 設置為輸入模式

PA_CR1_bit.C13 = 1; //GPA-》PIN3 帶上拉電阻輸入

PA_CR2_bit.C23 = 0; //GPA-》PIN3 禁止外部中斷

//PD2_Init

PD_DDR_bit.DDR2 = 0; //GPD-》PIN3 設置為輸入模式

PD_CR1_bit.C12 = 1; //GPD-》PIN3 帶上拉電阻輸入

PD_CR2_bit.C22 = 0; //GPD-》PIN3 禁止外部中斷

//PD3_Init

PD_DDR_bit.DDR3 = 1; //GPD-》PIN3 設置為輸入模式

PD_CR1_bit.C13 = 1; //GPD-》PIN3 帶上拉電阻輸入

PD_CR2_bit.C23 = 1; //GPD-》PIN3 禁止外部中斷

//PD4_Init

PD_DDR_bit.DDR4 = 1; //GPD-》PIN3 設置為輸入模式

PD_CR1_bit.C14 = 1; //GPD-》PIN3 帶上拉電阻輸入

PD_CR2_bit.C24 = 1; //GPD-》PIN3 禁止外部中斷

//PD5_Init

PD_DDR_bit.DDR5 = 1; //GPC-》PIN5 設置為輸入模式

PD_CR1_bit.C15 = 1; //GPC-》PIN5 帶上拉電阻輸入

PD_CR2_bit.C25 = 1; //GPC-》PIN5 禁止外部中斷

//PD6_Init

PD_DDR_bit.DDR6 = 1; //GPC-》PIN5 設置為輸入模式

PD_CR1_bit.C16 = 1; //GPC-》PIN5 帶上拉電阻輸入

PD_CR2_bit.C26 = 1; //GPC-》PIN5 禁止外部中斷

}

int main(void)

{

CLK_CKDIVR = 0x00; //內部時鐘為1分頻

ALL_LED_Init(); //調用LED1初始化函數

ALLKeyInit(); //調用按鈕初始化函數

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;

}

}

}

}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 矩陣鍵盤
    +關注

    關注

    7

    文章

    207

    瀏覽量

    31543
收藏 人收藏

    評論

    相關推薦

    AN-660:XY矩陣鍵盤與MicroConverter的接口

    電子發燒友網站提供《AN-660:XY矩陣鍵盤與MicroConverter的接口.pdf》資料免費下載
    發表于 01-13 16:02 ?0次下載
    AN-660:XY<b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤</b>與MicroConverter的接口

    點陣數碼管LED驅動/數顯LED驅動IC-VK1638 SOP28最大支持8×3按鍵矩陣/10×8點陣

    鍵盤掃描等電路。SEG腳接LED陽極,GRID腳接LED陰 極,可支持10SEGx8GRID的點陣LED顯示面板,最大支持8x3按鍵矩陣。適用于家電設備 (智能熱水器、微波爐、洗衣機
    的頭像 發表于 11-08 16:24 ?300次閱讀
    點陣數碼管LED驅動/數顯LED驅動IC-VK1638 SOP28最大支持8×3<b class='flag-5'>按鍵</b><b class='flag-5'>矩陣</b>/10×8點陣

    【xG24 Matter開發套件試用體驗】物聯網密碼柜之驅動矩陣鍵盤和OLED顯示器

    ;\"\"掃描矩陣鍵盤并返回按下的按鍵(row, col),如果按鍵已被按下則不重復返回\"\"\" # 逐行
    發表于 08-04 23:04

    磁軸鍵盤霍爾開關MST-MH481霍爾磁軸機械鍵盤

    磁軸鍵盤是一種利用霍爾效應進行觸發的鍵盤,與傳統的機械鍵盤有所不同。磁軸鍵盤的軸體采用了霍爾效應技術,可以更快速、更穩定地觸發按鍵,同時也具
    的頭像 發表于 06-22 08:07 ?807次閱讀
    磁軸<b class='flag-5'>鍵盤</b>霍爾開關MST-MH481霍爾磁軸機械<b class='flag-5'>鍵盤</b>

    基于51單片機矩陣鍵盤音樂電子琴電路圖proteus仿真及程序

    本資源內容概要:? ? ? ?這是基于51單片機矩陣鍵盤音樂電子琴電路圖proteus仿真及程序設計包含了電路圖源文件(Altiumdesigner軟件打開)、C語言程序源代碼(kei
    發表于 06-21 14:32 ?4次下載

    鍵盤矩陣規格設計圖

    鍵盤矩陣規格設計圖
    發表于 06-19 14:29 ?0次下載

    STM32矩陣按鍵造成IO口的損壞的原因?

    看了網上的4*4矩陣按鍵,不帶外部中斷,可實現多個按鍵同時按下。發現行線都配置成GPIO_Mode_Out_PP推挽輸出,我認為當同一個列線上有兩個按鍵同時按下時就會出現問題。 因為
    發表于 05-17 06:02

    用STM8L152使用一個矩陣鍵盤,信號一直處于低電平狀態的原因?

    想用STM8L152 使用一個矩陣鍵盤,根據的是行列掃描方法,但是代碼調試過程中只能檢測到列的信號(高低電平)的變化,信號一直處于低電平狀態,這是怎么一回事?哪里出問題了?
    發表于 05-15 08:31

    單片機接矩陣鍵盤GPIO應該怎么設置?是用上拉輸出或輸入模式嗎?

    單片機接矩陣鍵盤GPIO應該怎么設置?是用上拉輸出或輸入模式嗎?
    發表于 05-11 08:38

    往RA8875移植矩陣鍵盤程序失敗的原因?怎么解決?

    安富萊提供的例程RA8875,往里面移植4×4矩陣鍵盤失敗,就是搞不懂原因,掃描程序如下int KEY_Scan(void){ u8 KeyVal; GPIO_Write(GPI
    發表于 05-09 06:44

    stop mode下怎么實現按下矩陣鍵盤的任意鍵將系統喚醒呢?

    請問有沒有大佬知道stop mode下怎么實現按下矩陣鍵盤的任意鍵將系統喚醒呢?用WAKEUP 能實現嗎?
    發表于 05-06 07:08

    采用NT33510顯示屏,如何通過矩陣鍵盤更改顯示屏上的數字內容?

    我想實現一個這樣的功能:我的LCD當前顯示的是:新年快樂!2018! 想通過矩陣鍵盤將2018更改成2019,這個過程首先通過矩陣鍵盤上的左鍵移動到數字“8”上,然后在通過
    發表于 04-24 08:10

    stm32cubeMX如何配置4*4矩陣鍵盤

    stm32cubeMX如何配置4*4矩陣鍵盤,求大佬給代碼指導一下,看了太多代碼,自己迷亂了
    發表于 03-28 09:27

    集成芯片管腳順序識別方法

    集成芯片管腳順序的識別方法主要依賴于芯片的類型和特征。
    的頭像 發表于 03-19 18:14 ?5950次閱讀

    stm32模擬IIC總線驅動pcf8574t擴展矩陣鍵盤,運行一段時間后出現獲取到的鍵值不對的原因?

    stm32模擬IIC總線驅動pcf8574t擴展矩陣鍵盤,驅動調試成功,正常測試時沒有問題,運行一段時間后出現獲取到的鍵值不對,從此之后獲取到的鍵值一直不對。一開始認為是程序邏輯問題,下載程序
    發表于 03-12 07:25
    百家乐官网蓝盾在线现| 反赌百家乐的玩法技巧和规则 | 百家乐足球投注网哪个平台网址测速最好| 做生意养猫风水| KK娱乐城| 苏尼特左旗| 博彩百家乐官网软件| 百家乐官网有真假宝单吗| 百家乐官网怎么玩能赢钱| 澳门赌百家乐官网打法| 百家乐官网赌场牌路分析| 博彩百家乐官网最新优惠| 百家乐官网娱乐网官网网| 总玩百家乐官网有赢的吗| 百家乐娱乐城棋牌| 百家乐预约| 大发888娱乐城客户端下载| 拉斯维加斯| 来博百家乐官网现金网| 百家乐官网2号技术| 免费百家乐官网过滤| 菲律宾百家乐开户| 大发888娱乐成| 赌球赔率| 百家乐官网1326投注| 雅安市| 樱桃木百家乐官网桌| 九运2024年-2043年| 钱隆百家乐智能| 貔喜脉动棋牌下载| 百家乐官网注码调整| 百家乐官网透视牌靴哪里有| 百家乐的打法技巧| 瑞士百家乐的玩法技巧和规则| 德州扑克高牌| 新澳博百家乐官网现金网| 百家乐官网网站那个诚信好| 百家乐大天堂| 99真人娱乐城| 利都百家乐官网国际赌场娱乐网规则 | 百家乐太阳城|