99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

矩陣鍵盤的按鍵識(shí)別方法_矩陣鍵盤掃描程序

姚小熊27 ? 來源:網(wǎng)絡(luò)整理 ? 作者:網(wǎng)絡(luò)整理 ? 2020-04-20 09:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

矩陣鍵盤的按鍵識(shí)別方法

矩陣鍵盤的按鍵識(shí)別方法來自簡單日記網(wǎng)精選推薦。在學(xué)習(xí)有關(guān)矩陣鍵盤的時(shí)候,往往要學(xué)會(huì)矩陣鍵盤的按鍵識(shí)別方法,那么矩陣鍵盤的按鍵識(shí)別方法有哪些呢?小編帶著你來了解。

方法一:行掃描法

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

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

方法二:先從p1口的高四位輸出低電平,低四位輸出高電平,從p1口的低四位讀取鍵盤狀態(tài)。再從p1口的低四位輸出低電平,高四位輸出高電平,從p1口的高四位讀取鍵盤狀態(tài)。將兩次讀取結(jié)果組合起來就可以得到當(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)不一樣來區(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ù)值

**輸出:無

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

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

//輸入偵測

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ù):無

**輸出:無

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

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ù):無

**輸出:無

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

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;

}

}

}

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 矩陣鍵盤
    +關(guān)注

    關(guān)注

    7

    文章

    207

    瀏覽量

    32107
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    HarmonyOS應(yīng)用自定義鍵盤解決方案

    自定義鍵盤是一種替換系統(tǒng)默認(rèn)鍵盤的解決方案,可實(shí)現(xiàn)鍵盤個(gè)性化交互。允許用戶結(jié)合業(yè)務(wù)需求與操作習(xí)慣,對(duì)按鍵布局進(jìn)行可視化重構(gòu)、設(shè)置多功能組合鍵位,使輸入更加便捷和舒適。在安全防護(hù)層面,自
    的頭像 發(fā)表于 06-05 14:19 ?662次閱讀

    LED驅(qū)動(dòng)控制專用電路FZH181中文手冊

    集成LED 驅(qū)動(dòng):支持 11段×7位 至 14段×4位 多種顯示模式,適配不同數(shù)碼管布局。鍵盤掃描:內(nèi)置 10×2 矩陣鍵盤掃描,自動(dòng)完成鍵
    發(fā)表于 05-23 10:39 ?0次下載

    ADP5588移動(dòng)I/O擴(kuò)展器和QWERTY鍵盤控制器技術(shù)手冊

    ADP5588是一款I(lǐng)/O端口擴(kuò)展器和鍵盤矩陣,適用于需要大型鍵盤矩陣和擴(kuò)展I/O線路的QWERTY型電話。I/O擴(kuò)展器IC可以在移動(dòng)平臺(tái)中解決主處理器GPIO數(shù)量有限的問題。
    的頭像 發(fā)表于 05-22 11:37 ?255次閱讀
    ADP5588移動(dòng)I/O擴(kuò)展器和QWERTY<b class='flag-5'>鍵盤</b>控制器技術(shù)手冊

    ADP5587移動(dòng)I/O擴(kuò)展器和QWERTY鍵盤控制器技術(shù)手冊

    ADP5587 是一款 I/O 端口擴(kuò)展器和鍵盤矩陣,適用于需要大型鍵盤矩陣和擴(kuò)展 I/O 線路的 QWERTY 型電話。I/O 擴(kuò)展器 IC 可以在移動(dòng)平臺(tái)中解決主處理器 GPIO
    的頭像 發(fā)表于 05-22 11:08 ?265次閱讀
    ADP5587移動(dòng)I/O擴(kuò)展器和QWERTY<b class='flag-5'>鍵盤</b>控制器技術(shù)手冊

    低功耗Air724UG模組軟件指南:KEYPAD示例~

    一、簡介 ? 在電路設(shè)計(jì)中,通常需要較多的外部輸入,如果每個(gè)按鍵都單獨(dú)去占用一個(gè) IO 接口,就會(huì)非常浪費(fèi)資源,為了減少 I/O 口的占用,通常將按鍵排列成矩陣形式,即矩陣
    的頭像 發(fā)表于 02-07 14:25 ?240次閱讀
    低功耗Air724UG模組軟件指南:KEYPAD示例~

    納祥科技NX1722,一種帶鍵盤掃描的8段4位 LED 驅(qū)動(dòng)控制方案

    NX1722是一種帶鍵盤掃描電路接口的 LED 驅(qū)動(dòng)控制專用電路,內(nèi)部集成有 MCU 輸入輸出控制數(shù)字接口、數(shù)據(jù)鎖存器、LED 驅(qū)動(dòng)、鍵盤掃描、輝度調(diào)節(jié)等電路。 NX1722性能穩(wěn)定
    的頭像 發(fā)表于 02-05 17:27 ?389次閱讀
    納祥科技NX1722,一種帶<b class='flag-5'>鍵盤</b><b class='flag-5'>掃描</b>的8段4位 LED 驅(qū)動(dòng)控制方案

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

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

    點(diǎn)陣數(shù)碼管LED驅(qū)動(dòng)/數(shù)顯LED驅(qū)動(dòng)IC-VK1638 SOP28最大支持8×3按鍵矩陣/10×8點(diǎn)陣

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

    矩陣4x4個(gè)按鍵,如何把識(shí)別結(jié)果按編號(hào)01-16(十進(jìn)制)顯示在兩個(gè)七段數(shù)碼管上?

    矩陣4x4個(gè)按鍵,并把識(shí)別結(jié)果按編號(hào)01-16(十進(jìn)制)顯示在兩個(gè)七段數(shù)碼管上,按鍵按下時(shí)顯示,不按時(shí)消失編號(hào)消失。 2.為了更加實(shí)用,要求加上去抖動(dòng)電路模塊
    發(fā)表于 10-31 20:43

    MATLAB(6)--特殊矩陣

    通用的特殊矩陣 zero函數(shù):產(chǎn)生全是0矩陣,即零矩陣。 ones函數(shù):產(chǎn)生全是1矩陣,即幺矩陣。 eyes函數(shù):產(chǎn)生對(duì)角線為1的
    發(fā)表于 09-06 10:24

    MATLAB(2)--MATLAB矩陣的表示

    矩陣的建立 利用直接輸入法建立矩陣:將矩陣的元素用中括號(hào)括起來,按矩陣的順序輸入各元素,同一行的各元素之間用逗號(hào)或者空格分隔,不同的元素之間用分號(hào)分隔。 利用已建好的
    發(fā)表于 09-06 10:05

    MATLAB中的矩陣索引

    對(duì)矩陣進(jìn)行索引是從矩陣中選擇或修改部分元素的一種方式。MATLAB 有幾種索引樣式,它們不僅功能強(qiáng)大、靈活,而且可讀性強(qiáng)、表現(xiàn)力強(qiáng)。矩陣是 MATLAB 用來組織和分析數(shù)據(jù)的一個(gè)核心組件,索引是以可理解的方式有效操作
    的頭像 發(fā)表于 09-05 09:28 ?1080次閱讀
    MATLAB中的<b class='flag-5'>矩陣</b>索引

    LED屏驅(qū)動(dòng)廠家家電數(shù)顯驅(qū)動(dòng)IC芯片VK1S38A

    、LED 驅(qū)動(dòng)、鍵盤掃描等電路。SEG腳接LED陽極,GRID腳接LED陰極,可支持8SEGx8GRID的點(diǎn)陣LED顯示面板,最大支持8x3按鍵矩陣。適用于家電設(shè)備(智能熱水器、微波爐
    發(fā)表于 08-27 16:20

    開源項(xiàng)目!基于 Arduino DIY 漂亮的宏機(jī)械鍵盤

    按鍵上繪制圖標(biāo)以增強(qiáng)識(shí)別性,但實(shí)踐后我發(fā)現(xiàn)這不僅挑戰(zhàn)了我的手繪技能,更可能導(dǎo)致鍵帽設(shè)計(jì)顯得過于繁瑣,從而破壞整體鍵盤的簡潔美感。因此,我最終決定讓按鍵保持無圖標(biāo)狀態(tài),考慮到僅有 12
    發(fā)表于 08-19 17:02

    【xG24 Matter開發(fā)套件試用體驗(yàn)】物聯(lián)網(wǎng)密碼柜之驅(qū)動(dòng)矩陣鍵盤和OLED顯示器

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