//------------------------------------------------------------- //矩阵键盘十六按键电子琴源程序.C //硬件说明:51Hei单片机开发板,12M晶振 //编写人:胡琴 //网站:http://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; } }