當前位置:首頁 » 編程語言 » 矩陣鍵盤c語言

矩陣鍵盤c語言

發布時間: 2022-08-08 09:48:06

① 求矩陣鍵盤的c語言。我寫的程序,矩陣鍵盤的第1,2,4行一點反應都沒有,第3行正常運行

void delay() //延時子程序
{
unsigned char n, m;
for (n = 100; n > 0; n--)
for (m = 300; m > 0; m--);
}
unsigned char Keycan(void) //按鍵掃描程序 P1.0--P1.3為行線 P1.4--P1.7為列線
{
unsigned char rcode, ccode;
P1 = 0xF0; // 發全0行掃描碼,列線輸入
if((P1&0xF0) != 0xF0) // 若有鍵按下
{
delay();// 延時去抖動
if((P1&0xF0) != 0xF0)
{ rcode = 0xFE; // 逐行掃描初值
while((rcode&0x10) != 0)
{
P1 = rcode; // 輸出行掃描碼
if((P1&0xF0) != 0xF0) // 本行有鍵按下
{
ccode = (P1&0xF0)|0x0F;
do{;}while((P1&0xF0) != 0xF0); //等待鍵釋放
return ((~rcode) + (~ccode)); // 返回鍵編碼
}
else
rcode = (rcode<<1)|0x01; // 行掃描碼左移一位
}
}
}
return 0; // 無鍵按下,返回值為0
}

② 單片機 C語言編程 矩陣鍵盤

你要問什麼呢? 關於矩陣鍵盤的,我博客上面有,你可以參考。
http://hi..com/chinasndw

③ 單片機中獨立鍵盤和矩陣鍵盤如何一起使用 請用C語言寫個程序說明,謝謝。

這個很好處理呀,比如以下舉例,獨立+矩陣,實現獨立按鍵相當於類似SHIFT作用的效果。
#include<reg51.h>
#define uchar unsigned char
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0到f
uchar keyval,num;
sbit skey=P1^0; //獨立鍵P1.0
void delay(uchar a)
{
uchar i,j;
for(i=0;i<a;i++)
for(j=0;j<125;j++);
}
uchar kbscan(void) //矩陣鍵掃描程序
{
unsigned char sccode,recode;
P3=0x0f; //發0掃描,列線輸入
if ((P3 & 0x0f) != 0x0f) //有鍵按下
{
delay(20); //延時去抖動
if ((P3&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行掃描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
while((P3&0x0f)!=0x0f);//等待鍵抬起
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //無鍵按下,返回0
}
void getkey(void)
{
unsigned char key;
key=kbscan();
if(key==0)
{
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;
}
//以下處理獨立按鍵
if(skey==0)
{
if(keyval!=0xff)keyval+=16; //如果獨立鍵按下,鍵值加16
while(skey==0); //等待獨立鍵釋放
}
}
void t0isr() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
switch(num)
{
case 0:P2=0x01;break;
case 1:P2=0x02;break;
case 2:P2=0x04;break;
case 3:P2=0x08;break;
default:break;
}
if(keyval<16) P0=~tab[keyval]; //獨立鍵未按正常顯示
else P0=~(tab[keyval]|0x80); //獨立鍵按下顯示+DP
num++;
num&=0x03;
}
main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
getkey();
}
}

④ 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單片機,用c語言,如何用矩陣鍵盤為一個變數char a賦值已設計出一個函數,使得每按一個矩陣

/***4×4矩陣按鍵構架——火柴天堂作品-20110921***/
/***源程序默認硬體環境:52單片機,12MHz晶振,P1口 4×4矩陣鍵盤,詳細布局如下***/
/* 默認矩陣布局,按鍵掃描方式1使用
P0 P1 P2 P3
│ │ │ │
P4─┼──┼──┼──┤ S1 S2 S3 S4
│ │ │ │
P5─┼──┼──┼──┤ S5 S6 S7 S8
│ │ │ │
P6─┼──┼──┼──┤ S9 S10 S11 S12
│ │ │ │
P7─┴──┴──┴──┘ S13 S14 S15 S16
*/

#include"reg52.h" //包含52頭文件
#define TRUE 1 //定義布爾量'1':真
#define FALSE 0 //定義布爾量'0':假
#define uchar unsigned char //定義 無符號字元型數據 簡稱
#define uint unsigned int //定義 無符號整型數據 簡稱
#define KeyPort P1
#define Key1Value 1
#define Key2Value 2

//uchar code KeyCodeList[16]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xeb,0xe7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};//按鍵代碼列表,按鍵掃描方式2使用,可按需要隨意修改順序

