📄 main.c
字号:
/**************************************************************************************************
** 版权: 杭州利尔达科技有限公司
** 文件名: 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 + -