📄 a18.c
字号:
// “验证式” 实验十八 电子琴
#include <reg51.h>
#define MODE 0x03
xdata unsigned char CAddr _at_ 0xe100; // 命令控制口
xdata unsigned char OUTBIT _at_ 0xe101; // 位控制口
xdata unsigned char IN _at_ 0xe103; // 键盘读入口
code unsigned char KeyTable[] = {
0X00, 0X01, 0X04, 0X07,
0X0f, 0X02, 0X05, 0X08,
0X0e, 0X03, 0X06, 0X09,
0X0d, 0X0c, 0X0b, 0X0a,
0X10, 0X10, 0X10, 0X10,
0X10, 0X10, 0X10, 0X10,
};
unsigned char TestKey()
{
OUTBIT = 0;
return (~IN & 0x0f);
}
unsigned char GetKey()
{
unsigned char Pos;
unsigned char i;
unsigned char j;
unsigned char k;
i = 6;
Pos = 0x20;
do {
OUTBIT = ~ Pos;
Pos >>= 1;
k = ~IN & 0x0f;
} while ((--i != 0) && (k == 0));
if (k != 0) {
i *= 4;
if (k & 2)
i += 1;
else if (k & 4)
i += 2;
else if (k & 8)
i += 3;
OUTBIT = 0;
return(KeyTable[i]);
} else return(0xff);
}
/* ================================================================================ */
code unsigned int ToneTable[7] = {
64578, 64686, 64778, 64821, 64898, 64968, 65029
};
unsigned char PulseCNT;
bit Pulse;
sbit Speaker = P3^0;
unsigned ToneHigh, ToneLow;
void Timer() interrupt 1
{
TR0 = 0;
TH0 = ToneHigh;
TL0 = ToneLow;
TR0 = 1;
Speaker = Pulse;
Pulse = !Pulse;
PulseCNT--;
}
void main()
{
unsigned char Key;
CAddr= MODE;
TMOD = 0x01; // 方式 1 , 记时器
IE = 0x82; // EA=1, IT0 = 1
while (1) {
while (! TestKey) ; // 等按键
Key = GetKey();
if ( (Key >= 1) && (Key <= 7) ) {
ToneHigh = ToneTable[Key-1] >> 8;
ToneLow = ToneTable[Key-1] & 0xff;
TH0 = ToneHigh;
TL0 = ToneLow;
TR0 = 1;
PulseCNT = 200;
while (PulseCNT != 0) ; // 发 100 个脉冲
TR0 = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -