📄 dianziqin.c
字号:
#include "reg52.h"
#include <stdio.h>
#include <absacc.h>
#include <math.h>
sbit P2_7 = P2^7;
unsigned char STH0;
unsigned char STL0;
/* 音符与计数值对应表 */
unsigned int code tab[]={64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178};
/*主程序 */
void main()
{
unsigned char key,k;
unsigned char i,j;
unsigned char get(void);
TMOD = 0x01;
EA = 1;
ET0 = 1;
while(1)
{
P1 = 0xf0;
if ((P1&0xf0)!=0xf0) // 有键按下
{
for(i=50;i>0;i--) // 去抖动
for(j=200;j>0;j--)
;
if ((P1&0xf0)!=0xf0) // 确定键盘有按下
{
key = get(); // 调用键盘扫描函数
switch(key)
{
case 0x41: //第 1行第3列 低5 SO 392HZ
k = 2;
break;
case 0x81: //第 1行第4列 低6 LA 440HZ
k = 3;
break;
case 0x12: // 第2行第1列 低7 SI 494HZ
k = 4;
break;
case 0x22: // 第2行第2列 中1 DO 523HZ
k = 5;
break;
case 0x42: // 第2行第3列 中2 RE 587HZ
k = 6;
break;
case 0x82: // 第2行第4列 中3 MI 659HZ
k = 7;
break;
case 0x14: // 第3行第1列 中4FA 698HZ
k = 8;
break;
case 0x24: // 第3行第2列 中5 SO 784HZ
k = 9;
break;
case 0x44: // 第3行第3列 中6 LA 880HZ
k = 10;
break;
case 0x84: // 第3行第4列 中7 SI 988HZ
k = 11;
break;
case 0x18: // 第4行第1列 高1 DO 1046HZ
k = 12;
break;
case 0x28: // 第4行第2列 高2 RE 1175HZ
k = 13;
break;
case 0x48: // 第4行第3列 高3 MI 1318HZ
k = 14;
break;
case 0x88: // 第4行第4列 高4 FA 1397HZ
k = 15;
break;
default:
break;
}
P2_7 = ~P2_7;
/* 由k值设定计数器1的计数初值 */
STH0 = tab[k]/256;
STL0 = tab[k]%256;
TR0 = 1;
P1 = 0xf0;
while ((P1&0xf0)!=0xf0)
{
P1 = 0xf0;
}
TR1 = 0;
}
}
}
}
/* 定时器0中断服务子程序 */
void time0(void) interrupt 1
{
/* 设置计数初值 */
TH0 = STH0;
TL0 = STL0;
P2_7=~P2_7;
}
/* 键扫描子程序 */
unsigned char get(void)
{
unsigned char scan,temp;
if ((P1&0xf0)==0xf0)
return(0);
scan = 0xfe;
while((scan&0x10)!=0)
{
P1 = scan;
if ((P1&0xf0)!=0xf0)
{
temp = (P1&0xf0)|0x0f;
return((~scan)+(~temp));
}
else scan = (scan<<1)|0x01;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -