導航:首頁 > 操作系統 > 單片機鍵盤c語言

單片機鍵盤c語言

發布時間:2023-02-13 06:44:36

Ⅰ 求單片機C語言 鍵盤控制的解釋 求告訴注釋

#include<reg51.h>
//你用的是51系列的單片機,所以加上頭文件

#define uchar unsigned char
#define uint unsigned int

#define SCANPORT P1
//定義鍵盤掃描的埠P1口

uchar uca_LineScan[4]={0xEF,0xDF,0xBF,0x7F};
//我覺得這里有錯,應該是{0xEF,0xDF,0xBF,0x7F},原來是{0xFE,0xFD,0xFB,0xF7}

uchar ucKeyScan() //鍵盤掃描函數,看哪個按鍵按下
{
uchar Temp=0;
uchar ucRow=0,ucLine=0; //定義掃描的行和列

for(ucLine=0;ucLine<4;ucLine++)
{
SCANPORT=uca_LineScan[ucLine];
//把0xEF賦值給P1管腳,其含義是取第一行,掃描哪個按鍵按下了。
Temp=SCANPORT & 0x0F;
//屏蔽高四位管腳(這些管腳是行管腳所在的位置),看這行的哪個按鍵按下
if(Temp!=0x0F) //判斷哪個按鍵,並賦給列ucRow一個值
{
switch(Temp) //簡單,不解釋
{
case 0x0E: ucRow=10;break;
case 0x0D: ucRow=20;break;
case 0x0B: ucRow=30;break;
case 0x07: ucRow=40;break;
default: ucRow=50;break;
}
break;
}
}
//循環四次,就是掃描完四行,外成循環是行,裡面判斷這行里哪列的按鍵按下

SCANPORT=0x0F;

return ucRow+ucLine+1;
//返回哪個按鍵按下。如返回12,則意思是2行1列的按鍵按下
//注意:我說的是函數里的行和列,你給的圖看不清楚連線,所以不一定對應你的行和列

}

void vKeyProcess(unsigned char ucKeyCode)//不同按鍵按下,對應不同的操作
{

switch(ucKeyCode)
{
case 11:P2=0xff;P3=0x7f;break; //'7'
case 12:P2=0xff;P3=0x3f;break; //'8'
case 13:P2=0xff;P3=0x1f;break;
case 14:P2=0xff;P3=0x0f;break;

case 21:P2=0xff;P3=0x07;break; //'4'
case 22:P2=0xff;P3=0x03;break; //'5'
case 23:P2=0xff;P3=0x01;break;
case 24:P2=0xff;P3=0x00;break;

case 31:P3=0x00;P2=0x7f;break; //'1'
case 32:P3=0x00;P2=0x3f;break; //'2'
case 33:P3=0x00;P2=0x1f;break;
case 34:P3=0x00;P2=0x0f;break;

case 41:P3=0x00;P2=0x07;break; //'3'
case 42:P3=0x00;P2=0x03;break;
case 43:P3=0x00;P2=0x01;break; //'0'
case 44:P3=0x00;P2=0x00;break; //'+'

default:break;
}
}
void main()
{
while(1)
{
vKeyProcess(ucKeyScan());
}
}
小弟出道未久,不足之處,還請各位大蝦指教一二

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

Ⅲ 關於單片機c語言4*4小鍵盤程序

借用一下你的程序~
char
keypad_scan()
{
char
key,i;
P2=0xf0;
//定義高四位輸出,低四位輸入
while(P2!=0xf0)

//等待按鍵按下
do
{
for(i=0;i<3;i++)
{
P2=ksp[i];
//掃描出是哪一行(列)
-->但錯了,變成賦值運算了~
if(P2!=ksp[i])
//掃描出是哪一列(行)
-->但錯了~
{
delay();//延時消抖後再判斷該行有無鍵按下
key=P2;
//掃描出按鍵
-->本可以到這里了就可以直接得出按鍵值的~~~~
if(key!=ksp[i])
return
(key);
}
}
}while(1);
//是死循環,退不出來~~~
}
思路很好~~編得有點亂~~~

