📄 adqz.c
字号:
/* “验证式” 实验十八 电子琴 */
#include <reg51.h>
#include <absacc.h>
#define MODE 0x03
#define CAddr XBYTE[0xe100] /* 命令控制口 */
#define OUTBIT XBYTE[0xe101] /* 位控制口 */
#define IN XBYTE[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 = P1^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 + -