① 51單片機矩陣鍵盤(c語言) 求大神啊~
uchar
KeyScan(void)
{
static
uchar
k=0;
//由於函數在調用結束時k值已返回給函數,k作為局部變數即可
/////////
uchar
Trg,Trg1,Trg2,Cont1,Cont2;
uchar
ReadData1,ReadData2;
/////////
P3=0x0f;
ReadData1=P3^0x0f;
Trg1=ReadData1&(ReadData1^Cont1);
//觸發鍵
Cont1=ReadData1;
//長按鍵
/////////
P3=0xf0;
ReadData2=P3^0xf0;
Trg2=ReadData2&(ReadData2^Cont2);
Cont2=ReadData2;
Trg=Trg1+Trg2;
////////
switch(Trg)
{
case
0x81:{k=1;break;}
case
0x41:{k=2;break;}
case
0x21:{k=3;break;}
case
0x11:{k=4;break;}
case
0x82:{k=5;break;}
case
0x42:{k=6;break;}
case
0x22:{k=7;break;}
case
0x12:{k=8;break;}
case
0x84:{k=9;break;}
case
0x44:{k=10;break;}
case
0x24:{k=11;break;}
case
0x14:{k=12;break;}
case
0x88:{k=13;break;}
case
0x48:{k=14;break;}
case
0x28:{k=15;break;}
case
0x18:{k=16;break;}
default:{k=0;break;}
}
return(k);
}
//在主函數裡面直接調用keyboard()函數,直接返回鍵值;
然後在數碼管顯示。
好好的研究下這個鍵盤程序,
這種方式很程序很精煉、簡單
絕對可以調出來。
② 單片機中的4×4矩陣鍵盤的鍵值怎麼求
單片機書上應該有講的哦,多查資料。
既然是4x4,即4行4列了,共需要8個I/O口,有8bit數據(如高四位為行4bit,低四位為列4bit)位:xxxx xxxx。還要結合你的程序來編碼鍵值,如果有鍵按下了,查詢所有按鍵的所連接的I/O口電平狀態,每個按鍵需要兩個I/O口,一端連接行(行4bit之一),一端連接列(列4bit之一);若此時按鍵的電平狀態為0010 0001,即十六進制數據0x21,按下的按鍵所對應的鍵值編碼即為0x21。當然為了使用方便,在確定了按下按鍵的編碼後,可對其賦值,我要將它賦值為數字鍵8,方便後續編程使用。例:
//獲取鍵值編碼,由於確定哪個按鍵按下
uchar keyscan(void)//鍵盤掃描函數,使用行列反轉掃描法
{
uchar cord_h,cord_l;//行列值
P3=0x0f; //行線輸出全為0
cord_h=P3&0x0f; //讀入列線值
if(cord_h!=0x0f) //先檢測有無按鍵按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //讀入列線值
P3=cord_h|0xf0; //輸出當前列線值
cord_l=P3&0xf0; //讀入行線值
return(cord_h+cord_l);//鍵盤最後組合碼值
}
}return(0xff); //返回該值
}
while(1)
{
key=keyscan();//調用鍵盤掃描,
//keyVal=0~15表示按鍵對應的功能
switch(key)
{
case 0x7e:keyVal=0;break;//0 按下相應的鍵顯示相對應的碼值
case 0x7d:keyVal=1;break;//1
case 0x7b:keyVal=2;break;//2
case 0x77:keyVal=3;break;//3
case 0xbe:keyVal=4;break;//4
case 0xbd:keyVal=5;break;//5
case 0xbb:keyVal=6;break;//6
case 0xb7:keyVal=7;break;//7
case 0xde:keyVal=8;break;//8
case 0xdd:keyVal=9;break;//9
case 0xdb:keyVal=10;break;//a
case 0xd7:keyVal=11;break;//b
case 0xee:keyVal=12;break;//c
case 0xed:keyVal=13;break;//d
case 0xeb:keyVal=14;break;//e
case 0xe7:keyVal=15;break;//f
}
③ 求一個單片機4X4矩陣鍵盤掃描程序,C語言的。
淘bao 旺鋪: 廣州華電 單片機學習板 單片機外圍學習模塊/感測器模塊
//4*4鍵盤檢測程序,按下鍵後相應的代碼顯示在數碼管上
#include<reg51.h>
sbit beep=P2^3;
sbit la=P2^6;
sbit wela=P2^7;
unsigned char i=100;
unsigned char j,k,temp,key;
void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
display(unsigned char num)
{
P0=table[num];
la=1;
la=0;
P0=0xc0;
wela=1;
wela=0;
}
void main()
{
la=0;
wela=0;
while(1)
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
P1=0xfe;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
}
}
}
}
④ 單片機矩陣鍵盤程序求解釋和修正!
沒有硬體電路,單從程序來看應該沒錯。我加了注釋,你可以參考下。
#include<STC12C5A60S2.h>
char code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x00,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
void delayms(int xms)
{
int i,j;
for(i=xms;i>0;i--) //i=xms即延時約xms毫秒
for(j=110;j>0;j--);
}
void display(char num)
{
P1=table[num]; //段選數據
}
void matrixkeyscan()
{
char temp,key;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//說明有按鍵按下
{
delayms(10);//延時,去抖動
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//說明按鍵被持續按下
{
temp=P3;//記錄P3口狀態
switch(temp)//根據現在的狀態判斷哪個按鍵被按下
{
case 0xee: //p3^4被按下
key=0;
break;
case 0xde: //p3^5
key=1;
break;
case 0xbe://p3^6
key=2;
break;
case 0x7e://p3^7
key=3;
break;
}
while(temp!=0xf0)//按鍵松開之後跳出循環
{
temp=P3;
temp=temp&0xf0;
}
display(key);//顯示
}
}
P3=0xfd;
{......};
P3=0xfb:
{......};
P3=0xf7;
{......};
void main()
{
P0M1 = 0x00;//推挽輸出的定義
P0M0 = 0x0f;//推挽輸出的定義
P0=0x0f;
while(1)
{
matrixkeyscan();//不停調用鍵盤掃描程序
}
}
⑤ 求51單片機矩陣4*4鍵盤程序,P0口接一個數碼管,P3口接矩陣鍵盤,C語言的
#include<reg51.h>
unsigned char keyval,keynum=0;
unsigned char distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
void t1isr() interrupt 3
{
unsigned char sccode,recode;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
P3=0x0f; //發0掃描,列線輸入
if ((P3 & 0x0f) != 0x0f)keynum++; //有鍵按下
else keynum=0;
if(keynum>5) //按鍵保持在5次中斷以上
{
keynum=0;
sccode = 0xef; //逐行掃描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
getkey((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
getkey(0);
}
void getkey(unsigned char key)
{
if(key==0){keyval=0xff;return;}
switch(key)
{
case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}
}
main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(keyval!=0xff)P0=distab[keyval];
}
}
⑥ 誰能給我講講單片機4X4矩陣鍵盤的編程步驟(最好有常式註解),小弟沒分了!希望大家能幫幫我…
4*4的鍵盤
先說下,一個鍵盤吧,延時去抖動,就是說,按鍵按下的時候是低電平,那麼在等10-20ms確定是不是按下了按鍵,按下之後一般都是先等按鍵釋放,釋放只有執行程序,這樣就能確保下次按鍵的時候跟本次按鍵的操作不會干擾了
/*-----------------------------------------------
功能:按一次按鍵,led點亮,再按一次熄滅,以此循環
------------------------------------------------*/
#include<reg52.h>//包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
sbitKEY=P3^2;//定義按鍵輸入埠
sbitLED=P0^0;//定義led輸出埠
voidDelayUs2x(unsignedchart);//函數聲明
voidDelayMs(unsignedchart);
/*------------------------------------------------
主函數
------------------------------------------------*/
voidmain(void)
{
KEY=1;//按鍵輸入埠電平置高
while(1)//主循環
{
if(!KEY)//如果檢測到低電平,說明按鍵按下
{
DelayMs(10);//延時去抖,一般10-20ms
if(!KEY)//再次確認按鍵是否按下,沒有按下則退出
{
while(!KEY);//如果確認按下按鍵等待按鍵釋放,沒有釋放則一直等待
{
LED=!LED;//釋放則執行需要的程序
}
}
}
//主循環中添加其他需要一直工作的程序
}
}
/*------------------------------------------------
uS延時函數,含有輸入參數unsignedchart,無返回值
unsignedchar是定義無符號字元變數,其值的范圍是
0~255這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
{
while(--t);
}
/*------------------------------------------------
mS延時函數,含有輸入參數unsignedchart,無返回值
unsignedchar是定義無符號字元變數,其值的范圍是
0~255這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
至於4*4的鍵盤的話,那就要先確定按鍵到底是哪一個,舉個例子啊,比如說你先給1個列的按鍵給個低電平,然後去檢測,第一列的四個按鍵,是不是按下了,如果第一個按下了,延時去抖動,然後再確定是否按下,然後執行,操作,
同樣,就能確定16個鍵 了
#include<reg52.h>
sbita=P1^0;
sbitb=P1^1;
sbitc=P1^2;
sbitd=P1^3;
unsignedcharcodetable[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voidmain()
{unsignedintt=1000;
P2=0x00;
while(1)
{
P1=0xef;
while(P1!=0xef)
{
while(t--);t=1000;
while(P1!=0xef)
{switch(P1)
{
case0xee:P0=table[0];break;
case0xed:P0=table[1];break;
case0xeb:P0=table[2];break;
case0xe7:P0=table[3];break;
}
while(P1!=0xef);
}
}
P1=0xdf;
while(P1!=0xdf)
{
while(t--);t=1000;
while(P1!=0xdf)
{switch(P1)
{
case0xde:P0=table[4];break;
case0xdd:P0=table[5];break;
case0xdb:P0=table[6];break;
case0xd7:P0=table[7];break;
}
while(P1!=0xdf);
}
}
P1=0xbf;
while(P1!=0xbf)
{
while(t--);t=1000;
while(P1!=0xbf)
{switch(P1)
{
case0xbe:P0=table[0];break;
case0xbd:P0=table[1];break;
case0xbb:P0=table[2];break;
case0xb7:P0=table[3];break;
}
while(P1!=0xbf);
}
}
P1=0x7f;
while(P1!=0x7f)
{
while(t--);t=1000;
while(P1!=0x7f)
{switch(P1)
{
case0x7e:P0=table[4];break;
case0x7d:P0=table[5];break;
case0x7b:P0=table[6];break;
case0x77:P0=table[7];break;
}
while(P1!=0x7f);
}
}
}
}
自己寫的,怎麼看著亂七八糟的,你自己理一下就明白了
⑦ 單片機 4*4矩陣鍵盤
這個電路圖,只是你使用哪幾個口在程序中對應上就可以了
程序
//行列掃描程序,可以自己定義埠和掃描方式,這里做簡單介紹
#include<reg52.h>//包含頭文件
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharconstdofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
ucharkeyscan(void);
voiddelay(uinti);
voidmain()
{
ucharkey;
P2=0x00;//1數碼管亮按相應的按鍵,會顯示按鍵上的字元
while(1)
{
key=keyscan();//調用鍵盤掃描,
switch(key)
{
case0x7e:P0=dofly[0];break;//0按下相應的鍵顯示相對應的碼值
case0x7d:P0=dofly[1];break;//1
case0x7b:P0=dofly[2];break;//2
case0x77:P0=dofly[3];break;//3
case0xbe:P0=dofly[4];break;//4
case0xbd:P0=dofly[5];break;//5
case0xbb:P0=dofly[6];break;//6
case0xb7:P0=dofly[7];break;//7
case0xde:P0=dofly[8];break;//8
case0xdd:P0=dofly[9];break;//9
case0xdb:P0=dofly[10];break;//a
case0xd7:P0=dofly[11];break;//b
case0xee:P0=dofly[12];break;//c
case0xed:P0=dofly[13];break;//d
case0xeb:P0=dofly[14];break;//e
case0xe7:P0=dofly[15];break;//f
}
}
}
ucharkeyscan(void)//鍵盤掃描函數,使用行列反轉掃描法
{
ucharcord_h,cord_l;//行列值
P3=0x0f;//行線輸出全為0
cord_h=P3&0x0f;//讀入列線值
if(cord_h!=0x0f)//先檢測有無按鍵按下
{
delay(100);//去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f;//讀入列線值
P3=cord_h|0xf0;//輸出當前列線值
cord_l=P3&0xf0;//讀入行線值
return(cord_h+cord_l);//鍵盤最後組合碼值
}
}return(0xff);//返回該值
}
voiddelay(uinti)//延時函數
{
while(i--);
}
不明白的在聯系我,也可以直接訪問我的Blog:hi..com/lyzhangxiang
⑧ 51單片機矩陣鍵盤程序:想把按鍵的值一一存到數組里,最後按下某個按鍵時,把數組里的某個數顯示出來,
給一個鍵盤掃描程序參考:
voiddelay(unsignedinta)
{
unsignedinti,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
ucharkbscan(void)
{
unsignedcharsccode,recode;
P1=0x0f;//發0掃描,列線輸入
if((P2&0x0f)!=0x0f)//有鍵按下
{
delay(20);//延時去抖動
if((P1&0x0f)!=0x0f)
{
sccode=0xef;//逐行掃描初值
while((sccode&0x01)!=0)
{
P1=sccode;
if((P1&0x0f)!=0x0f)
{
recode=(P1&0x0f)|0xf0;
while((P1&0x0f)!=0x0f);//等待鍵抬起
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return0;//無鍵按下,返回0
}
uchargetkey(void)
{
unsignedcharkey,keyval=0xff;
key=kbscan();
switch(key)
{
case0x11:keyval=1;break;
case0x12:keyval=2;break;
case0x14:keyval=3;break;
case0x18:keyval=10;break; //+
case0x21:keyval=4;break;
case0x22:keyval=5;break;
case0x24:keyval=6;break;
case0x28:keyval=11;break; //-
case0x41:keyval=7;break;
case0x42:keyval=8;break;
case0x44:keyval=9;break;
case0x48:keyval=12;break; //清除
case0x81:keyval=13;break;
case0x82:keyval=0;break;
case0x84:keyval=14;break; //小數點
case0x88:keyval=15;break; //確認
default:keyval=16;break;
}
return(keyval);
}
⑨ 【求解釋】單片機最簡單的矩陣鍵盤代碼(只有三句)
這是完整的矩陣鍵盤代碼沒錯,不過並不難理解,假設按下的是連接P1.1和P1.5的按鍵,那麼各行代碼的二進制結果為:
第一行:P1 = 1111 0000
第二行:KH = 1101 0000
第三行:P1 = 0000 1111
第四行:KL = 0000 1101
第五行:Key = 1101 0000 | 0000 1101 = 1101 1101
高位和低位「0」的位置不同,位或得到的結果也不同,這樣就能得到不同的鍵值,作為判斷按鍵位置的依據。