日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机阵列式键盘实验C语言,单片机4×4矩阵式键盘的课程设计

發布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机阵列式键盘实验C语言,单片机4×4矩阵式键盘的课程设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、實驗目的

1.掌握4×4矩陣式鍵盤程序識別原理。

2.掌握4×4矩陣式鍵盤按鍵的設計方法。

二、設計原理

(1)如圖14.2所示,用單片機的并行口P3連接4×4矩陣鍵盤,并以單片機的P3.0-P3.3各管腳作輸入線,以單片機的P3.4-P3.7各管腳作輸出線,在數碼管上顯示每個按鍵 “0-F”的序號。

(2)鍵盤中對應按鍵的序號排列如圖14.1所示。

三、參考電路

圖14.2 4×4矩陣式鍵盤識別電路原理圖

圖14.1 4×4鍵盤0-F顯示

圖14.3 4×4矩陣式鍵盤識別程序流程圖

四、電路硬件說明

(1)在“單片機系統”區域中,把單片機的P3.0-P3.7端口通過8聯撥動撥碼開關JP3連接到“4×4行列式鍵盤”區域中的M1-M4,N1-N4端口上。

(2)在“單片機系統”區域中,把單片機的P0.0-P0.7端口連接到“靜態數碼顯示模塊”區域中的任何一個a-h端口上;要求:P0.0對應著a,P0.1對應著b,……,P0.7對應著h。

五、程序設計內容

(1)4×4矩陣鍵盤識別處理 。

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

六、程序流程圖(如圖14.3所示)

七、匯編源程序

;;;;;;;;;;定義單元;;;;;;;;;;

COUNT EQU 30H

;;;;;;;;;;入口地址;;;;;;;;;;

ORG 0000H

LJMP START

ORG 0003H

RETI

ORG 000BH

RETI

ORG 0013H

RETI

ORG 001BH

RETI

ORG 0023H

RETI

ORG 002BH

RETI

;;;;;;;;;;主程序入口;;;;;;;;;;

ORG 0100H

START: LCALL CHUSHIHUA

LCALL PANDUAN

LCALL XIANSHI

LJMP START

;;;;;;;;;;初始化程序;;;;;;;;;;

CHUSHIHUA: MOV COUNT,#00H

RET

;;;;;;;;;;判斷哪個按鍵按下程序;;;;;;;;;;

PANDUAN: MOV P3,#0FFH

CLR P3.4

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ SW1

LCALL DELAY10MS

JZ SW1

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,K1

MOV COUNT,#0

LJMP DK

K1: CJNE A,#0DH,K2

MOV COUNT,#4

LJMP DK

K2: CJNE A,#0BH,K3

MOV COUNT,#8

LJMP DK

K3: CJNE A,#07H,K4

MOV COUNT,#12

K4: NOP

LJMP DK

SW1: MOV P3,#0FFH

CLR P3.5

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ SW2

LCALL DELAY10MS

JZ SW2

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,K5

MOV COUNT,#1

LJMP DK

K5: CJNE A,#0DH,K6

MOV COUNT,#5

LJMP DK

K6: CJNE A,#0BH,K7

MOV COUNT,#9

LJMP DK

K7: CJNE A,#07H,K8

MOV COUNT,#13

K8: NOP

LJMP DK

SW2: MOV P3,#0FFH

CLR P3.6

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ SW3

LCALL DELAY10MS

JZ SW3

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,K9

MOV COUNT,#2

LJMP DK

K9: CJNE A,#0DH,KA

MOV COUNT,#6

LJMP DK

KA: CJNE A,#0BH,KB

MOV COUNT,#10

LJMP DK

KB: CJNE A,#07H,KC

MOV COUNT,#14

KC: NOP

LJMP DK

SW3: MOV P3,#0FFH

CLR P3.7

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ SW4

LCALL DELAY10MS

JZ SW4

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,KD

MOV COUNT,#3