uchar KeyScan() //按鍵掃描函數(方式1,需配合源程序矩陣布局,返回值0表示無按鍵,1-16為對應按鍵),缺點:無法掃描組合鍵(同時按2個按鍵以上)
{
uchar temp_h,temp_l,scan_value,i;
KeyPort=0xf0; //設置低4位為0(掃描線),准備讀取高4位(返回線)狀態
if(KeyPort==0xf0) return 0; //若高4位狀態不變,表示無按鍵,返回無按鍵 鍵值0
temp_h=~KeyPort>>4; //若高4位狀態改變,表示有按鍵,讀取高4位,並將結果轉成正邏輯(按鍵對應 行線 為 1 )存在temp_h低位上
KeyPort=0x0f; //設置高4位為0(掃描線),准備讀取低4位(返回線)狀態
temp_l=~(KeyPort|0xf0); //讀取低4位,並將結果轉成正邏輯(按鍵對應 列線 為 1 )存在temp_l低位上
while(i<4) //將 按鍵行線號 轉成數值
{
if((temp_h>>i)==0x01) break; //讀取按鍵行線號
i++;
}
if(i==4) return 0; //若讀取出錯,返回無按鍵
temp_h=i; //將 按鍵行線數值 結果存於 temp_h
i=0;
while(i<4) //將 按鍵列線號 轉成數值
{
if((temp_l>>i)==0x01) break; //讀取按鍵列線號
i++;
}
if(i==4) return 0; //若讀取出錯,返回無按鍵
temp_l=i; //將 按鍵列線號 結果存於 temp_l
scan_value=(temp_h<<2)+temp_l+1; //合並行列線數值,並轉成按鍵值,每條行線鍵值差為 4(temp_h<<2),按鍵值從1開始(+1,0為無按鍵 鍵值)
return scan_value; //返回 按鍵值
}
/*
uchar KeyScan() //按鍵掃描函數(方式2,需配合 按鍵代碼列表 數組 進行 鍵值 查詢,返回值0表示無按鍵,1-16為代碼表順序對應按鍵),缺點:無法掃描組合鍵
{
uchar temp,i;
KeyPort=0xf0; //設置低4位為0(掃描線),准備讀取高4位(返回線)狀態
if(KeyPort==0xf0) return 0; //若高4位狀態不變,表示無按鍵,返回無按鍵 鍵值0
temp=KeyPort|0x0f; //若高4位狀態改變,表示有按鍵,讀取高4位,並將結果存於 temp 的高4位
KeyPort=0x0f; //設置高4位為0(掃描線),准備讀取低4位(返回線)狀態
temp&=(KeyPort|0xf0); //讀取低4位,並將結果存於 temp 的低4位
while(i<16) //將按鍵行列線代碼轉換成鍵值
{
if(temp==KeyCodeList[i]) break; //將 行列線 代碼與 按鍵代碼表 進行對比,若一致則結束對比
i++; //進行下一個對比
}
if(i==16) return 0; //若查詢出錯,或 行列線代碼 不在 按鍵代碼表中,返回無按鍵 鍵值0
return i+1; //返回按鍵值1~16(按鍵代碼列表中元素下標+1,0為無按鍵 鍵值)
}
*/
void KeyResp() //按鍵響應函數
{
static uchar KeyValue; //定義靜態變數-按鍵值,
static bit KeyDownFlag,KeyReadyFlag; //定義靜態標志位-按鍵按下標志,按鍵准備(響應)標志
uchar key_value=KeyScan(); //調用掃描函數,並將結果臨時存放於key_value 中
if(key_value) //若掃描結果為真(即有按鍵)
{
KeyValue=key_value; //保存掃描結果
KeyDownFlag=TRUE; //按鍵按下標志 置位
KeyReadyFlag=TRUE; //按鍵准備(響應)標志 置位
}
else KeyDownFlag=FALSE; //若掃描結果為假(即無按鍵),則清空按鍵按下標志
if(KeyReadyFlag && !KeyDownFlag) //若 按鍵已准備(響應),且無按鍵按下,(可知為 按下後又鬆手情況)
{
switch(KeyValue) //查找 按鍵值 對應的 按鍵處理
{
case Key1Value:break; //按鍵1處理
case Key2Value:break; //按鍵2處理
//case Key3Value:break;//......... //按鍵N處理
default:break; //無對應按鍵,或其它按鍵值處理
}
KeyValue=0; //清除按鍵值
KeyReadyFlag=FALSE; //清空 按鍵准備(響應)標志
}
}

void main() //主函數
{
while(1) //循環系統
{
KeyResp(); //調用 按鍵響應函數
}
}

⑥ C語言矩陣鍵盤函數疑問

看程序中P1.0-P1.3是行掃描輸出,P1.4-P1.7是掃描輸入。所以原理是P1.0-P1.3中每次只有一個引腳輸出0,其餘輸出1,然後讀取P1.4-P1.7是否有引腳為0;如果有0說明有按鍵按下,如果全1說明沒有按鍵按下。


