看了STM8的触摸按键库,没耐心看下去,就自己写了一个简易版的单触摸按键程序,经过测试,效果还不错,和大家分享一下,有不足之处,大家讨论
简单说下硬件电路,PD6为触摸按键输入,PG1为测试用LED,PA6,PB7为灵敏度微调输入口 ,用的是500K的充放电电阻
#include "stm8s.h"
#define DC_MOTOR PA5
#define uchar unsigned char
#define uint unsigned int
void TIME3_INIT(void);
void SYSTEM_INIT(void);
#define LED PG1 //测试用LED
u16 i,j;
u16 n;
u16 m=100;
u8 Sensor=15;
u8 sn1=0;
u8 sn2=0;
u16 dalay;
u8 time=0;
void main(void)
{
/*系统初始*/
SYSTEM_INIT();
GPIOA->ODR=0XFF;
TIME3_INIT();//
//enableInterrupts();
GPIOD->CR2=0;
TIM3_Cmd(ENABLE);
m=0;
n=0;
GPIOD->DDR=0XC0;//PD7 PD6 OUTPUT
GPIOD->CR1=0XC0;//推挽输出
GPIOD->ODR=0X80;//PD=0X80;
while(1)
{
if(time>11)//time m为12次测试结果总和
{
if(m>(760+Sensor*2)) //760为阀值,sensor为微调
{
n=5000;//按键延时
{
GPIOG->ODR=0;
}
}
else
{
if(n>0)
{
n--;
}
else
{
GPIOG->ODR=2;
}
}
m=0;
time=0;
}
TIM3->CNTRH=0;
TIM3->CNTRL=0;
GPIOD->CR1=0X80;//PD6 悬浮输入
GPIOD->DDR=0X80;//PD6 INPUT
while(!((GPIOD->IDR)&(0X40)))
{
}
m=TIM3->CNTRL+m;
time++;
GPIOD->DDR=0XC0;//PD7 PD6 OUTPUT
GPIOD->CR1=0XC0;//推挽输出
GPIOD->ODR=0X80;//PD=0X80;
/*微调灵敏度调节*/
if(((GPIOA->IDR)&0X40)==0)
{
if(sn1==1)
{
if( Sensor<30)
Sensor++;
}
sn1=0;
}
else
{
sn1=1;
}
if(((GPIOB->IDR)&0X80)==0)
{
if(sn2==1)
{
if( Sensor>0)
Sensor--;
}
sn2=0;
}
else
{
sn2=1;
}
}
}
/*系统初始化*/
void SYSTEM_INIT(void)
{
/*设置时钟*/
CLK_HSECmd(ENABLE);
CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, DISABLE);
CLK_ClockSwitchCmd(ENABLE);
CLK_ClockSecuritySystemEnable();
CLK->CKDIVR=0;
//设置引脚,输出
GPIO_Init(GPIOG,GPIO_PIN_1,GPIO_MODE_OUT_PP_HIGH_SLOW);//led
GPIO_Init(GPIOE,GPIO_PIN_0,GPIO_MODE_OUT_PP_LOW_SLOW);//OUT 1
GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_LOW_SLOW);//OUT2,3, 4 5 6 7 8
//PE0 1
//PD0 2
//PD2 3
//PD3 4
//PD4 5
//PD5 6
//PD6 7
//PD7 8
GPIO_Init(GPIOA,GPIO_PIN_5,GPIO_MODE_OUT_PP_LOW_SLOW);//DC_PWM
//输入
GPIO_Init(GPIOA,GPIO_PIN_6|GPIO_PIN_4,GPIO_MODE_IN_FL_NO_IT);//IN1,DC_ERROR
GPIO_Init(GPIOB,GPIO_PIN_ALL,GPIO_MODE_IN_FL_NO_IT);//IN2~IN9
GPIO_Init(GPIOE,GPIO_PIN_5,GPIO_MODE_IN_FL_NO_IT);//IN10
GPIO_Init(GPIOC,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,GPIO_MODE_IN_FL_NO_IT);//IN10
//ADC输入通道配置
}
/*计数器初始化*/
void TIME3_INIT(void)
{
TIM3_DeInit();
TIM3_TimeBaseInit(0, 0XFFFF);
//TIM3_ITConfig(0x01,ENABLE);
TIM3_UpdateRequestConfig(TIM3_UPDATESOURCE_REGULAR);
//TIM3_ARRPreloadConfig(ENABLE);
//TIM3_Cmd(ENABLE);
} |