Ⅰ 求單片機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語言程序!!!
使用這個到板子裡面:
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit KEY3 = P2^6;
sbit KEY4 = P2^7;
unsigned char code LedChar[] = { //數碼管顯示字元轉換表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
void delay();
void main(){
bit keybuf = 1; //按鍵值暫存,臨時保存按鍵的掃描值
bit backup = 1; //按鍵值備份,保存前一次的掃描值
unsigned char cnt = 0; //按鍵計數,記錄按鍵按下的次數
ENLED = 0; //選擇數碼管 DS1 進行顯示
ADDR3 = 1;
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0;
P2 = 0xF7; //P2.3 置 0,即 KeyOut1 輸出低電平
P0 = LedChar[cnt]; //顯示按鍵次數初值
while (1){
keybuf = KEY4; //把當前掃描值暫存
if (keybuf != backup){ //當前值與前次值不相等說明此時按鍵有動作
delay(); //延時大約 10ms
if (keybuf == KEY4){ //判斷掃描值有沒有發生改變,即按鍵抖動
if (backup == 0){ //如果前次值為 0,則說明當前是彈起動作
cnt++; //按鍵次數+1
//只用 1 個數碼管顯示,所以加到 10 就清零重新開始
if (cnt >= 10){
cnt = 0;
}
P0 = LedChar[cnt]; //計數值顯示到數碼管上
}
backup = keybuf; //更新備份為當前值,以備進行下次比較
}
}
}
}
/* 軟體延時函數,延時約 10ms */
void delay(){
unsigned int i = 1000;
while (i--);
}
Ⅷ 鍵盤 單片機程序C語言
哪有這樣寫的?
你說的也不清楚啊
P3.1串口輸出一個信號給電腦四個鍵帶便「上下左右」,...
這句什麼意思呢?