//本程序用于pic單片機(jī)外接鍵盤(pán)的識(shí)別,通過(guò)編程,使按下K1鍵時(shí)第一個(gè)數(shù)碼管顯示1,按下K2鍵時(shí)第一
//個(gè)數(shù)碼管上顯示2,按下K3鍵時(shí)第一個(gè)數(shù)碼管上顯示3,按下K4鍵時(shí)第一個(gè)數(shù)碼管上顯示4,
//程序由http://www.zg4o1577.cn 提供,有問(wèn)題請(qǐng)聯(lián)系單片機(jī)網(wǎng)。
//對(duì)鍵盤(pán)的掃描采用查詢(xún)方式。
#include "p18f458.h"
static volatile int table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
volatile unsigned char data;
unsigned int i;
unsigned char j=0;
/*初始化子程序*/
void initial()
{
TRISA=0x00; /*A口設(shè)置為輸出*/
TRISB=0XF0; /*RB1輸出,RB4輸入*/
TRISC=0x00; /*SDO引腳為輸出,SCK引腳為輸出*/
TRISE=0x00; /*E口設(shè)置為輸出*/
INTCON=0x00; /*關(guān)閉所有中斷*/
SSPCON1=0x30; /*SSPEN=1;CKP=1,F(xiàn)OSC/4*/
SSPSTAT=0xC0; /*時(shí)鐘下降沿發(fā)送數(shù)據(jù)*/
PIR1=0; /*清除SSPIF標(biāo)志*/
}
/*軟件延時(shí)子程序*/
void DELAY()
{
for(i = 6553; --i ;)
continue;
}
/*鍵盤(pán)掃描子程序*/
int KEYSCAN()
{
PORTBbits.RB1=0;
PORTAbits.RA3=0;
PORTE=0; /*將K1,K2,K3,K4四條列線置0*/
while(1)
{
if (PORTBbits.RB4==0)
break;
} /*等待有鍵按下,RB4為0表示有鍵按下*/
DELAY(); /*軟件延時(shí)*/
if (PORTBbits.RB4==0)
KEYSERVE(); /*如果仍有鍵按下,則調(diào)用鍵服務(wù)子程序*/
else j=0x00; /*如果為干擾,則令返回值為0*/
return(j);
}
/*鍵服務(wù)子程序*/
int KEYSERVE()
{
PORTBbits.RB1=0; /*K1,K2置低電平,K3,K4置高電平*/
PORTAbits.RA3=0; /*RB4為0,表示按鍵為K1,K2中的一個(gè)*/
PORTE=3; /*RB4為1,表示按鍵為K3,K4中的一個(gè)*/
if(PORTBbits.RB4==0)
{
PORTBbits.RB1=0; /*K1置低電平,K2置高電平*/
PORTAbits.RA3=1; /*RB4為0,表示按鍵為K1;RB4為1,表示按鍵為K2*/
if(PORTBbits.RB4==0) j=0X01;
else {j=0X02; PORTAbits.RA3=0;}
}
else
{
PORTEbits.RE0=0; /*K3置低電平,K4置高電平*/
PORTEbits.RE1=1; /*RB4為0,表示按鍵為K3;RB4為1,表示按鍵為K4*/
if(PORTBbits.RB4==0) j=0X03;
else {j=0X04; PORTEbits.RE1=0;}
}
while(1)
{
if(PORTBbits.RB4==1) break; /*為了防止一次按鍵多次識(shí)別,等鍵松開(kāi)才返回*/
}
return(j);
}
/*顯示子程序*/
void SPILED(char data)
{
PORTAbits.RA5=0; /*LACK送低電平,為鎖存做準(zhǔn)備*/
SSPBUF=data; /*啟動(dòng)發(fā)送*/
do
{
;
}while(PIR1bits.SSPIF==0); /*等待發(fā)送完畢*/
PIR1bits.SSPIF=0; /*清除SSPIF標(biāo)志*/
PORTAbits.RA5=1; /*最后給鎖存信號(hào),代表顯示任務(wù)完成*/
}
/*鍵盤(pán)掃描查詢(xún)方式輸入主程序*/
main()
{
initial(); /*系統(tǒng)初始化*/
while(1)
{
KEYSCAN();
if(j!=0) /*如果j=0,證明先前的按鍵為干擾,則不予顯示*/
{
data=table[j];
SPILED(data); /*發(fā)送顯示段碼顯示*/
}
}
}