8051單片機(jī)串行口擴(kuò)展矩陣鍵盤接口與應(yīng)用
由于8051的串行口在方式0工作狀態(tài)下,可以方便地通過移位寄存器74LS164擴(kuò)展并行輸出口。因此,可以將這些并行口線作為列線,與P3口的行線構(gòu)成行列式鍵盤。每占用一條P3口線可增加8個(gè)按鍵,用戶根據(jù)需要可增減。在8051的串行口方式0工作狀態(tài)下,結(jié)合P3.4和P3.5實(shí)現(xiàn)2*8鍵盤。如圖所示。
C51軟件設(shè)計(jì):
#include<stdio.h> //預(yù)處理
#include<reg51.h>
#include<intrins.h>
unsigned char getkey(void); //鍵盤掃描函數(shù)
void proc1(void); //定義按鍵處理程序1
void proc2(void); //定義按鍵處理程序2
void proc3(void); //定義按鍵處理程序3
void proc4(void); //定義按鍵處理程序4
……
bit0=P3.4;
bit1=P3.5;
void delay(void); //定義延時(shí)函數(shù)
void main(void) //主函數(shù)
{
unsigned char idata key;
SCON=0x00; //串口初始化
ES=0;
EA=0; //關(guān)閉中斷
while(1)
{
key=getkey();
if(key!=0xff)
switch (key)
{
case 0x00:
proc0();
braek;
case 0x01:
proc1();
braek;
case 0x02:
proc2();
braek;
case 0x03:
proc3();
braek;
……
……
……
default:
break;
}
}
}
unsigned char getkey(void) //鍵盤掃描函數(shù)
{
unsigned char idata key_code,col=0; mask=0x00;
TI=0;
SBUF=mask;
while(TI==0);
if((bit0&bit1)!= 0)
return(0xff);
delay();
if((bit0&bit1)!= 0)
return(0xff);
mask=0xfe;
while(col!=8)
{
TI=0;
SBUF=mask;
while(TI==0);
if((bit0&bit1)!= 0)
{
mask=mask<<1;
mask=mask|0x01;
col=col+1;
continue;
}
else break;
}
if(col==8)
return(0xff);
if(bit0==1) key_code=col;
else key_code=8+col;
while(bit0&bit1==0);
return(key_code);
}
void delay(void) /*延時(shí)10毫秒*/
{
unsigned int i=10;
while(i--);
}
編輯:admin 最后修改時(shí)間:2018-05-08