音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

[分享]4*4矩陣式鍵盤識別技術(shù)

作者:jaky 欄目:單片機
1、設(shè)計任務
  用AT89C51的并行口P1接4×4矩陣鍵盤,以P1.0-P1.3作輸入線,以P1.4-P1.7作輸出線;在數(shù)碼管上顯示每個按鍵的“0-F”序號。  


2樓: >>參與討論
jaky
2、電路原理圖
3樓: >>參與討論
jaky

3、程序設(shè)計內(nèi)容
  (1)4×4矩陣鍵盤識別處理  
  (2)每個按鍵有它的行值和列值 ,行值和列值的組合就是識別這個按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和CPU通信。每個按鍵的狀態(tài)同樣需變成數(shù)字量“0”和“1”,開關(guān)的一端(列線)通過電阻接VCC,而接地是通過程序輸出數(shù)字“0”實現(xiàn)的。鍵盤處理程序的任務是:確定有無鍵按下,判斷哪一個鍵按下,鍵的功能是什么;還要消除按鍵在閉合或斷開時的抖動。兩個并行口中,一個輸出掃描碼,使按鍵逐行動態(tài)接地,另一個并行口輸入按鍵狀態(tài),由行掃描值和回饋信號共同形成鍵編碼而識別按鍵,通過軟件查表,查出該鍵的功能。


4樓: >>參與討論
jaky

4、程序框圖


5樓: >>參與討論
jaky



5、匯編源程序

KEYBUFEQU 30H

ORG 00H

START:MOV KEYBUF,#2

WAIT:

MOV P3,#0FFH

CLR P3.4

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY1

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY1

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK1

MOV KEYBUF,#0

LJMP DK1

NK1:CJNE A,#0DH,NK2

MOV KEYBUF,#1

LJMP DK1

NK2:CJNE A,#0BH,NK3

MOV KEYBUF,#2

LJMP DK1

NK3:CJNE A,#07H,NK4

MOV KEYBUF,#3

LJMP DK1

NK4:NOP

DK1:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A



DK1A:MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK1A

NOKEY1:

MOV P3,#0FFH

CLR P3.5

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY2

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY2

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK5

MOV KEYBUF,#4

LJMP DK2

NK5:CJNE A,#0DH,NK6

MOV KEYBUF,#5

LJMP DK2

NK6:CJNE A,#0BH,NK7

MOV KEYBUF,#6

LJMP DK2

NK7:CJNE A,#07H,NK8

MOV KEYBUF,#7

LJMP DK2

NK8:NOP

DK2:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A



DK2A:MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK2A

NOKEY2:

MOV P3,#0FFH

CLR P3.6

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY3

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY3

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK9

MOV KEYBUF,#8

LJMP DK3

NK9:CJNE A,#0DH,NK10

MOV KEYBUF,#9

LJMP DK3

NK10:CJNE A,#0BH,NK11

MOV KEYBUF,#10

LJMP DK3

NK11:CJNE A,#07H,NK12

MOV KEYBUF,#11

LJMP DK3

NK12:NOP

DK3:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A



DK3A:MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK3A

NOKEY3:

MOV P3,#0FFH

CLR P3.7

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY4

LCALL DELY10MS

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ NOKEY4

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,NK13

MOV KEYBUF,#12

LJMP DK4

NK13:CJNE A,#0DH,NK14

MOV KEYBUF,#13

LJMP DK4

NK14:CJNE A,#0BH,NK15

MOV KEYBUF,#14

LJMP DK4

NK15:CJNE A,#07H,NK16

MOV KEYBUF,#15

LJMP DK4

NK16:NOP

DK4:

MOV A,KEYBUF

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A



DK4A:MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ DK4A

NOKEY4:

LJMP WAIT

DELY10MS:

MOV R6,#10

D1:MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H

DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H

END

6、C語言源程序

#include

unsigned CHAR code table[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

unsigned CHAR TEMP;

unsigned CHAR key;

unsigned CHAR i,j;

void main(void)

{

while(1)

{

P3=0xff;

P3_4=0;

TEMP=P3;

TEMP=TEMP & 0x0f;

if (TEMP!=0x0f)

{

for(i=50;i>0;i--)

for(j=200;j>0;j--);

TEMP=P3;

TEMP=TEMP & 0x0f;

if (TEMP!=0x0f)

{

TEMP=P3;

TEMP=TEMP & 0x0f;

SWITCH(TEMP)

{

case 0x0e:

key=7;

break;

case 0x0d:

key=8;

break;

case 0x0b:

key=9;

break;

case 0x07:

key=10;

break;

}

TEMP=P3;

P1_0=~P1_0;

P0=table[key];

TEMP=TEMP & 0x0f;

while(TEMP!=0x0f)

{

TEMP=P3;

TEMP=TEMP & 0x0f;

}

}

}

P3=0xff;

P3_5=0;

TEMP=P3;

TEMP=TEMP & 0x0f;

if (TEMP!=0x0f)

{

for(i=50;i>0;i--)

for(j=200;j>0;j--);

TEMP=P3;

TEMP=TEMP & 0x0f;

if (TEMP!=0x0f)

{

TEMP=P3;

TEMP=TEMP & 0x0f;

SWITCH(TEMP)

{

case 0x0e:

key=4;

break;

case 0x0d:

key=5;

break;

case 0x0b:

key=6;

break;

case 0x07:

key=11;

break;

}

TEMP=P3;

P1_0=~P1_0;

P0=table[key];

TEMP=TEMP & 0x0f;

while(TEMP!=0x0f)

{

TEMP=P3;

6樓: >>參與討論
godsky
ai  頂一下吧
7樓: >>參與討論
vico
好東西,就是程序長了點,下次用 C 編寫吧!
8樓: >>參與討論
wujing198
以下是引用 vico 在(2007-1-20 8:46:14)的發(fā)言
好東西,就是程序長了點,下次用 C 編寫吧!


就是,用c要容易很多。
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
I/O口不足時的多路DAC設(shè)計
桌面報時程序
C51編寫菜單的例子
控制步進電機正反轉(zhuǎn)的實際應用程序
[分享]用AT89C51設(shè)計智能流量顯示儀
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號