導航:首頁 > 操作系統 > 51單片機44鍵盤

51單片機44鍵盤

發布時間:2022-08-27 08:42:24

⑴ 51單片機 c語言 關於4x4鍵盤編程問題。

其它你知道它是矩陣鍵盤就可以了,不需要關心行列是如何排列的,你寫個測試程序,每按一個鍵就把它對應的鍵值列印出來。

⑵ 51單片機4×4小鍵盤的構造原理

其實就是一個排列組合的關系,4行和4列組成一個矩陣,根據作者的掃描軟體處理不同,可以檢測到單鍵,也可以檢測到多鍵。比如行鍵全部設為高,一列一列的掃以「低電平」,此時檢測行健的電平高低從而得知所按鍵的位置,這就是矩陣鍵盤的掃描原理。

⑶ 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單片機矩陣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];
}

}

⑸ 51單片機 c語言 就是我現在在用4x4矩陣鍵盤 然後我一個按鍵是控制流水燈開始

這個要使用外部中斷,你在程序裡面改一下,加入中斷,可以用你的連接矩陣鍵盤的io口的最高位與最低位做一個與非門作為中斷信號就可以了。附上一段以前寫的,你看看,不過由於我沒有與非門,所以我用按鍵代替了中斷信號。

⑹ 51單片機4*4鍵盤及兩個七段顯示器函數,要求實現加減乘除

51單片機4*4鍵盤及兩個共陽數碼管,組成一個簡宜的計算器,實現加減乘除運算。proteus 軟體中有一個4X4的矩陣鍵,就是專門為計算器設計的,使用很方便。模擬圖如下所示。

⑺ 51單片機4x4鍵盤C語言程序運行,不知道為什麼第一行按鍵沒反應,而把注釋掉的部分加進去又有反應了。

你的注釋相當於加了點延時,你可以加幾個NOP()就可以了。

⑻ 51單片機的4*4鍵盤輸入的編程

