導航:首頁 > 操作系統 > 單片機獨立鍵盤

單片機獨立鍵盤

發布時間:2022-04-27 08:48:14

㈠ 獨立式按鍵的工作原理

獨立按鍵式直接用I/O口線構成的單個按鍵電路,其特點式每個按鍵單獨佔用一根I/O口線,每個按鍵的工作不會影響其他I/O口線的狀態。獨立式按鍵電路配置靈活,軟體結構簡單,但每個按鍵必須佔用一個I/O口線,因此,在按鍵較多時,I/O口線浪費較大,不宜採用。

獨立按鍵的軟體常採用查詢式結構。先逐位查詢沒跟I/O口線的輸入狀態,如某一根I/O口線輸入為低電平,則可確認該I/O口線所對應的按鍵已按下,然後,再轉向該鍵的功能處理程序。

獨立鍵盤理想的波形是按下去時保持低電平,實際上在上升沿和下降沿的過程中(即按鍵和離鍵時的一段微小時間)會出現抖動。消抖的方法有兩種,一種是通過硬體:在電路上連個電容;另一種是軟體消抖,根據經驗增加10ms的延時。

(1)單片機獨立鍵盤擴展閱讀:

按鍵分類與輸入原理:

按鍵按照結構原理科分為兩類,一類是觸點式開關按鍵,如機械式開關、導電橡膠式開關燈;另一類是無觸點式開關按鍵,如電氣式按鍵,磁感應按鍵等。前者造價低,後者壽命長。目前,微機系統中最常見的是觸點式開關按鍵。

在單片機應用系統中,除了復位按鍵有專門的復位電路及專一的復位功能外,其他按鍵都是以開關狀態來設置控制功能或輸入數據的。當所設置的功能鍵或數字鍵按下時,計算機應用系統應完成該按鍵所設定的功能,鍵信息輸入時與軟體結構密切相關的過程。

對於一組鍵或一個鍵盤,總有一個介面電路與CPU相連。CPU可以採用查詢或中斷方式了解有無將按鍵輸入,並檢查是哪一個按鍵按下,將該鍵號送人累加器,然後通過跳轉指令轉入執行該鍵的功能程序,執行完成後再返回主程序。




㈡ 單片機的獨立按鍵

#include<reg51.h> // 4*4 按鍵+數碼管模擬,可以參考。

#define uchar unsigned char

uchar temp;

int key1,key,disbuf;// 此表為 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f

unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

unsigned char ledx[8];

bit s0,s1;

void delay(uchar z)

{

uchar i,j;

for(i=0;i<120;i++)

for(j=0;j<z;j++);

}

void scan() //要是按鍵了,掃描鍵盤編碼值

{

P1=0xF0;

delay(1);

temp=P1;

switch(temp)

{

case 0xe0: key1=0;

break;

case 0xd0: key1=1;

break;

case 0xb0: key1=2;

break;

case 0x70: key1=3;

break;

}

P1=0x0f;

delay(1);

temp=P1;

switch(temp)

{

case 0x0E: key=key1+0;

break;

case 0x0D: key=key1+4;

break;

case 0x0B: key=key1+8;

break;

case 0x07: key=key1+12;

break;

default : key=-1;

}

if((key1+1)&&(key+1)) disbuf=key;

}

void ejjc() //判斷是否按鍵

{

P1=0xF0;

if(P1!=0xF0) { scan();s0=1;}

else { s0=0; s1=1;}

}

void main()

{

uchar i;

while(1)

{

ejjc();

if(s0==1 && s1==1)

{

s0=0;s1=0;

for(i=0;i<8;i++)

{ ledx[i]=ledx[i+1]; ledx[8]=disbuf; }

}

P0=0xff;

P2=LED7Code[ledx[0]];

P0=0xfe;

delay(5);

P0=0xff;

P2=LED7Code[ledx[1]];

P0=0xfd;

delay(5);

P0=0xff;

P2=LED7Code[ledx[2]];

P0=0xfb;

delay(5);

P0=0xff;

P2=LED7Code[ledx[3]];

P0=0xf7;

delay(5);

P0=0xff;

P2=LED7Code[ledx[4]];

P0=0xef;

delay(5);

P0=0xff;

P2=LED7Code[ledx[5]];

P0=0xdf;

delay(5);

P0=0xff;

P2=LED7Code[ledx[6]];

P0=0xbf;

delay(5);

P0=0xff;

P2=LED7Code[ledx[7]];

P0=0x7f;

delay(5);

}

}

㈢ 單片機中獨立鍵盤和矩陣鍵盤如何一起使用 請用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();
}
}

㈣ 單片機獨立鍵盤輸入數碼管顯示 使用獨立鍵盤輸入,實現按鍵復用,並在數碼管上顯示。

這個就兩個功能,一個是鍵盤掃描,二是數碼管顯示,這樣的程序網上一大把,
按鍵程序
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar pre_peyno=16;keyno=16;
void delayms(int x)
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
void ked_scan()
{
uchar m;
P2=0x0f;
if(P2&0x0f!=0x0f)
delayms(2);
if(P2&0x0f!=0x0f)
m=P2^0x0f;
switch(m)
{
case1:keyno=0;break;
case2:keyno=1;break;
case4:keyno=2;break;
case8:keyno=3;break;
default:keyno=16;
}
P2=0xf0;
delayms(1);
m=P2>>4^0x0f;
m=m+10;
switch(m)
{
case1:keyno=0;break;
case2:keyno=4;break;
case4:keyno=8;break;
case8:keyno=12;break;
}
}
main()
{
P2=0xff;
while(1)
{
uchar i;
switch(keyno)
{
case0:P2=0x00;break;
case1:P2=0xfe;for(i=0;i<7;i++){P2=_crol_(P2,1);delayms(150);}break;
case2:P2=0x7f;for(i=0;i<7;i++)P2=_cror_(p2,1);delayms(150);}break;
case16:P2=0xff;break;
}
}

數碼管程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit la=P2^7;
sbit wela=P2^6;
unsigned char code num[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

#define uint unsigned int

void delay(uint x)
{
while(x--);
}

void main()
{
while(1)
{

P0=0xfe;
wela=1;
wela=0;
P0=num[1];
la=1;
la=0;
delay(1000);

P0=0xfd;
wela=1;
wela=0;
P0=num[2];
la=1;
la=0;
delay(1000);

}
}
以上兩個程序是參考程序,不過還得根據自己的實際電路改改,不能直接運用。

閱讀全文

與單片機獨立鍵盤相關的資料

熱點內容
java多類繼承 瀏覽:157
怎麼用多玩我的世界連接伺服器地址 瀏覽:481
為什麼華為手機比安卓流暢 瀏覽:175
javamap多線程 瀏覽:226
卡西歐app怎麼改時間 瀏覽:841
jquery壓縮圖片 瀏覽:970
用紙筒做解壓東西 瀏覽:236
神奇寶貝伺服器如何tp 瀏覽:242
雲伺服器支持退貨嗎 瀏覽:277
貸款等額本息演算法 瀏覽:188
根伺服器地址配置 瀏覽:499
單片機是軟體還是硬體 瀏覽:624
vivo手機怎麼看編譯編號 瀏覽:320
塑鋼扣條演算法 瀏覽:301
linux應用程序安裝 瀏覽:414
linux怎麼查找命令 瀏覽:431
安卓12原生和非原生是什麼意思 瀏覽:277
四川廣電怎麼安裝app 瀏覽:6
大話西遊伺服器是什麼意思 瀏覽:775
誇克解壓壓縮文件 瀏覽:915