導航:首頁 > 操作系統 > 51單片機鍵盤矩陣程序

51單片機鍵盤矩陣程序

發布時間:2023-01-07 19:06:54

⑴ 51單片機 c語言編程 4*4矩陣鍵盤如何實現等待按鍵松開功能

1、在程序檢測到按鍵後,加個延時去抖,不要加鬆手檢測。然後執行第一個按鍵相對應的程序。然後繼續按鍵掃描。注意這里說的是繼續,也就是繼續往下檢測。否則的程序就只能執行第一個按鍵所對應的程序了。這樣,就能檢測到第二次按鍵的鍵值了。


2、常式:

ucharshaomiao()
{
ucharl,h;
P1=0xf0;//獲取高四位信息。在此低四位接到行。行低電平
l=P1|0x0f;
P1=l;//只把被按下鍵所在列置低
h=P1|0xf0;
switch(h)
{
case0xfe:h=0;break;//11111110
case0xfd:h=1;break;
case0xfb:h=2;break;
case0xf7:h=3;break;
}
switch(l)
{
case0xef:l=0;break;//11101111
case0xdf:l=1;break;
case0xbf:l=2;break;
case0x7f:l=3;break;
}
P1=0xf0;
/******關鍵問題解決如下******/
while(P1!=0xf0)
{
while(P1!=0xf0);//等待放開按鍵
delayms(50);//防止抖動
}
return(h*4+l);
}

⑵ 求助程序:51單片機矩陣鍵盤是否按下檢測程序

/**************************************************************************************
* 矩陣按鍵實驗 *
實現現象:下載程序後數碼管顯示0,按下矩陣按鍵上的按鍵顯示對應的數字
S1-S4:0-3
S5-S8:4-7
S9-S12:8-B
S13-S16:C-F。
注意事項:如果不想讓點陣模塊顯示,可以將74HC595模塊上的JP595短接片拔掉。
***************************************************************************************/
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;
#define GPIO_DIG P0
#define GPIO_KEY P1
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 KeyValue; //用來存放讀取到的鍵值
u8 code smgan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
/*******************************************************************************
* 函 數 名 : delay
* 函數功能 : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 數 名 : KeyDown
* 函數功能 : 檢測有按鍵按下並讀取鍵值
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
{
delay(1000);//延時10ms進行消抖
if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
{
//測試列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//測試行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //檢測按鍵鬆手檢測
{
delay(1000);
a++;
}
}
}
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
LSA=0; //給一個數碼管提供位選
LSB=0;
LSC=0;
while(1)
{
KeyDown(); //按鍵判斷函數
GPIO_DIG=smgan[KeyValue]; //
}
}

⑶ 求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];
}

}

⑷ C 51單片機 矩陣按鍵

首先記住,你的是矩陣鍵盤,就是說一個按鍵A的一端接單片機的一個腳(假設P00),另一個也接一個腳(假設P07),
GPIO_KEY=0x0f; 當沒有按下的話,GPIO_KEY還是等於0x0f的,假設按下A按鍵,由於按鍵兩邊一個接高電平,一個接低電平,按下後,高電平被低電平拉成低電平,也就是說按鍵A兩側都是0,此時不就可以判定了嘛

⑸ 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);
}

⑹ 求51單片機最簡單的矩陣按鍵程序

uchar x[16]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
uchar scan() //掃描鍵值的子程序
{
P1=0xf0;
scan0=P1;
delay1ms(20);

if(scan0!=0xf0) //判鍵是否按下
{
scan0=P1;
if(scan0!=0xf0) //二次判鍵是否按下
{
P1=0x0f;
delay1ms(20);
scan1=P1;
keycode=scan0|scan1; //組合成鍵編碼
for(m=0;m<16;m++)
{
if(keycode==x[m]) //查表得鍵值
{
key=m;

}

}
}
}
return(key);
}

⑺ 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()函數,直接返回鍵值;
然後在數碼管顯示。
好好的研究下這個鍵盤程序,
這種方式很程序很精煉、簡單
絕對可以調出來。

⑻ 51單片機4*3矩陣鍵盤6位密碼鎖c語言程序

#include<stdio.h>
#include<reg51.h>
#define uchar unsigned char

uchar key;
int i=0;
char b[4]={'0','0','0','0'};//輸入的密碼放這里和初始的比較來判斷是否密碼正確
void keyscan() //掃描按鍵是否按下
{
uchar temp;
P3=0xfe; //掃描第一行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0) //判斷按鍵是否按下
{
delayms(10);//去抖動
temp=P3;
temp=temp&0xf0;
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;
}
b[i]=key;i++;if(i==3)i=0;
}
}
P3=0xfd; //掃描第二行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
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;
}
b[i]=key;i++;if(i==3)i=0;
}
}
P3=0xfb; //掃描第三行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:key='8' ;break;
case 0xdb:key='9' ;break;
case 0xbb:key='A';break;
case 0x7b:key='B';break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
b[i]=key;i++;if(i==3)i=0;
}
}
P3=0xf7; //掃描第四行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:key='C';break;
case 0xd7:key='D';break;
case 0xb7:key='E';break;
case 0x77:key='F';break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
b[i]=key;i++;if(i==3)i=0;
}
}
}

main()
{
char a[4]={'3','5','A','C'}; //這個做初始密碼
while(1)//無限循環,保證了b 0-3 四個數有值
{
keyscan();
if(a[0]==b[0]&&a[1]==b[1]&&a[2]==b[2]&&a[3]==b[3])
{
//這里寫密碼正確程序要怎麼處理
}
}
}

閱讀全文

與51單片機鍵盤矩陣程序相關的資料

熱點內容
未來最值得投資的加密貨幣 瀏覽:526
ascii碼是編譯的時候用嗎 瀏覽:779
壓縮機感應包可以通用嗎 瀏覽:410
方舟伺服器怎麼發布到搜索列表 瀏覽:270
xml防反編譯 瀏覽:239
數據傳輸加密系統技術方案 瀏覽:842
程序員沒有準備去面試 瀏覽:4
51單片機usb滑鼠 瀏覽:879
qq伺服器的ip地址查詢 瀏覽:112
java仿qq聊天 瀏覽:400
解壓的ipa重新打包 瀏覽:142
程序員那麼可愛vip版 瀏覽:239
程序員怎麼升職 瀏覽:243
圖形化命令按鈕vb 瀏覽:987
vcu盤加密怎麼設置 瀏覽:414
如何加密備份微信聊天記錄 瀏覽:529
安卓手機如何模擬鍵盤 瀏覽:932
查看dns地址命令 瀏覽:768
android錄屏工具 瀏覽:841
成都互動直播系統源碼 瀏覽:956