淦,搞了好久,这逻辑我理解不了啊啊啊啊啊
#include "stm32f10x.h"
#include "LED.h"
#include "delay.h"
#include "tim.h"
#include "usart.h"
#include "icap.h"
void tpadHandler(uint16_t prer,uint16_t value);
void tpadInitVal(void);
u16 TPAD_Get_Val(void);
void TPAD_Reset();
u16 TPAD_Get_MaxVal(u8 n);
u8 TPAD_Scan(u8 mode);
u16 TPAD_ARR_MAX_VAL=0xFFFF;
int main(void)
{
u8 t=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();
LED_Init();
uart_init(115200);
tpadHandler(6-1,TPAD_ARR_MAX_VAL);
tpadInitVal();
while(1)
{
if(TPAD_Scan(0))
{
LED0=~LED0;
}
t++;
if(t==15)
{
t=0;
LED1=~LED1;
}
delay_ms(10);
}
}
void tpadHandler(uint16_t prer,uint16_t value)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_ICInitTypeDef TIM_ICInitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
TIM_TimeBaseInitStruct.TIM_Prescaler=prer;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=value;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseInitStruct);
TIM_ICInitStruct.TIM_Channel=TIM_Channel_2;
TIM_ICInitStruct.TIM_ICFilter= 0x03;
TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInit(TIM5,&TIM_ICInitStruct);
TIM_Cmd(TIM5,ENABLE);
}
vu16 tpad_default_val=0;
void tpadInitVal(void)
{
u16 buf[10];
u16 temp=0;
u8 k=0;
int i=0;
int j=0;
int h=0;
for(h=0;h<=10;h++)
{
buf[h]=TPAD_Get_Val();
delay_ms(10);
}
for(i=0;i<10;i++)
{
for( j=i+1;j<10;j++)
{
if(buf[i]<buf[j])
{
u16 temp1=0;
temp1=buf[i];
buf[i]=buf[j];
buf[j]=temp1;
}
}
}
for(k=2;k<8;k++)
{
temp+=buf[k];
}
tpad_default_val=temp/6;
printf("tpad_default_val:%d\r\n",tpad_default_val);
}
u16 TPAD_Get_Val(void)
{
TPAD_Reset();
while(TIM_GetFlagStatus(TIM5,TIM_IT_CC2 ))
{
if(TIM_GetCounter(TIM5)>=TPAD_ARR_MAX_VAL-500)
{
return TIM_GetCounter(TIM5);
}
}
return TIM_GetCapture2(TIM5);
}
void TPAD_Reset()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
delay_ms(10);
TIM_SetCounter(TIM5, 0);
TIM_ClearITPendingBit(TIM5, TIM_IT_CC2|TIM_IT_Update);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
#define TPAD_GATE_VAL 100
u8 TPAD_Scan(u8 mode)
{
static u8 keyen=0;
u8 res=0;
u8 sample=3;
u16 rval;
if(mode)
{
sample=6;
keyen=0;
}
rval=TPAD_Get_MaxVal(sample);
if(rval>(tpad_default_val+TPAD_GATE_VAL))
{
if(keyen==0)res=1;
keyen=3;
}
if(keyen)keyen--;
return res;
}
u16 TPAD_Get_MaxVal(u8 n)
{
u16 temp=0;
u16 res=0;
while(n--)
{
temp=TPAD_Get_Val();
if(temp>res)
{
res=temp;
}
}
return res;
}
|