打印

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

[复制链接]
1464|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
恬蔚|  楼主 | 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[4]={0};
Uint16 key = 0;
Uint16 Keys[3][3] = {1,2,3,4,5,6,7,8,9};//数据表,与12个按键对应                                                                                        //实时按键信息变量
Uint16 KY_On = 0;
Uint16 KX_On = 0;
Uint16 KX_Tim[4] = {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[9]={                         //单位 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[1] = KX1_STATUS;
        KX_Status[2] = KX2_STATUS;
        KX_Status[3] = KX3_STATUS;
}
/*****************************************************************************************************/

/**************************************读取按键行位置**************************************/
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 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] && 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);
        }
}
/*****************************************************************************************************/
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[Song[i]]);                        //设置定时时间
                        StartCpuTimer0();                                                                                                //重启定时器
                        ENABLE_TIMER1_INT;                                                                                                //使能定时中断
                        Delay(DT[i]);                                                                                                //音乐节拍延时
                        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
这代码搞成这样, 实在看得郁闷.
你可以考虑用1个 PWM 来驱动声音输出.
通过按键信号来控制 PWM 的频率和是 ...

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

使用特权

评论回复
5
airwill| | 2014-1-22 13:16 | 只看该作者
PWM 来驱动声音输出. 就不涉及中断服务, 会简单一些.
蜂鸣器是不是有源的, 要不要考虑停止时的控制状态?

使用特权

评论回复
6
恬蔚|  楼主 | 2014-1-22 16:04 | 只看该作者
airwill 发表于 2014-1-22 13:16
PWM 来驱动声音输出. 就不涉及中断服务, 会简单一些.
蜂鸣器是不是有源的, 要不要考虑停止时的控制状态? ...

对  这个好像就是要考虑停止时的控制状态   它可能是有源的  这个是不是得问卖家  自己看不出来吧?它在开发板上呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

147

帖子

1

粉丝