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

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

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

3天內不再提示

矩陣鍵盤掃描的原理及設計

凡億PCB ? 來源:設計中在遇到按鍵較多, ? 作者:設計中在遇到按鍵 ? 2022-07-05 14:59 ? 次閱讀

設計中在遇到按鍵較多,但是單片機I/O資源有限時,采用矩陣鍵盤是一種很好的選擇方案。在按鍵較少時,矩陣鍵盤沒有明顯的優勢,比如3×3矩陣鍵盤占用I/O口6個,只支持9個按鍵;但是,按鍵較多時,矩陣鍵盤的優勢就凸顯出來了,比如5×5矩陣鍵盤占用I/O口10個,可支持25個按鍵;

矩陣鍵盤的硬件設計非常簡單,如圖1以5×5矩陣鍵盤為例,藍色行線5條,綠色列線5條(加上拉電阻),用按鍵代替行列交叉的節點即組成了矩陣鍵盤,其中二極管處的紅色連線可用來檢測按鍵是否按下或作為中斷信號的(可以不需要,使用時沒有任何影響,本文不涉及)。

4b9915ac-f417-11ec-ba43-dac502259ad0.png

圖1:矩陣鍵盤

圖2單片機STM32F103CBT6的外圍電路,帶顏色的I/O口為矩陣鍵盤行線PA1~PA5(藍色),列線PA6~PA10(綠色)。為方便編程,矩陣鍵盤最好選擇同組的I/O端口

4bb1e8ca-f417-11ec-ba43-dac502259ad0.png

圖2:單片機外圍電路

硬件的設計就是以上部分,接下來講解程序部分,

矩陣鍵盤的掃描方法有多種,其中很青睞的是行列反轉掃描,不僅簡單而且效率高,而且只需要掌握該方法就足夠了。

行列反轉掃描的邏輯:

①行線輸出全為0(行線PA1~PA5配置成推挽輸出,列線PA6~PA10配置成上拉輸入)

②讀入列線值

③輸出列線值(行線PA1~PA5配置成上拉輸入,列線PA6~PA10配置成推挽輸出)

④讀入行線值

⑤組合行線列線值

對于STM32的單片機,直接操作寄存器會更簡單,且無需再對I/O進行另外的配置,全部代碼如圖3所示,完全可以當做一個模塊來使用。

4bcd4e44-f417-11ec-ba43-dac502259ad0.png

圖3:矩陣鍵盤的行列反轉掃描

以下代碼與圖3里面的代碼完全一致(為方便瀏覽和拷貝)

/*----------------------
5*5矩陣鍵盤掃描函數,返回掃描鍵值(行列反轉掃描)
-----------------------*/
u16 Key_Scan(void)
{
u16 cord_h,cord_l;
u16 key_value = 0xFFFF;
GPIOA->CRL = 0x88333334;
GPIOA->CRH = 0x44444888;
GPIOA->ODR = GPIOA->IDR & 0xFFC1;
cord_l = GPIOA->IDR & 0x07C0;
if(cord_l != 0x07C0)
{
delay_ms(10);
if(cord_l != 0x07C0)
{
cord_l = GPIOA->IDR & 0x07C0;
GPIOA->CRL = 0x33888884;
GPIOA->CRH = 0x44444333;
GPIOA->ODR = cord_l | 0xF83F;
delay_us(1);
cord_h = GPIOA->IDR & 0x003E;
cord_h >>= 1;
cord_l >>= 1;
key_value = (cord_l + cord_h) & 0xFFFF;
return(key_value);
}
}return(0xFFFF);
}

以下代碼為端口配置寄存器的操作,PA組I/O有16個引腳:PA0~PA15;3代表推挽輸出,4代表浮空輸入,8代表上拉輸入;

GPIOA->CRL = 0x88333334; //低8位配置
GPIOA->CRH = 0x44444888; //高8位配置

以下代碼中,GPIOA->ODR為端口輸出數據寄存器,用于寫操作;GPIOA->IDR為端口輸入數據寄存器,用于讀操作;

0xFFC1的二進制:1111 1111 1100 0001,表示要對PA1~PA5置0。

0x07C0的二進制:0000 0111 1100 0000,表示要對PA6~PA10讀值。

GPIOA->ODR = GPIOA->IDR & 0xFFC1;//行線輸出全為0
cord_l = GPIOA->IDR & 0x07C0; //讀入列線值

行列反轉后的原理與上面完全一樣,這里就不一一闡述了。