scancode這個變數就是用於控制P1.0-P1.3(P1=scancode;由這句輸出)中每次只有一個引腳輸出0的。

scancode=0xfe;這句中bit0值為0,其餘bit為1,所以開始時,P1=scancode;由這句輸出後,P1.0為0,其餘引腳為1。

scancode=(scancode<<1)|0x01;這句使為0的bit左移一位(依次值為0xFE,0xFD,0xFB,0xF7,0xEF)。0xFE,0xFD,0xFB,0xF7都滿足while((scancode&0x10)!=0)這個條件,而0xEF則不滿足了,所以說<此語句只檢查第五位是否為1,如果最低列按下後不就等於零了,就跳過此函數了>,到這就所有按鍵都掃描過了,沒有按鍵按下(如果有按鍵按下,中途就返回了)。


if((P1&0xf0)!=0xf0)這句中P1&0xf0表示只判斷P1.4-P1.7,只有當前按下的按鍵所在行掃描輸出為0時,這個表達式才成立(這時(P1&0xf0)!=0xf0);否則這個表達式肯定不成立(這時(P1&0xf0)==0xf0),所以說當前行。


return((~scancode)+(~tmpcode));這句就是如果有按鍵按下,那麼直接返回鍵值,並不再進行循環退出程序。


程序格式要注意,下面這樣更清楚:

ucharkeyscan(void)
{
ucharscancode,tmpcode;
P1=0xf0;//發全0行掃描碼
if((P1&0xf0)!=0xf0)
//若有鍵按下
{
delay();//延時去抖動
if((P1&0xf0)!=0xf0)
//延時後再判斷一次,去除抖動影響
{
scancode=0xfe;
while((scancode&0x10)!=0)
//逐行掃描<此語句只檢查第五位是否為1,如果最低列按下後不就等於零了,就跳過此函數了>
{
P1=scancode;//輸出行掃描碼
if((P1&0xf0)!=0xf0)
//本行有鍵按下<為什麼是行?哪一列按下此句都成立啊>
{
tmpcode=(P1&0xf0)|0x0f;
/*返回特徵位元組碼,為1的位即對應於行和列*/
return((~scancode)+(~tmpcode));
}
else
scancode=(scancode<<1)|0x01;
//行掃描碼左移一位
}
}
}
return(0);//無鍵按下,返回值為0
}

⑦ 單片機AT89C51矩陣鍵盤C語言程序

#include<reg51.h>
#define uchar unsigned char;
uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<1000;j++);
}
uchar kbscan(void)
{
unsigned char sccode,recode;
P2=0x0f; //發0掃描,列線輸入
if ((P2 & 0x0f) != 0x0f) //有鍵按下
{
delay(20); //延時去抖動
if ((P2&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行掃描初值
while((sccode&0x01)!=0)
{
P2=sccode;
if((P2&0x0f)!=0x0f)
{
recode=(P2&0x0f)|0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //無鍵按下,返回0
}

void getkey(void)
{
unsigned char key;
key=kbscan();
if(key==0)return;
switch(key)
{
case 0x11:P1=distab[0];break;
case 0x12:P1=distab[1];break;
case 0x14:P1=distab[2];break;
case 0x18:P1=distab[3];break;
case 0x21:P1=distab[4];break;
case 0x22:P1=distab[5];break;
case 0x24:P1=distab[6];break;
case 0x28:P1=distab[7];break;
case 0x41:P1=distab[8];break;
case 0x42:P1=distab[9];break;
case 0x44:P1=distab[10];break;
case 0x48:P1=distab[11];break;
case 0x81:P1=distab[12];break;
case 0x82:P1=distab[13];break;
case 0x84:P1=distab[14];break;
case 0x88:P1=distab[15];break;
default:P1=distab[16];break;
}
}
main()
{
while(1)
{
getkey();
}
}

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

熱點內容
美國雲伺服器主機 發布:2024-04-19 22:28:54 瀏覽:140
抗生素資料庫 發布:2024-04-19 22:13:03 瀏覽:495
晚晚教編程 發布:2024-04-19 21:56:23 瀏覽:713
安卓換蘋果語音留言怎麼看 發布:2024-04-19 21:56:21 瀏覽:627
解壓神經 發布:2024-04-19 21:47:03 瀏覽:894
c語言字元轉義字元 發布:2024-04-19 21:43:51 瀏覽:728
mysql存儲過程語法 發布:2024-04-19 21:00:04 瀏覽:245
修復損壞的壓縮文件 發布:2024-04-19 20:53:32 瀏覽:423
編程發型 發布:2024-04-19 20:53:28 瀏覽:500
去除空格sql 發布:2024-04-19 20:43:30 瀏覽:785