📄 speaker.c
字号:
#include "2407c.h"
#define T46uS 0x0d40
#define nMusicNumber 16
#define nhalfnum 8
ioport unsigned char port8001;
ioport unsigned char port8005;
unsigned char ledbuf[8],ledx[8];
unsigned char ledkey[8]=
{0x1E,0x21,0x42,0x84,0x84,0x42,0x21,0x1E} ; //heart
void interrupt gptime1(void);
void gp_init(void);
char ConvertScanToChar(unsigned char cScanCode);
void Delay(unsigned int nDelay);
void delaym(unsigned int nDelay);
unsigned int uWork,nCount,nCount1;
unsigned int showheart;
unsigned int music[nMusicNumber][2]=
{
/*{151,480},{135,480},{121,480},{113,480},{101,480},{91,480},{81,480},{75,480}*/
/*{91,480}, {101,480},{121,480},{101,480}, {151,480},{91,480},{101,480},{91,480}*/
{151,480},{121,480},{101,480},{101,480},{91,480},{101,480},{121,480},{151,480},
{101,480},{101,480},{101,480},{121,480},{151,480},{101,480},{151,480},{101,480}
};
ioport unsigned char port8001;
void musicspk(unsigned char kind);
main()
{ char cKey;
unsigned char nScanCode,musicflag;
unsigned int uWork1,nSpeed,i;
*WDCR=0x6f;
*WDKEY=0x5555;
*WDKEY=0xaaaa;
*SCSR1=0x81fe; //40m
uWork=(*MCRC);
uWork&=0x0efdf; /* PWM11/IOPE5,TDIR2/IOPF4 for normal I/O ports */
(*MCRC)=uWork;
uWork=(*MCRB);
uWork&=0x0ffbf; /* CANTX/IOPC6 for normal I/O port */
(*MCRB)=uWork;
nCount=0;
gp_init();
*IMR=0x3;
*IFR=0xffff;
nCount=0;
uWork=(*WSGR);
uWork&=0x0fe3f;
(*WSGR)=uWork;
for ( uWork=0;uWork<8;uWork++ )
{
ledbuf[uWork]=0x0ff;
ledx[uWork]=1<<(uWork);
}
uWork=(*PFDATDIR);
uWork|=0x1000;
uWork1&=0xffef; /* Set direct=0 */
(*PFDATDIR)=uWork;
asm(" clrc INTM");
Delay(128);
*T1PR=T46uS;
nSpeed=T46uS;
showheart=0;
for ( i=0;i<nMusicNumber;i++ )
{
music[i][0]*=24;
}
while(1)
{
if(showheart==1)
{
for ( i=0;i<8;i++ )
ledbuf[i]=~ledkey[7-i]; /*把字符码存入数组ledbuf,取反后才能点亮LED */
/*Delay(128); */
for ( i=0;i<8;i++ )
{
port8005=ledx[i];
port8005=ledbuf[i];
Delay(1);
}
}
else
{
}
if ( nCount>=16 )
{
nCount=0;
nCount1=0;
cKey=0;
nScanCode=port8001;
nScanCode&=0x0ff;
if ( nScanCode!=0 )
{
cKey=ConvertScanToChar(nScanCode);
if ( cKey=='0' )
{
*T1PR=T46uS*9/5;
uWork1=(*PFDATDIR);
uWork1|=0x0010; /* Set direct=1 */
(*PFDATDIR)=uWork1;
Delay(128);
*T1PR=nSpeed;
musicflag=0;
musicspk(musicflag);
}
else if ( cKey=='1' )
{
*T1PR=T46uS*9/5;
uWork1=(*PFDATDIR);
uWork1&=0xffef; /* Set direct=0 */
(*PFDATDIR)=uWork1;
Delay(128);
*T1PR=nSpeed;
musicflag=1;
musicspk(musicflag);
}
else if ( cKey=='2' )
{
if ( nSpeed== 0x17D9 )
nSpeed=T46uS;
else
nSpeed=0x17D9;
*T1PR=nSpeed;
musicflag=2;
musicspk(musicflag);
}
else if ( cKey=='3' )
{
if ( nSpeed== 0x0a40 )
nSpeed=T46uS;
else
nSpeed=0x0a40;
*T1PR=nSpeed;
musicflag=3;
musicspk(musicflag);
}
if ( cKey=='A' )
{
showheart=1;
}
Delay(128);
//musicspk(musicflag);
Delay(128);
musicflag=8;
}
}
}
}
void musicspk(unsigned char kind)
{
int i,nCount1=0;
switch(kind)
{
case 0:{for(i=0;i<nMusicNumber;i++)
{
nCount1++;
*T3PR = music[nCount1][0];
delaym(music[nCount1][1]);
}
}
break;
case 1:
{ nCount1=16;
for(i=0;i<16;i++)
{
nCount1--;
*T3PR = music[nCount1][0];
delaym(music[nCount1][1]);
}
}
break;
case 2:
{
for(i=0;i<nMusicNumber;i++)
{
nCount1++;
*T3PR = music[nCount1][0];
delaym(music[nCount1][1]+240);
}
}
break;
case 3:
{
for(i=0;i<16;i++)
{
nCount1++;
*T3PR = music[nCount1][0];
delaym(music[nCount1][1]-240);
}
}
break;
default: break;
}
}
void interrupt gptime1(void)
{
int i;
uWork=(*PIVR);
switch(uWork)
{
case 0x27:
{
(*EVAIFRA)=0x80;
uWork=(*PEDATDIR);
uWork|=0x2000;
uWork^=0x0020;
(*PEDATDIR)=uWork;
nCount++;
break;
}
case 0x2F:
{
(*EVBIFRA)=0x80;
{
uWork=(*PCDATDIR);
uWork|=0x4000;
uWork^=0x40;
(*PCDATDIR)=uWork;
}
break;
}
}
}
void gp_init(void)
{
*EVAIMRA = 0x80;
*EVAIFRA = 0xffff;
*GPTCONA = 0x0100;
*T1PR = T46uS*9/5;
*T1CNT = 0;
*T1CON = 0x1340;
*EVBIMRA = 0x80;
*EVBIFRA = 0xffff;
*GPTCONB = 0x0100;
*T3PR = music[nCount][0];
*T3CNT = 0;
*T3CON = 0x1340;
}
char KeyLUT[16]={ '0','1','2','3',
'4','5','6','7',
'8','9','A','B',
'C','D','E','F'
};
char ConvertScanToChar(unsigned char cScanCode)
{
int nWork;
unsigned int uWork1,uWork2;
uWork1=uWork2=cScanCode;
uWork1>>=4;
uWork2&=0x0f;
switch ( uWork1 )
{
case 1: nWork=0; break;
case 2: nWork=4; break;
case 4: nWork=8; break;
case 8: nWork=12; break;
}
switch ( uWork2 )
{
case 1: nWork+=3; break;
case 2: nWork+=2; break;
case 4: nWork+=1; break;
}
return KeyLUT[nWork];
}
void Delay(unsigned int nDelay)
{
int i,j,k;
for ( i=0;i<nDelay;i++ )
for ( j=0;j<256;j++ )
k++;
}
void delaym(unsigned int nDelay)
{
int ii,jj,kk,i;
for ( i=0;i<8;i++ )
ledbuf[i]=~ledkey[7-i]; /*把字符码存入数组ledbuf,取反后才能点亮LED */
for ( ii=0;ii<nDelay;ii++ )
{
for ( jj=0;jj<230;jj++ )
{
kk++;
}
}
for ( i=0;i<8;i++ )
{
port8005=ledx[i];
port8005=ledbuf[i];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -