恬蔚 发表于 2014-1-20 16:24

电子琴的程序,有错误,谁有时间帮我下呢?

#include "DSP28x_Project.h"   // Device Headerfile and Examples Include File
/**************************************宏定义************************************************/

#define SET_KY3                        GpioDataRegs.GPASET.bit.GPIO1 = 1                                                //Y3拉高
#define RST_KY3                        GpioDataRegs.GPACLEAR.bit.GPIO1 = 1                                                //Y3拉低
#define SET_KY2                        GpioDataRegs.GPASET.bit.GPIO2 = 1                                                //Y2拉高
#define RST_KY2                        GpioDataRegs.GPACLEAR.bit.GPIO2 = 1                                                //Y2拉低
#define SET_KY1                        GpioDataRegs.GPASET.bit.GPIO3 = 1                                                //Y1拉高
#define RST_KY1                        GpioDataRegs.GPACLEAR.bit.GPIO3 = 1                                                //Y1拉低

#define KX3_STATUS               GpioDataRegs.GPBDAT.bit.GPIO51                                                        //X3状态
#define KX2_STATUS               GpioDataRegs.GPBDAT.bit.GPIO52                                                        //X2状态
#define KX1_STATUS               GpioDataRegs.GPBDAT.bit.GPIO53                                                        //X1状态

#define BUZZ_CLK_GENER                        GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;                //蜂鸣器控制IO,IO电平翻转,产生控制脉冲
#define DISABLE_TIMER1_INT                IER &= 0xFFFE;                                                                //关闭定时器
#define ENABLE_TIMER1_INT                IER |= M_INT1;                                                                //打开定时器
#define BUZZ_OFF                                GpioDataRegs.GPASET.bit.GPIO0 = 1;                        //关闭蜂鸣器

/*****************************************************************************************************/

Uint16 KX_Status={0};
Uint16 key = 0;
Uint16 Keys = {1,2,3,4,5,6,7,8,9};//数据表,与12个按键对应                                                                                        //实时按键信息变量
Uint16 KY_On = 0;
Uint16 KX_On = 0;
Uint16 KX_Tim = {0};

/**************************************函数声明************************************************/
interrupt void cpu_timer0_isr(void);
void Init_KeyGpio(void);                                                        //初始化按键IO
void yanchi(Uint32 t);                                                                //延时函数
void ResetAllKY(void);                                                                //4列全部输出低电平
void KX_AllStatus(void);                                                        //读取4行IO电平状态
void Read_KX(Uint16 x);                                                                //读取按键所在行
void Set_KY(Uint16 x);                                                                //设置任意列输出高电平
void Rst_KY(Uint16 x);                                                                //设置任意列输出低电平
void Read_KY(Uint16 x);                                                                //读取按键所在列
void Buzz_Gpio_Init(void);
void Delay(Uint16 t);
void show(Uint16 i);
int ANjian(void);
//******************************************按键初值*************************************************//

Uint16 Musi={                         //单位 us,不同频率下,蜂鸣器发出不同音调的声音
                                0,
                                1912,        //do
                                1703,        //re
                                1517,        //mi
                                1432,        //fa
                                1275,        //so
                                1136,        //la
                                1013,        //xi
                                0xFF        //STOP
                                };

