#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 ;
}
}
}
|