LJMP DK

KD: CJNE A,#0DH,KE

MOV COUNT,#7

LJMP DK

KE: CJNE A,#0BH,KF

MOV COUNT,#11

LJMP DK

KF: CJNE A,#07H,KG

MOV COUNT,#15

KG: NOP

LJMP DK

SW4: LJMP PANDUAN

DK: RET

;;;;;;;;;;顯示程序;;;;;;;;;;

XIANSHI: MOV A,COUNT

MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

SK: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ SK

RET

;;;;;;;;;;10ms延時程序;;;;;;;;;;

DELAY10MS: MOV R6,#20

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

;;;;;;;;;;200ms延時程序;;;;;;;;;;

DELAY: MOV R5,#20

LOOP: LCALL DELAY10MS

DJNZ R5,LOOP

RET

;;;;;;;;;;共陰碼表;;;;;;;;;;

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

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

;;;;;;;;;;結束標志;;;;;;;;;;

END

八、C語言源程序

#include

unsigned char code table[]={0x3f,0x66,0x7f,0x39,

0x06,0x6d,0x6f,0x5e,

0x5b,0x7d,0x77,0x79,

0x4f,0x07,0x7c,0x71};

void main(void)

{ unsigned char i,j,k,key;

while(1)

{ P3=0xff; //給P3口置1//

P3_4=0; //給P3.4這條線送入0//

i=P3;

i=i&0x0f; //屏蔽低四位//

if(i!=0x0f) //看是否有按鍵按下//

{ for(j=50;j>0;j--) //延時//

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

if(i!=0x0f) //再次判斷按鍵是否按下//

{ switch(i) //看是和P3.4相連的四個按鍵中的哪個//

{ case 0x0e:

key=0;

break;

case 0x0d:

key=1;

break;

case 0x0b:

key=2;

break;

case 0x07:

key=3;

break;

}

P0=table[key]; //送數到P0口顯示//

}

}

P3=0xff;

P3_5=0; //讀P3.5這條線//

i=P3;

i=i&0x0f; //屏蔽P3口的低四位//

if(i!=0x0f) //讀P3.5這條線上看是否有按鍵按下//

{ for(j=50;j>0;j--) //延時//

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

i=P3; //再看是否有按鍵真的按下//

i=i&0x0f;

if(i!=0x0f)

{ switch(i) //如果有,顯示相應的按鍵//

{ case 0x0e:

key=4;

break;

case 0x0d:

key=5;

break;

case 0x0b:

key=6;

break;

case 0x07:

key=7;

break;

}

P0=table[key]; //送入P0口顯示//

}

}

P3=0xff;

P3_6=0; //讀P3.6這條線上是否有按鍵按下//

i=P3;

i=i&0x0f;

if(i!=0x0f)

{ for(j=50;j>0;j--)

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

i=P3;

i=i&0x0f;

if(i!=0x0f)

{ switch(i)

{ case 0x0e:

key=8;

break;

case 0x0d:

key=9;

break;

case 0x0b:

key=10;

break;

case 0x07:

key=11;

break;

}

P0=table[key];

}

}

P3=0xff;

P3_7=0; //讀P3.7這條線上是否有按鍵按下//

i=P3;

i=i&0x0f;

if(i!=0x0f)

{ for(j=50;j>0;j--)

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

i=P3;

i=i&0x0f;

if(i!=0x0f)

{ switch(i)

{ case 0x0e:

key=12;

break;

case 0x0d:

key=13;

break;

case 0x0b:

key=14;

break;

case 0x07:

key=15;

break;

}

P0=table[key];

}

}

}

}

九、注意事項

在硬件電路中,要把8聯撥動撥碼開關JP2撥下,把8聯撥動撥碼開關JP3撥上去。

總結

以上是生活随笔為你收集整理的单片机阵列式键盘实验C语言,单片机4×4矩阵式键盘的课程设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。