導航:首頁 > 操作系統 > 單片機中斷鍵盤怎麼掃描

單片機中斷鍵盤怎麼掃描

發布時間:2022-07-01 08:17:08

⑴ 51單片機,定時中斷與鍵盤掃描的問題。

-----------------------------------------------------------
從上面的這段代碼來看,你在主函數里調用了掃描函數掃描按鍵,軟體置TF0=1產生定時中斷,而事實上,T0已在處理在定時中斷的當中,然而中斷函數使用了下面的語句:
while(keybuf!='E')
{
move(0x00);//移動LCD游標
getkey();
wrdata(keybuf);//向LCD當前位置寫入鍵盤值,此處scan()無效
}
這些語句很容易讓程序處在中斷當中而無法退出,建議你在中斷當中用if語句適合。
同時,我建議你在編寫程序時注意程序的結構,盡量模塊化,一個函數在中斷外部調用了,就不要在中斷外部再調用,中斷當中注意使用while語句,防止處在中斷當中退不出來或不確定狀態。
------------------------------------------------
米德電子-Mide
Technology研發中心
http://www.csmide.cn
------------------------------------------------

⑵ 單片機 鍵盤掃描 這個程序是如何工作的

別人寫的代碼我很難分析,代碼也不全,就不想費時間分析,大概的思路,就是將接鍵盤的IO口設為輸入,當按下時位低電平,就能判斷哪個被按下。具體的是,4*4,四行四列,表示16個數,四個接行數,數個接列數,具體的接法就不說了,網上有,叫矩陣鍵盤,然後就是一直掃描,if語句判斷哪行被按下,在掃描列,就可以對應到具體的按鍵了,然後就可以跳到相應的處理函數進行處理。

⑶ 單片機4x4按鍵中斷掃描法中的鍵盤編碼的問題

嗯,想法很不錯..
我試著幫你解釋下第一個吧..
這應該是選用的線掃法(好像這么說的吧).
比如說,鍵盤口為,P1
在一開始輸出,01111111B,再判斷P1口值是否變化..
若沒變化再換成,10111111B,再判斷P1口值是否變化..
這樣依次到,11101111B,
在有變化時就可以得到把描碼了..就像是你那個表中所示.的數值就經過這四次都可以得出其中一種....
#include<reg51.h>
#define uchar unsigned char
#define KeyPad P0
code uchar key_tab[17]=
{0xed,0x7e,0x7d,0x7b,
0xbe,0xbd,0xbb,0xde,
0xdd,0xdb,0x77,0xb7,
0xee,0xd7,0xeb,0xe7,0XFF};
code uchar key_show[]=
{1,2,3,0x0a,
4,5,6,0x0b,
7,8,9,0x0e,
0x0c,0,0x0d,0x0f,0xff};
uchar Keyscan()
{
uchar i=0x01,j,k;
KeyPad=~i;
j=~i;
for (k=0;k<4;k++)
{
if(KeyPad==j)
{
i*=2;
KeyPad=~i;
j=~i;
}
else
k=KeyPad;//取出掃描碼.
}
i=0;
if(k!=4)
{
while(key_tab[i++]!=0xff)
{
if(k==key_tab[i])
k=i;
else
k=16;
}
}
return key_show[k];
}
以上是整個掃描鍵盤子程序..
程序編譯通過,不知道實際怎麼樣..
其中未用中斷..
不過,方法是一樣的...
明白思想才是最重要的..
祝你好運!
^_^

⑷ 單片機行列式鍵盤掃描原理

單片機行列式鍵盤掃描原理如下:

1、行線P10~P13為輸出線,列線P14~P17為輸入線。一開始單片機將行線(P10~P13)全部輸出低電平,此時讀入列線數據,若列線全為高電平則沒有鍵按下,當列線有出現低電平時調用延時程序以此來去除按鍵抖動。

2、延時完成後再判斷是否有低電平,如果此時讀入列線數據還是有低電平,則說明確實有鍵按下。最後一步確定鍵值。當判斷確實有鍵按下之後,行線輪流輸出低電平,根據讀入列線的數據可以確定鍵值。

3、單片機將P10輸出為低電平,其它P11~P13輸出高電平,此時讀取列線的數據全為高電平,說明沒有在第一行有鍵按下;其次,單片機將P11輸出低電平,其它P10、P12、P13仍為高電平。

4、此時再來讀取列線數據,發現列線讀到的數據有低電平,數值為1011(0x0B),如果我們的鍵盤布局已經確定,那麼0x0B就代表S5的值了。轉到S5鍵功能處理子程序就可以達到目的。

