📄 led.c
字号:
#include "2407c.h"
#define nMusicNumber 9
void interrupt gptime1(void);
void gp_init(void);
void delay(unsigned int nDelay);
unsigned int uWork,uWork1;
int sKey;/*,nCount; */
unsigned int music[nMusicNumber][2]=
{
{151,480},{135,480},{121,480},{113,480},{101,480},{91,480},{81,480},{75,480},{0,480}
};
/*
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
. .
*/
ioport unsigned char port8001;
ioport unsigned char port8005;
char ConvertScanToChar(unsigned char cScanCode); /*将键盘扫描码转换为字符 */
unsigned char ledbuf[8],ledx[8];
unsigned char ledkey[16][8]=
{
{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00}, //0
{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}, //3
{0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00}, //4
{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;
int i,nKeyCode,sKey;
for ( i=0;i<nMusicNumber;i++ )
{
music[i][0]*=24;
}
for ( uWork=0;uWork<8;uWork++ )
{
ledbuf[uWork]=0x0ff;
ledx[uWork]=1<<(uWork);
}
*WDCR=0x6f;
*WDKEY=0x5555;
*WDKEY=0xaaaa; /* 关闭看门狗中断 */
*SCSR1=0x81fe; /* 打开所有外设,设置时钟频率40MHz */
uWork1=(*MCRB);
uWork1&=0x0ffbf; /* CANTX/IOPC6 for normal I/O port */
(*MCRB)=uWork1;
/*nCount=0; */
gp_init();
*IMR=0x3;
*IFR=0xffff;
uWork=(*WSGR); /*设置等待状态寄存器,以适应较慢的外部数据源 */
uWork&=0x0fe3f;
(*WSGR)=uWork;
asm(" clrc INTM");
for(;;)
{/*键盘的扫描码由DSP的I/O扩展地址0x8001给出,当有键盘输入时,读此端口得到扫描码,当无键被按下时读此端口的结果为0 */
nScanCode=port8001;
nScanCode&=0x0ff;
/*if ( nScanCode!=0 )
{
}*/
if ( nScanCode!=0 )
{
cKey=ConvertScanToChar(nScanCode);
nKeyCode=( cKey>='0' && cKey<='9' )?(cKey-'0'):(cKey-'A'+10);
for ( i=0;i<8;i++ )
{ledbuf[i]=~ledkey[nKeyCode][7-i]; } /*把字符码存入数组ledbuf,取反后才能点亮LED */
if( cKey>='0' && cKey<='9' )
{
sKey=(int)cKey;
sKey-=49;
delay(music[sKey][1]);
*T1PR = music[sKey][0];
}
else
{
delay(music[8][1]);
*T1PR = music[8][0];
}
}
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'
};
char ConvertScanToChar(unsigned char cScanCode)
{
int nWork4;
unsigned int uWork2,uWork3;
uWork2=uWork3=cScanCode;
uWork2>>=4;
uWork3&=0x0f;
/* 0x18,0x14,0x12,0x11 对应 0,1,2,3
0x28,0x24,0x22,0x21 4,5,6,7
0x48,0x44,0x42,0x41 8,9,A, B
0x88,0x84,0x82,0x81 C, D, E, F */
switch ( uWork2 )
{
case 1: nWork4=0; break;
case 2: nWork4=4; break;
case 4: nWork4=8; break;
case 8: nWork4=12; break;
}
switch ( uWork3 )
{
case 1: nWork4+=3; break;
case 2: nWork4+=2; break;
case 4: nWork4+=1; break;
}
return KeyLUT[nWork4];
}
void interrupt gptime1(void)
{
uWork=(*PIVR);
switch(uWork)
{
case 0x27:
{
(*EVAIFRA)=0x80;
{
uWork=(*PCDATDIR);
uWork|=0x4000;
uWork^=0x40;
(*PCDATDIR)=uWork;
}
break;
}
}
}
void gp_init(void)
{
*EVAIMRA = 0x80;
*EVAIFRA = 0xffff;
*GPTCONA = 0x0100; /*由周期中断标志来启动 */
*T1PR = music[sKey][0];
*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++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -