//------------------------------------------------------------- //矩陣鍵盤十六按鍵電子琴源程序.C //硬件說明:51Hei單片機開發板,12M晶振 //編寫人:胡琴 //網站:https://www.51hei.com //編寫日期:2010.01.17 //修改日誌:2010.01.18 加顯示功能 //------------------------------------------------------------- #include <AT89X51.H> //包含頭文件 #define uchar unsigned char //宏定義 #define uint unsigned int //宏定義 uint a,b; //定義全局變量 sbit k1=P3^0; //按鍵 sbit k2=P3^1; //按鍵 sbit k3=P3^2; //按鍵 sbit k4=P3^3; //按鍵 sbit yy=P2^2; //音頻輸出引腳 sbit leds=P1^4; //==============行列式鍵盤掃描子程序============================ void kk(void) { P3=0xf0; if(P3!=0xf0) { P3=0xef; loop1:if(!k1){a=0xfb,b=0x04;TR0=1;P0=0x3f;if(!k1){goto loop1;}} else TR0=0;yy=1; P0=0x00; loop2:if(!k2){a=0xfb;b=0x90;TR0=1;P0=0x06;if(!k2){goto loop2;}} else TR0=0;yy=1; P0=0x00; loop3:if(!k3){a=0xfc;b=0x0c;TR0=1;P0=0x5b;if(!k3){goto loop3;}} else TR0=0;yy=1; P0=0x00; loop4:if(!k4){a=0xfc;b=0x44;TR0=1;P0=0x4f;if(!k4){goto loop4;}} else TR0=0;yy=1; P0=0x00; P3=0xdf;yy=1; P0=0x00; loop5:if(!k1){a=0xfc;b=0xac;TR0=1;P0=0x66;if(!k1){goto loop5;}} else TR0=0;yy=1; P0=0x00; loop6:if(!k2){a=0xfd;b=0x09;TR0=1;P0=0x6d;if(!k2){goto loop6;}} else TR0=0;yy=1; P0=0x00; loop7:if(!k3){a=0xfd;b=0x34;TR0=1;P0=0x7d;if(!k3){goto loop7;}} else TR0=0;yy=1; P0=0x00; loop8:if(!k4){a=0xfd;b=0x82;TR0=1;P0=0x07;if(!k4){goto loop8;}} else TR0=0;yy=1; P0=0x00; P3=0xbf; loop9:if(!k1){a=0xfd;b=0xc8;TR0=1;P0=0x7f;if(!k1){goto loop9;}} else TR0=0;yy=1; P0=0x00; loop10:if(!k2){a=0xfe;b=0x06;TR0=1;P0=0x6f;if(!k2){goto loop10;}} else TR0=0;yy=1; P0=0x00; loop11:if(!k3){a=0xfe;b=0x22;TR0=1;P0=0x77;if(!k3){goto loop11;}} else TR0=0;yy=1; P0=0x00; loop12:if(!k4){a=0xfe;b=0x57;TR0=1;P0=0x7c;if(!k4){goto loop12;}} else TR0=0;yy=1; P0=0x00; P3=0x7f; loop13:if(!k1){a=0xfe;b=0x85;TR0=1;P0=0x39;if(!k1){goto loop13;}} else TR0=0;yy=1; P0=0x00; loop14:if(!k2){a=0xfe;b=0x9a;TR0=1;P0=0x5e;if(!k2){goto loop14;}} else TR0=0;yy=1; P0=0x00; loop15:if(!k3){a=0xfe;b=0xc1;TR0=1;P0=0x79;if(!k3){goto loop15;}} else TR0=0;yy=1; P0=0x00; loop16:if(!k4){a=0xfe;b=0xe4;TR0=1;P0=0x71;if(!k4){goto loop16;}} else TR0=0;yy=1; P0=0x00; } } //======初始化=========================================== void init(void) { TMOD=0x01; TH0=0x3c; TL0=0xb0; ET0=1; TR0=0; EA=1; } //========定時器T0中斷服務子程序========================= void time0(void) interrupt 1 { TH0=a; TL0=b; yy=~yy; } //=======主函數======================================== void main() { P2=0x35; //鎖存2個74hc573,防止數碼管點陣點亮. leds=1; //打開led太耗電了 所以關閉了 init(); yy=1; while(1) { kk(); TR0=0; } }