(4)單片機中斷鍵盤怎麼掃描擴展閱讀

單片機學習方法

1、基礎理論知識學習

基礎理論知識包括模擬電路、數字電路和C語言知識。。在學習單片機之前,覺得模擬電路和數字電路基礎不好的話,不要急著學習單片機,應該先回顧所學過的模擬電路和數字電路知識,為學習單片機加強基礎。

2、單片機實踐

准備一台電腦、一塊單片機開發板、一套視頻教程、一本單片機教材和一本C語言教材。電腦是用來編寫和編譯程序,並將程序代碼下載到單片機上;開發板來運行單片機程序,驗證實際效果。

⑸ 單片機鍵盤掃描程序

2*3的鍵盤,太簡單了,不值得用循環,特別是雙重循環。

最簡明、高效的程序如下:

sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;

char scan_key(void)
{
P13 = 0;
if (!P10) return 0;
if (!P11) return 1;
if (!P12) return 2;
P13 = 1;

P14 = 0;
if (!P10) return 3;
if (!P11) return 4;
if (!P12) return 5;
}

本程序,使用的變數最少,也不涉及其它介面。
代碼最少,執行效率最高。

⑹ 簡述單片機鍵盤掃描工作過程

鍵盤由行線列線交叉而成。列線接有上拉電阻。對第一行的行線置0,然後讀取列線碼,如果所有列線都是1說明買有被按下的鍵,繼續掃描下一行。直到能讀到0為止,讀到0時所掃描的行就是該鍵的行碼,而0所在的位是列碼。一般的鍵盤掃描都做成中斷形式,把列線所有線相與,只要有一個0就輸出0,將這個信號送給中斷,就可以實現在有鍵被按下時開啟掃描了。

⑺ 單片機利用中斷掃描獨立式按鍵

你定時器中斷後,掃描下即便掃描到有按鍵按下先做個標記,等待下次中斷進入後,根據標記先判斷是否按鍵還處於按下狀態,是的話,經過你的再次定時器中斷,也已經實現了消抖延時的作用。此時可以採集按鍵值。

⑻ 單片機外部中斷有那些用處可不可以在中斷里放一個鍵盤掃描程序

外部中斷,需要有一個外部脈沖信號加到P3.2 或P3.3,引起中斷,才能執行到中斷服務程序。
要在中斷里放一個鍵盤掃描程序,那得需要鍵盤引起中斷才行的。多個獨立式按鍵,或矩陣式鍵盤,都不方便產生一個中斷信號的。
外部中斷,不是為了鍵盤的,為什麼會想到用鍵盤呢?

⑼ 單片機獨立式按鍵的外部中斷掃描

#include<reg51.h>
#include<intrins.h>
#defineucharunsignedchar
ucharkey;
voidext0()interrupt0
{
if(P1&0x01)key=1;
elseif(P1&0x02)key=2;
elseif(P1&0x04)key=3;
elseif(P1&0x08)key=4;
elsekey=0;
}
voiddelay(uchara)
{
uchari;
while(a--)for(i=0;i<120;i++);
}
main()
{
ucharled,i,j;
while(1)
{
switch(key)
{
case1:
led=0xfe;
for(i=0;i<10;i++)
for(j=0;j<8;j++)
{
P1=led;
led=_crol_(led,1);
delay(200);
}
break;
case2:
led=0x7f;
for(i=0;i<10;i++)
for(j=0;j<8;j++)
{
P1=led;
led=_cror_(led,1);
delay(200);
}
break;
case3:
led=0x0f;
for(i=0;i<10;i++)
{
P1=led;
delay(200);
led=~led;
P1=led;
delay(200);
led=~led;
}
break;
case4:
for(i=0;i<10;i++)
{
P1=0x00;
delay(200);
P1=0xff;
delay(200);
}
break;
}
}
}

⑽ 求MSP430單片機4X4矩陣鍵盤的中斷掃描程序

