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

📄 main.c

📁 利用MSP430F2274代触摸控制的及无线模块的演示程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************************************
** 版权:      杭州利尔达科技有限公司
** 文件名:    main.c
** 版本:     v1.0
** 工作环境: IAR Embedded Workbench v3.41
** 作者:     wxy
** 生成日期: 2007-05-15
** 功能:     CC2500触摸按键控制板
** 相关文件: 
** 修改日志:
**************************************************************************************************/
#include "include.h" 

/**************************************************************************************************
**宏定义
**************************************************************************************************/
#define flg_rx_state      0x01
#define flg_rx_finished   0x02
#define flg_beep_on       0x04

#define Num_Of_Key 5			         // 按键个数
#define Max_Key_Threshold  120		 // 按键阀值
#define basic_cap_adjust_cycle 32	 // 基本电容调节周期

/**************************************************************************************************
**LED接口控制定义
**************************************************************************************************/
#define LED1_BIT  BIT7
#define LED2_BIT  BIT6
#define LED3_BIT  BIT5
#define LED4_BIT  BIT4
#define LED5_BIT  BIT3
#define LED_BITS (LED1_BIT + LED2_BIT + LED3_BIT + LED4_BIT + LED5_BIT)

#define LED_PORT_DIR P4DIR
#define LED_PORT_OUT P4OUT
#define LED_ALL_OFF LED_PORT_OUT |= LED_BITS
#define LED_ALL_ON  LED_PORT_OUT &= ~LED_BITS

/**************************************************************************************************
**蜂鸣器接口控制定义
**************************************************************************************************/
#define BEEP_BIT BIT3
#define BEEP_PORT_DIR P2DIR
#define BEEP_PORT_OUT P2OUT

#define BEEP_ON  BEEP_PORT_OUT |=  BEEP_BIT
#define BEEP_OFF BEEP_PORT_OUT &= ~BEEP_BIT

#define BEEP_EN  TACCTL1 = CCIE; TACCR1 = TAR + 60000;\
                 BEEP_ON;

/**************************************************************************************************
**常量定义
**************************************************************************************************/
const unsigned char LED_DISP_TABLE[5] = {LED1_BIT, LED2_BIT, LED3_BIT, LED4_BIT, LED5_BIT};
const unsigned char Key_Port[6] = {1 , 2 , 4 , 8 , 16, 32 };

/**************************************************************************************************
**变量定义
**************************************************************************************************/
extern char paTable[];
extern char paTableLen;
__no_init  char rxBuffer[6] @ 0x200; // 数据发送缓存

unsigned char sum;
unsigned char system_state;

unsigned long TagIdBuffer[5];   // 无线卡片ID缓存
unsigned char TagConter;        // 接收到的无线卡片个数计数器

unsigned int Timer_Count;
unsigned int Key_Capacitance_Basic[Num_Of_Key];
  signed int Key_Capacitance_Filter[Num_Of_Key];
unsigned char key_rise_times[Num_Of_Key]={0};
unsigned char key_down_times[Num_Of_Key]={0};
unsigned char key_data;
unsigned char key_pressed=0;	 

/**************************************************************************************************
**函数原型声明
**************************************************************************************************/
void TagIdProc (char *idbuf);
unsigned int measure_key_capacitance(unsigned int Key_Num);
void touchkey_init(void);
int scan_key(char key, char times);
unsigned char scan_result(void);
void cap_adjust(void);

