亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? f2013-touchkey.c

?? 這寫C源代碼是MSP430單片機的應用程序
?? C
字號:
//******************************************************************************
//   MSP430xG461x Demo -Touchpad demonstration for the "4" on the 2006 ATC board.
//
//   Description: A program for the MSP430FG4619 on the 2006 ATC board 
//   to accept I2C information from the touchpad,display it numerically
//   on the LCD, and send it to a host PC for graphical display.This demo
//   connects two MSP430's via the I2C bus. The masterreceives one byte 
//   from the slave. This is the master code. It receivesa single byte as
//   soon as a button connected on P1.0 was pressed.   
//   ACLK = 32kHz, MCLK = SMCLK = TACLK = BRCLK = 1MHz
//
//  THIS IS THE MASTER CODE
//
//                MSP430F2013                 MSP430xG461x
//                    slave                       master
//              -----------------           ------------------
//            -|XIN      SDA/P1.7|<------->|P3.1/UCB0SDA    XIN|-
//       32kHz |                 |         |                   | 32kHz
//            -|XOUT             |         |               XOUT|-
//             |         SCL/P1.6|<------->|P3.2/UCB0SCL   P2.4|----
//             |                 |         |                   | 9600
//             |                 |         |               P2.5|----
//  Note: internal pull-ups are used in this example for SDA & SCL
//
//   FengLF
//   LSD SCIENCE& TECHNOLOGY CO.,LTD 
//   2007.07
//   Built with IAR Embedded Workbench Version: 3.42A
//******************************************************************************
#include  <stdint.h>
#include  <stdlib.h>
#include  <msp430x20x3.h>

#define FALSE 0
#define TRUE (!FALSE)

typedef struct
{
  unsigned char port;
  unsigned char port_bit;
  int threshold;
} key_line_config_data_t;

typedef struct
{
  int base_capacitance;
  int filtered;
} key_line_data_t;

#define ADAPTION_RATE           1000
#define ADAPTION_RATIO          50
#define KEY_DOWN_THRESHOLD      12
#define KEY_UP_THRESHOLD        12
#define NUM_KEYS    	        16
#define NUM_LINES    	        8
#define DIRECTIONAL_HYSTERESIS  6
const key_line_config_data_t key_line_config[NUM_LINES] =
{
  {1, BIT0, 40},
  {1, BIT1, 40},
  {1, BIT2, 40},
  {1, BIT3, 40},
  {1, BIT4, 40},
  {1, BIT5, 40},
  {2, BIT6, 40},
  {2, BIT7, 40},
};

const uint8_t map_key_to_sense[NUM_KEYS] =
{
  2, 3, 1, 6,
  5, 2, 7, 6,
  1, 4, 3, 0,
  5, 4, 0, 7
};

const uint8_t map_sense_to_key[NUM_KEYS][2] =
{
  {11, 14},
  {2, 8},
  {0, 5},
  {1, 10},
  {9, 13},
  {4, 12},
  {3, 7},
  {6, 15}
};

key_line_data_t key_line[NUM_LINES];
unsigned int timer_count;
void usi_i2c_init(void);
void send_to_host(int position);
uint8_t test_seq_data = 0;
uint8_t host_data = 0;
void init_key(key_line_data_t *key_line, const key_line_config_data_t *key_line_config)
{
  key_line->base_capacitance = 0;
   key_line->filtered = 0;
   if (key_line_config->port == 1)
   {
     P1OUT &= ~key_line_config->port_bit;
     P1DIR |= key_line_config->port_bit;
     P1IES |= key_line_config->port_bit;
   }
   else
   {
     P2OUT &= ~key_line_config->port_bit;
     P2DIR |= key_line_config->port_bit;
     P2IES |= key_line_config->port_bit;
   }
}