//msp430F149
4*4矩陣鍵盤P1口中斷掃描
#include<msp430x14x.h>
#define
KEY_DIR
P1DIR
#define
KEY_OUT
P1OUT
#define
KEY_IN
P1IN
#define
KEY_IE
P1IE
#define
KEY_IES
P1IES
#define
KEY_IFG
P1IFG
/***************全局變數***************/
unsigned
char
Key_Val;
//存放鍵值
void
CtrlKey(unsigned
char
sw);
//控制鍵盤開關//sw=0關
sw=1開
/*******************************************
函數名稱:Init_Keypad

能:初始化掃描鍵盤的IO埠

數:無
返回值
:無
********************************************/
void
Init_Keypad(void)
{
KEY_DIR
=
0x0f;
//P1.0~P1.3設置為輸出狀態,P1.4~P1.7輸入
狀態(上拉H)
KEY_OUT=0;
KEY_IES
=0xf0;
//P1.4~P1.7允許中斷
KEY_IE
=0xf0;
//P1.4~P1.7下降沿觸發中斷
KEY_IFG=0;
//中斷標志清0
Key_Val
=
0;
}
/*******************************************
函數名稱:Check_Key

能:掃描鍵盤的IO埠,獲得鍵值

數:無
返回值
:無
********************************************/
//p14\5\6\7
接上拉電阻
/***************************************
key_Val
對應鍵值
列:[p14]
[p15]
[p16]
[p17]




行:
[p13]→
1
2
3
4
[p12]→
5
6
7
8
[p11]→
9
10
11
12
[p10]→
13
14
15
16
***************************************/
void
Check_Key(void)
{
unsigned
char
row
,col,tmp1,tmp2;
unsigned
char
keymap[]
=
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};//設置鍵盤邏輯鍵值
與程序計算鍵值的映射
tmp1
=
0x08;
for(row
=
0;row
<
4;row++)
//行掃描
{
KEY_OUT
=
0x0f;
//P1.4~P1.7輸出全1
KEY_OUT
-=
tmp1;
//P1.4~p1.7輸出四位中有一個為0
tmp1
>>=1;
if((KEY_IN
&
0xf0)<0xf0)
//是否P1IN的P1.0~P1.3中有一位為0
{
tmp2
=
0x10;
//
tmp2用於檢測出哪一位為0
for(col
=
0;col
<
4;col++)
//
列檢測
{
if((KEY_IN
&
tmp2)
==
0x00)
//
是否是該列,等於0為是
{
Key_Val
=
keymap[row*4
+
col];
//
獲取鍵值
return;
//
退出循環
}
tmp2
<<=
1;
//
tmp2右移1位
}
}
}
}
/*******************************************
函數名稱:delay

能:延時約15ms,完成消抖功能

數:無
返回值
:t=
tmp*5*clk
根據使用時鍾調整tmp值
********************************************/
void
delay(void)
{
unsigned
int
tmp;
for(tmp
=
12000;tmp
>
0;tmp--);
}
/*******************************************
函數名稱:Key_Event

能:檢測按鍵,並獲取鍵值

數:無
返回值
:無
********************************************/
void
Key_Event(void)
{
unsigned
char
tmp;
KEY_OUT
=0;
//
設置P1OUT全為0,等待按鍵輸入
tmp
=
KEY_IN;
//
獲取
p1IN
if((tmp
&
0xf0)
<
0xf0)
//如果有鍵按下
{
delay();
//消除抖動
Check_Key();
//
調用check_Key(),獲取鍵值
}
}
/*********************************************************************
控制打開或者關閉鍵盤中斷
SW=
0:關閉;
ELSE:打開
*********************************************************************/
void
CtrlKey(unsigned
char
sw)
{
if(sw==0)
KEY_IE
=0;
//關閉埠中斷
else
KEY_IE
=0xf0;
//打開埠中斷
}
/*埠1按鍵中斷*/
#pragma
vector=PORT1_VECTOR
__interrupt
void
Port(void)
{
if((KEY_IFG&0xf0)!=0)
{
Key_Event();
if(Key_Val!=0)
//鍵值!=0有鍵按下
{
CtrlKey(0);
//關鍵盤中斷
}
}
KEY_IFG=0;KEY_OUT=0;
//清中斷標志
}

閱讀全文

與單片機中斷鍵盤怎麼掃描相關的資料

熱點內容
51單片機定時器pwm 瀏覽:681
民國修真 瀏覽:386
php數組作為參數傳遞 瀏覽:991
運行命令查ip 瀏覽:200
漲奶吃奶小說 瀏覽:338
股票十大戰法主圖指標源碼 瀏覽:702
查看網路的命令是什麼意思 瀏覽:585
《鬼吹燈》1-8全本txt 瀏覽:336
python繪圖兩個圓代碼 瀏覽:605
python中end的用法 瀏覽:682
大概率30選股源碼 瀏覽:206
阿里雲伺服器如何鏡像 瀏覽:161
能看的 瀏覽:403
京東伺服器為什麼會崩 瀏覽:834
php超類 瀏覽:822
怎麼在美團APP上請假 瀏覽:100
午夜激情影院 瀏覽:242
歐拉app怎麼下訂單 瀏覽:422
肉文有聲小說 瀏覽:955
求個看片的網址 瀏覽:547