📄 subroutine.c
字号:
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 + -