//-------------------------------------------------------------
//矩阵键盘十六按键电子琴源程序.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;
}
}