
从开始玩STM32F开始就用官方库.感觉快上手,外设配置用官方库. 常用的输出等(如更新I/O)就直接操作寄存器. 在不追求处理速度下完全可以接受. 在一个用F051的项目也直接用触摸库,连芯片手册都没看; 花了不少时间才将变量定义好,: w3 [. c" O1 ^6 ^( p 又花了不少时间初始化成功 -------注意:触摸库会挨个将GPIO的CLK打开, 最后发现整个触摸功占用了快(整个系统)1/5的时间, 看了手册才发现原来F051的触摸功能就像USART或其它外设一样,都有对应的寄存器,计数寄存器,中断等.简单易用 V: U7 y% z; t$ I' [ --------注:STM8/STM32L1XX并非这样,比较麻烦+ u4 E3 k Q- p D9 K# A 大家没必要去找库. 另:硬件电路上,采样(充电)电容不一定要用那么大的,用小点灵敏度高很多(要不是1S内采样不了几次); 要不是本来速度就慢,再要虑波一下,就其慢无比了. |
//电容测量型按键检测支持 定义和函数 0 S K$ J3 k9 ^/ e- j
//-----------------------------------------------------------------------------
#define KEY1_R (GPIOD->IDR & 0x04)//PD2
//#define KEY2_R (GPIOC->IDR & 0x80)//PC7
//#define KEY3_R (GPIOD->IDR & 0x20)//PD58 D' U6 ~$ |4 y. g# L5 A& u
//#define KEY4_R (GPIOD->IDR & 0x40)//PD6 n7 `6 N7 b }& O% s$ h
#define KEY_SH (GPIOD->ODR |=0x08)//PD3* t( ~: b" \( M* |3 ~
#define KEY_SL (GPIOD->ODR &=0xf7)//PD3
//-----------------------------------------------------------------------------
#define KEY1_O_1 {GPIOD->ODR|=0x04;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD2$ O9 i$ ^; x' t; L! d
#define KEY1_O_0 {GPIOD->ODR&=0xFb;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD2
#define KEY1_I {GPIOD->CR1&=0xfb;GPIOD->DDR&=0xfb;}//PD2
5 m& |8 C1 O; K, _" D: F* A ?
//#define KEY2_R (GPIOC->IDR & 0x80)//PC7
//#define KEY3_R (GPIOD->IDR & 0x20)//PD5& ?9 s4 }( `! w( |: c4 `
//#define KEY4_R (GPIOD->IDR & 0x40)//PD6) P) y2 T+ U! I/ F$ ]2 @$ t0 ]
//-----------------------------------------------------------------------------1 R) T: z9 u, X( L
#define GT_GATE 5: F7 e- s+ m( `$ e( ]- h! H
//-----------------------------------------------------------------------------
unsigned char key_time_sta1;//充电开始时间* J* x B0 i& n8 N
unsigned char key_time1;//动态时间% K7 P1 @0 ^# [. f0 n# S; i
unsigned char key_CH1;//按键充放电时间基准
unsigned char key_delay1;//按键保持存在的时间倒计时
unsigned char key_filter1;//按键滤波 毛刺消除
* m& f- |+ Z( z- G" h: |3 V* Y( l+ d
unsigned char key_count;//按键计数count 用于长按设置9 {2 X/ g! P. a0 [$ A0 T" M
unsigned char key_value;//按键数据
#define SET_K1 (key_value|=0x01)
#define SET_K2 (key_value|=0x02)
#define SET_K3 (key_value|=0x04)! i1 x1 n: O. [; W
#define SET_K4 (key_value|=0x08)
#define Key_on (key_value&0x01). ]8 j) s' |, L9 n3 {
#define Key_set (key_value&0x02)
#define Key_add (key_value&0x04)
#define Key_pause (key_value&0x08)
unsigned char key_shadow;//按键影子数据
#define lkey_add (key_shadow&0x04)
unsigned char key_buf[64];! }+ p) i# }/ E! p5 [# a$ m5 {$ Y
unsigned char key_i;2 r8 v, V! Y6 b& b f
//-----------------------------------------------------------------------------
void CM_filter()
{//按键滤波调用0 H; W# |2 s2 }8 V
if(key_filter1<10). ^. `5 v/ o ]/ P1 v8 A
{7 l- V) s& q! _. f/ G% u
}
} Q+ x1 h4 B/ J! P( M- I
//-----------------------------------------------------------------------------/ A% @; z( W4 \+ \* x/ R+ t+ [
void CM_Key_scan()% B9 O1 ]" Y9 P7 o
{//1ms 调用一次 刷新键值
unsigned char temp;, P' q9 ^. D& @; s
key_value=0;//键值清0* A6 q, q# ]5 x* G( s- y
//key_time_sta1=TIM2->CNTRH;
//key_time_sta1<<=8;
key_time_sta1=TIM2->CNTRL;
KEY1_O_0;//准备充电 先放光' S' x8 T+ E3 g8 Q
KEY_SH;; I! L5 P% x+ C$ l1 q
KEY1_I;//高阻
while(!KEY1_R);
KEY1_O_1;//准备放电 先充满 x$ y" N( }( w% z
KEY1_I;//高阻
KEY_SL;* o& l- m2 n6 t/ [8 p' t1 k( w1 y5 t
while(KEY1_R);/ h/ j# L9 @( ^0 b
//temp=TIM2->CNTRH;
//temp<<=8;3 m3 ?2 ]4 ]* n7 y1 V+ I
temp=TIM2->CNTRL;6 R# [" A6 V1 }
key_time1=temp-key_time_sta1;//单位是us
# U0 x6 ?9 e- [/ Y
if(key_time1>(key_CH1+GT_GATE))+ m4 |0 ~% s- |$ {1 f7 x
{//溢出阀值
if(key_filter1<8)key_filter1++;$ a6 z. U8 X3 y; V3 G
else
{//连续8次才有效+ |5 T: |4 W6 O
key_delay1=200;//0.2s1 Q. v2 S, F" t
//if(key_delay1==0)key_CH1-=GT_GATE;
key_CH1-=(key_CH1>>4);// 15/16
key_CH1+=(key_time1>>4);; ~3 O2 t: s! u0 L
}
}$ n; ]* H+ \; ]0 D% \8 ]
else
{//未溢出情况下累计基准% s, q3 S1 A2 W! n4 N4 F- u
key_filter1=0;$ B( ]9 A+ X: n
key_CH1-=(key_CH1>>4);// 15/16, E4 j0 b7 w6 x1 X4 M
key_CH1+=(key_time1>>4);
}
if(key_delay1), T5 }9 G8 L" y! v: z5 e5 n
{//在key_delay1不为0期间 K1保持按下状态
key_delay1--;
SET_K1;+ v) P* _( e- T) q6 \5 B
}
key_i++;6 j7 A; V+ i5 ?3 `/ p3 h
if(key_i>=64)key_i=0;. [! i0 v6 `; M- m7 Q; m ~1 ]% w
key_buf[key_i]=key_time1;% B" |/ L$ v, X8 {/ _( T4 v
4 j8 j1 l \: m+ G" s/ N% z# _8 P
//key_CH1-=(key_CH1>>4);// 15/16) l* Y1 c- y2 h! p& A$ a
//key_CH1+=(key_time>>4);' R- @. U( x0 ?* ^4 P5 K
temp=key_value;; f: b7 N. X; ~6 b
key_value=key_value&(key_value^key_shadow);5 F B" f8 G# Z; k3 c$ Y4 H
key_shadow=temp;. o Z3 K; j# M& D, w
}2 {$ U; T3 h4 r( t1 M