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

📄 subroutine.c

📁 TI公司MSP430单片机实现方形触摸按键的C语言源代码。
💻 C
📖 第 1 页 / 共 2 页
字号:
    return max_position;
 
}

    
//=====================================================================
//函数名称: int find_mean_position(void)
//形参类型: void
//函数类型: int
//函数功能: 获取当前按键值
//=====================================================================
    
int find_mean_position(void)
{
    long v_key_avg;                                                   //按键平均值
    long v_key_cur;                                                   //当前按键值
    long min;                                                         //最小按键值
    long max;                                                         //最大按键值
    int id_pos_key;                                                   //按键的校准编号
    int id_max_pos;                                                   //最大按键值的按键编号
    int key_threshold;                                                //按键阀值
    int i; 
      

    key_threshold=100;                                                 

    min = 32767;                                                      //设置最小电容量的初值
    max = -32768;                                                     //设置最大电容量的初值
    id_max_pos = -1;                                                  //设置最大电容量位置的初值
                             
    for (i = 0;  i < NUM_KEYS;  i++)                                  //查询最小电容量,最大电容量和最大电容量的位置并记录
    {
        if (key[i].filtered < min)
            min = key[i].filtered;
        if (key[i].filtered > max)
        {
            max = key[i].filtered;
            id_max_pos = i;
        }
    }
    
    if (max < key_threshold)                                           // 按键自适应处理
    {                                 
        for (i = 0;  i < NUM_KEYS;  i++)                               
        {
            if(key[i].filtered>0)    
              key[i].adapt+=8;
            else
              key[i].adapt+=-2;
                                   
            if(key[i].adapt>320)
            {  
              ++key[i].base_capacitance;
              key[i].adapt=0;
              key[i].adapter_flag=10;              
            }
            else if(key[i].adapt<-320)
            {
              --key[i].base_capacitance;             
              key[i].adapt=0;   
              key[i].adapter_flag=100;               
            } 
            else
              key[i].adapter_flag=0;
        }
       
        return -1;                                                      //没有按键按下
    }
   
    
    max>>=3;                                                            //设定有用按键阀值                                  

    if (id_max_pos >= 3  &&  id_max_pos <= 9)
     
    {
        v_key_avg = 0;
        v_key_cur = 0;
        for (i = 0;  i < NUM_KEYS;  i++)
        {
            if(key[i].filtered>=max)
            {
            v_key_avg += (key[i].filtered);
            v_key_cur += (i+1) *(key[i].filtered);
            }
        }
        v_key_cur /= (v_key_avg >>4);
       // v_key_cur += 28/id_max_pos;
        if (v_key_cur < 0)
            v_key_avg = 0;
    }
    else
    {
        v_key_avg = 0;
        v_key_cur = 0;
        for (i = 0;  i < NUM_KEYS;  i++)
        {
            id_pos_key=(i + 8) & 0x0f;          
            if(key[id_pos_key].filtered>=max)
            {          
            v_key_avg += (key[id_pos_key].filtered);
            v_key_cur += (i + 1)*(key[id_pos_key].filtered);
            }
        }
        v_key_cur /= (v_key_avg >>4);
        if (v_key_cur < 0)
            v_key_cur = 0;
        else
        {
             v_key_cur =(v_key_cur-(v_key_cur -60)/4)+128;
           // v_key_cur = v_key_cur  & 0xFF;
        }
    }
   /// if(v_key_cur>(reg_last_position+6)||v_key_cur<(reg_last_position-6))
    //{
    //  if
    // v_key_cur = v_key_cur  & 0xFF;
    LCDMEM[1]=digit[((unsigned char)id_max_pos /10) % 10];
    LCDMEM[0]=digit[(unsigned char)id_max_pos  % 10];
    return (int) v_key_cur;
}
//=====================================================================
//函数名称: void Lcd_Display(int reg_key_value)
//型参类型:空
//返回类型:空
//函数功能:把当前键值显示出来
//=====================================================================
void Lcd_Display(int reg_key_value)
{
  unsigned char i;
   if(reg_key_value == -1)                                             // 如果当前没有任何按键按下,则LCD清屏             
   {
      for(i=0;i<8;i++)
        {
          LCDMEM[i]=0;
        }    
   }
   else                                                               // 显示当前键值,0~255,高位在前
   {        
      LCDMEM[0]=digit[( unsigned char)reg_key_value % 10];
      LCDMEM[1]=digit[((unsigned char)reg_key_value /10) % 10];
      LCDMEM[2]=digit[((unsigned char)reg_key_value /100) % 10];
   }
}
  
