打印

控制音乐播放器声音放大缩小的程序

[复制链接]
562|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dengdc|  楼主 | 2017-2-12 21:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
官方给的那个滑动触摸板能够控制音乐播放器声音放大缩小的程序很复杂,不好理解,我就想能不能自己做一个类似的滑动触摸板的程序,经过修改,终于写了这么一个程序,虽然和官方例程相比,要差的很远,但是初步实现了预期效果,希望大家给与指点。试验芯片:g2553,实验效果:顺时针滑动触摸板,串口打印出123,逆时针滑动触摸板,串口打印321,
程序里用到了标志位变量,先说明一下。fu1,fd1,fl1,fr1分别是上,下,左,右四个按键第一次按下的标志,fu2,fd2,fl2,fr2分别是上,下,左,右四个按键滑动按下的标志,cw,ccw分别是顺时针,逆时针滑动的标志。

相关帖子

沙发
dengdc|  楼主 | 2017-2-12 21:50 | 只看该作者

//******************************************************************************
// RO_PINOSC_TA0_WDTp_Wheel_Buttons example
// Touch the five wheel buttons to turn on/off the center button LED
// RO method capactiance measurement using PinOsc IO, TimerA0, and WDT+
//
//          Schematic Description:
//
//                         MSP430G2452
//                      +---------------+
//                      |
//             C--------|P2.4
//           C----------|P2.1
//               C------|P2.3
//             C--------|P2.2
//                      |
//           C----------|P2.5
//                      |
//           C----------|P2.0
//
//        The WDT+ interval represents the measurement window.  The number of
//        counts within the TA0R that have accumulated during the measurement
//        window represents the capacitance of the element. This is lowest
//        power option with either LPM3 (ACLK WDTp source) or LPM0 (SMCLK WDTp
//        source).
//
//******************************************************************************
#include "CTS_Layer.h"

// Uncomment to have this compiler directive run characterization functions only
// Comment to have this compiler directive run example application
//#define ELEMENT_CHARACTERIZATION_MODE


#define DELAY 1000
// Timer delay timeout count, 5000*0.1msec = 500 msec

struct Element * keyPressed;
// Pointer to the Element structure

#ifdef ELEMENT_CHARACTERIZATION_MODE
// Delta Counts returned from the API function for the sensor during characterization
unsigned int wheelCnt[5];
// Becuase the Wheel is composed of five elements
#endif