unsigned int measure_key_capacitance(int key_no)
{
  char active_key;
  const key_line_config_data_t *keyp;
  const key_line_config_data_t *partner;
  int sum;
  keyp = &key_line_config[key_no];
  partner = &key_line_config[key_no ^ 1];
  active_key = keyp->port_bit;
  if (keyp->port == 1)
    P1OUT |= active_key;
  else
    P2OUT |= active_key;
  _NOP();
  _NOP();
  _NOP();
  if (keyp->port == 1)
  {
    P1IES |= active_key;
    P1IE |= active_key;
    P1DIR &= ~active_key;
  }
  else
  {
    P2IES |= active_key;
    P2IE |= active_key;
    P2DIR &= ~active_key;
  }
  timer_count = TAR;
  LPM0;
  if (keyp->port == 1)
  {
    P1IE &= ~active_key;             // 關中斷
    P1OUT &= ~active_key;            // 輸出低電平
    P1DIR |= active_key;             // 輸出方向
  }
  else
  {
    P2IE &= ~active_key;             // 關中斷
    P2OUT &= ~active_key;            // 輸出低電平
    P2DIR |= active_key;             // 輸出方向
  }
  sum = timer_count;
  active_key = keyp->port_bit;
  if (partner->port == 1)
    P1OUT |= partner->port_bit;
  else
    P2OUT |= partner->port_bit;
  _NOP();
  _NOP();
  _NOP();
  if (keyp->port == 1)
  {
    P1IES &= ~active_key;           // 下降沿中斷
    P1IE |= active_key;             // 中斷使能
    P1DIR &= ~active_key;           // 輸入方向
  }
  else
    {
      P2IES &= ~active_key;        // 下降沿中斷
      P2IE |= active_key;          // 中斷使能
      P2DIR &= ~active_key;        // 輸入方向
    }
  timer_count = TAR;
  LPM0;
  if (keyp->port == 1)
  {
    P1IE &= ~active_key;           // 關中斷
    P1OUT &= ~active_key;          // 輸出低電平
    P1DIR |= active_key;           // 輸出方向
  }
  else
  {
    P2IE &= ~active_key;           // 關中斷
    P2OUT &= ~active_key;          // 輸出低電平
    P2DIR |= active_key;           // 輸出方向
  }
  if (partner->port == 1)
    P1OUT &= ~partner->port_bit;
  else
    P2OUT &= ~partner->port_bit;
    sum += timer_count;
    return sum >> 1;
}

int scan_keys(void)
{
  int i;
  int margin;
  for (i = 0;  i < NUM_LINES;  i++)
  {
    margin = measure_key_capacitance(i) - key_line[i].base_capacitance;
    key_line[i].filtered += (margin - (key_line[i].filtered >> 4));
  }
  return 0;
}

int last_peak = -100;
long int aaa;
long int bbb;
int min;
int grass_level;

void xxxx(int line, int key)
{
  if ((key_line[line].filtered - min) > grass_level)
  {
    aaa += (key_line[line].filtered - min);
    bbb += key*(key_line[line].filtered - min);
  }
}

int find_finger_position(void)
{
  int i;
  int j;
  int k;
  int l;
  long int a;
  long int b;
  int max;
  int max_pos;
  min = 32767;
  max = -32768;
  max_pos = -1;
  for (i = 0;  i < NUM_LINES;  i++)
  {
    if (key_line[i].filtered < min)
      min = key_line[i].filtered;
    if (key_line[i].filtered > max)
    {
      max = key_line[i].filtered;
      max_pos = i;
    }
  }
  if (max < 100)   
    return -1;
  grass_level = (max - min) >> 3;
  i = map_sense_to_key[max_pos][0];
  j = map_sense_to_key[max_pos][1];
  if (abs(last_peak - j) > abs(last_peak - i))
  {
    if (last_peak < 12  ||  i != 2)
      j = i;
  }
  aaa = 0;
  bbb = 0;
  if (last_peak >= 12  &&  i == 2)
  {
    last_peak = 13;
    xxxx(4, 13);
    xxxx(1, 14);
    xxxx(0, 15);
  }
  else
  {
    last_peak = j;
     k = j - 1;
     if (k < 0)
       k = 0;
     l = j + 1;
     if (l >= NUM_KEYS)
       l = NUM_KEYS - 1;
     for (i = k;  i <= l;  i++)
     {
       j = map_key_to_sense[i];
       xxxx(j, i + 1);
     }
  }
  a = aaa;
  b = bbb;
  b /= (a >> 4);
  b -= 16;
  if (b < 0)
    b = 0;
  return b;
}

int last_position = 0;
int new_position = 0;
int button_down = 0;