//=====================================================================
//函数名称:void Uart_Tx(int reg_key_value)
//型参类型:空
//返回类型:空
//函数功能:把当前键值通过模拟串口送给上位机(19200,n,8,1)
//======================================================================
int tmp_reg_key_value;
void Uart_Tx(int reg_key_value)
{
  if(reg_key_value == -1)
  {
    _NOP();
  }
  else
  {
 //   if(reg_key_value<11)
 //   {
 //     if(-255<(reg_key_value-tmp_reg_key_value)<-239 ||-1<(reg_key_value-tmp_reg_key_value)<11 ||-12<(reg_key_value-tmp_reg_key_value)<-1)
//      {
        P6DIR |= 0x01;                            // P6.0 output
    CCTL0 = CCIE;                             // CCR0 interrupt enabled
    CCR0 = 209;
    TACTL = TASSEL_2 + MC_1;                  // SMCLK, continuous mode
    P6OUT =0x01;
    reg_tx=reg_key_value%256;  
    _BIS_SR(LPM0_bits + GIE);  
    CCTL0 &= ~CCIE; 
    TACTL = TASSEL_2 + MC_2;  
    tmp_reg_key_value=reg_key_value;
  //    }
  //  }
    /*
    if(reg_key_value>240)
    {
      if(-255<(reg_key_value-tmp_reg_key_value)<-229 ||-16<(reg_key_value-tmp_reg_key_value)<1 ||-1<(reg_key_value-tmp_reg_key_value)<12)
      {
        P6DIR |= 0x01;                            // P6.0 output
    CCTL0 = CCIE;                             // CCR0 interrupt enabled
    CCR0 = 209;
    TACTL = TASSEL_2 + MC_1;                  // SMCLK, continuous mode
    P6OUT =0x01;
    reg_tx=(unsigned char)reg_key_value;  
    _BIS_SR(LPM0_bits + GIE);  
    CCTL0 &= ~CCIE;
    TACTL = TASSEL_2 + MC_2;  
    tmp_reg_key_value=reg_key_value;
      }
    }
    */
  }
}
//=====================================================================
//函数名称:void Port1_ISR(void)
//型参类型:空
//返回类型:空
//函数功能:读取触摸式按键的充放电时间
//======================================================================
#pragma vector=PORT1_VECTOR
__interrupt void Port1_ISR(void)
{
//  timer_count=TAR-timer_out;
  cnt_time = TAR - cnt_time;
  P1IFG = 0;
  LPM0_EXIT;  
 // _DINT();
}

//=====================================================================
//函数名称:void Port2_ISR(void)
//型参类型:空
//返回类型:空
//函数功能:读取触摸式按键的充放电时间
//======================================================================

#pragma vector=PORT2_VECTOR
__interrupt void Port2_ISR(void)
{
  cnt_time = TAR - cnt_time;
  P2IFG=0;
  LPM0_EXIT;
}


//=======================================================================
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  //P5OUT ^= 0x02;                            // Toggle P5.1
 // CCR0 += 1667;                            // Add Offset to CCR0
  switch(tx_bit)
  {
  case 1: CCR0 = 209;break;
  case 2: CCR0 = 208;break;
  case 3: CCR0 = 208;break;
  case 4: CCR0 = 208;break;
  case 5: CCR0 = 208;break;
  case 6: CCR0 = 208;break;
  case 7: CCR0 = 208;break;
  case 8: CCR0 = 209;break;  
  default:break;
  }
  if(tx_bit==0)
  {
    P6OUT =0X00;
    CCR0 =209;
    tx_bit++;
  }
  else
  {
    if(tx_bit<9)
    {
       P6OUT=reg_tx & 0X01;
       reg_tx >>=1;
       tx_bit++;
    }
     else
    {
    P6OUT=0X01;
    CCR0=65000;
    //LPM0_EXIT;
    //tmp_reg_tx--;
    //reg_tx =tmp_reg_tx;
    LPM0_EXIT;
    tx_bit=0;
    }
  }
}

⌨️ 快捷键说明

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