/*******************************/
/* 电子琴 */
/*******************************/
#include <stdio.h>
#include <conio.h>
#include "ApiEx.h"
#pragma comment(lib,"ApiEx.lib")
int time[]={120,106,94,89,79,70,63,59}; /*8253发不同音的计数器初值*/
int data[]={0x80,0x96,0xae,0xc5,0xd8,0xe9,0xf5,0xfd,
0xff,0xfd,0xf5,0xe9,0xd8,0xc5,0xae,0x96,
0x80,0x66,0x4e,0x38,0x25,0x15,0x09,0x04,
0x00,0x04,0x09,0x15,0x25,0x38,0x4e,0x66}; /*正弦波数据*/
void de_lay(int i);
void main()
{
int i,k,j;
if(!Startup()) /*打开设备*/
{
printf("ERROR: Open Device Error!\n");
return;
}
printf("Press 1,2,3,4,5,6,7,8\n");
printf("Press other key to exit!\n");
PortWriteByte(0x28b,0x9b); /*置8255和8253工作方式字*/
PortWriteByte(0x283,0x10);
for(;;) {
k=getch();
if(k<0x31||k>0x38) break;
for (j=0;j<60;j++)
for(i=0;i<32;i++) /*轮流输出正弦波数据*/
{
PortWriteByte(0x290,(int)(data[i]));
de_lay(time[k-0x31]); /*延时*/
}
}
Cleanup(); /*关闭设备*/
}
void de_lay(int i)
{
BYTE data;
PortWriteByte(0x280,i); /*输出计数值*/
do{
PortReadByte(0x288,&data);
}while(!(data&0x01)); /*判断PA0是否为高电平,若是则返回*/
}