📄 speaker.c
字号:
#include "2407c.h"
#define nMusicNumber 40
#define T46uS 0x0d40
#define LCDDELAY 1
#define LCDCMDTURNON 0x3f
#define LCDCMDTURNOFF 0x3e
#define LCDCMDSTARTLINE 0xc0
#define LCDCMDPAGE 0xb8
#define LCDCMDVERADDRESS 0x40
ioport unsigned char port8001;
ioport unsigned char port8002;
ioport unsigned char port8003;
ioport unsigned char port8004;
ioport unsigned char port8005;
void interrupt gptime1(void); //speaker
void gp_init(void);
void delay(unsigned int nDelay);
void interrupt gptime1(void);
void gp_init(void);
char ConvertScanToChar(unsigned char cScanCode); //key
void Delay(unsigned int nDelay);
void Delay(unsigned int nTime); // 延时子程序 lcd
void TurnOnLCD(); // 打开显示
void LCDCLS(); // 清除屏幕显示内容
void display16( int page,int line,int number,unsigned char (*pos)[32]);
unsigned int uWork,nCount;
unsigned int music[nMusicNumber][2]=
{
{182,480},{151,480},{135,480},{121,480},{135,480},{151,480},{182,480},{0,480},
{182,480},{151,480},{135,480},{121,480},{135,480},{151,480},{182,480},{0,480},
{182,240},{151,240},{135,240},{121,240},{135,240},{151,240},{182,240},{0,240},
{182,240},{151,240},{135,240},{121,240},{135,240},{151,240},{182,240},{0,240},
{182,1920},{151,1920},{135,1920},{121,1920},{135,1920},{151,1920},{182,1920},{0,1920}
};
/*
C D E F G A B
1 2 3 4 5 6 7 11
C: 264,297,330,352,396,440,495,528
music[][0]=1/264*1000000/25nS(for 40MHz DSP clock)
6123216
. .
*/
unsigned char coursedesign[4][32]= /*lcd*/
{
{
0x20, 0x21, 0xee, 0x04, 0x00, 0x00, 0x00, 0x7e, 0x4a, 0x4a, 0xfe, 0x4a, 0x4a, 0x7e, 0x00, 0x00,
0x00, 0x00, 0x3f, 0x10, 0x08, 0x21, 0x11, 0x09, 0x05, 0x03, 0xff, 0x05, 0x09, 0x31, 0x11, 0x00,
},
{
0x10, 0x12, 0xd2, 0xfe, 0x91, 0x11, 0x80, 0xbf, 0xa1, 0xa1, 0xa1, 0xa1, 0xbf, 0x80, 0x00, 0x00,
0x04, 0x03, 0x00, 0xff, 0x00, 0x41, 0x44, 0x44, 0x44, 0x7f, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00,
},
{
0x40, 0x41, 0xce, 0x04, 0x00, 0x80, 0x40, 0xbe, 0x82, 0x82, 0x82, 0xbe, 0xc0, 0x40, 0x40, 0x00,
0x00, 0x00, 0x7f, 0x20, 0x90, 0x80, 0x40, 0x43, 0x2c, 0x10, 0x10, 0x2c, 0x43, 0xc0, 0x40, 0x00,
},
{
0x20, 0x21, 0x2e, 0xe4, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0x20, 0x00,
0x00, 0x00, 0x00, 0x7f, 0x20, 0x10, 0x08, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
},
};
unsigned char ledbuf[8],ledx[8]; /*key*/
unsigned char ledkey[16][8]=
{
{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00},
{0x00,0x00,0x00,0x84,0xFE,0x80,0x00,0x00}, //1
{0x00,0x00,0x84,0xC2,0xA2,0x92,0x8C,0x00}, //2
{0x00,0x00,0x44,0x92,0x92,0x92,0x6C,0x00},
{0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00},
{0x00,0x00,0x4E,0x92,0x92,0x92,0x62,0x00},
{0x00,0x00,0x7C,0x92,0x92,0x92,0x64,0x00},
{0x00,0x00,0x02,0xC2,0x32,0x0A,0x06,0x00},
{0x00,0x00,0x6C,0x92,0x92,0x92,0x6C,0x00},
{0x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00},
{0x00,0x00,0xF8,0x24,0x22,0x24,0xF8,0x00},
{0x00,0x00,0xFE,0x92,0x92,0x92,0x6C,0x00},
{0x00,0x00,0x7C,0x82,0x82,0x82,0x44,0x00},
{0x00,0x00,0xFE,0x82,0x82,0x82,0x7C,0x00},
{0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x00},
{0x00,0x00,0xFE,0x12,0x12,0x12,0x12,0x00}
};
main()
{
char cKey=0;
unsigned char nScanCode;
unsigned int uWork1,nSpeed;
/*unsigned char nScanCode; */
unsigned int uWork,uWork2,uWork3;
int i,nKeyCode;
for ( uWork=0;uWork<8;uWork++ )
{
ledbuf[uWork]=0x0ff;
ledx[uWork]=1<<(uWork);
}
*WDCR=0x6f;
*WDKEY=0x5555;
*WDKEY=0xaaaa;
*SCSR1=0x81fe; //40m
*IMR=0x3;
*IFR=0xffff;
uWork=(*WSGR);
uWork&=0x0fe3f;
(*WSGR)=uWork;
LCDCLS(); // 清除显示内存
TurnOnLCD(); // 打开显示
display16(2,0,4,coursedesign);
//do{}while(1);
nCount=0;
//gp_init();
for(;;)
{
nScanCode=port8001;
nScanCode&=0x0ff;
if ( nScanCode!=0 )
{
cKey=ConvertScanToChar(nScanCode);
}
if ( nScanCode!=0 )
{
nKeyCode=( cKey>='0' && cKey<='9' )?(cKey-'0'):(cKey-'A'+10);
for ( i=0;i<8;i++ )
ledbuf[i]=~ledkey[nKeyCode][7-i];
if(cKey='1')
{
void motor();
}
if(cKey='2')
{
void speaker();
}
}
for ( i=0;i<8;i++ )
{
port8005=ledx[i];
port8005=ledbuf[i];
}
}
'
}
char KeyLUT[16]={ '0','1','2','3',
'4','5','6','7',
'8','9','A','B',
'C','D','E','F'
};
void interrupt gptime1(void)
{
uWork=(*PIVR);
switch(uWork)
{
case 0x27:
{
(*EVAIFRA)=0x80;
{
uWork=(*PCDATDIR);
uWork|=0x4000;
uWork^=0x40;
(*PCDATDIR)=uWork;
(*PEDATDIR)=uWork;
}
break;
}
}
}
void gp_init(void)
{
*EVAIMRA = 0x80;
*EVAIFRA = 0xffff;
*GPTCONA = 0x0100;
*T1PR = T46uS*9/5;;
*T1CNT = 0;
*T1CON = 0x1340;
}
void delay(unsigned int nDelay)
{
int ii,jj,kk;
for ( ii=0;ii<nDelay;ii++ )
for ( jj=0;jj<256;jj++ )
kk++;
}
void Delay(unsigned int nDelay)
{
int ii,jj,kk=0;
for ( ii=0;ii<nDelay;ii++ )
{
for ( jj=0;jj<64;jj++ )
{
kk++;
}
}
}
void TurnOnLCD()
{
port8001=LCDCMDTURNON;
port8002=0;
Delay(1024);
port8001=LCDCMDSTARTLINE;
port8002=0;
Delay(LCDDELAY);
}
void LCDCLS()
{
int i,j;
port8001=LCDCMDSTARTLINE;
port8002=0;
Delay(LCDDELAY);
for ( i=0;i<8;i++ )
{
port8001=LCDCMDPAGE+i;
port8002=0;
Delay(LCDDELAY);
port8001=LCDCMDVERADDRESS;
port8002=0;
Delay(LCDDELAY);
for ( j=0;j<64;j++ )
{
port8003=0;
port8002=0;
Delay(LCDDELAY);
}
port8001=LCDCMDPAGE+i;
port8002=0;
Delay(LCDDELAY);
port8001=LCDCMDVERADDRESS;
port8002=0;
Delay(LCDDELAY);
for ( j=0;j<64;j++ )
{
port8004=0;
port8002=0;
Delay(LCDDELAY);
}
}
}
void display16( int page,int line,int number,unsigned char (*pos)[32])
{
int i,n,p,m;
for(n=0;n<number;n++) //8个字的依次显示
{
p=0;
for(m=0;m<2;m++)//每个字需要显示2个页
{
port8001=LCDCMDPAGE+m+page; // 设置操作页=m+1
port8002=0;
Delay(LCDDELAY);
port8001=LCDCMDVERADDRESS+n*16+line; // 起始列=n*16+8
port8002=0;
Delay(LCDDELAY);
for ( i=0;i<16;i++,p++ )
{
if((n*16+line+i)<64)
{
port8003=pos[n][p]; // 屏幕左侧第1至32行第i列赋值
port8002=0; // (赋值后当前操作列自动加1,所以不需设置)
port8002=0;
Delay(LCDDELAY);
}
else
{
port8001=LCDCMDVERADDRESS+n*16+line+i-64;
port8002=0;
port8004=pos[n][p]; // 屏幕左侧第1至32行第i列赋值
port8002=0; // (赋值后当前操作列自动加1,所以不需设置)
port8002=0;
Delay(LCDDELAY);
}
}
}
}
}
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 motor()
{
char cKey;
unsigned char nScanCode;
unsigned int uWork,uWork1,nSpeed;
void interrupt gptime1(void);
void gp_init(void);
char ConvertScanToChar(unsigned char cScanCode);
void Delay(unsigned int nDelay);
uWork=(*MCRC);
uWork&=0x0efdf; /* PWM11/IOPE5,TDIR2/IOPF4 for normal I/O ports */
(*MCRC)=uWork;
nCount=0;
uWork=(*PFDATDIR);
uWork|=0x1000;
uWork1&=0xffef; /* Set direct=0 */
(*PFDATDIR)=uWork;
asm(" clrc INTM");
Delay(128);
*T1PR=T46uS;
nSpeed=T46uS;
for(;;)
{
if ( nCount>=16 )
{
nCount=0;
nScanCode=port8001;
nScanCode&=0x0ff;
if ( nScanCode!=0 )
{
cKey=ConvertScanToChar(nScanCode);
if ( cKey=='A' )
{
*T1PR=T46uS*9/5;
uWork1=(*PFDATDIR);
uWork1|=0x0010; /* Set direct=1 */
(*PFDATDIR)=uWork1;
Delay(128);
*T1PR=nSpeed;
}
else if ( cKey=='B' )
{
*T1PR=T46uS*9/5;
uWork1=(*PFDATDIR);
uWork1&=0xffef; /* Set direct=0 */
(*PFDATDIR)=uWork1;
Delay(128);
*T1PR=nSpeed;
}
else if ( cKey=='C' )
{
if ( nSpeed== 0x17D9 )
nSpeed=T46uS;
else
nSpeed=0x17D9;
*T1PR=nSpeed;
}
else if ( cKey=='D' )
{
if ( nSpeed== 0x0a40 )
nSpeed=T46uS;
else
nSpeed=0x0a40;
*T1PR=nSpeed;
}
}
}
}
}
void speaker()
{
int i;
void interrupt gptime1(void);
void gp_init(void);
void delay(unsigned int nDelay);
for ( i=0;i<nMusicNumber;i++ )
{
music[i][0]*=24;
}
uWork=(*MCRB);
uWork&=0x0ffbf; /* CANTX/IOPC6 for normal I/O port */
(*MCRB)=uWork;
asm(" clrc INTM");
for(;;)
{
delay(music[nCount][1]);
nCount++;
nCount%=nMusicNumber;
*T1PR = music[nCount][0];
}
nCount=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -