單片機(jī)學(xué)習(xí)——矩陣鍵盤(自用)
原理及思路:
對(duì)于矩陣鍵盤,我們只能逐行掃描,然后讀取列的信號(hào)。
例如一個(gè)4x4的矩陣,應(yīng)對(duì)每一行分別賦0,然后掃描列的信號(hào),加入某一列中出現(xiàn)0,則為對(duì)應(yīng)行列的鍵盤被按下。此時(shí),應(yīng)定義一個(gè)全局變量,給矩陣行列上的每一個(gè)按鍵賦予一個(gè)獨(dú)立的號(hào)碼,當(dāng)掃描到某一行某一列的動(dòng)作后,把對(duì)應(yīng)的編號(hào)輸出,我們就知道哪個(gè)按鍵觸發(fā)了。
軟件部分:
#include "reg52.h"
unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x80,
0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
unsigned char key_num;
sfr P4=0xc0; //52單片機(jī)無P4位,則需定義P4的地址
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
sbit C4=P3^4;
sbit C3=P3^4;
sbit C2=P4^2;
sbit C1=P4^4;//分別定義C1-C4、R1-R4端的端口
void selectHC573(unsigned char n)
{
?switch(n)
?{
?case 4:
?P2=(P2&0x1f)|0x80;
?break;
?case 5:
?P2=(P2&0x1f)|0xa0;
?break;
?case 6:
?P2=(P2&0x1f)|0xc0;
?break;
?case 7:
?P2=(P2&0x1f)|0xe0;
?break;
}
}//通過138譯碼器選擇需要使用的寄存器
void displaykeynum(unsigned char value)
{
?selectHC573(6);
?P0=0x01;
?selectHC573(7);
?P0=value;
}
void scankey()
{
?R1=0;//掃描第一行
?R2=R3=R4=1;
?C1=C2=C3=C4=1;
?if(C1==0)//分別對(duì)第一行的第一二三四列進(jìn)行掃描
?{
?while(C1==0);
?key_num=0;//若c1為0則代表按下的鍵為C1R1,輸出代表C1R1的0值
?displaykeynum(SMG_duanma[key_num]);
?}
?else if(C2==0)
?{
?while(C2==0);
?key_num=1;
?displaykeynum(SMG_duanma[key_num]);
?}
?if(C3==0)
?{
?while(C3==0);
?key_num=2;
?displaykeynum(SMG_duanma[key_num]);
?}
?if(C4==0)
?{
?while(C4==0);
?key_num=3;
?displaykeynum(SMG_duanma[key_num]);
?}?
?R2=0;
?R1=R3=R4=1;
?C1=C2=C3=C4=1;
?if(C1==0)
?{
?while(C1==0);
?key_num=4;
?displaykeynum(SMG_duanma[key_num]);
?}
?else if(C2==0)
?{
?while(C2==0);
?key_num=5;
?displaykeynum(SMG_duanma[key_num]);
?}
?if(C3==0)
?{
?while(C3==0);
?key_num=6;
?displaykeynum(SMG_duanma[key_num]);
?}
?if(C4==0)
?{
?while(C4==0);
?key_num=7;
?displaykeynum(SMG_duanma[key_num]);
?}
?R3=0;
?R2=R1=R4=1;
?C1=C2=C3=C4=1;
?if(C1==0)
?{
?while(C1==0);
?key_num=8;
?displaykeynum(SMG_duanma[key_num]);
?}
?else if(C2==0)
?{
?while(C2==0);
?key_num=9;
?displaykeynum(SMG_duanma[key_num]);
?}
?if(C3==0)
?{
?while(C3==0);
?key_num=10;
?displaykeynum(SMG_duanma[key_num]);
?}
?if(C4==0)
?{
?while(C4==0);
?key_num=11;
?displaykeynum(SMG_duanma[key_num]);
?}
?R4=0;
?R2=R3=R1=1;
?C1=C2=C3=C4=1;
?if(C1==0)
?{
?while(C1==0);
?key_num=12;
?displaykeynum(SMG_duanma[key_num]);
?}
?else if(C2==0)
?{
?while(C2==0);
?key_num=13;
?displaykeynum(SMG_duanma[key_num]);
?}
?if(C3==0)
?{
?while(C3==0);
?key_num=14;
?displaykeynum(SMG_duanma[key_num]);
?}
?if(C4==0)
?{
?while(C4==0);
?key_num=15;
?displaykeynum(SMG_duanma[key_num]);
?}
}
void main()
{
while(1)
{
?scankey();
}
}
懂完了