⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fg439_pwm_adc.c

📁 TI MSP430针对cap sense 按键的源码, 可实现单击或滑动键, 如IPOD上的人机接口.
💻 C
字号:
//  MSP430xG439 software ADC demo
//
//  Description: This codes generates a PWM signal, and adjusts its ratio until a heavily low pass
//               filtered version of the signal (i.e. its equivalent DC value) matches a DC signal to
//               be measured. The match is detected using comparator A.
//
//
//                                T.I.                  T.I.
//                           MSP430xG43x MCU  STK/EVK 6.5 digit 4 mux LCD
//                                                    #T218010
//                           ---------------       --------------
//                          |          COM3 |-----|2    COM4     |
//                          |          COM2 |-----|1    COM3     |
//                          |          COM1 |-----|3    COM2     |
//                          |          COM0 |-----|4,20 COM1     |
//                          |          SEG0 |-----|19            |
//                          |          SEG1 |-----|18            |
//                          |          SEG2 |-----|17            |
//  signal to be measured-->|CA1       SEG3 |-----|16            |
//                          |          SEG4 |-----|15            |
//                   +-470k-|P2.0      SEG5 |-----|14            |
//                   |      |          SEG6 |-----|13            |
//                   +----- |CA0       SEG7 |-----|12            |
//                   |      |          SEG8 |-----|11            |
//                  ===.047 |          SEG9 |-----|10            |
//                   |      |          SEG10|-----|9             |
//                   ------ |VSS       SEG11|-----|8             |
//                          |          SEG12|-----|7             |
//                          |          SEG13|-----|6             |
//                          |          SEG14|-----|5 (bits C,E,H |
//                          |               |     |   of digit 7)|
//                          |               |      --------------
//                          |            XIN|-
//                          |               | 32768
//                          |           XOUT|-
//                          |               |
//                           ---------------
//
//   Vincent Chan
//   Texas Instruments, Inc
//   Aug 2002

#include <msp430xG43x.h>

#define SEG_a       0x01
#define SEG_b       0x02
#define SEG_c       0x10
#define SEG_d       0x04
#define SEG_e       0x80
#define SEG_f       0x20
#define SEG_g       0x08
#define SEG_h       0x40

//By changing the about definitions appropriately, the follow
//definitions are generic, and may be used for most byte
//addressed displays.

//First blank, and the hex codes, which all display quite
//well on a 7-segment display.
#define CHAR_SPACE	0
#define CHAR_ALL	(SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f|SEG_g|SEG_h)
#define CHAR_0		(SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f)
#define CHAR_1  	(SEG_b|SEG_c)
#define CHAR_2  	(SEG_a|SEG_b|SEG_d|SEG_e|SEG_g)
#define CHAR_3  	(SEG_a|SEG_b|SEG_c|SEG_d|SEG_g)
#define CHAR_4  	(SEG_b|SEG_c|SEG_f|SEG_g)
#define CHAR_5  	(SEG_a|SEG_c|SEG_d|SEG_f|SEG_g)
#define CHAR_6  	(SEG_a|SEG_c|SEG_d|SEG_e|SEG_f|SEG_g)
#define CHAR_7  	(SEG_a|SEG_b|SEG_c)
#define CHAR_8  	(SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f|SEG_g)
#define CHAR_9  	(SEG_a|SEG_b|SEG_c|SEG_d|SEG_f|SEG_g)
#define CHAR_A  	(SEG_a|SEG_b|SEG_c|SEG_e|SEG_f|SEG_g)
#define CHAR_B  	(SEG_c|SEG_d|SEG_e|SEG_f|SEG_g)
#define CHAR_C  	(SEG_a|SEG_d|SEG_e|SEG_f)
#define CHAR_D  	(SEG_b|SEG_c|SEG_d|SEG_e|SEG_g)
#define CHAR_E  	(SEG_a|SEG_d|SEG_e|SEG_f|SEG_g)
#define CHAR_F  	(SEG_a|SEG_e|SEG_f|SEG_g)