呵呵,自己寫的,可以根據你的引腳排布自己做適當修改,希望對你有幫助
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code num[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(uint z);
main()
{
while(1)
{
P1=0xfe;
if(P1==0xee||P1==0xde||P1==0xbe||P1==0x7e)
delay(5);
if(P1==0xee||P1==0xde||P1==0xbe||P1==0x7e)
{
switch(P1)
{
case 0xee: P0=num[1]; break;
case 0xde: P0=num[2] ;break;
case 0xbe: P0= num[3];break;
case 0x7e: P0=num[4] ;break;
}
}
P1=0xfd;
if(P1==0xed||P1==0xdd||P1==0xbd||P1==0x7d)
delay(5);
if(P1==0xed||P1==0xdd||P1==0xbd||P1==0x7d)
{
switch(P1)
{
case 0xed: P0=num[5]; break;
case 0xdd: P0=num[6] ;break;
case 0xbd: P0= num[7];break;
case 0x7d: P0=num[8] ;break;
}
}
P1=0xfb;
if(P1==0xeb||P1==0xdb||P1==0xbb||P1==0x7b)
delay(5);
if(P1==0xeb||P1==0xdb||P1==0xbb||P1==0x7b)
{
switch(P1)
{
case 0xeb: P0=num[9]; break;
case 0xdb: P0=num[10] ;break;
case 0xbb: P0= num[11];break;
case 0x7b: P0=num[12] ;break;
}
}
P1=0xf7;
if(P1==0xe7||P1==0xd7||P1==0xb7||P1==0x77)
delay(5);
if(P1==0xe7||P1==0xd7||P1==0xb7||P1==0x77)
{
switch(P1)
{
case 0xe7: P0=num[13]; break;
case 0xd7: P0=num[14] ;break;
case 0xb7: P0= num[15];break;
case 0x77: P0=num[0] ;break;
}
}

}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

⑼ C51單片機4X4矩陣鍵盤檢測程序問題

可以參考:
http://hi..com/%d7%f6%b6%f8%c2%db%b5%c0/blog/item/ef086222268d4f4eac34de59.html
程序中,讀取4*4矩陣鍵盤的函數,可以得到0~f,和16。
當讀出為16的時候,即是按鍵放手了,可以執行對應的功能程序。

⑽ 如何利用51單片機4*4矩陣鍵盤和1602液晶實現四位(或者多位)的顯示問題

//按4X4鍵盤的F鍵 進入設定狀態
//E D 鍵是前後移動鍵
//C按鍵是調整數值按鍵
#include "reg52.h"
#define uchar unsigned char
sbit RW=P2^1;
sbit RS=P2^0;
sbit E=P2^2;
bit at=0;
uchar code shen[]={"CLOCK!"};
uchar code word[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x20};
uchar dispbuf[8],h,m,s,counter;
void delay()
{
uchar i;
for(i=0;i<255;i++);
}

/*******寫命令**********/
void lcd_wmc(uchar i)
{

P0=i;
RS=0;
RW=0;
E=0;
delay();
E=1;
}

/*******寫數據***********/

void lcd_wmd(uchar i)
{

P0=i;
RS=1;
RW=0;
E=0;
delay();
E=1;
}

/*******初始化液晶*******/
void lcd_init()
{
uchar i;
lcd_wmc(0x01);
lcd_wmc(0x38);
lcd_wmc(0x0c);
lcd_wmc(0x06);
lcd_wmc(0xc9);
for(i=0;i<6;i++)
lcd_wmd(shen[i]);
lcd_wmc(0xc0);
}

/*******更新緩沖區子程序*******/
void newbuf()
{
dispbuf[0]=s%10;
dispbuf[1]=s/10;
dispbuf[3]=m%10;
dispbuf[4]=m/10;
dispbuf[6]=h%10;
dispbuf[7]=h/10;
}

/*******顯示子程序**********/
void disp(uchar dispadd)
{
uchar tmp;
lcd_wmc(dispadd);
tmp=dispbuf[7];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[6];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[5];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[4];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[3];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[2];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[1];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[0];
tmp=word[tmp];
lcd_wmd(tmp);
}

/*********************鍵盤子程序***********************/

uchar keypro(void)
{
uchar scanl,scanh;
P1=0x0f;//先將所有行線拉低
if((P1&0x0f)!=0x0f) //如果列線有變化
{
delay();//延遲一段時間。
if((P1&0x0f)!=0x0f)//如果此時此刻列線還有變化,說明確實有按鍵按下
{
scanl=0xfe;
while((scanl&0x10)!=0)
{
P1=scanl; //給P1口賦掃描碼,每次只拉低一行
if((P1&0xf0)!=0xf0) //如果判斷為真,則說明找到了按鍵按下的行
{
scanh=(P1&0xf0)|0x0f; //計算識別碼
return (~scanh)+(~scanl);
}
else scanl=(scanl<<1)|0x01; //否則依次將第二,第三,第四行拉低

}
}
}
return 0;//沒有按鍵 按下 返回0
}

/********************時間調整子程序********************/
void adjustime()
{
uchar k;
static uchar add;
k=keypro();
switch(k)
{
case 0x88: if(!at){add=0xc1;EA=0;lcd_wmc(0xc1);lcd_wmc(0x0f);at=1;}
else {lcd_wmc(0xc0);lcd_wmc(0x0c);at=0;EA=1;} break;

case 0x48: if(at)
{
if(add==0xc1){add=0xc7; lcd_wmc(add);}
else {add=add-3;lcd_wmc(add);}
}
break;

case 0x28: if(at)
{
if(add==0xc7) {add=0xc1;lcd_wmc(add);}
else {add=add+3;lcd_wmc(add);}
}
break;

case 0x18: if(at)
{
if(add==0xc1) h++;
if(h==24)
h=0;
if(add==0xc4) m++;
if(m==60)
m=0;
if(add==0xc7) s++;
if(s==60)
s=0;
newbuf();
disp(0xc0);
lcd_wmc(add);
}
break;
default: break;
}
if(k!=0)
{
while((P1&0xf0)!=0xf0)
P1=0xf0;
}

}

/*********************初始化子程序**********************/
void init()
{

TMOD=0x01;
TH0=0x4c;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
counter=0;
h=12;m=0;s=0;
dispbuf[2]=10;
dispbuf[5]=10;
}

/***************************主程序************************/

void main(void)
{
init();
lcd_init();

while(1)
{
adjustime();
if(!at)
{
//閃爍
if(counter<10)
{
dispbuf[2]=10;
dispbuf[5]=10;
}
else
{
dispbuf[2]=11;
dispbuf[5]=11;
}
//更新顯示緩沖區及調用顯示程序
if(counter==0)
{
newbuf();
disp(0xc0);
}
else if(counter==10)
disp(0xc0);
}
}
}

/*************************定時器0的中斷**********************/
void Time0() interrupt 1 using 2 //再次強調中斷子程序執行時間越短越好
{
TH0=(65536-46075)/256;
TL0=(65536-46075)%256;
counter++;
if(counter==20)
{
s++;
counter=0;
if(s==60)
{
m++;
s=0;
if(m==60)
{
h++;
m=0;
if(h==24)
h=0;
}
}

}
}
這是一個數字時鍾的程序,用矩陣鍵盤調時

閱讀全文

與51單片機44鍵盤相關的資料

熱點內容
java代碼快速 瀏覽:239
單片機左移右移後是補1還是0 瀏覽:595
湛江一號命令 瀏覽:333
導出命令行 瀏覽:274
C和php交互 瀏覽:600
蘋果手機里的通訊錄如何導入安卓手機 瀏覽:170
怎麼在京東app裡面看自己會員等級 瀏覽:43
emerson伺服器怎麼短接啟動 瀏覽:559
工控編程人員工資 瀏覽:397
速成義大利語pdf 瀏覽:250
連續加減乘除法的演算法 瀏覽:652
用mfc編程實現dda演算法 瀏覽:42
linux命令打開應用 瀏覽:146
改造後的程序員 瀏覽:270
數控編程變數 瀏覽:785
江門哪裡有plc編程系統 瀏覽:378
安卓手機如何下載外服b站 瀏覽:700
pythonetree庫 瀏覽:759
數據插值演算法 瀏覽:725
澳大利亞加密貨幣逃稅 瀏覽:484