要求:
(1)创建KeilC工程,编写代码捕捉开发板上矩阵键盘的按键动作,可准确分辨同行或同列中不同的键值;
(2)编写代码,准确分辨4行4列中不同的键值;
(3)编写代码,在捕捉键值的基础上添加防抖动处理以及屏蔽多键按下等误操作;
(4)发挥创意,使键盘配合定时器驱动蜂鸣器,实现简易音乐弹奏功能。
#include <REGX52.H>
sbit Buzzer=P2^5;
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void de(unsigned short p)
{
while(p--);
}
unsigned char MatrixKey()
{
unsigned char KeyNumber=0;
P1=0xFF;
P1_3=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
P1=0xFF;
P1_2=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
P1=0xFF;
P1_1=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
P1=0xFF;
P1_0=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
return KeyNumber;
}
unsigned char Keyn()
{
unsigned char Ke=0;
if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);Ke=1;}
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);Ke=2;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);Ke=3;}
if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);Ke=4;}
return Ke;
}
unsigned char KeyNum,key,k;
unsigned char tone[10]={0,0,0,0,0,0,0,0,0,0};
void sound()
{
unsigned short i=220;
unsigned short t;
if(KeyNum==1)
{
KeyNum=0;
tone[t]=191;
t++;
while(i--)
{
Buzzer=~Buzzer;
de(191);
}
}
if(KeyNum==2)
{
KeyNum=0;
tone[t]=170;
t++;
while(i--)
{
Buzzer=~Buzzer;
de(170);
}
}
if(KeyNum==3)
{
KeyNum=0;
tone[t]=152;
t++;
while(i--)
{
Buzzer=~Buzzer;
de(152);
}
}
if(KeyNum==4)
{
KeyNum=0;
tone[t]=143;
t++;
while(i--)
{
Buzzer=~Buzzer;
de(143);
}
}
if(KeyNum==5)
{
KeyNum=0;
tone[t]=128;
t++;
while(i--)
{
Buzzer=~Buzzer;
de(128);
}
}
if(KeyNum==6)
{
KeyNum=0;
tone[t]=114;
t++;
while(i--)
{
Buzzer=~Buzzer;
de(114);
}
}
if(KeyNum==7)
{
KeyNum=0;
tone[t]=101;
t++;
while(i--)
{
Buzzer=~Buzzer;
de(101);
}
}
if(key==1)
{
for (k=0;k<10;k++)
{
while(i--)
{
Buzzer=~Buzzer;
de(tone[k]);
}
i=220;
Delay(100);
}
}
if(key==3)
{
t=0;
}
}
void main()
{
unsigned short i=220;
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
PT0=0;
while(1)
{
if(key==2)
{
while(i--)
{
Buzzer=~Buzzer;
de(191);
}
}
}
}
void Timer0_Routine() interrupt 1
{
KeyNum=MatrixKey();
key=Keyn();
/*取对应频率值的重装载值到定时器*/
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
sound();
}