char digit[10] =
{
    CHAR_0,  // "0"    LCD segments a+b+c+d+e+f
    CHAR_1,  // "1"
    CHAR_2,  // "2"
    CHAR_3,  // "3"
    CHAR_4,  // "4"
    CHAR_5,  // "5"
    CHAR_6,  // "6"
    CHAR_7,  // "7"
    CHAR_8,  // "8"
    CHAR_9   // "9"
};

extern int Meas_ADC(void);

void main(void)
{
    char *LCD = LCDMEM;
    unsigned int i;

    WDTCTL = WDTPW | WDTHOLD;             // Stop watchdog timer
    SCFI0 |= FN_2;                        // x2 DCO, 4MHz nominal DCO
    FLL_CTL0 = XCAP18PF;                  // set load capacitance for xtal
    SCFQCTL = 74;                         // (74+1) x 32768 = 2.45Mhz

    P1DIR = 0xE7;                         // All P1.x outputs
    P1OUT = 0;                            // All P1.x reset
    P2DIR = 0x00;                         // All P2.x outputs
    P2OUT = 0;                            // All P2.x reset
    P3DIR = 0xFF;                         // All P3.x outputs
    P3OUT = 0;                            // All P3.x reset
    P4DIR = 0xFF;                         // All P4.x outputs
    P4OUT = 0;                            // All P4.x reset
    P5DIR = 0xFF;                         // All P5.x outputs
    P5OUT = 0;                            // All P5.x reset
    P6DIR = 0xFF;                         // All P6.x outputs
    P6OUT = 0;                            // All P6.x reset

    CACTL2 = P2CA0 | P2CA1;               // P2.3+ P2.4-
    CAPD |= CAPD7 | CAPD6;                // disable the input buffer the pins
                                          // associated with CA0 (P1.6) and CA1 (P1.7)
                                          // so large current will not flow through
                                          // the CMOS tansistors.

    // Initialize the LCD driver (4Mux mode)
    LCDCTL = LCDSG0_3 | LCD4MUX | LCDON;                // 4-Mux LCD, segments S0-S23
    P5SEL = BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2;    // Select P5.2-7 as Com and Rxx

    // Clear the LCD memory to clear display
    for (i = 0;  i < 12;  i++)
        LCD[i] = 0;

    BTCTL = BT_fLCD_DIV64 | BT_fCLK2_DIV128 | BT_fCLK2_ACLK_DIV256;

    BTCTL = BT_ADLY_0_5;
    IE2 |= BTIE;                                        // Enable BT interrupt

    P2DIR |= BIT0;                                      // Enable ADC PWM DAC output

    P6SEL |= BIT7;
    P6DIR |= BIT7;
    ADC12CTL0 = ADC12ON | MSC | SHT0_4 | REFON | REF2_5V;   // Turn on the ADC12, and set the sampling time

    /* Configure the DAC to generate an output level which we can measure using the
       soft-ADC. */
    DAC12_1CTL = DAC12CALON | DAC12IR | DAC12AMP_7 | DAC12ENC;
    DAC12_1DAT = 0x800;

    _EINT();

    for (;;)
    {
        _BIS_SR(LPM3_bits);                 // Enter LPM3
        _NOP();
    }
}

#pragma vector=BASICTIMER_VECTOR
__interrupt void basictimer_interrupt(void)
{
    char *LCD = LCDMEM;
    unsigned int i;
    int ADC_sum;

    /* Average 4 readings */
    ADC_sum = 0;
    ADC_sum += Meas_ADC();
    ADC_sum += Meas_ADC();
    ADC_sum += Meas_ADC();
    ADC_sum += Meas_ADC();
    ADC_sum >>= 2;

    /* Display the average reading */
    for (i = 0;  i < 5;  i++)
    {
        LCD[i] = digit[ADC_sum%10];     // remainder = character in table to display
        ADC_sum = ADC_sum/10;           // shifts right so next character can be displayed
    }
    LCD[3] |= SEG_h;                    // Add the decimal point

    /* Step the DAC output level, wrapping to zero at full scale. */
    DAC12_1DAT = (DAC12_1DAT + 1) & 0xFFF;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -