
从开始玩STM32F开始就用官方库.感觉快上手,外设配置用官方库. 常用的输出等(如更新I/O)就直接操作寄存器. 在不追求处理速度下完全可以接受.9 u6 C9 z; B" b3 d 在一个用F051的项目也直接用触摸库,连芯片手册都没看;! i# O" f N, k' {+ S2 L2 E 花了不少时间才将变量定义好,' w6 o0 z& F+ B0 } 又花了不少时间初始化成功 -------注意:触摸库会挨个将GPIO的CLK打开,; a- x8 O( g2 \( V( V 最后发现整个触摸功占用了快(整个系统)1/5的时间,5 t+ R c0 M% y3 B7 d$ b 看了手册才发现原来F051的触摸功能就像USART或其它外设一样,都有对应的寄存器,计数寄存器,中断等.简单易用8 T N. p0 e2 z. J; _ --------注:STM8/STM32L1XX并非这样,比较麻烦, ~/ \) I. H8 a3 a; J 大家没必要去找库. 另:硬件电路上,采样(充电)电容不一定要用那么大的,用小点灵敏度高很多(要不是1S内采样不了几次); 要不是本来速度就慢,再要虑波一下,就其慢无比了. |
//电容测量型按键检测支持 定义和函数 * [' T u# Y7 c/ V0 A
//-----------------------------------------------------------------------------
#define KEY1_R (GPIOD->IDR & 0x04)//PD2
//#define KEY2_R (GPIOC->IDR & 0x80)//PC75 q- {1 ^( `- A7 x$ q& W8 `9 F
//#define KEY3_R (GPIOD->IDR & 0x20)//PD5
//#define KEY4_R (GPIOD->IDR & 0x40)//PD6' U1 V& R" [* \8 X9 Y
#define KEY_SH (GPIOD->ODR |=0x08)//PD3
#define KEY_SL (GPIOD->ODR &=0xf7)//PD3, v! {9 r! q* l3 W' A! H
//-----------------------------------------------------------------------------$ H) T* F( d8 X! B8 @
#define KEY1_O_1 {GPIOD->ODR|=0x04;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD2
#define KEY1_O_0 {GPIOD->ODR&=0xFb;GPIOD->DDR|=0x04;GPIOD->CR1|=0x04;}//PD20 a* n+ A7 @- U, y2 W3 b
#define KEY1_I {GPIOD->CR1&=0xfb;GPIOD->DDR&=0xfb;}//PD2
//#define KEY2_R (GPIOC->IDR & 0x80)//PC7; e: r# U# K! _' z5 s% O
//#define KEY3_R (GPIOD->IDR & 0x20)//PD5" p: F4 [* ?. k' B2 F9 l
//#define KEY4_R (GPIOD->IDR & 0x40)//PD6
//-----------------------------------------------------------------------------
#define GT_GATE 5' d+ F5 g+ {+ S7 a# p1 @) S- k
//-----------------------------------------------------------------------------% V: K, {7 J5 m
unsigned char key_time_sta1;//充电开始时间
unsigned char key_time1;//动态时间
unsigned char key_CH1;//按键充放电时间基准) l7 [& V- P# K
unsigned char key_delay1;//按键保持存在的时间倒计时
unsigned char key_filter1;//按键滤波 毛刺消除3 ]" Z' c2 \# K2 t+ b, y
unsigned char key_count;//按键计数count 用于长按设置7 k3 s$ j; l4 _4 G2 f
unsigned char key_value;//按键数据
#define SET_K1 (key_value|=0x01)1 p4 i" g! D' F7 W1 o; I7 r6 I! [/ h
#define SET_K2 (key_value|=0x02)5 l7 W( B% w# M. K3 p* m
#define SET_K3 (key_value|=0x04)8 e$ o$ ^! A( x |7 y) X* ]
#define SET_K4 (key_value|=0x08)
#define Key_on (key_value&0x01)& N. h/ z6 Z. ?0 U0 }
#define Key_set (key_value&0x02)
#define Key_add (key_value&0x04)% z+ }: `1 ^7 K4 z4 ~- I+ X. V
#define Key_pause (key_value&0x08)! _' Q2 ^$ L$ V+ o1 A/ ?9 V
unsigned char key_shadow;//按键影子数据
#define lkey_add (key_shadow&0x04)( R J' n& l% b/ W; Z8 F+ D+ a
unsigned char key_buf[64];7 B( N! v- l3 W* L4 y5 \
unsigned char key_i;
//-----------------------------------------------------------------------------7 g; s& l0 d+ R. d: _) z& x
void CM_filter()+ g+ }9 D% Z" z' z& _9 k
{//按键滤波调用/ {4 L: U7 _9 j
if(key_filter1<10)
{
}! H( T h: D0 M" A5 t8 `2 d7 Q" W/ \
}
//-----------------------------------------------------------------------------; Z8 {& ]0 n) z- b
void CM_Key_scan(), ^ Q F6 B7 I4 x
{//1ms 调用一次 刷新键值) p7 N6 ^/ D# O
unsigned char temp;8 m9 a- x, E/ O$ V) n6 d' A
key_value=0;//键值清0
//key_time_sta1=TIM2->CNTRH;! l* ^1 n n$ R Q$ d) Y
//key_time_sta1<<=8;( b+ i8 r. }: d3 I; l, L8 W; d; p+ {
key_time_sta1=TIM2->CNTRL;9 W, v* B; h' {
KEY1_O_0;//准备充电 先放光1 k s, T1 p1 u9 u
KEY_SH;
KEY1_I;//高阻2 R9 ?6 v$ [( O4 U7 f* d
while(!KEY1_R);
; L# Q& ] E2 h" j% e: p0 b
KEY1_O_1;//准备放电 先充满
KEY1_I;//高阻
KEY_SL;
while(KEY1_R);' T6 n( W7 d6 m: A5 }
7 p1 C7 e9 x) X* C% |' v* _8 v! j
//temp=TIM2->CNTRH;; F4 g0 U. O, O% i6 ?; M
//temp<<=8;
temp=TIM2->CNTRL;
key_time1=temp-key_time_sta1;//单位是us
4 |0 a; U$ x, \
if(key_time1>(key_CH1+GT_GATE))
{//溢出阀值2 V7 G$ A$ M9 Z8 ]. `
if(key_filter1<8)key_filter1++;$ X4 k. I0 H* A2 b* `% S
else9 h: f8 h! | `. \0 T5 Z
{//连续8次才有效
key_delay1=200;//0.2s
//if(key_delay1==0)key_CH1-=GT_GATE;
key_CH1-=(key_CH1>>4);// 15/16, Y+ n, _1 F! `! }4 W1 T
key_CH1+=(key_time1>>4);% y9 I, \+ j4 {1 I- c% O
}2 H! X3 E. r. m5 ^
}
else
{//未溢出情况下累计基准. S+ k6 V$ P. @8 ~
key_filter1=0;
key_CH1-=(key_CH1>>4);// 15/16
key_CH1+=(key_time1>>4);
}- j+ ~/ h/ e/ F, a2 w+ _' J
if(key_delay1)
{//在key_delay1不为0期间 K1保持按下状态3 d: }7 M/ P2 H1 t- ]5 H
key_delay1--;
SET_K1;
}
8 Y/ h: E v# i1 O* p* p- P
key_i++;/ P; S j5 n% \2 r& ~) p
if(key_i>=64)key_i=0;) C: L4 p5 T0 K9 S1 Z( k
key_buf[key_i]=key_time1;2 A( U, @" h) f9 N0 k
//key_CH1-=(key_CH1>>4);// 15/16
//key_CH1+=(key_time>>4);6 z1 v W% A) N3 z7 r1 y
temp=key_value;" D; u( d" K6 Z0 H. ?
key_value=key_value&(key_value^key_shadow);
key_shadow=temp;
}