最后講一下組合行線列線值,假如S1按鍵按下去了,得到的二進制為(注意黑體字

cord_h:0000 0000 0011 1100

cord_l:0000 0111 1000 0000

cord_h >>= 1 表示右移1位得到:

0000 0000 0001 1110

cord_l >> = 1 表示右移1位得到:

0000 0011 1100 0000

組合碼(鍵值):key_value=0000 0011 1101 1110,即0x03DE;最后函數返回key_value值,該值就作為判斷S1的鍵值。

之所以右移1位,是因為PA0沒有用于矩陣鍵盤,所得到的鍵值也就被左移了1位,事實上,也可以不用右移,只是得到的組合碼不同而已,右移是為了方便計算。

矩陣鍵盤的鍵值定義如下:

#define S1 0x03DE
#define S2 0x03BE
#define S3 0x037E
#define S4 0x02FE
#define S5 0x01FE
#define S6 0x03DD
#define S7 0x03BD
#define S8 0x037D
#define S9 0x02FD
#define S10 0x01FD
#define S11 0x03DB
#define S12 0x03BB
#define S13 0x037B
#define S14 0x02FB
#define S15 0x01FB
#define S16 0x03D7
#define S17 0x03B7
#define S18 0x0377
#define S19 0x02F7
#define S20 0x01F7
#define S21 0x03CF
#define S22 0x03AF
#define S23 0x036F
#define S24 0x02EF
#define S25 0x01EF

要點:

①行列反轉掃描的思想是行線作為輸出時,讀出列線的值;然后反過來,列線作為輸出時,讀出行線的值,最后把兩個值組合起來就是該按鍵的鍵值;

②參與計算的十六進制數一定要與行線或列線在同組端口的位置匹配,比如0xFFC1的二進制:1111 1111 1100 0001,表示要對PA1~PA5置0。

審核編輯:郭婷


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

    關注

    147

    文章

    9706

    瀏覽量

    167577
  • 單片機
    +關注

    關注

    6043

    文章

    44621

    瀏覽量

    638597

原文標題:5×5矩陣鍵盤掃描,一條龍化繁為簡,值得擁有

文章出處:【微信號:FANYPCB,微信公眾號:凡億PCB】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    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的接口

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

    編輯器,選擇circuitpython為解釋器并選擇開發板連接的串口 然后將有關代碼提示的設置打開,方便后續開發 矩陣鍵盤的驅動 矩陣鍵盤的實現原理并不難,就是逐行
    發表于 08-04 23:04

    TCA8424低壓8x16鍵盤掃描器數據表

    電子發燒友網站提供《TCA8424低壓8x16鍵盤掃描器數據表.pdf》資料免費下載
    發表于 07-11 11:46 ?0次下載
    TCA8424低壓8x16<b class='flag-5'>鍵盤</b><b class='flag-5'>掃描</b>器數據表

    TCA8418 I2C控制型鍵盤掃描IC數據表

    電子發燒友網站提供《TCA8418 I2C控制型鍵盤掃描IC數據表.pdf》資料免費下載
    發表于 07-01 11:53 ?0次下載
    TCA8418 I2C控制型<b class='flag-5'>鍵盤</b><b class='flag-5'>掃描</b>IC數據表

    TCA8418E I2C控制鍵盤掃描IC,帶集成ESD保護數據表

    電子發燒友網站提供《TCA8418E I2C控制鍵盤掃描IC,帶集成ESD保護數據表.pdf》資料免費下載
    發表于 06-27 09:58 ?0次下載
    TCA8418E I2C控制<b class='flag-5'>鍵盤</b><b class='flag-5'>掃描</b>IC,帶集成ESD保護數據表

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

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

    鍵盤矩陣規格設計圖

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

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

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

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

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

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

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

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

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

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

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

    具有48個電流源、64條掃描線的汽車類共陰極LED矩陣驅動器LP5891-Q1數據表

    電子發燒友網站提供《具有48個電流源、64條掃描線的汽車類共陰極LED矩陣驅動器LP5891-Q1數據表.pdf》資料免費下載
    發表于 04-03 10:20 ?0次下載
    具有48個電流源、64條<b class='flag-5'>掃描</b>線的汽車類共陰極LED<b class='flag-5'>矩陣</b>驅動器LP5891-Q1數據表

    48個電流源、64 次掃描、共陰極矩陣 LED顯示驅動器TLC6984數據表

    電子發燒友網站提供《48個電流源、64 次掃描、共陰極矩陣 LED顯示驅動器TLC6984數據表.pdf》資料免費下載
    發表于 04-02 09:54 ?0次下載
    48個電流源、64 次<b class='flag-5'>掃描</b>、共陰極<b class='flag-5'>矩陣</b> LED顯示驅動器TLC6984數據表

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

    stm32cubeMX如何配置4*4矩陣鍵盤,求大佬給代碼指導一下,看了太多代碼,自己迷亂了
    發表于 03-28 09:27
    日博娱乐| 百家乐游戏解码器| 太阳城百家乐官网软件| 云鼎百家乐代理| 免费百家乐官网游戏下| 太阳城投诉| 2024属虎人全年运势| 澳门百家乐官网论谈| 百家乐怎么| 百家乐官网足球| 喜来登娱乐城| 速博百家乐的玩法技巧和规则 | 揭秘百家乐官网百分之50| 百家乐博彩,| 永利百家乐赌场娱乐网规则| 百家乐官网号公| 百家乐官网游戏看路| 大发888官方网站下载| 澳门百家乐威尼斯| 博彩百家乐官网字谜总汇| 百家乐官网庄闲必赢| 大发888王博| 百家乐专业术语| Bet百家乐官网娱乐城| 缅甸百家乐官网博彩| 金都国际| 百家乐麻将牌| 足球百家乐投注计算| 网站百家乐官网假| 百家乐官网玩法说明| 百家乐赌博导航| 好运来百家乐官网的玩法技巧和规则 | 百家乐软件代打| 百家乐官网公式与赌法| 百家乐官网的破解方法| 奇博国际娱乐网| 大发888娱乐城充值| 百家乐真人斗地主| 百家乐专打和局| 百家乐官网游戏机破解方法| 百家乐官网怎样投注好|