void main(void)
{
  int i;
  WDTCTL = WDTPW | WDTHOLD;
  BCSCTL3 = LFXT1S_2;
  BCSCTL1 = CALBC1_16MHZ;               
  DCOCTL = CALDCO_16MHZ;
  _BIS_SR(OSCOFF);
  P1OUT = 0;
  P1DIR = 0xFF;
  P1SEL = 0;
  P1REN = 0;
  P2OUT = 0;
  P2DIR = 0xFF;
  P2SEL = 0;
  P2REN = 0;
  usi_i2c_init();
  _EINT();

#if 0
  for (;;)
  {
    send_to_host(test_seq_data++);
    for (i = 0; i < 15000; i++)
      _NOP();
  }
#endif
  for (i = 0;  i < NUM_LINES;  i++)
    init_key(&key_line[i], &key_line_config[i]);
  TACTL = TASSEL_2 | MC_2 | ID_3;
  for (i = 0;  i < 100;  i++)
    scan_keys();
  for (i = 0;  i < NUM_LINES;  i++)
  {
    key_line[i].base_capacitance = key_line[i].filtered >> 4;
    key_line[i].filtered = 0;
  }
  for (;;)
  {
    scan_keys();
    if ((new_position = find_finger_position()) >= 0)
    {
      if (new_position > last_position + DIRECTIONAL_HYSTERESIS
          ||
            new_position < last_position - DIRECTIONAL_HYSTERESIS)
      {
        if (new_position > last_position)
          last_position = new_position - (DIRECTIONAL_HYSTERESIS - 1);
        else
          last_position = new_position + (DIRECTIONAL_HYSTERESIS - 1);
        if (new_position < 240)
          send_to_host(new_position);
        else
          send_to_host(239);
      }
    }
    else
    {
      last_position = -100;
    }
  }
}

#pragma vector=PORT1_VECTOR
__interrupt void port_1_interrupt(void)
{
  P1IFG = 0;                                // 清中斷標志位
  timer_count = TAR - timer_count;          // 記錄電容放電時間
  LPM3_EXIT;                                // 退出低功耗
}

#pragma vector=PORT2_VECTOR
__interrupt void port_2_interrupt(void)
{
  P2IFG = 0;                                // 清中斷標志位
  timer_count = TAR - timer_count;          // 記錄電容放電時間
  LPM3_EXIT;                                // 退出低功耗
}

#pragma vector=TIMERA0_VECTOR
__interrupt void timera0_interrupt(void)
{
  LPM3_EXIT;
}

#pragma vector=TIMERA1_VECTOR
__interrupt void timera1_interrupt(void)
{
    switch (TAIV)
    {
    case 2:
        LPM3_EXIT;
        break;
    }
}


const uint8_t SLV_Addr = 0x48;                       // I2C從機地址 0x48 
int8_t I2C_state = -2;                               

void send_to_host(int data)
{
  host_data = data;                            
  I2C_state = 0;
  USICTL1 |= USIIFG;                               // 置標志位
  do
    LPM0;
  while (I2C_state >= 0);
}

void usi_i2c_init(void)
{
  P1OUT |= (BIT7 | BIT6);                         // P1.6、P1.7設置成I2C功能
  P1REN |= (BIT7 | BIT6);                         // 使能 SDA、SDL
  USICTL0 = USIPE6 | USIPE7 | USIMST | USISWRST;  // 設置成 I2C模式
  USICTL1 = USII2C | USIIE;                       // 使能I2C模式,開中斷
  USICKCTL = USIDIV_7 | USISSEL_2 | USICKPL;      // 設置 USI 時鐘  SCL = SMCLK/128 (~125kHz) 
  USICNT |= USIIFGCC;                             // 禁止自動清標志位
  USICTL0 &= ~USISWRST;                           // 使能 USI 
  USICTL1 &= ~USIIFG;                             // 清標志位
}

