有关DSP脉冲发出的问题?想用DSP编一个电子琴
型号为28335;程序编译通过,但是不能实现功能,指点下吧,如果能帮我改下程序就感激死了,但是嫌麻烦的话给我指点指点,或是类似程序也可以!谢谢了!程序:这个程序只能第一次...
型号为28335;程序编译通过,但是不能实现功能,指点下吧,如果能帮我改下程序就感激死了,但是嫌麻烦的话给我指点指点,或是类似程序也可以!谢谢了!
程序:这个程序只能第一次按键后,响了,然后一直响,不是用按键控制的,其他端口我已经设置好了
#include"DSP28x_Project.h" // Device Headerfile and Examples Include File
void Read_KX(Uint16 x)
{
KX_AllStatus();
if(KX_Status[x] == 0)
{
KX_Tim[x]++;
if(KX_Tim[x] >= 6000)
{
KX_On = x;
KX_Tim[1]=0;
KX_Tim[2]=0;
KX_Tim[3]=0;
}
}
}
void Read_KY(Uint16 x)
{
if(!KX_Status[KX_On] && KX_On) //符合x行低电平并且x列不为零即x列被扫描 Read_KY(x)
{
Set_KY(x); //x列被扫描 则令x列置高电平
yanchi(200);
KX_AllStatus();
if(KX_Status[KX_On]) //观察x行是否也转化为高电平
{
KY_On = x;
key = Keys[KX_On-1][KY_On-1]; //KY_ON-1是因为 数字从零开始0-3
KY_On = 0;
KX_On = 0;
}
Rst_KY(x);
}
}
void Show(Uint16 i)
{
while(1)
{
StopCpuTimer0(); //停止计数
DISABLE_TIMER1_INT; //不使能定时中断
ConfigCpuTimer(&CpuTimer0, 150, Musi[i]); //设置定时时间
StartCpuTimer0(); //重启定时器
ENABLE_TIMER1_INT; //使能定时中断
Delay(1); //音乐节拍延时
StopCpuTimer0(); //停止计数
DISABLE_TIMER1_INT; //不使能定时中断
BUZZ_OFF; //关闭蜂鸣器
Delay(8); //音乐停顿
}
}
interrupt void cpu_timer0_isr(void);
void main(void)
{
InitSysCtrl();
Buzz_Gpio_Init();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOWprotected registers
PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS; // This is needed to disable write toEALLOW protected registers
InitCpuTimers(); // For thisexample, only initialize the Cpu Timers
ConfigCpuTimer(&CpuTimer0, 150, 50);
IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
while(1)
{
Read_KX(1);
Read_KX(2);
Read_KX(3);
Read_KY(1);
Read_KY(2);
Read_KY(3);
Show(key);
}
}
interrupt void cpu_timer0_isr(void)
{
CpuTimer0.InterruptCount++;
BUZZ_CLK_GENER;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
} 展开
程序:这个程序只能第一次按键后,响了,然后一直响,不是用按键控制的,其他端口我已经设置好了
#include"DSP28x_Project.h" // Device Headerfile and Examples Include File
void Read_KX(Uint16 x)
{
KX_AllStatus();
if(KX_Status[x] == 0)
{
KX_Tim[x]++;
if(KX_Tim[x] >= 6000)
{
KX_On = x;
KX_Tim[1]=0;
KX_Tim[2]=0;
KX_Tim[3]=0;
}
}
}
void Read_KY(Uint16 x)
{
if(!KX_Status[KX_On] && KX_On) //符合x行低电平并且x列不为零即x列被扫描 Read_KY(x)
{
Set_KY(x); //x列被扫描 则令x列置高电平
yanchi(200);
KX_AllStatus();
if(KX_Status[KX_On]) //观察x行是否也转化为高电平
{
KY_On = x;
key = Keys[KX_On-1][KY_On-1]; //KY_ON-1是因为 数字从零开始0-3
KY_On = 0;
KX_On = 0;
}
Rst_KY(x);
}
}
void Show(Uint16 i)
{
while(1)
{
StopCpuTimer0(); //停止计数
DISABLE_TIMER1_INT; //不使能定时中断
ConfigCpuTimer(&CpuTimer0, 150, Musi[i]); //设置定时时间
StartCpuTimer0(); //重启定时器
ENABLE_TIMER1_INT; //使能定时中断
Delay(1); //音乐节拍延时
StopCpuTimer0(); //停止计数
DISABLE_TIMER1_INT; //不使能定时中断
BUZZ_OFF; //关闭蜂鸣器
Delay(8); //音乐停顿
}
}
interrupt void cpu_timer0_isr(void);
void main(void)
{
InitSysCtrl();
Buzz_Gpio_Init();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOWprotected registers
PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS; // This is needed to disable write toEALLOW protected registers
InitCpuTimers(); // For thisexample, only initialize the Cpu Timers
ConfigCpuTimer(&CpuTimer0, 150, 50);
IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
while(1)
{
Read_KX(1);
Read_KX(2);
Read_KX(3);
Read_KY(1);
Read_KY(2);
Read_KY(3);
Show(key);
}
}
interrupt void cpu_timer0_isr(void)
{
CpuTimer0.InterruptCount++;
BUZZ_CLK_GENER;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
} 展开
展开全部
很明显嘛,一直响表示中断没关,你看中断BUZZ_CLK_GENER; 你是不是define 的GPIO端口的触发器。另外你的CpuTimer0.InterruptCount++;这行去掉,没意义,没做占空比就不要,还有让我汗颜的是,,,当检测到有按键时,你居然一直把这个状态保持下去,做了个while(1),循环。。。。你敢不敢去掉void Show(Uint16 i)里的while(1)......改成一个触发状态,编译一个
#define START_ON TRUE
#define START_OFF FALSE
bool KEY;
KEY = START_OFF;
如果有按键按下,KEY = START_ON;
然后void Show(Uint16 i)里得while(1)改成while(KEY),然后在while(KEY)里末尾加上KEY = START_OFF,这样就不会老响。
#define START_ON TRUE
#define START_OFF FALSE
bool KEY;
KEY = START_OFF;
如果有按键按下,KEY = START_ON;
然后void Show(Uint16 i)里得while(1)改成while(KEY),然后在while(KEY)里末尾加上KEY = START_OFF,这样就不会老响。
更多追问追答
追问
我是定义的TOGGLE ,那就是关不了中断吗? 还有那个while循环如果不是死循环怎么能一直检测是否有按键按下呢?本人初学 不懂啊 希望多多指点
追答
你这样改
把检测到KEY的键加一个
KEY = START_ON;
while(KEY)
{
StopCpuTimer0(); //停止计数
DISABLE_TIMER1_INT; //不使能定时中断
ConfigCpuTimer(&CpuTimer0, 150, Musi[i]); //设置定时时间
StartCpuTimer0(); //重启定时器
ENABLE_TIMER1_INT; //使能定时中断
Delay(1); //音乐节拍延时
StopCpuTimer0(); //停止计数
DISABLE_TIMER1_INT; //不使能定时中断
BUZZ_OFF; //关闭蜂鸣器
Delay(8); //音乐停顿
KEY = START_OFF;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询