//本程序用于pic單片機外接鍵盤的識別,通過編程,使按下K1鍵時第一個數碼管顯示1,按下K2鍵時第一 //個數碼管上顯示2,按下K3鍵時第一個數碼管上顯示3,按下K4鍵時第一個數碼管上顯示4, //對鍵盤的掃描采用查詢方式。
#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口設置為輸出*/ TRISB=0XF0; /*RB1輸出,RB4輸入*/ TRISC=0x00; /*SDO引腳為輸出,SCK引腳為輸出*/ TRISE=0x00; /*E口設置為輸出*/ INTCON=0x00; /*關閉所有中斷*/ SSPCON1=0x30; /*SSPEN=1;CKP=1,FOSC/4*/ SSPSTAT=0xC0; /*時鐘下降沿發送數據*/ PIR1=0; /*清除SSPIF標志*/ }
/*軟件延時子程序*/ void DELAY() { for(i = 6553; --i ;) continue; }
/*鍵盤掃描子程序*/ 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(); /*軟件延時*/ if (PORTBbits.RB4==0) KEYSERVE(); /*如果仍有鍵按下,則調用鍵服務子程序*/ else j=0x00; /*如果為干擾,則令返回值為0*/ return(j); } /*鍵服務子程序*/ int KEYSERVE() { PORTBbits.RB1=0; /*K1,K2置低電平,K3,K4置高電平*/ PORTAbits.RA3=0; /*RB4為0,表示按鍵為K1,K2中的一個*/ PORTE=3; /*RB4為1,表示按鍵為K3,K4中的一個*/ 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; /*為了防止一次按鍵多次識別,等鍵松開才返回*/ } return(j); }
/*顯示子程序*/ void SPILED(char data) { PORTAbits.RA5=0; /*LACK送低電平,為鎖存做準備*/ SSPBUF=data; /*啟動發送*/ do { ; }while(PIR1bits.SSPIF==0); /*等待發送完畢*/ PIR1bits.SSPIF=0; /*清除SSPIF標志*/ PORTAbits.RA5=1; /*最后給鎖存信號,代表顯示任務完成*/ }
/*鍵盤掃描查詢方式輸入主程序*/ main() { initial(); /*系統初始化*/ while(1) { KEYSCAN(); if(j!=0) /*如果j=0,證明先前的按鍵為干擾,則不予顯示*/ { data=table[j]; SPILED(data); /*發送顯示段碼顯示*/ } } }
|