// Sleep Function
// Configures Timer A to run off ACLK, count in UP mode, places the CPU in LPM3
// and enables the interrupt vector to jump to ISR upon timeout
void sleep(unsigned int time)
{
     TA0CCR0 = time;
     TA0CTL = TASSEL_1+MC_1+TACLR;
     TA0CCTL0 &= ~CCIFG;
     TA0CCTL0 |= CCIE;
    __bis_SR_register(LPM3_bits+GIE);
     __no_operation();
}
/*void sleep()
{
     WDTCTL=WDT_ADLY_250;
     IE1 |= WDTIE;
     __bis_SR_register(LPM3_bits+GIE);
     __no_operation();
}*/
void time1()
{
     P1DIR|=BIT6;
     P1SEL|=BIT6;
     TA1CTL = TASSEL_1+MC_1;
     TA1CCTL1=OUTMOD_3;
     TA1CCR1=100;
}
void delay(unsigned char x)
{
     unsigned char a,b;
     for(a=x;a>0;a--)
       for(b=100;b>0;b--);
}
void uart_init()
{
    //UCA0CTL1|= UCSWRST;
    //UCA0CTL0|=UCMSB;
    DCOCTL=CALDCO_1MHZ;       //将DCO设为1mhz
    BCSCTL1=CALBC1_1MHZ;
    UCA0CTL1|=UCSSEL_2;
   UCA0BR0=13;           //波特率为9600
    UCA0BR1=0;
    UCA0MCTL=UCBRS0;
    P1SEL|=BIT1+BIT2;     //将P1.1 P1.2设为第二功能
    P1SEL2 = BIT1 + BIT2;
    UCA0CTL1&=~UCSWRST;
}
void send(unsigned char c)
{
     uart_init();
     //delay(100);
     UCA0TXBUF=c;   
     while(!(IFG2&UCA0TXIFG));
     IFG2&=~UCA0TXIFG;
}
void sendstring(unsigned char *str)
{
     unsigned char i=0;
     while(str[i])
     {
       send(str[i]);
       i++;
     }
}
// Main Function
void main(void)
{
    unsigned char fu1,fu2,fd1,fd2,fl1,fl2,fr1,fr2,cw,ccw;
   //unsigned char a,b,c,d;
   WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
   BCSCTL1 = CALBC1_1MHZ;                // Set DCO to 1, 8, 12 or 16MHz
   DCOCTL = CALDCO_1MHZ;
   BCSCTL1 |= DIVA_0;                    // ACLK/1 [ACLK/(0:1,1:2,2:4,3:8)]
   BCSCTL2 |= DIVS_3;                    // SMCLK/8 [SMCLK/(0:1,1:2,2:4,3:8)]
   BCSCTL3 |= LFXT1S_2;                  // LFXT1 = VLO Clock Source

  P1OUT = 0x00;
// Drive all Port 1 pins low
   P1DIR = 0xFF;
// Configure all Port 1 pins outputs

  P2SEL &= ~(BIT6 + BIT7);
// Configure XIN (P2.6) and XOUT (P2.7) to GPIO
   P2OUT = 0x00;
// Drive all Port 2 pins low
   P2DIR = 0xFF;
// Configure all Port 2 pins outputs
// time1();
   // Initialize Baseline measurement
   TI_CAPT_Init_Baseline(&wheel_buttons);

  // Update baseline measurement (Average 5 measurements)
   TI_CAPT_Update_Baseline(&wheel_buttons,5);  

  // Main loop starts here
   while (1)
   {
   

  
#ifdef ELEMENT_CHARACTERIZATION_MODE

// Get the raw delta counts for element characterization

TI_CAPT_Custom(&wheel_buttons,wheelCnt);

__no_operation();
// Set breakpoint here


#endif





#ifndef ELEMENT_CHARACTERIZATION_MODE

// Return the pointer to the element which has been touched

keyPressed = (struct Element *)TI_CAPT_Buttons(&wheel_buttons);



// If a button has been touched, then take some action

if(keyPressed)

{

// Up Element

if(keyPressed == &up_element)             //如果上键按下

{

P1OUT |= BIT0;

                       // sendstring("up\r\n");
                         fu1=1;
                         if((ccw==0)&&((fl1==1)||(fl2==1)))  //如果不是逆时针状态,且左键被按下过
                         {
                           cw=1;                            //说明是顺时针状态
                           fu2=1;                       //且此时是手指滑动状态,将上键的滑动状态置1
                           fu1=0;                      //将第一次按键的状态清0,这一句可不要
                         }
                         if((cw==0)&&((fr1==1)||(fr2==1)))//如果不是顺时针状态,且右键被按下过
                         {
                           ccw=1;                      //说明是逆时针状态
                           fu2=1;                      //且此时是手指滑动状态,将上键的滑动状态置1
                           fu1=0;                      //将第一次按键的状态清0,这一句可不要
                         }
                 }

// Down Element

if(keyPressed == &down_element)

{

P1OUT |= BIT0;
                        // sendstring("down\r\n");
                         fd1=1;
                         if((ccw==0)&&((fr1==1)||(fr2==1)))
                         {
                           cw=1;
                           fd2=1;
                           fd1=0;
                         }
                         if((cw==0)&&((fl1==1)||(fl2==1)))
                         {
                           ccw=1;
                           fd2=1;
                           fd1=0;
                         }
                 }

// Left Element

if(keyPressed == &left_element)

{

P1OUT |= BIT0;

                       // sendstring("left\r\n");
                         fl1=1;
                         if((ccw==0)&&((fd1==1)||(fd2==1)))
                         {
                           cw=1;
                           fl2=1;
                           fl1=0;
                         }
                         if((cw==0)&&((fu1==1)||(fu2==1)))
                         {
                           ccw=1;
                           fl2=1;
                           fl1=0;
                         }

}

// Right Element

if(keyPressed == &right_element)

{

P1OUT |= BIT0;
                        // sendstring("right\r\n");
                         fr1=1;
                         if((ccw==0)&&((fu1==1)||(fu2==1)))
                         {
                           cw=1;
                           fr2=1;
                           fr1=0;
                         }
                         if((cw==0)&&((fd1==1)||(fd2==1)))
                         {
                           ccw=1;
                           fr2=1;
                           fr1=0;
                         }

}


// Middle Element

if(keyPressed == &middle_element)

{

P1OUT |= BIT0;
// Turn on center LED

        sendstring("middle\r\n");
                 }
                 if(cw&&(fu2||fr2||fd2||fl2))
                   sendstring("123\r\n");
                 if(ccw&&(fu2||fr2||fd2||fl2))
                   sendstring("321\r\n");

  }

  else

  {

      P1OUT &= ~(BIT0);
// Turn off center LED
               fu2=fr2=fd2=fl2=0;
               fu1=fr1=fd1=fl1=0;
               cw=ccw=0;
           }      

    // Put the MSP430 into LPM3 for a certain DELAY period
     sleep(DELAY);
     #endif

  }
} // End Main