Ⅳ 求一段51單片機按鍵C語言程序詳解

P1.0、P1.1都控制 LED
試試下面程序:

#include <reg51.h>
sbit led = P1^0;
sbit key = P1^7;
void main()
{
while(1) led = key;
}

P1.1知道用

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

Ⅵ 單片機的鍵盤用C語言怎麼賦值

#i nclude<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define ank P1 //鍵盤到單片機的埠
//DB 50H,1CH,39H,16H,38H,78H,70H,0FEH,0EFH,0FFH;A B, C, D, E, ,F ,P, -, ,. ,COLSE
//DB 01H,0C7H,22H,82H,0C4H,88H,08H,0C3H,00H,80H;帶小數點的字形碼0.,1.,-----9.

uchar code table[]={ //鍵盤編碼"1~F~0"
0xD7,0x32,0x92,0xD4,
0x98,0x18,0xD1,0x10,
0x90,0x50,0x1C,0x39,
0x16,0x38,0x78,0x11};
uchar num,temp,num1;
void delay(uint z) //延時子程序 Zms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan(); //鍵盤函數聲明
void display(uchar aa);//顯示函數聲明
void main() //主函數
{

while(1)
{
display(keyscan());
}
}
void display(uchar aa) //顯示子程序
{
//la=1;
//P0=table[aa-1];
//la=0;
SBUF=table[aa-1];
}
uchar keyscan() //鍵盤掃描程序,取回一個鍵盤號
{
ank=0xfe;
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=ank;
switch(temp)
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=4;
break;
}
while(temp!=0xf0)
{
temp=ank;
temp=temp&0xf0;
}
}
}

ank=0xfd;
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=ank;
switch(temp)
{
case 0xed:num=5;
break;
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8;
break;
}
while(temp!=0xf0)
{
temp=ank;
temp=temp&0xf0;
}
}
}

ank=0xfb;
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=ank;
switch(temp)
{
case 0xeb:num=9;
break;
case 0xdb:num=10;
break;
case 0xbb:num=11;
break;
case 0x7b:num=12;
break;
}
while(temp!=0xf0)
{
temp=ank;
temp=temp&0xf0;
}
}
}

ank=0xf7;
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=ank;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=ank;
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
break;
case 0x77:num=16;
break;
}
while(temp!=0xf0)
{
temp=ank;
temp=temp&0xf0;
}
}
}
return num;
}
這個是取按鍵值的程序,然後具體做什麼,你可以自己做函數。

Ⅶ 單片機鍵盤去抖動c語言程序!!!

使用這個到板子裡面:

Ⅷ 鍵盤 單片機程序C語言

哪有這樣寫的?

你說的也不清楚啊

P3.1串口輸出一個信號給電腦四個鍵帶便「上下左右」,...

這句什麼意思呢?

閱讀全文

與單片機鍵盤c語言相關的資料

熱點內容
解壓文件蘋果手機rar 瀏覽:145
centos開機命令行模式 瀏覽:695
遍歷所有listpython 瀏覽:660
力控加密文件夾 瀏覽:515
如何更改移動伺服器密碼 瀏覽:686
蘋果8p手機加密 瀏覽:749
ipad建文件夾怎麼弄 瀏覽:833
iphone13對wap3加密 瀏覽:555
pdf文件打開失敗 瀏覽:913
dubbo怎麼調用不同伺服器介面 瀏覽:40
全能解壓王app歷史版本 瀏覽:75
優先隊列與拓撲排序演算法 瀏覽:281
pdf轉換formacbook 瀏覽:871
pdf文件內容怎麼編輯 瀏覽:48
134壓縮機排氣溫度多少 瀏覽:256
unity等待編譯後 瀏覽:806
黑鯊手機鎖屏視頻在哪個文件夾 瀏覽:781
wow地圖解壓後怎麼壓縮 瀏覽:823
有pdf卻打不開 瀏覽:462
七星彩軟體app怎麼下載 瀏覽:219