A. C51單片機按鍵掃描
1.設置一個狀態變數,如flag,定義flag=0為開狀態,flag=1為關狀態。
2.因為是按鍵(不是開關),所以實際上單片機讀取的應該是脈沖形式的輸入。設按鍵接單片機P01引腳,故可採用以下程序實現按鍵掃描
if(P01==0)//按下按鍵,進入下降沿
{
delay2();//20ms延時去按鍵前抖動
while(P01==0);//等待上升沿到
來,即按鍵彈起
flag=~flag;//flag取反,實現狀態切換
}
void
delay2()//20ms延時子程序
{
unsigned
char
i,k;
for(i=0;i<100;i++)
for(k=0;k<100;k++);
}
註:根據按鍵的具體接法,若按下按鍵向單片機輸入低電平,則採用以上程序;若按下按鍵向單片機輸入高電平,則將兩處P01==0均改為P01==1。
B. 單片機矩陣鍵盤按鍵行列逐級掃描法
unsigned
char
KeyScan(void)
//鍵盤掃描函數,使用行列逐級掃描法{
unsigned
char
Val;
KeyPort=0xf0;//這句其實就是整體看看是否有鍵按下,四行全送0,有鍵按下,高四位肯定不為全1
if(KeyPort!=0xf0)//表示有按鍵按下
{
DelayMs(10);
//去抖
if(KeyPort!=0xf0)
{
//表示有按鍵按下
KeyPort=0xfe;
//檢測第一行
if(KeyPort!=0xfe)
{
Val=KeyPort&0xf0;
Val+=0x0e;
//相當於檢測到第一行有鍵按下,鍵值=列(高四位)+行(低四位)
while(KeyPort!=0xfe);
DelayMs(10);
//去抖
while(KeyPort!=0xfe);
return
Val;
}
C. 求用52單片機實驗板實現4*4鍵盤及數碼管動態掃描顯示的程序
#include <reg52.h>
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
sbit la=P2^6;
sbit wela=P2^7;
uchar keyscan();
uchar num,temp,num1;
void delay(uchar z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
num=17;
la=1;
P0=0;
la=0;
wela=1;
P0=0xc0;
wela=0;
while(1)//每次按下都是 所以while循環
{
num1=keyscan();
la=1;
P0=table[num1-1];
la=0;
}
}
uchar keyscan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0); //必須用if啊
{
delay(5);//消抖再判斷
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0) //必須用if啊
{
temp=P3;
switch(temp)
{
case 0xee:num=1;break;
case 0xde:num=2;break;
case 0xbe:num=3;break;
case 0x7e:num=4;break;
}
while(temp!=0xf0)// 鬆手檢測 鬆手數字才變化 必須用while 不鬆手不顯示 不鬆手下一排鍵盤沒用 一直在while內循環 放在第二個if內
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
delay(5);//消抖再判斷
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
temp=P3;
switch(temp)
{
case 0xed:num=5;break;
case 0xdd:num=6;break;
case 0xbd:num=7;break;
case 0x7d:num=8;break;
}
while(temp!=0xf0)//鬆手檢測 鬆手數字才變化 必須用while
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
delay(5);//消抖再判斷
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
temp=P3;
switch(temp)
{
case 0xeb:num=9;break;
case 0xdb:num=10;break;
case 0xbb:num=11;break;
case 0x7b:num=12;break;
}
while(temp!=0xf0)//鬆手檢測 鬆手數字才變化 必須用while
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
delay(5);//消抖再判斷
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
temp=P3;
switch(temp)
{
case 0xe7:num=13;break;
case 0xd7:num=14;break;
case 0xb7:num=15;break;
case 0x77:num=16;break;
}
while(temp!=0xf0)//鬆手檢測 鬆手數字才變化 必須用while
{
temp=P3;
temp=temp&0xf0;
}
}
}
return num;
}
D. 單片機鍵盤掃描。
兄弟,你好
void key()
{uchar key1,key2,key3; 這條語句後就key1=key2=key3=0了,肯定就一直在key()函數中一直不出來了撒,你的key1等是按鍵,怎麼沒有分配一個IO口呢
你如果這樣的話就可以了
void key()
{uchar key1,key2,key3;
key1=key2=key3=1;這樣的話就不會一直在key()中了
要想達到效果,估計你還的弄幾個按鍵
添幾句
sbit key1=P3^0;
。。。。。。
再把 uchar key1,key2,key3;這一句刪了,
你試一下,祝你成功
E. 用單片機編寫的鍵盤掃描程序怎樣編寫它的求鍵號程序
要不要我幫你寫一段,你後面沒掃描,當然無法獲取鍵值
t1:mov
p1,#0fh
;p1介面高4位為0,低4位輸入
mov
a,p1
;讀p1
anl
a,#0fh
;屏蔽高4位
cjne
a,#0fh,t2
;有鍵按下轉t2
sjmp
t1
;無鍵按下轉回
t2:lcall
delay10;延時10ms,去抖
mov
a,p1
;重新掃描p1口
anl
a,#0fh
cjne
a,#0fh,t3
sjmp
t1
t3:mov
r0,#00
;行計數值
mov
r1,#00
;列計數值
mov
r3,#0efh
;掃描初值
t4:mov
a,r3
mov
p1,a;輸出行掃描字
mov
a,p1
mov
r1,a
anl
a,#0fh
cjne
a,#0fh,t5
;該行有鍵按下
inc
r0
;行計數器加1
,掃下一行
MOV
A,R3
RLC
A
MOV
R3,A
MOV
A,R0
CJAE
A,#04H,t4
;掃到最後一行?
t6:
ret
;結束
t5:mov
a,r1
jnb
acc.0,t7
jnb
acc.1,t8
jnb
acc.2,t9
jnb
acc.3,t10
sjmp
t6
t7:
mov
r2,#00
;0列號
sjmp
t11
t8:mov
r2,#01
;1列號
sjmp
t11
t9:mov
r2,#02
;2列號
sjmp
t11
t10:mov
r2,#03
;3列號
t11:mov
a,r0
mov
b,#04
mul
ab
;行號乘4
add
a,r2
;鍵值在A中
ret
F. 單片機行列式鍵盤掃描原理
單片機行列式鍵盤掃描原理如下:
1、行線P10~P13為輸出線,列線P14~P17為輸入線。一開始單片機將行線(P10~P13)全部輸出低電平,此時讀入列線數據,若列線全為高電平則沒有鍵按下,當列線有出現低電平時調用延時程序以此來去除按鍵抖動。
2、延時完成後再判斷是否有低電平,如果此時讀入列線數據還是有低電平,則說明確實有鍵按下。最後一步確定鍵值。當判斷確實有鍵按下之後,行線輪流輸出低電平,根據讀入列線的數據可以確定鍵值。
3、單片機將P10輸出為低電平,其它P11~P13輸出高電平,此時讀取列線的數據全為高電平,說明沒有在第一行有鍵按下;其次,單片機將P11輸出低電平,其它P10、P12、P13仍為高電平。
4、此時再來讀取列線數據,發現列線讀到的數據有低電平,數值為1011(0x0B),如果我們的鍵盤布局已經確定,那麼0x0B就代表S5的值了。轉到S5鍵功能處理子程序就可以達到目的。
(6)單片機鍵盤掃描實驗擴展閱讀
單片機學習方法
1、基礎理論知識學習
基礎理論知識包括模擬電路、數字電路和C語言知識。。在學習單片機之前,覺得模擬電路和數字電路基礎不好的話,不要急著學習單片機,應該先回顧所學過的模擬電路和數字電路知識,為學習單片機加強基礎。
2、單片機實踐
准備一台電腦、一塊單片機開發板、一套視頻教程、一本單片機教材和一本C語言教材。電腦是用來編寫和編譯程序,並將程序代碼下載到單片機上;開發板來運行單片機程序,驗證實際效果。