#pragma vector = USI_VECTOR
__interrupt void USI_TXRX(void)
{
  switch (__even_in_range(I2C_state, 10))
  {
  case 0:
    P1OUT |= 0x01;                      
    USISRL = 0x00;                      // 產生起始條件 
    USICTL0 |= (USIGE | USIOE);         // 輸出使能
    USICTL0 &= ~USIGE;                  // 關閉輸出鎖存
    USISRL = SLV_Addr << 1;              
    USICNT = (USICNT & 0xE0) + 0x08;    // 8位數據
    I2C_state = 2;                      // 跳轉到下一個狀態
    break;
  case 2:
    USICTL0 &= ~USIOE;                  // SDA輸入
    USICNT |= 0x01;                     // 數據長度為1 ,復位狀態
    I2C_state = 4;                      // 跳轉到下一個狀態
    break;
  case 4:
    USICTL0 |= USIOE;                   // SDA 輸出使能
    if (USISRL & 0x01)
    {
      USISRL = 0x00;                    // 寫入數據0
      USICNT |=  0x01;                  // SCL 高, SDA 低
      I2C_state = 10;                   // 跳轉到下一個狀態
      P1OUT |= 0x01;                    // 關閉 LED 
    }
    else
    {
      USISRL = host_data;               // 發送數據到從機
      USICNT |=  0x08;                  // 8 位數據,開始發送
      I2C_state = 6;                    // 跳轉到下一個狀態
      P1OUT &= ~0x01;                   // 關閉 LED
    }
    break;
  case 6:
    USICTL0 &= ~USIOE;                  // SDA 輸入,接收數據
    USICNT |= 0x01;                     // 1 位數據,開始接收
    I2C_state = 8;                      // 跳轉到下一個狀態
    break;
  case 8:
    USICTL0 |= USIOE;
    if (USISRL & 0x01)
    {
    }
    else
    {
    }
    USISRL = 0x00;
    USICNT |=  0x01;                    // 1 位數據 SCL 高, SDA 低
    I2C_state = 10;                     // 跳轉到下一個狀態
    break;
  case 10: 
    USISRL = 0x0FF;                     // USISRL = 1  
    USICTL0 |= USIGE;                   // 輸出使能
    USICTL0 &= ~(USIGE | USIOE);        // 禁止輸出鎖存、發送
    I2C_state = -2;                     // 狀態復位,準備下次發送數據
    LPM0_EXIT;                          // 退出低功耗
    break;
  }
  USICTL1 &= ~USIIFG;                   // 清標志位 USIIFG
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天堂va蜜桃一区二区三区| 免费看日韩精品| 成人免费视频视频| 久久综合九色综合欧美亚洲| 免费不卡在线观看| 3atv在线一区二区三区| 亚洲一区二区三区爽爽爽爽爽 | 一区二区三区视频在线看| 高清av一区二区| 国产欧美精品一区二区色综合 | 欧美激情综合五月色丁香| 久久99国产精品久久| 欧美一区二区不卡视频| 五月激情六月综合| 欧美日韩情趣电影| 午夜成人免费电影| 欧美精品777| 日韩精品一二三区| 91麻豆精品国产91久久久使用方法| 亚洲一区二区影院| 欧美无乱码久久久免费午夜一区| 亚洲一区二区视频在线观看| 在线看国产日韩| 久久久久久影视| 国产精品123| 中文在线资源观看网站视频免费不卡| 成人激情校园春色| 中文字幕一区二区三区av| 99精品视频在线观看| 亚洲欧美欧美一区二区三区| 91麻豆国产香蕉久久精品| 亚洲视频狠狠干| 欧美自拍偷拍一区| 偷拍与自拍一区| 日韩欧美色综合网站| 国产精品77777| 亚洲色图丝袜美腿| 欧美视频一区二区三区四区| 亚洲国产精品久久人人爱蜜臀| 欧美精品视频www在线观看| 青青草97国产精品免费观看无弹窗版| 日韩欧美卡一卡二| 国产精品乡下勾搭老头1| 国产精品久久久久婷婷 | 国产v综合v亚洲欧| 亚洲伦理在线免费看| 欧美日韩成人综合在线一区二区 | 免费国产亚洲视频| 久久久亚洲精品一区二区三区| 成人亚洲一区二区一| 亚洲老妇xxxxxx| 欧美精品色一区二区三区| 国内精品在线播放| 综合在线观看色| 欧美日本精品一区二区三区| 国模少妇一区二区三区| 亚洲色欲色欲www| 欧美人牲a欧美精品| 国产一区二区91| 亚洲欧美日韩国产一区二区三区 | 久久美女艺术照精彩视频福利播放| 成人av网站在线| 亚洲高清中文字幕| 久久一区二区三区国产精品| 91免费国产视频网站| 人人精品人人爱| 国产精品传媒入口麻豆| 69精品人人人人| 成人av影视在线观看| 天天综合色天天综合色h| 国产欧美综合在线| 欧美色综合久久| 国产高清精品久久久久| 亚洲高清一区二区三区| 欧美国产精品一区| 欧美日本高清视频在线观看| 成人激情文学综合网| 免费观看91视频大全| 成人欧美一区二区三区白人| 日韩一卡二卡三卡国产欧美| 99精品一区二区| 国模一区二区三区白浆| 亚洲永久精品大片| 精品久久久久久亚洲综合网 | 欧美日韩一区二区电影| 国产精品123| 日韩成人午夜精品| 18涩涩午夜精品.www| 欧美成人精品1314www| 色呦呦一区二区三区| 国产一级精品在线| 视频一区二区三区在线| 国产精品成人免费精品自在线观看| 日韩久久久精品| 欧美色男人天堂| bt欧美亚洲午夜电影天堂| 韩国女主播成人在线观看| 亚洲不卡av一区二区三区| 欧美国产视频在线| 欧美大黄免费观看| 欧美精品第1页| 色老汉一区二区三区| 国产91精品一区二区麻豆网站| 日本午夜一区二区| 亚洲小说春色综合另类电影| 国产精品夫妻自拍| 久久精品人人做人人爽人人| 91精品国产福利| 欧美色中文字幕| 色悠久久久久综合欧美99| 成人免费高清在线| 国产在线观看一区二区| 日本一区中文字幕| 午夜久久电影网| 亚洲综合色噜噜狠狠| 国产精品二三区| 国产精品色婷婷久久58| 26uuu国产在线精品一区二区| 51精品国自产在线| 在线观看日韩电影| 91原创在线视频| 972aa.com艺术欧美| 国产成人av电影在线观看| 国内成人自拍视频| 精品无人码麻豆乱码1区2区 | 岛国一区二区在线观看| 国产主播一区二区| 免费成人在线网站| 免费成人在线影院| 麻豆国产精品一区二区三区| 视频精品一区二区| 五月综合激情婷婷六月色窝| 亚洲一区二区三区在线播放| 亚洲精品国产a| 亚洲激情校园春色| 亚洲精品国产精华液| 亚洲欧洲中文日韩久久av乱码| 亚洲视频精选在线| 一区二区三区中文在线| 亚洲一区二区五区| 日韩高清在线不卡| 日韩福利电影在线观看| 亚洲成人综合视频| 天堂午夜影视日韩欧美一区二区| 亚洲午夜免费电影| 日韩电影在线免费看| 青青草97国产精品免费观看 | 在线免费观看不卡av| 欧美性xxxxx极品少妇| 欧美丝袜自拍制服另类| 欧美精品日韩一本| 日韩一区二区视频在线观看| 日韩精品一区二区三区三区免费| 精品日产卡一卡二卡麻豆| 精品久久久久久最新网址| 国产午夜亚洲精品午夜鲁丝片| 国产亚洲综合在线| 国产精品色哟哟| 亚洲激情欧美激情| 丝袜国产日韩另类美女| 免费成人在线视频观看| 国产精品一区在线观看乱码 | 国产精品一区2区| 成人理论电影网| 色综合天天做天天爱| 欧美日韩黄色影视| 精品欧美一区二区三区精品久久| 久久久久久亚洲综合| 国产精品国产馆在线真实露脸 | 99久久久国产精品免费蜜臀| 91久久线看在观草草青青| 欧美高清你懂得| 精品国产91洋老外米糕| 中文字幕在线观看不卡视频| 亚洲国产一区二区三区| 狂野欧美性猛交blacked| 丰满放荡岳乱妇91ww| 色噜噜狠狠成人网p站| 欧美一个色资源| 国产精品天美传媒沈樵| 亚洲欧美色综合| 麻豆精品国产91久久久久久| 成人永久看片免费视频天堂| 欧美在线小视频| 亚洲精品一区二区三区影院| 亚洲欧洲日产国码二区| 日韩精品一级二级| 成人av网站大全| 欧美日韩三级视频| 国产欧美日韩精品在线| 亚洲超碰精品一区二区| 福利电影一区二区三区| 欧美日韩另类一区| 国产亚洲精品7777| 亚洲线精品一区二区三区八戒| 国内精品自线一区二区三区视频| 色av一区二区| 久久精品在线观看| 亚洲第四色夜色| 国产91高潮流白浆在线麻豆|