Uint16 Song[]=        {0,1,2,3,4,5,6,7,8};                               
Uint16 DT[]={2,2,5,4,6,8,2};                        //节拍
/*****************************************************************************************************/
// Prototype statements for functions found within this file.
interrupt void cpu_timer0_isr(void);
/*******************************按键IO初始化***********************************/
void Init_KeyGpio(void)
{

        EALLOW;

    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;                                                                           // Enable pullup on GPIO0
    GpioDataRegs.GPASET.bit.GPIO0 = 1;                                                                       // Load output latch
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;                                                                        // GPIO0 = GPIO
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;                                                                           // GPIO0 = output
       
        //////////////////////////////以下四个IO口设置为输出,作为列扫描////////////////////////////

        //KY3: 对应PCB端子 KEY_MATRIX:IO24
        GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;                                                                           // Enable pullup on GPIO11
    GpioDataRegs.GPASET.bit.GPIO1 = 1;                                                                           // Load output latch
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;                                                                        // GPIO11 = GPIO
    GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;                                                                           // GPIO11 = output   

        //KY2: 对应PCB端子 KEY_MATRIX:IO25
        GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0;                                                                           // Enable pullup on GPIO11
    GpioDataRegs.GPASET.bit.GPIO2 = 1;                                                                           // Load output latch
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;                                                                        // GPIO11 = GPIO
    GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;                                                                           // GPIO11 = output   

        //KY1: 对应PCB端子 KEY_MATRIX:IO26
    GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;                                                                           // Enable pullup on GPIO11
    GpioDataRegs.GPASET.bit.GPIO3 = 1;                                                                           // Load output latch
    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0;                                                                        // GPIO11 = GPIO
    GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;                                                                           // GPIO11 = output   


        //////////////////////////////以下四个IO口设置为输入,作为行扫描////////////////////////////

        //KX3: 对应PCB端子 KEY_MATRIX:IO28      
    GpioCtrlRegs.GPBPUD.bit.GPIO51 = 0;                                                                           // Enable pullup on GPIO11
    GpioCtrlRegs.GPBMUX2.bit.GPIO51 = 0;                                                                        // 设置为一般IO口
    GpioCtrlRegs.GPBDIR.bit.GPIO51= 0;                                                                           // IO口方向为输入

        //KX2: 对应PCB端子 KEY_MATRIX:IO29      
    GpioCtrlRegs.GPBPUD.bit.GPIO52 = 0;                                                                           // Enable pullup on GPIO11
    GpioCtrlRegs.GPBMUX2.bit.GPIO52 = 0;                                                                        // 设置为一般IO口
    GpioCtrlRegs.GPBDIR.bit.GPIO52= 0;                                                                           // IO口方向为输入

        //KX1: 对应PCB端子 KEY_MATRIX:IO30         
    GpioCtrlRegs.GPBPUD.bit.GPIO53 = 0;                                                                           // Enable pullup on GPIO11
    GpioCtrlRegs.GPBMUX2.bit.GPIO53= 0;                                                                        // 设置为一般IO口
    GpioCtrlRegs.GPBDIR.bit.GPIO53   = 0;                                                                           // IO口方向为输入   

    EDIS;
        ResetAllKY();
}
/*****************************************************************************************************/

/*********************************************延时函数************************************************/
void Delay(Uint16 t)                                                                                                                //延时函数
{
        Uint32 i=0;
        Uint32 gain = 200000;                                                                                                        //延时增益
        Uint32 base=0;                                                               
        base=gain*t;                                                                                                                        
        for(i=0;i<=base;i++);
}
/*****************************************************************************************************/
//*******************************************按键延时函数***********************************************//
void yanchi(Uint32 t)
{
        Uint32 i = 0;
        for (i = 0; i < t; i++);
}
//**********************************************按键延时函数************************************************//

/****************************************4列全部输出低电平************************************************/
void ResetAllKY(void)
{
        RST_KY3        ;
        RST_KY2        ;
        RST_KY1        ;
}
/*****************************************************************************************************/

/****************************************读取4行IO电平状态************************************************/
void KX_AllStatus(void)
{
        KX_Status = KX1_STATUS;
        KX_Status = KX2_STATUS;
        KX_Status = KX3_STATUS;
}
/*****************************************************************************************************/

/**************************************读取按键行位置**************************************/
void Read_KX(Uint16 x)
{
        KX_AllStatus();
        if(KX_Status == 0)
        {
               KX_Tim++;
               if(KX_Tim >= 6000)
               {
                       KX_On = x;       
                       KX_Tim= 0;
                       KX_Tim=0;
                       KX_Tim=0;       
               }
        }
}
/*****************************************************************************************************/

/*******************************指定列输出高电平******************************************/
void Set_KY(Uint16 x)
{
        if(x==1){SET_KY1;}
        if(x==2){SET_KY2;}
        if(x==3){SET_KY3;}
}
/*****************************************************************************************************/

/*******************************指定列输出低电平**********************************************/
void Rst_KY(Uint16 x)
{
        if(x==1){RST_KY1;}
        if(x==2){RST_KY2;}
        if(x==3){RST_KY3;}
}
/*****************************************************************************************************/