/******************************************************************************/
// Timer0_A0 Interrupt Service Routine: Disables the timer and exists LPM3  
/******************************************************************************/
#pragma vector=TIMER0_A0_VECTOR
__interrupt void ISR_Timer0_A0(void)
{
   TA0CTL &= ~(MC_1);
   TA0CCTL0 &= ~(CCIE);
   __bic_SR_register_on_exit(LPM3_bits+GIE);
}

/*#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
    WDTCTL = WDTPW + WDTHOLD;
   __bic_SR_register_on_exit(LPM3_bits+GIE);                           
}*/

使用特权

评论回复
板凳
zhenykun| | 2017-2-12 21:52 | 只看该作者
效果怎么啊

使用特权

评论回复
地板
jiaxw| | 2017-2-12 21:55 | 只看该作者
可以看看效果图么?

使用特权

评论回复
5
dengdc|  楼主 | 2017-2-12 21:57 | 只看该作者
我又修改了以下代码,顺时针滑动发送clockwise,逆时针滑动发送countclockwise
下面是程序://******************************************************************************
// RO_PINOSC_TA0_WDTp_Wheel_Buttons example
// Touch the five wheel buttons to turn on/off the center button LED
// RO method capactiance measurement using PinOsc IO, TimerA0, and WDT+
//
//          Schematic Description:
//
//                         MSP430G2452
//                      +---------------+
//                      |
//             C--------|P2.4
//           C----------|P2.1
//               C------|P2.3
//             C--------|P2.2
//                      |
//           C----------|P2.5
//                      |
//           C----------|P2.0
//
//        The WDT+ interval represents the measurement window.  The number of
//        counts within the TA0R that have accumulated during the measurement
//        window represents the capacitance of the element. This is lowest
//        power option with either LPM3 (ACLK WDTp source) or LPM0 (SMCLK WDTp
//        source).
//
//******************************************************************************
#include "CTS_Layer.h"

// Uncomment to have this compiler directive run characterization functions only
// Comment to have this compiler directive run example application
//#define ELEMENT_CHARACTERIZATION_MODE        

#define DELAY 1000                 // Timer delay timeout count, 5000*0.1msec = 500 msec

struct Element * keyPressed;                        // Pointer to the Element structure

#ifdef ELEMENT_CHARACTERIZATION_MODE
// Delta Counts returned from the API function for the sensor during characterization
unsigned int wheelCnt[5];                                // Becuase the Wheel is composed of five elements
#endif

