#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define output P1 //P1口做输出接口
#define input P1 //P1口做输入接口
unsigned int code Soundtab[] = { 64580,64684,64777,64820,64898,64968,65030,65058,}; //设置T值
uint SoundTemp; //用来存储T值
sbit Sound = P3^7; //扬声器,接P3.7口
void delayms(uint xms) //延时x毫秒
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void T0_INT(void) interrupt 1 //中断程序
{
Sound = ~Sound; //电平取反,发音
TH0 = SoundTemp/256; //除以256
TL0 = SoundTemp; //载入定时半周期的初始值
}
void main()
{
TMOD = 0X01; //定时器T0设置为方式1
EA = 1;
ET0 = 1; //使能 T0 中断
TR0 = 0; //关闭T0定时器
while(1) //循环
{
uint n;
uchar L,H; //临时保存读取的行或者列
output = 0x0f;
L = input; //读取列
if(0x0f != L) //如果按键按下
{
delayms(5); //延时,用于消除抖动
L = input; //再读取列
if(0x0f != L) //说明按键按下
{
L = L & 0x0f; //保留低4位
output = 0xf0; //准备读取行
delayms(1); //延时
H = input; //读取行
H = H & 0xf0; //保留高4位
L = L | H; //将列和行的值合并
}
}
if(L==0xee)
{ //P1=11101110 P1^0与P1^4输入低电平 说明是按键1按下
n=0;
SoundTemp = Soundtab[n]; //读取音调的简谱码T值
TR0 = 1; //启动中断
while(0xf0 != output); //检测按键松开
TR0 = 0;
Sound = 1 ;
}
if(L==0xde)
{ //P1=11011110 P1^0与P1^5输入低电平 说明是按键2按下
n=1;
SoundTemp = Soundtab[n]; //读取音调的简谱码T值
TR0 = 1; //启动中断
while(0xf0 != output); //检测按键松开
TR0 = 0;
Sound = 1 ;
}
if(L==0xbe)
{ //说明是按键3按下
n=2;
SoundTemp = Soundtab[n]; //读取音调的简谱码T值
TR0 = 1; //启动中断
while(0xf0 != output); //检测按键松开
TR0 = 0;
Sound = 1 ;
}
if(L==0x7e)
{ //说明是按键4按下
n=3;
SoundTemp = Soundtab[n]; //读取音调的简谱码T值
TR0 = 1; //启动中断
while(0xf0 != output); //检测按键松开
TR0 = 0;
Sound = 1 ;
}
if(L==0xed)
{ //说明是按键5按下
n=4;
SoundTemp = Soundtab[n]; //读取音调的简谱码T值
TR0 = 1; //启动中断
while(0xf0 != output); //检测按键松开
TR0 = 0;
Sound = 1 ;
}
if(L==0xdd)
{ //说明是按键6按下
n=5;
SoundTemp = Soundtab[n]; //读取音调的简谱码T值
TR0 = 1; //启动中断
while(0xf0 != output); //检测按键松开
TR0 = 0;
Sound = 1 ;
}
if(L==0xbd)
{ //说明是按键7按下
n=6;
SoundTemp = Soundtab[n]; //读取音调的简谱码T值
TR0 = 1; //启动中断
while(0xf0 != output); //检测按键松开
TR0 = 0;
Sound = 1 ;
}
if(L==0x7d)
{ //说明是按键8按下
n=7;
SoundTemp = Soundtab[n]; //读取音调的简谱码T值
TR0 = 1; //启动中断
while(0xf0 != output); //检测按键松开
TR0 = 0;
Sound = 1 ;
}
}
}
|