/*******************************读取按键列位置**********************************************/
void Read_KY(Uint16 x)
{
       
        if(!KX_Status && KX_On)    //符合x行低电平并且x列不为零 即x列被扫描 Read_KY(x)
        {       
                Set_KY(x);//x列被扫描则令x列置高电平
                yanchi(200);
                KX_AllStatus();
                if(KX_Status)//观察x行是否也转化为高电平
                {
                        KY_On = x;
                        key = Keys;    //KY_ON-1是因为数字从零开始0-3
                        KY_On = 0;
                        KX_On = 0;
                }
                Rst_KY(x);
        }
}
/*****************************************************************************************************/
int ANjian(void)
{      
      Read_KX(1);
                Read_KX(2);
                Read_KX(3);
               
                Read_KY(1);
                Read_KY(2);
                Read_KY(3);
      return key;
}

/*********************************************歌曲演奏************************************************/
void Show(Uint16 i)
{
        while(1)
        {
               
                        StopCpuTimer0();                                                                                                //停止计数
                        DISABLE_TIMER1_INT;                                                                                                //不使能定时中断
                        ConfigCpuTimer(&CpuTimer0, 150, Musi]);                        //设置定时时间
                        StartCpuTimer0();                                                                                                //重启定时器
                        ENABLE_TIMER1_INT;                                                                                                //使能定时中断
                        Delay(DT);                                                                                                //音乐节拍延时
                        StopCpuTimer0();                                                                                                //停止计数
                        DISABLE_TIMER1_INT;                                                                                                //不使能定时中断
                        BUZZ_OFF;                                                                                                                //关闭蜂鸣器
                        Delay(8);                                                                                                                //音乐停顿
               
        }

}
/*****************************************************************************************************/

void main(void)
{
   InitSysCtrl();

   Init_KeyGpio();                                                                                        //初始化拨码开关IO

   DINT;

   InitPieCtrl();

   IER = 0x0000;
   IFR = 0x0000;

   InitPieVectTable();
   EALLOW;// This is needed to write to EALLOW protected registers
   PieVectTable.TINT0 = &cpu_timer0_isr;
   EDIS;    // This is needed to disable write to EALLOW protected registers
   
   InitCpuTimers();   // For this example, only initialize the Cpu Timers
   
   ConfigCpuTimer(&CpuTimer0, 150, 50);
   
   IER |= M_INT1;
   
   PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

// Enable global Interrupts and higher priority real-time debug events:
   EINT;   // Enable Global interrupt INTM
   ERTM;   // Enable Global realtime interrupt DBGM

        while(1)                                                                                                //死循环
        {
               
                ANjian();
      show(key);
                //不仅是1行对1列有可能Read_KX(1)为低电平 而Read_KY(3)才符合置高后 Read_KX(1)也为高电平
        }

}        


interrupt void cpu_timer0_isr(void)
{
   CpuTimer0.InterruptCount++;
   BUZZ_CLK_GENER;
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

//===========================================================================
// No more.
//===========================================================================

恬蔚 发表于 2014-1-20 16:26

其实我就是执行了两个子程序,ANjian()和show(),就不可以了,它们单独执行都可以,弄了几天了   求帮助啊

airwill 发表于 2014-1-22 12:44

这代码搞成这样, 实在看得郁闷.
你可以考虑用1个 PWM 来驱动声音输出.
通过按键信号来控制 PWM 的频率和是否输出的开关就可以了.
这样代码简单, 不会有频率偏差.

恬蔚 发表于 2014-1-22 13:00

airwill 发表于 2014-1-22 12:44 static/image/common/back.gif
这代码搞成这样, 实在看得郁闷.
你可以考虑用1个 PWM 来驱动声音输出.
通过按键信号来控制 PWM 的频率和是 ...

哈哈   初学   什么都不懂呢   这程序自然很烂   那个像这种的输出不同频率都是通过PWM吗   我还有一个简洁的问题   麻烦你给看看吧    谢谢啦   我@你了

airwill 发表于 2014-1-22 13:16

PWM 来驱动声音输出. 就不涉及中断服务, 会简单一些.
蜂鸣器是不是有源的, 要不要考虑停止时的控制状态?

恬蔚 发表于 2014-1-22 16:04

airwill 发表于 2014-1-22 13:16 static/image/common/back.gif
PWM 来驱动声音输出. 就不涉及中断服务, 会简单一些.
蜂鸣器是不是有源的, 要不要考虑停止时的控制状态? ...

对这个好像就是要考虑停止时的控制状态   它可能是有源的这个是不是得问卖家自己看不出来吧?它在开发板上呢
页: [1]
查看完整版本: 电子琴的程序,有错误,谁有时间帮我下呢?