?? key_2.c
字號:
#include "2407A.h"
void initial(); /*初始化子程序 */
void timerint(); /*定時器3初始化子程序 */
void pwminitial(); /*PWM初始化子程序 */
unsigned char m[71];
unsigned int i=0;
void inline disable()
{
asm(" SETC INTM"); /*禁止所有中斷*/
}
void inline enable()
{
asm(" CLRC INTM"); /*開放所有中斷 */
}
void initial()
{
asm(" SETC SXM"); /*抑制符號位擴展 */
asm(" SETC OVM"); /*根據遇到溢出的情況,累加器被設置為它的最大正值或負值 */
asm(" SETC CNF"); /*B0被設置為程序存儲空間 */
*SCSR1=0X8FFE; /*clock=0.5*fin;使能ADC、SCI、SPI、CAN、EVA、EVB模塊*/
*WDCR=0X06f;
*WDKEY=0X5555;
*WDKEY=0XAAAA; /*disable watch dog*/
*IMR=0X0002; /*允許INT2中斷*/
*IFR=0XFFFF; /*清除全部中斷標志*/
WSGR=0X00; /*禁止所有等待狀態*/
*MCRA=*MCRA|0X0040; /*IOPA6端口設置為基本功能,PWM1 */
m[0]=0x42;
m[1]=0x61;
m[2]=0x81;
m[3]=0x72;
m[4]=0x61;
m[5]=0x51;
m[6]=0x42;
m[7]=0x62;
m[8]=0x52;
m[9]=0x32;
m[10]=0x42;
m[11]=0x61;
m[12]=0x81;
m[13]=0x72;
m[14]=0x61;
m[15]=0x71;
m[16]=0x84;
m[17]=0x01;
m[18]=0xB2;
m[19]=0xA1;
m[20]=0xB1;
m[21]=0x82;
m[22]=0x71;
m[23]=0x61;
m[24]=0x74;
m[25]=0x01;
m[26]=0xA2;
m[27]=0x31;
m[28]=0x41;
m[29]=0x52;
m[30]=0x41;
m[31]=0x31;
m[32]=0x44;
m[33]=0x01;
m[34]=0x62;
m[35]=0x61;
m[36]=0x71;
m[37]=0xA2;
m[38]=0xB1;
m[39]=0xA1;
m[40]=0x94;
m[41]=0x01;
m[42]=0xA1;
m[43]=0xB1;
m[44]=0x72;
m[45]=0x71;
m[46]=0x81;
m[47]=0x72;
m[48]=0x61;
m[49]=0x41;
m[50]=0x74;
m[51]=0x01;
m[52]=0x81;
m[53]=0x71;
m[54]=0x62;
m[55]=0x01;
m[56]=0xC2;
m[57]=0xB1;
m[58]=0xA1;
m[59]=0xB4;
m[60]=0xD2;
m[61]=0x71;
m[62]=0x81;
m[63]=0xA2;
m[64]=0x31;
m[65]=0x41;
m[66]=0x52;
m[67]=0x41;
m[68]=0x31;
m[69]=0x44;
m[70]=0x02;
}
void timerint()
{
*EVBIMRA=*EVBIMRA|0X0080; /*允許定時器3的周期中斷*/
*EVBIFRA=*EVBIFRA|0Xffff; /*清除定時器3周期中斷標志*/
*T3CON=0X170C; /*Timer3為連續增計數模式,預分頻值為128,使用內部時鐘*/
*T3PER=0X2625; /*1/4second*/
*T3CNT=0X00; /*Timer3的計數器清零 */
}
void pwminitial()
{
*ACTRA=0X0001; /*PWM1高有效!!!!*/
*DBTCONA=0X00; /*不使能死區控制*/
*COMCONA=0X8200; /*使能比較操作*/
*T1CON=0X1000; /*Timer1為連續增計數模式,預分頻值為1,使用內部時鐘,Timer1比較使能*/
}
void main()
{
disable();
initial();
timerint();
pwminitial();
enable();
*T3CON=*T3CON|0X0040; /*啟動Timer3*/
while(1)
{
asm(" nop");
}
}
void interrupt T3_INT()
{
unsigned int flag;
unsigned char note,length,tmp1,tmp2;
flag=*EVBIFRA&0X0080;
if(flag==0x0080)
{
*T3CON=*T3CON&0XFFBF; /*stop timer3 */
*T3CNT=0X00; /*reset timer3 */
*EVBIFRA=*EVBIFRA|0X0080; /*clearn flag */
tmp1=tmp2=m[i];
note=tmp1&0xF0;
length=tmp2&0x0F;
if(note<0x60)
{
switch(note)
{
case 0x10: /*↓MI*/
*CMPR1=0X1D97;
*T1PER=0X3B2E; /*F=330Hz,T=3.030ms*/
*T1CON=*T1CON|0X0040; /*啟動Timer1 */
break;
case 0x20: /*↓FA*/
*CMPR1=0X1BFA;
*T1PER=0X37F5; /*F=349Hz,T=2.865ms*/
*T1CON=*T1CON|0X0040;
break;
case 0x30: /*↓SO*/
*CMPR1=0X18E9;
*T1PER=0X31D3; /*F=392Hz,T=2.551ms*/
*T1CON=*T1CON|0X0040;
break;
case 0x40: /*↓LA*/
*CMPR1=0X1630;
*T1PER=0X2C60; /*F=440Hz,T=2.272ms*/
*T1CON=*T1CON|0X0040;
break;
case 0x50: /*↓SI*/
*CMPR1=0X13C4;
*T1PER=0X2788; /*F=494Hz,T=2.024ms*/
*T1CON=*T1CON|0X0040;
break;
default :*T1CON=*T1CON&0XFFBF; /*STOP Timer1 */
}
}
else
{
switch(note)
{
case 0x60: /*DO*/
*CMPR1=0X12AC;
*T1PER=0X2558; /*F=523Hz,T=1.912ms*/
*T1CON=*T1CON|0X0040;
break;
case 0x70: /*RE*/
*CMPR1=0X10E5;
*T1PER=0X21CA; /*F=578Hz,T=1.730ms*/
*T1CON=*T1CON|0X0040;
break;
case 0x80: /*MI*/
*CMPR1=0X0ED0;
*T1PER=0X1DA1; /*F=659Hz,T=1.517ms*/
*T1CON=*T1CON|0X0040;
break;
case 0x90: /*FA*/
*CMPR1=0X0DFE;
*T1PER=0X1BFD; /*F=698Hz,T=1.433ms*/
*T1CON=*T1CON|0X0040;
break;
case 0xA0: /*SO*/
*CMPR1=0X0C76;
*T1PER=0X18EC; /*F=784Hz,T=1.276ms*/
*T1CON=*T1CON|0X0040;
break;
case 0xB0: /*LA*/
*CMPR1=0X0B18;
*T1PER=0X1630; /*F=880Hz,T=1.136ms*/
*T1CON=*T1CON|0X0040;
break;
case 0xC0: /*SI*/
*CMPR1=0X09E2;
*T1PER=0X13C4; /*F=988Hz,T=1.012ms*/
*T1CON=*T1CON|0X0040;
break;
case 0xD0: /*↑DO*/
*CMPR1=0X0956;
*T1PER=0X12AC; /*F=1046Hz,T=0.956ms*/
*T1CON=*T1CON|0X0040;
break;
case 0xE0: /*↑RE*/
*CMPR1=0X084F;
*T1PER=0X109F; /*F=1175Hz,T=0.851ms*/
*T1CON=*T1CON|0X0040;
break;
case 0xF0: /*↑MI*/
*CMPR1=0X0769;
*T1PER=0X0ED3; /*F=1318Hz,T=0.759ms*/
*T1CON=*T1CON|0X0040;
break;
default :*T1CON=*T1CON&0XFFBF; /*STOP Timer1 */
}
}
i=++i;
if(i>=71)
{
i=0;
}
switch(length)
{
case 1:
*T3PER=0X2625; /*1/4second*/
*T3CON=*T3CON|0X0040; /*啟動Timer3*/
break;
case 2:
*T3PER=0X4C4B; /*1/2second*/
*T3CON=*T3CON|0X0040;
break;
case 4:
*T3PER=0X9896; /*1second*/
*T3CON=*T3CON|0X0040;
break;
case 8:
*T3PER=0X00;
*T3CON=*T3CON|0X0040;
break;
default:
*T3PER=0X2625; /*1/4second*/
*T3CON=*T3CON|0X0040;
}
enable(); /*開中斷*/
return; /*中斷返回*/
}
else
{
enable();
return;
}
}
void interrupt nothing( )
{
enable();
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -