【TI 技术资料分享】+lantchpad的电容式触摸板的源码

2019-07-30 18:46发布

本帖最后由 必胜客A 于 2015-3-9 21:52 编辑

TI公司MSP430芯片评估板lantchpad的电容式触摸板的源码 TI公司MSP430芯片评估板lantchpad的电容式触摸板的源码.zip (9.96 KB, 下载次数: 4) 2015-3-9 21:50 上传 点击文件名下载附件

  1. #include "CTS_Layer.h"
  2. #include "uart.h"


  3. #define WAKE_UP_UART_CODE       0xBE
  4. #define WAKE_UP_UART_CODE2      0xEF
  5. #define SLEEP_MODE_UART_CODE    0xDE
  6. #define SLEEP_MODE_UART_CODE2   0xAD
  7. #define MIDDLE_BUTTON_CODE      0x80
  8. #define INVALID_GESTURE         0xFD
  9. #define GESTURE_START           0xFC
  10. #define GESTURE_STOP            0xFB
  11. #define COUNTER_CLOCKWISE       1
  12. #define CLOCKWISE               2
  13. #define GESTURE_POSITION_OFFSET 0x20
  14. #define WHEEL_POSITION_OFFSET   0x30

  15. #define WHEEL_TOUCH_DELAY       12  //Delay between re-sendings of touches
  16. #define MAX_IDLE_TIME           200
  17. #define PROXIMITY_THRESHOLD     60

  18. unsigned int wheel_position=ILLEGAL_SLIDER_WHEEL_POSITION, last_wheel_position=ILLEGAL_SLIDER_WHEEL_POSITION;
  19. unsigned int deltaCnts[1];
  20. unsigned int prox_raw_Cnts;




  21. /*----------------- LED definition---------------------------------------------
  22. * There are 8 LEDs to represent different positions around the wheel. They are
  23. * controlled by 5 pins of Port 1 using a muxing scheme. The LEDs are divided
  24. * vertically into two groups of 4, in which each LED is paired up [muxed] with
  25. * the LED mirrored on the other side of the imaginary center vertical line via
  26. * the use of pin P1.3 and one specific port pin.
  27. * Specifically, the pairs are LEDs [0,7], [1,6], [2,5], [3,4], as shown in the
  28. * diagram below.
  29. *     LED                        Position (degrees, clockwise)
  30. * --RIGHT SIDE--
  31. *      0       BIT4,!BIT3                  45
  32. *      1       BIT5,!BIT3                  80
  33. *      2       BIT6,!BIT3                 100
  34. *      3       BIT7,!BIT3                 135 *
  35. *
  36. * --LEFT SIDE--
  37. *      4       BIT3,(BIT4,5,6)             225
  38. *      5       BIT3,(BIT4,5,7)             260
  39. *      6       BIT3,(BIT4,6,7)             280
  40. *      7       BIT3,(BIT5,6,7)             315
  41. *----------------------------------------------------------------------------*/
  42. #define MASK7                   BIT4
  43. #define MASK6                   BIT5
  44. #define MASK5                   BIT6
  45. #define MASK4                   BIT7

  46. #define MASK3                   (BIT3+BIT4+BIT5+BIT6)
  47. #define MASK2                   (BIT3+BIT4+BIT5+BIT7)
  48. #define MASK1                   (BIT3+BIT4+BIT6+BIT7)
  49. #define MASK0                   (BIT3+BIT5+BIT6+BIT7)

  50. const unsigned char LedWheelPosition[16] =
  51.                                 {
  52.                                   MASK0, MASK0, MASK0 & MASK1, MASK1,
  53.                                   MASK1 & MASK2, MASK2, MASK2 & MASK3, MASK3,
  54.                                   MASK4, MASK4, MASK4 | MASK5, MASK5,
  55.                                   MASK5 | MASK6,  MASK6, MASK6 | MASK7, MASK7
  56.                                 };
  57. const unsigned char startSequence[8] =
  58.                                 {
  59.                                   MASK0,
  60.                                   MASK1,
  61.                                   MASK2,
  62.                                   MASK3,
  63.                                   MASK4,
  64.                                   MASK5,
  65.                                   MASK6,
  66.                                   MASK7
  67.                                 };
  68. /*----------------- LED definition------------------------------*/


  69. void InitLaunchPadCore(void)

  70. {
  71.   BCSCTL1 |= DIVA_0;                    // ACLK/(0:1,1:2,2:4,3:8)
  72.   BCSCTL3 |= LFXT1S_2;                  // LFXT1 = VLO  
  73.   
  74.   // Port init
  75.   P1OUT &= ~(BIT3+BIT4+BIT5+BIT6+BIT7+BIT0);
  76.   P1DIR |= BIT3+BIT4+BIT5+BIT6+BIT7+BIT0;
  77.   P2SEL = 0x00;                         // No XTAL
  78.   P2DIR |= (BIT0+BIT4+BIT2+BIT3+BIT1+BIT5);
  79.   P2OUT &= ~(BIT0+BIT4+BIT2+BIT3+BIT1+BIT5);
  80. }

  81. void SendByte(unsigned char touch)
  82. {
  83.   TimerA_UART_init();
  84.   TimerA_UART_tx(touch);
  85.   TimerA_UART_shutdown();  
  86. }

  87. /* ----------------CapTouchIdleMode-----------------------------------------
  88. * Device stays in LPM3 'sleep' mode, only Proximity Sensor is used to detect
  89. * any movement triggering device wake up                                 
  90. * ------------------------------------------------------------------------*/
  91. void CapTouchIdleMode(void)
  92. {
  93.   /* Send status via UART: 'sleep' = [0xDE, 0xAD] */  
  94.   SendByte(SLEEP_MODE_UART_CODE);
  95.   SendByte(SLEEP_MODE_UART_CODE2);
  96.   
  97.   /* Set DCO to 1MHz */
  98.   /* Set SMCLK to 1MHz / 8 = 125kHz */
  99.   BCSCTL1 = CALBC1_1MHZ;               
  100.   DCOCTL = CALDCO_1MHZ;
  101.   BCSCTL2 |= DIVS_3;  
  102.   
  103.   P1OUT |= BIT0;                            // Turn on center LED   
  104.   deltaCnts[0] = 0;
  105.   
  106.   /* Sleeping in LPM3 with ACLK/100 = 12Khz/100 = 120Hz wake up interval */
  107.   /* Measure proximity sensor count upon wake up */
  108.   /* Wake up if proximity deltaCnts > THRESHOLD */  
  109.   do
  110.   {
  111.     TACCR0 = 100;                                                                                                                                               
  112.     TACTL = TASSEL_1 + MC_1;                  
  113.     TACCTL0 |= CCIE;   
  114.     __bis_SR_register(LPM3_bits+GIE);
  115.     TACCTL0 &= ~CCIE;                             
  116.     TI_CAPT_Custom(&proximity_sensor,deltaCnts);
  117.   }
  118.   while (deltaCnts[0] <= PROXIMITY_THRESHOLD);
  119.   
  120.   P1OUT &= ~BIT0;                           // Turn off center LED
  121. }

  122. /* ----------------MeasureCapBaseLine--------------------------------------
  123. * Re-measure the baseline capacitance of the wheel elements & the center  
  124. * button. To be called after each wake up event.                          
  125. * ------------------------------------------------------------------------*/
  126. void MeasureCapBaseLine(void)
  127. {
  128.   P1OUT = BIT0;
  129.   /* Set DCO to 8MHz */
  130.   /* SMCLK = 8MHz/8 = 1MHz */
  131.   BCSCTL1 = CALBC1_8MHZ;     
  132.   DCOCTL = CALDCO_8MHZ;
  133.   BCSCTL2 |= DIVS_3;
  134.   
  135.   TI_CAPT_Init_Baseline(&wheel);
  136.   TI_CAPT_Update_Baseline(&wheel,2);
  137.   TI_CAPT_Init_Baseline(&middle_button);
  138.   TI_CAPT_Update_Baseline(&middle_button,2);  
  139. }

  140. /* ----------------LedStartUpSequence--------------------------------------
  141. * Display an LED lighting sequence to indicate the wake up event
  142. * ------------------------------------------------------------------------*/
  143. void LedStartUpSequence(void)
  144. {
  145.   unsigned char i;
  146.   TACCTL0 = CCIE;                           // CCR0 interrupt enabled
  147.   TACTL |= TACLR;
  148.   TACCR0 = TAR + 500;                       // 50ms                             
  149.   TACTL = TASSEL_1 + MC_1;                  // ACLK, upmode
  150.   
  151.   /* Slow clockwise sequence */
  152.   for(i=0; i<8; i++)
  153.   {
  154.       P1OUT = startSequence[i];
  155.       __bis_SR_register(LPM3_bits+GIE);
  156.      
  157.       __delay_cycles(1000000);
  158.       TACCR0 = TAR + 500;   // 50ms                             
  159.   }

  160.   P1OUT = BIT0;
  161.   /* Fast counter-clockwise sequence */
  162.   while(i)
  163.   {
  164.       i--;
  165.       P1OUT = startSequence[i];
  166.       __bis_SR_register(LPM3_bits+GIE);
  167.       TACCR0 = TAR + 500;   // 50ms                             
  168.   }
  169.   TACCTL0 &= ~CCIE;                         // CCR0 interrupt disabled
  170.   P1OUT = 0;                                // Turn off all LEDs
  171. }

  172. /* ----------------GetGesture----------------------------------------------
  173. * Determine immediate gesture based on current & previous wheel position
  174. * ------------------------------------------------------------------------*/
  175. unsigned char GetGesture(unsigned char wheel_position)
  176. {
  177. unsigned char gesture = INVALID_GESTURE, direction, ccw_check, cw_check;
  178. // ******************************************************************************
  179. // gesturing
  180. // determine if a direction/swipe is occuring
  181. // the difference between the initial position and
  182. // the current wheel position should not exceed 8
  183. // 0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F-0...
  184. //
  185. // E-F-0-1-2:  cw, 4
  186. // 2-1-0-F-E: ccw, 4
  187. // A-B-C-D-E-F

  188.   //if(initial_wheel_position == INVALID_WHEEL_POSITION)
  189.   //{
  190.     //gesture = 0;
  191.     //initial_wheel_position = wheel_position;
  192.   //}
  193.   //else

  194.   if(last_wheel_position != ILLEGAL_SLIDER_WHEEL_POSITION)
  195.   {
  196.     if(last_wheel_position  > wheel_position)
  197.     {
  198.       // E-D-C-B-A:  ccw, 4
  199.       // counter clockwise: 0 < (init_wheel_position - wheel_position) < 8
  200.       //                    gesture = init_wheel_position - wheel_position
  201.       //
  202.       // E-F-0-1-2:  cw, 4
  203.       // clockwise:        0 < (init_wheel_position+wheel_position)-16 <8
  204.       //                    
  205.       ccw_check = last_wheel_position  - wheel_position;
  206.       if(ccw_check < 8)
  207.       {
  208.         gesture = ccw_check;
  209.         direction = COUNTER_CLOCKWISE;
  210.       }
  211.       else
  212.       {
  213.         // E-F-0-1-2:  cw, 4
  214.         // 16 - 14 + 2 = 4
  215.         cw_check = 16 - last_wheel_position  + wheel_position ;
  216.         if(cw_check < 8)
  217.         {
  218.             gesture = cw_check;
  219.             direction = CLOCKWISE;
  220.         }
  221.       }
  222.     }
  223.     else
  224.     {
  225.       // initial_wheel_position <= wheel_position
  226.       //
  227.       // 2-1-0-F-E: ccw, 4
  228.       // counter clockwise:
  229.       //                    0 < (init_wheel_position+wheel_position)-16 <8
  230.       //                    gesture = init_wheel_position - wheel_position
  231.       //
  232.       // 0-1-2-3-4:  cw, 4
  233.       // clockwise:        0 < (wheel_position - init_wheel_position) < 8
  234.       //   
  235.       cw_check = wheel_position - last_wheel_position ;
  236.       if(cw_check < 8)
  237.       {
  238.         gesture = cw_check;
  239.         direction = CLOCKWISE;
  240.       }
  241.       else
  242.       {
  243.         // 2-1-0-F-E: ccw, 4
  244.         // 16 + 2 - 14 = 4
  245.         ccw_check = 16 + last_wheel_position  - wheel_position ;
  246.         if(ccw_check < 8)
  247.         {
  248.           gesture = ccw_check;
  249.           direction = COUNTER_CLOCKWISE;
  250.         }
  251.       }
  252.     }
  253.   }
  254.   if (gesture == INVALID_GESTURE)
  255.           return gesture;
  256.   if (direction == COUNTER_CLOCKWISE)
  257.     return (gesture + 16);
  258.   else
  259.     return gesture;
  260. }

  261. /* ----------------CapTouchActiveMode----------------------------------------------
  262. * Determine immediate gesture based on current & previous wheel position
  263. *
  264. *
  265. *
  266. *
  267. *
  268. *
  269. *
  270. * -------------------------------------------------------------------------------*/
  271. void CapTouchActiveMode()
  272. {
  273.   unsigned char idleCounter, activeCounter;
  274.   unsigned char gesture, gestureDetected;
  275.   unsigned char centerButtonTouched = 0;
  276.   unsigned int wheelTouchCounter = WHEEL_TOUCH_DELAY - 1;
  277.   
  278.      
  279.   gesture = INVALID_GESTURE;            // Wipes out gesture history
  280.   
  281.   /* Send status via UART: 'wake up' = [0xBE, 0xEF] */  
  282.   SendByte(WAKE_UP_UART_CODE);
  283.   SendByte(WAKE_UP_UART_CODE2);

  284.   idleCounter = 0;      
  285.   activeCounter = 0;
  286.   gestureDetected = 0;
  287.   
  288.   while (idleCounter++ < MAX_IDLE_TIME)
  289.   {  
  290.           /* Set DCO to 8MHz */
  291.           /* SMCLK = 8MHz/8 = 1MHz */
  292.     BCSCTL1 = CALBC1_8MHZ;     
  293.     DCOCTL = CALDCO_8MHZ;
  294.     BCSCTL2 |= DIVS_3;  
  295.     TACCTL0 &= ~CCIE;   
  296.    
  297.     wheel_position = ILLEGAL_SLIDER_WHEEL_POSITION;      
  298.     wheel_position = TI_CAPT_Wheel(&wheel);
  299.    
  300.     /* Process wheel touch/position/gesture  if a wheel touch is registered*/
  301.     /* Wheel processing has higher priority than center button*/
  302.    
  303.     if(wheel_position != ILLEGAL_SLIDER_WHEEL_POSITION)
  304.     {
  305.       centerButtonTouched = 0;
  306.       
  307.       /* Adjust wheel position based: rotate CCW by 2 positions */
  308.       if (wheel_position < 0x08)
  309.       {
  310.          wheel_position += 0x40 - 0x08;
  311.       }
  312.       else
  313.       {
  314.          wheel_position -= 0x08;
  315.             /* Adjust wheel position based: rotate CCW by 2 positions */
  316.       }
  317.       
  318.       wheel_position = wheel_position >>2;  // divide by four
  319.                
  320.       gesture = GetGesture(wheel_position);            
  321.       
  322.       /* Add hysteresis to reduce toggling between wheel positions if no gesture
  323.        * has been TRULY detected. */  
  324.                   
  325.       if ( (gestureDetected==0) && ((gesture<=1) || (gesture==0x11) || (gesture==0x10)))
  326.       {
  327.         if (last_wheel_position != ILLEGAL_SLIDER_WHEEL_POSITION)
  328.             wheel_position = last_wheel_position;
  329.         gesture = 0;
  330.       }
  331.       
  332.       /* Turn on corresponding LED(s) */
  333.       P1OUT = (P1OUT & BIT0) | LedWheelPosition[wheel_position];
  334.       
  335.      
  336.       if ((gesture != 0) && (gesture != 16) && (gesture != INVALID_GESTURE))           
  337.       { /* A gesture has been detected */
  338.         
  339.         if (gestureDetected ==0)
  340.         { /* Starting of a new gesture sequence */
  341.           gestureDetected = 1;
  342.          
  343.           /* Transmit gesture start status update & position via UART to PC */
  344.           SendByte(GESTURE_START);
  345.           SendByte(last_wheel_position + GESTURE_POSITION_OFFSET);
  346.         }
  347.                  
  348.         /* Transmit gesture & position via UART to PC */
  349.         SendByte(gesture);
  350.         SendByte(wheel_position + GESTURE_POSITION_OFFSET);
  351.       }      
  352.       else
  353.         if (gestureDetected==0)
  354.         { /* If no gesture was detected, this is constituted as a touch/tap */
  355.           if (++wheelTouchCounter >= WHEEL_TOUCH_DELAY)
  356.           {
  357.                   /* Transmit wheel position [twice] via UART to PC */
  358.                   wheelTouchCounter = 0;
  359.                   SendByte(wheel_position + WHEEL_POSITION_OFFSET );
  360.                   SendByte(wheel_position + WHEEL_POSITION_OFFSET );
  361.           }
  362.         }
  363.                else
  364.           wheelTouchCounter = WHEEL_TOUCH_DELAY - 1;             
  365.         
  366.       idleCounter = 0;                      // Reset idle counter
  367.       activeCounter++;
  368.       last_wheel_position = wheel_position;
  369.     }
  370.     else   
  371.     { /* no wheel position was detected */
  372.       
  373.       if(TI_CAPT_Button(&middle_button))
  374.       { /* Middle button was touched */   
  375.         if (centerButtonTouched==0)
  376.         {
  377.           /* Transmit center button code [twice] via UART to PC */
  378.           SendByte(MIDDLE_BUTTON_CODE);         
  379.           SendByte(MIDDLE_BUTTON_CODE);
  380.                     
  381.           centerButtonTouched = 1;
  382.          
  383.           P1OUT = (P1OUT&BIT0) ^ BIT0;      // Toggle Center LED
  384.         }
  385.         idleCounter = 0;
  386.       }
  387.       else   
  388.       { /* No touch was registered at all [Not wheel or center button */
  389.         centerButtonTouched = 0;
  390.         P1OUT &= BIT0;      
  391.         if ( (gesture == INVALID_GESTURE) || (gestureDetected ==0))
  392.         { /* No gesture was registered previously */
  393.           if (last_wheel_position  != ILLEGAL_SLIDER_WHEEL_POSITION)
  394.             {
  395.               /* Transmit last wheel position [twice] via UART to PC */
  396.               SendByte(last_wheel_position  + WHEEL_POSITION_OFFSET );
  397.               SendByte(last_wheel_position  + WHEEL_POSITION_OFFSET );
  398.               wheelTouchCounter = WHEEL_TOUCH_DELAY - 1;
  399.             }
  400.         }
  401.          
  402.           if (gestureDetected == 1)
  403.           { /* A gesture was registered previously */
  404.             
  405.             /* Transmit status update: stop gesture tracking [twice] via UART to PC */
  406.             SendByte(GESTURE_STOP);
  407.             SendByte(GESTURE_STOP);
  408.           }
  409.          
  410.       }
  411.       
  412.       // Reset all touch conditions, turn off LEDs,
  413.       last_wheel_position= ILLEGAL_SLIDER_WHEEL_POSITION;      
  414.       gesture = INVALID_GESTURE;
  415.       gestureDetected = 0;

  416.     }
  417.    
  418.   /* ------------------------------------------------------------------------
  419.    * Option:
  420.    * Add delay/sleep cycle here to reduce active duty cycle. This lowers power
  421.    * consumption but sacrifices wheel responsiveness. Additional timing
  422.    * refinement must be taken into consideration when interfacing with PC
  423.    * applications GUI to retain proper communication protocol.
  424.    * -----------------------------------------------------------------------*/
  425.      
  426.   }
  427. }


  428. void main(void)
  429. {   

  430.   WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
  431.   
  432.   InitLaunchPadCore();
  433.    
  434.   
  435.   /* Set DCO to 1MHz */
  436.   /* Set SMCLK to 1MHz / 8 = 125kHz */
  437.   BCSCTL1 = CALBC1_1MHZ;               
  438.   DCOCTL = CALDCO_1MHZ;
  439.   BCSCTL2 |= DIVS_3;
  440.   /* Establish baseline for the proximity sensor */  
  441.   TI_CAPT_Init_Baseline(&proximity_sensor);
  442.   TI_CAPT_Update_Baseline(&proximity_sensor,5);
  443.   
  444.   while (1)
  445.   {
  446.     CapTouchIdleMode();  
  447.   
  448.     MeasureCapBaseLine();
  449.     LedStartUpSequence();
  450.     CapTouchActiveMode();
  451.   }
  452. }
复制代码
0条回答

一周热门 更多>