// Sleep Function
// Configures Timer A to run off ACLK, count in UP mode, places the CPU in LPM3
// and enables the interrupt vector to jump to ISR upon timeout
void sleep(unsigned int time)
{
     TA0CCR0 = time;
     TA0CTL = TASSEL_1+MC_1+TACLR;
     TA0CCTL0 &= ~CCIFG;
     TA0CCTL0 |= CCIE;
    __bis_SR_register(LPM3_bits+GIE);
     __no_operation();
}
/*void sleep()
{
     WDTCTL=WDT_ADLY_250;
     IE1 |= WDTIE;
     __bis_SR_register(LPM3_bits+GIE);
     __no_operation();
}*/
void time1()
{
     P1DIR|=BIT6;
     P1SEL|=BIT6;
     TA1CTL = TASSEL_1+MC_1;
     TA1CCTL1=OUTMOD_3;
     TA1CCR1=100;
}
void delay(unsigned char x)
{
     unsigned char a,b;
     for(a=x;a>0;a--)
       for(b=100;b>0;b--);
}
void uart_init()
{
    DCOCTL=CALDCO_1MHZ;       //将DCO设为1mhz
    BCSCTL1=CALBC1_1MHZ;
    UCA0CTL1|=UCSSEL_2;
   UCA0BR0=13;           //波特率为9600
    UCA0BR1=0;
    UCA0MCTL=UCBRS0;
    P1SEL|=BIT1+BIT2;     //将P1.1 P1.2设为第二功能
    P1SEL2 = BIT1 + BIT2;
    UCA0CTL1&=~UCSWRST;
}
void send(unsigned char c)
{
     uart_init();
     //delay(100);
     UCA0TXBUF=c;   
     while(!(IFG2&UCA0TXIFG));
     IFG2&=~UCA0TXIFG;
}
void sendstring(unsigned char *str)
{
     unsigned char i=0;
     while(str[i])
     {
       send(str[i]);
       i++;
     }
}
// Main Function
void main(void)
{
    unsigned char fu1,fu2,fd1,fd2,fl1,fl2,fr1,fr2,cw,ccw;
   //unsigned char a,b,c,d;
   WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
   BCSCTL1 = CALBC1_1MHZ;                // Set DCO to 1, 8, 12 or 16MHz
   DCOCTL = CALDCO_1MHZ;
   BCSCTL1 |= DIVA_0;                    // ACLK/1 [ACLK/(0:1,1:2,2:4,3:8)]
   BCSCTL2 |= DIVS_3;                    // SMCLK/8 [SMCLK/(0:1,1:2,2:4,3:8)]
   BCSCTL3 |= LFXT1S_2;                  // LFXT1 = VLO Clock Source
  P1OUT = 0x00;                                                        // Drive all Port 1 pins low
   P1DIR = 0xFF;                                                        // Configure all Port 1 pins outputs
   P2SEL &= ~(BIT6 + BIT7);                                // Configure XIN (P2.6) and XOUT (P2.7) to GPIO
   P2OUT = 0x00;                                                        // Drive all Port 2 pins low
   P2DIR = 0xFF;                                                        // Configure all Port 2 pins outputs
// time1();
   // Initialize Baseline measurement
   TI_CAPT_Init_Baseline(&wheel_buttons);
   // Update baseline measurement (Average 5 measurements)
   TI_CAPT_Update_Baseline(&wheel_buttons,5);  
   // Main loop starts here
   while (1)
   {
           #ifdef ELEMENT_CHARACTERIZATION_MODE
         // Get the raw delta counts for element characterization
        TI_CAPT_Custom(&wheel_buttons,wheelCnt);
         __no_operation();                                         // Set breakpoint here        
        #endif
         #ifndef ELEMENT_CHARACTERIZATION_MODE
         // Return the pointer to the element which has been touched
         keyPressed = (struct Element *)TI_CAPT_Buttons(&wheel_buttons);
         // If a button has been touched, then take some action
         if(keyPressed)
         {
                 // Up Element
                 if(keyPressed == &up_element)             //如果上键按下
                 {
                         P1OUT |= BIT0;                              
                         fu1=1;
                         if((ccw==0)&&((fl1==1)||(fl2==1)))  //如果不是逆时针状态,且左键被按下过
                         {
                           cw=1;                            //说明是顺时针状态
                           fu2=1;                       //且此时是手指滑动状态,将上键的滑动状态置1
                           fu1=0;                      //将第一次按键的状态清0,这一句可不要
                         }
                         if((cw==0)&&((fr1==1)||(fr2==1)))//如果不是顺时针状态,且右键被按下过
                         {
                           ccw=1;                      //说明是逆时针状态
                           fu2=1;                      //且此时是手指滑动状态,将上键的滑动状态置1
                           fu1=0;                      //将第一次按键的状态清0,这一句可不要
                         }
                 }
                 // Down Element
                 if(keyPressed == &down_element)
                 {
                         P1OUT |= BIT0;
                         fd1=1;
                         if((ccw==0)&&((fr1==1)||(fr2==1)))
                         {
                           cw=1;
                           fd2=1;
                           fd1=0;
                         }
                         if((cw==0)&&((fl1==1)||(fl2==1)))
                         {
                           ccw=1;
                           fd2=1;
                           fd1=0;
                         }
                 }
                 // Left Element
                 if(keyPressed == &left_element)
                 {
                         P1OUT |= BIT0;        
                        fl1=1;
                         if((ccw==0)&&((fd1==1)||(fd2==1)))
                         {
                           cw=1;
                           fl2=1;
                           fl1=0;
                         }
                         if((cw==0)&&((fu1==1)||(fu2==1)))
                         {
                           ccw=1;
                           fl2=1;
                           fl1=0;
                         }
                 }
                 // Right Element
                 if(keyPressed == &right_element)
                 {
                         P1OUT |= BIT0;
                         fr1=1;
                         if((ccw==0)&&((fu1==1)||(fu2==1)))
                         {
                           cw=1;
                           fr2=1;
                           fr1=0;
                         }
                         if((cw==0)&&((fd1==1)||(fd2==1)))
                         {
                           ccw=1;
                           fr2=1;
                           fr1=0;
                         }
                 }                                                
                // Middle Element
                 if(keyPressed == &middle_element)
                 {
                         P1OUT |= BIT0;                                // Turn on center LED
                         sendstring("middle\r\n");
                 }
                 if(cw&&(fu2||fr2||fd2||fl2))
                   sendstring("clockwise\r\n");
                 if(ccw&&(fu2||fr2||fd2||fl2))
                   sendstring("counterclockwise\r\n");
           }
           else
           {
               P1OUT&=~(BIT0);                                // Turn off center LED
               if((fu1==1)&&(cw==0)&&(ccw==0))
                 sendstring("up\r\n");
               if((fd1==1)&&(cw==0)&&(ccw==0))
                 sendstring("down\r\n");
               if((fl1==1)&&(cw==0)&&(ccw==0))
                 sendstring("left\r\n");
               if((fr1==1)&&(cw==0)&&(ccw==0))
                 sendstring("right\r\n");
               fu2=fr2=fd2=fl2=0;
               fu1=fr1=fd1=fl1=0;
               cw=ccw=0;
           }      
         
     // Put the MSP430 into LPM3 for a certain DELAY period
     sleep(DELAY);
     #endif
   }
} // End Main

/******************************************************************************/
// Timer0_A0 Interrupt Service Routine: Disables the timer and exists LPM3  
/******************************************************************************/
#pragma vector=TIMER0_A0_VECTOR
__interrupt void ISR_Timer0_A0(void)
{
   TA0CTL &= ~(MC_1);
   TA0CCTL0 &= ~(CCIE);
   __bic_SR_register_on_exit(LPM3_bits+GIE);
}

使用特权

评论回复
6
dengdc|  楼主 | 2017-2-12 21:59 | 只看该作者
搞定了,呵呵,犯了低级错误……结贴啦,多谢各位

使用特权

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

本版积分规则

892

主题

13885

帖子

7

粉丝