/**************************************************************************************************
**函数名称:void main (void)
**入口参数:无
**出口参数:无
**功能描述:主循环函数
**************************************************************************************************/
void main (void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // 停止看门狗
      
  IFG1 &= ~OFIFG;                          // 清除晶振失效标志  

	LED_ALL_OFF;
  LED_PORT_DIR |= LED_BITS;
  BEEP_OFF;
  BEEP_PORT_DIR |= BEEP_BIT;
  
  TI_CC_SPISetup();                         // 初始化 SPI 接口 
  TI_CC_PowerupResetCCxxxx();               // 复位 CC2500
  writeRFSettings();                        // 写配置寄存器 
  TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, paTable, paTableLen);  

  
  TI_CC_GDO2_PxIES |= TI_CC_GDO2_PIN;       // 下降沿中断
  TI_CC_GDO2_PxIFG &= ~TI_CC_GDO2_PIN;      // 清除中断标志微
  TI_CC_GDO2_PxIE |= TI_CC_GDO2_PIN;        // 使能中断
     
  TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);         //转换CC2500为空闲状态
  TI_CC_SPIStrobe(TI_CCxxx0_SRX);           //转换cc2500处于接收状态
  system_state |= flg_rx_state;
  
  touchkey_init();
  _EINT();           
  
  BEEP_EN;
  
  while(1)
  { 
    LPM0;
    _NOP(); 
    if(system_state & flg_rx_finished)
    {
      system_state &= ~flg_rx_finished;
      _NOP();
                 
      sum = rxBuffer[0] + rxBuffer[1] + rxBuffer[2] + rxBuffer[3];
	  	if(sum == rxBuffer[4])
	    {       
			  P1IE &=~ TI_CC_GDO2_PIN;  
        TagIdProc(&rxBuffer[0]);
        P1IE |= TI_CC_GDO2_PIN; 
			}          
    }
    
    key_data = scan_result();
    if(key_pressed ==0)		 
    {
      key_pressed=1;
    	switch(key_data)
    	{	
    	  case 0x00:		                  // 无按键按下
      		key_pressed=0;			
   		    break;	
    	  case 0x01:		                  // key5按下 	
		      P4OUT |= BIT3;
          if (TagIdBuffer[4] != 0)
          {
            TagConter--;
            TagIdBuffer[4] = 0;
          }
          system_state |= flg_beep_on;
		      break;
    	  case 0x01<<1:		                // key4按下 
		      P4OUT |= BIT4;
          if (TagIdBuffer[3] != 0)
          {
            TagConter--;
            TagIdBuffer[3] = 0;
          }
          system_state |= flg_beep_on;
		      break;
    	  case 0x01<<2:		                // key3按下 
		      P4OUT |= BIT5;
          if (TagIdBuffer[2] != 0)
          {
            TagConter--;
            TagIdBuffer[2] = 0;
          }
          system_state |= flg_beep_on;
		      break;
    	  case 0x01<<3:		                 // key2按下
		      P4OUT |= BIT6;
          if (TagIdBuffer[1] != 0)
          {
            TagConter--;
            TagIdBuffer[1] = 0;
          }
          system_state |= flg_beep_on;
		      break;
    	  case 0x01<<4:		                  // key1按下
		      P4OUT |= BIT7;
          if (TagIdBuffer[0] != 0)
          {
            TagConter--;
            TagIdBuffer[0] = 0;
          }
          system_state |= flg_beep_on;
		      break;	
    	  default:		                        //多个按键按下
	  	  break;
    	} 
    }
    else			                      
    {
      if(key_data==0)		                    
	    {
	      key_pressed=0;		
	    }
    }
    
    if (system_state & flg_beep_on)
    {
      system_state &= ~flg_beep_on;
      BEEP_EN
    }
    cap_adjust();		                       // 电容值调节
    
  }  
}

/**************************************************************************************************
**函数名称:void TagIdProc (char *idbuf)
**入口参数:idbuf: 当前接收到的卡片的ID号
**出口参数:无
**功能描述:判断接收到的ID号并点亮相应的LED
**************************************************************************************************/
void TagIdProc (char *idbuf)
{
  unsigned char i;
  unsigned long *pid;
  
  pid = (unsigned long*)idbuf;
  
  for (i = 0; i < 5; i++)
  {
    if (TagIdBuffer[i] == *pid)
    {
      LED_PORT_OUT ^= LED_DISP_TABLE[i];
      return;
    }
  }
  
  if (i >= 5)
  {
    if (TagConter < 5)   // 判断是否还有空闲通道
    { 
      for (i = 0; i < 5; i++)
      {
        if (TagIdBuffer[i] == 0)
        {
          TagConter++;
          TagIdBuffer[i] = *pid;
          LED_PORT_OUT ^= LED_DISP_TABLE[i]; 
          return;
        }
      }
    }
  }
}

/**************************************************************************************************
**函数名称:unsigned int measure_key_capacitance(unsigned int Key_Num)
**入口参数:Key_Num:按键编号
**出口参数:测量的电容值
**功能描述:测量当前按键的电容值
**************************************************************************************************/
unsigned int measure_key_capacitance(unsigned int Key_Num)
{
  unsigned char Active_Key,Partner_Key;
  unsigned int Sum;
  Active_Key = Key_Port[Key_Num];
  Partner_Key = Key_Port[Key_Num ^ 1];
  
  P1OUT |= Active_Key;
  
  _NOP();

⌨️ 快捷键说明

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